ETH Price: $3,402.40 (+4.42%)

Token

ExoGens Official Collection (ExoGens)
 

Overview

Max Total Supply

920 ExoGens

Holders

475

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
*mika🚀️.eth
Balance
1 ExoGens
0xe185f87fa30c0bfc7917df76f4197377598b816f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ExoGensprojectReal

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

pragma solidity 0.8.7;

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

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

/**
 * @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 whiteed 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 whiteed 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]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

/**
 * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public 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 whiteed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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

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

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

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


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


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


// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


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

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


contract ExoGensprojectReal is ERC721("ExoGens Official Collection", "ExoGens"), ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    string private baseURI;
    string private blindURI;
    string private jsonparam = '.json';
    uint256 public constant BUY_LIMIT_PER_TX = 3;
    uint256 public constant MAX_NFT_PUBLIC = 9900;
    uint256 private constant MAX_NFT = 10001;
    uint256 public Price = 110000000000000000;  // 0.11 ETH
    bool public reveal;
    bool public isActive;
    bool public isPresaleActive;
    bool private freeMintActive;
    mapping(address => uint256) public whiteListClaimed;
    mapping(address => bool) private giveawayMintClaimed;
    uint256 public giveawayCount;


    /*
     * Function to reveal all ExoGens
    */
    function revealNow() 
        external 
        onlyOwner 
    {
        reveal = true;
    }
    
    
    /*
     * Function setIsActive to activate/desactivate the smart contract
    */
    function setIsActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        isActive = _isActive;
    }
    
    /*
     * Function setPresaleActive to activate/desactivate the whitelist/raffle presale  
    */
    function setPresaleActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        isPresaleActive = _isActive;
    }

    /*
     * Function setFreeMintActive to activate/desactivate the free mint capability  
    */
    function setFreeMintActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        freeMintActive = _isActive;
    }
    
    /*
     * Function to set Base and Blind URI 
    */
    function setURIs(
        string memory _blindURI, 
        string memory _URI
    ) 
        external 
        onlyOwner 
    {
        blindURI = _blindURI;
        baseURI = _URI;
    }
    
    /*
     * Function to withdraw collected amount during minting by the owner
    */
    function withdraw(
    ) 
        public 
        onlyOwner 
    {
        uint balance = address(this).balance;
        require(balance > 0, "Balance should be more then zero");
        payable(address(0x75bbAbD451E7BadcF3569F4Df8BA0bE52b7a911F)).transfer(balance);
    }
    

    /*
     * Function to mint new NFTs during the presale
     * It is payable. Amount is calculated as per (Price.mul(_numOfTokens))
    */ 
    function mintNFT(
        uint256 _numOfTokens
    ) 
        public 
        payable
    {
        require(isActive, 'Sale is not active');
        require(isPresaleActive, 'Whitelist is not active');
        require(totalSupply() < MAX_NFT_PUBLIC, 'All public tokens have been minted');
        require(_numOfTokens <= BUY_LIMIT_PER_TX, 'Cannot purchase this many tokens');
        require(totalSupply().add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, 'Purchase would exceed max public supply of NFTs');
        require(whiteListClaimed[msg.sender].add(_numOfTokens) <= BUY_LIMIT_PER_TX, 'Purchase exceeds max whiteed');
        require(Price.mul(_numOfTokens) == msg.value, "Ether value sent is not correct");
        for (uint256 i = 1; i <= _numOfTokens; i++) {
                whiteListClaimed[msg.sender] += 1;
                _safeMint(msg.sender, totalSupply().sub(giveawayCount));
        }
    }
    
    /*
     * Function to mint NFTs for giveaway and partnerships
    */
    function mintByOwner(
        address _to, 
        uint256 _tokenId
    )
        public 
        onlyOwner
    {
        require(_tokenId < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens");
        _safeMint(_to, _tokenId);
    }
    
    /*
     * Function to mint all NFTs for giveaway and partnerships
    */
    function mintMultipleByOwner(
        address[] memory _to, 
        uint256[] memory _tokenId
    )
        public
        onlyOwner
    {
        require(_to.length == _tokenId.length, "Should have same length");
        for(uint256 i = 0; i < _to.length; i++){
            require(_tokenId[i] >= MAX_NFT_PUBLIC, "Tokens number to mint must exceed number of public tokens");
            require(_tokenId[i] < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens");
            _safeMint(_to[i], _tokenId[i]);
            giveawayCount = giveawayCount.add(1);
        }
    }

    /*
     * Function to get token URI of given token ID
     * URI will be blank untill totalSupply reaches MAX_NFT_PUBLIC
    */
    function tokenURI(
        uint256 _tokenId
    )
        public 
        view 
        virtual 
        override 
        returns (string memory) 
    {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (!reveal) {
            return string(abi.encodePacked(blindURI, _tokenId.toString(), jsonparam));
        } else {
            return string(abi.encodePacked(baseURI, _tokenId.toString(), jsonparam));
        }
    }


    // Standard functions to be overridden in ERC721Enumerable
    function supportsInterface(
        bytes4 _interfaceId
    ) 
        public
        view 
        override (ERC721, ERC721Enumerable) 
        returns (bool) 
    {
        return super.supportsInterface(_interfaceId);
    }

   
    function _beforeTokenTransfer(
        address _from, 
        address _to, 
        uint256 _tokenId
    ) 
        internal 
        override(ERC721, ERC721Enumerable) 
    {
        super._beforeTokenTransfer(_from, _to, _tokenId);
    }

}

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":"BUY_LIMIT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Price","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"mintMultipleByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintNFT","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":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setFreeMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURIs","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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200005192919062000200565b50670186cc6acd4b0000600e553480156200006b57600080fd5b506040518060400160405280601b81526020017f45786f47656e73204f6666696369616c20436f6c6c656374696f6e00000000008152506040518060400160405280600781526020017f45786f47656e73000000000000000000000000000000000000000000000000008152508160009080519060200190620000f092919062000200565b5080600190805190602001906200010992919062000200565b5050506200012c620001206200013260201b60201c565b6200013a60201b60201c565b62000315565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020e90620002b0565b90600052602060002090601f0160209004810192826200023257600085556200027e565b82601f106200024d57805160ff19168380011785556200027e565b828001600101855582156200027e579182015b828111156200027d57825182559160200191906001019062000260565b5b5090506200028d919062000291565b5090565b5b80821115620002ac57600081600090555060010162000292565b5090565b60006002820490506001821680620002c957607f821691505b60208210811415620002e057620002df620002e6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614c3680620003256000396000f3fe60806040526004361061020f5760003560e01c80636352211e11610118578063b88d4fde116100a0578063e748e07c1161006f578063e748e07c1461077a578063e8254174146107a5578063e985e9c5146107ce578063e9be0f3f1461080b578063f2fde38b146108365761020f565b8063b88d4fde146106c0578063c151a5f8146106e9578063c87b56dd14610712578063d1d80f301461074f5761020f565b806392642744116100e757806392642744146105fa57806395d89b41146106165780639dfde20114610641578063a22cb4651461066c578063a475b5dd146106955761020f565b80636352211e1461053e57806370a082311461057b578063715018a6146105b85780638da5cb5b146105cf5761020f565b80632f745c591161019b57806342842e0e1161016a57806342842e0e1461046d5780634f6ccce7146104965780634f9b563c146104d35780635f0f45b2146104fc57806360d938dc146105135761020f565b80632f745c59146103c75780633542aee2146104045780633ccfd60b1461042d5780633f8121a2146104445761020f565b806318160ddd116101e257806318160ddd146102e257806322f3e2d41461030d5780632333f3c41461033857806323b872dd146103755780632750fc781461039e5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061345b565b61085f565b6040516102489190613b38565b60405180910390f35b34801561025d57600080fd5b50610266610871565b6040516102739190613b53565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e919061352d565b610903565b6040516102b09190613ad1565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613376565b610988565b005b3480156102ee57600080fd5b506102f7610aa0565b6040516103049190613f15565b60405180910390f35b34801561031957600080fd5b50610322610aad565b60405161032f9190613b38565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a91906131f3565b610ac0565b60405161036c9190613f15565b60405180910390f35b34801561038157600080fd5b5061039c60048036038101906103979190613260565b610ad8565b005b3480156103aa57600080fd5b506103c560048036038101906103c0919061342e565b610b38565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190613376565b610bd1565b6040516103fb9190613f15565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190613376565b610c76565b005b34801561043957600080fd5b50610442610d44565b005b34801561045057600080fd5b5061046b6004803603810190610466919061342e565b610e66565b005b34801561047957600080fd5b50610494600480360381019061048f9190613260565b610eff565b005b3480156104a257600080fd5b506104bd60048036038101906104b8919061352d565b610f1f565b6040516104ca9190613f15565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f5919061342e565b610f90565b005b34801561050857600080fd5b50610511611029565b005b34801561051f57600080fd5b506105286110c2565b6040516105359190613b38565b60405180910390f35b34801561054a57600080fd5b506105656004803603810190610560919061352d565b6110d5565b6040516105729190613ad1565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d91906131f3565b611187565b6040516105af9190613f15565b60405180910390f35b3480156105c457600080fd5b506105cd61123f565b005b3480156105db57600080fd5b506105e46112c7565b6040516105f19190613ad1565b60405180910390f35b610614600480360381019061060f919061352d565b6112f1565b005b34801561062257600080fd5b5061062b61161c565b6040516106389190613b53565b60405180910390f35b34801561064d57600080fd5b506106566116ae565b6040516106639190613f15565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190613336565b6116b4565b005b3480156106a157600080fd5b506106aa611835565b6040516106b79190613b38565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e291906132b3565b611848565b005b3480156106f557600080fd5b50610710600480360381019061070b91906133b6565b6118aa565b005b34801561071e57600080fd5b506107396004803603810190610734919061352d565b611aa5565b6040516107469190613b53565b60405180910390f35b34801561075b57600080fd5b50610764611b6e565b6040516107719190613f15565b60405180910390f35b34801561078657600080fd5b5061078f611b74565b60405161079c9190613f15565b60405180910390f35b3480156107b157600080fd5b506107cc60048036038101906107c791906134b5565b611b79565b005b3480156107da57600080fd5b506107f560048036038101906107f09190613220565b611c27565b6040516108029190613b38565b60405180910390f35b34801561081757600080fd5b50610820611cbb565b60405161082d9190613f15565b60405180910390f35b34801561084257600080fd5b5061085d600480360381019061085891906131f3565b611cc1565b005b600061086a82611db9565b9050919050565b60606000805461088090614232565b80601f01602080910402602001604051908101604052809291908181526020018280546108ac90614232565b80156108f95780601f106108ce576101008083540402835291602001916108f9565b820191906000526020600020905b8154815290600101906020018083116108dc57829003601f168201915b5050505050905090565b600061090e82611e33565b61094d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094490613d95565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610993826110d5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fb90613e15565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a23611e9f565b73ffffffffffffffffffffffffffffffffffffffff161480610a525750610a5181610a4c611e9f565b611c27565b5b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613cf5565b60405180910390fd5b610a9b8383611ea7565b505050565b6000600880549050905090565b600f60019054906101000a900460ff1681565b60106020528060005260406000206000915090505481565b610ae9610ae3611e9f565b82611f60565b610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90613e55565b60405180910390fd5b610b3383838361203e565b505050565b610b40611e9f565b73ffffffffffffffffffffffffffffffffffffffff16610b5e6112c7565b73ffffffffffffffffffffffffffffffffffffffff1614610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab90613db5565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000610bdc83611187565b8210610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490613b95565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c7e611e9f565b73ffffffffffffffffffffffffffffffffffffffff16610c9c6112c7565b73ffffffffffffffffffffffffffffffffffffffff1614610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce990613db5565b60405180910390fd5b6127118110610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90613d35565b60405180910390fd5b610d40828261229a565b5050565b610d4c611e9f565b73ffffffffffffffffffffffffffffffffffffffff16610d6a6112c7565b73ffffffffffffffffffffffffffffffffffffffff1614610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790613db5565b60405180910390fd5b600047905060008111610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90613cb5565b60405180910390fd5b7375bbabd451e7badcf3569f4df8ba0be52b7a911f73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e62573d6000803e3d6000fd5b5050565b610e6e611e9f565b73ffffffffffffffffffffffffffffffffffffffff16610e8c6112c7565b73ffffffffffffffffffffffffffffffffffffffff1614610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990613db5565b60405180910390fd5b80600f60026101000a81548160ff02191690831515021790555050565b610f1a83838360405180602001604052806000815250611848565b505050565b6000610f29610aa0565b8210610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6190613e75565b60405180910390fd5b60088281548110610f7e57610f7d6143cb565b5b90600052602060002001549050919050565b610f98611e9f565b73ffffffffffffffffffffffffffffffffffffffff16610fb66112c7565b73ffffffffffffffffffffffffffffffffffffffff161461100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390613db5565b60405180910390fd5b80600f60036101000a81548160ff02191690831515021790555050565b611031611e9f565b73ffffffffffffffffffffffffffffffffffffffff1661104f6112c7565b73ffffffffffffffffffffffffffffffffffffffff16146110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90613db5565b60405180910390fd5b6001600f60006101000a81548160ff021916908315150217905550565b600f60029054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590613d55565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90613d15565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611247611e9f565b73ffffffffffffffffffffffffffffffffffffffff166112656112c7565b73ffffffffffffffffffffffffffffffffffffffff16146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290613db5565b60405180910390fd5b6112c560006122b8565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60019054906101000a900460ff16611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790613c75565b60405180910390fd5b600f60029054906101000a900460ff1661138f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138690613b75565b60405180910390fd5b6126ac61139a610aa0565b106113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190613eb5565b60405180910390fd5b600381111561141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590613ef5565b60405180910390fd5b6126ac61144f60125461144184611433610aa0565b61237e90919063ffffffff16565b61239490919063ffffffff16565b1115611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148790613e35565b60405180910390fd5b60036114e482601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461237e90919063ffffffff16565b1115611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90613bd5565b60405180910390fd5b3461153b82600e546123aa90919063ffffffff16565b1461157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290613c95565b60405180910390fd5b6000600190505b818111611618576001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115d99190614067565b92505081905550611605336116006012546115f2610aa0565b61239490919063ffffffff16565b61229a565b808061161090614295565b915050611582565b5050565b60606001805461162b90614232565b80601f016020809104026020016040519081016040528092919081815260200182805461165790614232565b80156116a45780601f10611679576101008083540402835291602001916116a4565b820191906000526020600020905b81548152906001019060200180831161168757829003601f168201915b5050505050905090565b600e5481565b6116bc611e9f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190613c55565b60405180910390fd5b8060056000611737611e9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e4611e9f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118299190613b38565b60405180910390a35050565b600f60009054906101000a900460ff1681565b611859611853611e9f565b83611f60565b611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613e55565b60405180910390fd5b6118a4848484846123c0565b50505050565b6118b2611e9f565b73ffffffffffffffffffffffffffffffffffffffff166118d06112c7565b73ffffffffffffffffffffffffffffffffffffffff1614611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90613db5565b60405180910390fd5b805182511461196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190613e95565b60405180910390fd5b60005b8251811015611aa0576126ac82828151811061198c5761198b6143cb565b5b602002602001015110156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90613ed5565b60405180910390fd5b6127118282815181106119eb576119ea6143cb565b5b602002602001015110611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a90613d35565b60405180910390fd5b611a71838281518110611a4957611a486143cb565b5b6020026020010151838381518110611a6457611a636143cb565b5b602002602001015161229a565b611a87600160125461237e90919063ffffffff16565b6012819055508080611a9890614295565b91505061196d565b505050565b6060611ab082611e33565b611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690613df5565b60405180910390fd5b600f60009054906101000a900460ff16611b3857600c611b0e8361241c565b600d604051602001611b2293929190613aa0565b6040516020818303038152906040529050611b69565b600b611b438361241c565b600d604051602001611b5793929190613aa0565b60405160208183030381529060405290505b919050565b6126ac81565b600381565b611b81611e9f565b73ffffffffffffffffffffffffffffffffffffffff16611b9f6112c7565b73ffffffffffffffffffffffffffffffffffffffff1614611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec90613db5565b60405180910390fd5b81600c9080519060200190611c0b929190612ecb565b5080600b9080519060200190611c22929190612ecb565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60125481565b611cc9611e9f565b73ffffffffffffffffffffffffffffffffffffffff16611ce76112c7565b73ffffffffffffffffffffffffffffffffffffffff1614611d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3490613db5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da490613bf5565b60405180910390fd5b611db6816122b8565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e2c5750611e2b8261257d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f1a836110d5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f6b82611e33565b611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190613cd5565b60405180910390fd5b6000611fb5836110d5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061202457508373ffffffffffffffffffffffffffffffffffffffff1661200c84610903565b73ffffffffffffffffffffffffffffffffffffffff16145b8061203557506120348185611c27565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661205e826110d5565b73ffffffffffffffffffffffffffffffffffffffff16146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab90613dd5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b90613c35565b60405180910390fd5b61212f83838361265f565b61213a600082611ea7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218a9190614148565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e19190614067565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122b482826040518060200160405280600081525061266f565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361238c9190614067565b905092915050565b600081836123a29190614148565b905092915050565b600081836123b891906140ee565b905092915050565b6123cb84848461203e565b6123d7848484846126ca565b612416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240d90613bb5565b60405180910390fd5b50505050565b60606000821415612464576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612578565b600082905060005b6000821461249657808061247f90614295565b915050600a8261248f91906140bd565b915061246c565b60008167ffffffffffffffff8111156124b2576124b16143fa565b5b6040519080825280601f01601f1916602001820160405280156124e45781602001600182028036833780820191505090505b5090505b60008514612571576001826124fd9190614148565b9150600a8561250c91906142de565b60306125189190614067565b60f81b81838151811061252e5761252d6143cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561256a91906140bd565b94506124e8565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061264857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612658575061265782612861565b5b9050919050565b61266a8383836128cb565b505050565b61267983836129df565b61268660008484846126ca565b6126c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bc90613bb5565b60405180910390fd5b505050565b60006126eb8473ffffffffffffffffffffffffffffffffffffffff16612bad565b15612854578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612714611e9f565b8786866040518563ffffffff1660e01b81526004016127369493929190613aec565b602060405180830381600087803b15801561275057600080fd5b505af192505050801561278157506040513d601f19601f8201168201806040525081019061277e9190613488565b60015b612804573d80600081146127b1576040519150601f19603f3d011682016040523d82523d6000602084013e6127b6565b606091505b506000815114156127fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f390613bb5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612859565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128d6838383612bc0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129195761291481612bc5565b612958565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612957576129568382612c0e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561299b5761299681612d7b565b6129da565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129d9576129d88282612e4c565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4690613d75565b60405180910390fd5b612a5881611e33565b15612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f90613c15565b60405180910390fd5b612aa46000838361265f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af49190614067565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c1b84611187565b612c259190614148565b9050600060076000848152602001908152602001600020549050818114612d0a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d8f9190614148565b9050600060096000848152602001908152602001600020549050600060088381548110612dbf57612dbe6143cb565b5b906000526020600020015490508060088381548110612de157612de06143cb565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e3057612e2f61439c565b5b6001900381819060005260206000200160009055905550505050565b6000612e5783611187565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612ed790614232565b90600052602060002090601f016020900481019282612ef95760008555612f40565b82601f10612f1257805160ff1916838001178555612f40565b82800160010185558215612f40579182015b82811115612f3f578251825591602001919060010190612f24565b5b509050612f4d9190612f51565b5090565b5b80821115612f6a576000816000905550600101612f52565b5090565b6000612f81612f7c84613f55565b613f30565b90508083825260208201905082856020860282011115612fa457612fa361442e565b5b60005b85811015612fd45781612fba88826130d2565b845260208401935060208301925050600181019050612fa7565b5050509392505050565b6000612ff1612fec84613f81565b613f30565b905080838252602082019050828560208602820111156130145761301361442e565b5b60005b85811015613044578161302a88826131de565b845260208401935060208301925050600181019050613017565b5050509392505050565b600061306161305c84613fad565b613f30565b90508281526020810184848401111561307d5761307c614433565b5b6130888482856141f0565b509392505050565b60006130a361309e84613fde565b613f30565b9050828152602081018484840111156130bf576130be614433565b5b6130ca8482856141f0565b509392505050565b6000813590506130e181614ba4565b92915050565b600082601f8301126130fc576130fb614429565b5b813561310c848260208601612f6e565b91505092915050565b600082601f83011261312a57613129614429565b5b813561313a848260208601612fde565b91505092915050565b60008135905061315281614bbb565b92915050565b60008135905061316781614bd2565b92915050565b60008151905061317c81614bd2565b92915050565b600082601f83011261319757613196614429565b5b81356131a784826020860161304e565b91505092915050565b600082601f8301126131c5576131c4614429565b5b81356131d5848260208601613090565b91505092915050565b6000813590506131ed81614be9565b92915050565b6000602082840312156132095761320861443d565b5b6000613217848285016130d2565b91505092915050565b600080604083850312156132375761323661443d565b5b6000613245858286016130d2565b9250506020613256858286016130d2565b9150509250929050565b6000806000606084860312156132795761327861443d565b5b6000613287868287016130d2565b9350506020613298868287016130d2565b92505060406132a9868287016131de565b9150509250925092565b600080600080608085870312156132cd576132cc61443d565b5b60006132db878288016130d2565b94505060206132ec878288016130d2565b93505060406132fd878288016131de565b925050606085013567ffffffffffffffff81111561331e5761331d614438565b5b61332a87828801613182565b91505092959194509250565b6000806040838503121561334d5761334c61443d565b5b600061335b858286016130d2565b925050602061336c85828601613143565b9150509250929050565b6000806040838503121561338d5761338c61443d565b5b600061339b858286016130d2565b92505060206133ac858286016131de565b9150509250929050565b600080604083850312156133cd576133cc61443d565b5b600083013567ffffffffffffffff8111156133eb576133ea614438565b5b6133f7858286016130e7565b925050602083013567ffffffffffffffff81111561341857613417614438565b5b61342485828601613115565b9150509250929050565b6000602082840312156134445761344361443d565b5b600061345284828501613143565b91505092915050565b6000602082840312156134715761347061443d565b5b600061347f84828501613158565b91505092915050565b60006020828403121561349e5761349d61443d565b5b60006134ac8482850161316d565b91505092915050565b600080604083850312156134cc576134cb61443d565b5b600083013567ffffffffffffffff8111156134ea576134e9614438565b5b6134f6858286016131b0565b925050602083013567ffffffffffffffff81111561351757613516614438565b5b613523858286016131b0565b9150509250929050565b6000602082840312156135435761354261443d565b5b6000613551848285016131de565b91505092915050565b6135638161417c565b82525050565b6135728161418e565b82525050565b600061358382614024565b61358d818561403a565b935061359d8185602086016141ff565b6135a681614442565b840191505092915050565b60006135bc8261402f565b6135c6818561404b565b93506135d68185602086016141ff565b6135df81614442565b840191505092915050565b60006135f58261402f565b6135ff818561405c565b935061360f8185602086016141ff565b80840191505092915050565b6000815461362881614232565b613632818661405c565b9450600182166000811461364d576001811461365e57613691565b60ff19831686528186019350613691565b6136678561400f565b60005b838110156136895781548189015260018201915060208101905061366a565b838801955050505b50505092915050565b60006136a760178361404b565b91506136b282614453565b602082019050919050565b60006136ca602b8361404b565b91506136d58261447c565b604082019050919050565b60006136ed60328361404b565b91506136f8826144cb565b604082019050919050565b6000613710601c8361404b565b915061371b8261451a565b602082019050919050565b600061373360268361404b565b915061373e82614543565b604082019050919050565b6000613756601c8361404b565b915061376182614592565b602082019050919050565b600061377960248361404b565b9150613784826145bb565b604082019050919050565b600061379c60198361404b565b91506137a78261460a565b602082019050919050565b60006137bf60128361404b565b91506137ca82614633565b602082019050919050565b60006137e2601f8361404b565b91506137ed8261465c565b602082019050919050565b600061380560208361404b565b915061381082614685565b602082019050919050565b6000613828602c8361404b565b9150613833826146ae565b604082019050919050565b600061384b60388361404b565b9150613856826146fd565b604082019050919050565b600061386e602a8361404b565b91506138798261474c565b604082019050919050565b600061389160388361404b565b915061389c8261479b565b604082019050919050565b60006138b460298361404b565b91506138bf826147ea565b604082019050919050565b60006138d760208361404b565b91506138e282614839565b602082019050919050565b60006138fa602c8361404b565b915061390582614862565b604082019050919050565b600061391d60208361404b565b9150613928826148b1565b602082019050919050565b600061394060298361404b565b915061394b826148da565b604082019050919050565b6000613963602f8361404b565b915061396e82614929565b604082019050919050565b600061398660218361404b565b915061399182614978565b604082019050919050565b60006139a9602f8361404b565b91506139b4826149c7565b604082019050919050565b60006139cc60318361404b565b91506139d782614a16565b604082019050919050565b60006139ef602c8361404b565b91506139fa82614a65565b604082019050919050565b6000613a1260178361404b565b9150613a1d82614ab4565b602082019050919050565b6000613a3560228361404b565b9150613a4082614add565b604082019050919050565b6000613a5860398361404b565b9150613a6382614b2c565b604082019050919050565b6000613a7b60208361404b565b9150613a8682614b7b565b602082019050919050565b613a9a816141e6565b82525050565b6000613aac828661361b565b9150613ab882856135ea565b9150613ac4828461361b565b9150819050949350505050565b6000602082019050613ae6600083018461355a565b92915050565b6000608082019050613b01600083018761355a565b613b0e602083018661355a565b613b1b6040830185613a91565b8181036060830152613b2d8184613578565b905095945050505050565b6000602082019050613b4d6000830184613569565b92915050565b60006020820190508181036000830152613b6d81846135b1565b905092915050565b60006020820190508181036000830152613b8e8161369a565b9050919050565b60006020820190508181036000830152613bae816136bd565b9050919050565b60006020820190508181036000830152613bce816136e0565b9050919050565b60006020820190508181036000830152613bee81613703565b9050919050565b60006020820190508181036000830152613c0e81613726565b9050919050565b60006020820190508181036000830152613c2e81613749565b9050919050565b60006020820190508181036000830152613c4e8161376c565b9050919050565b60006020820190508181036000830152613c6e8161378f565b9050919050565b60006020820190508181036000830152613c8e816137b2565b9050919050565b60006020820190508181036000830152613cae816137d5565b9050919050565b60006020820190508181036000830152613cce816137f8565b9050919050565b60006020820190508181036000830152613cee8161381b565b9050919050565b60006020820190508181036000830152613d0e8161383e565b9050919050565b60006020820190508181036000830152613d2e81613861565b9050919050565b60006020820190508181036000830152613d4e81613884565b9050919050565b60006020820190508181036000830152613d6e816138a7565b9050919050565b60006020820190508181036000830152613d8e816138ca565b9050919050565b60006020820190508181036000830152613dae816138ed565b9050919050565b60006020820190508181036000830152613dce81613910565b9050919050565b60006020820190508181036000830152613dee81613933565b9050919050565b60006020820190508181036000830152613e0e81613956565b9050919050565b60006020820190508181036000830152613e2e81613979565b9050919050565b60006020820190508181036000830152613e4e8161399c565b9050919050565b60006020820190508181036000830152613e6e816139bf565b9050919050565b60006020820190508181036000830152613e8e816139e2565b9050919050565b60006020820190508181036000830152613eae81613a05565b9050919050565b60006020820190508181036000830152613ece81613a28565b9050919050565b60006020820190508181036000830152613eee81613a4b565b9050919050565b60006020820190508181036000830152613f0e81613a6e565b9050919050565b6000602082019050613f2a6000830184613a91565b92915050565b6000613f3a613f4b565b9050613f468282614264565b919050565b6000604051905090565b600067ffffffffffffffff821115613f7057613f6f6143fa565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f9c57613f9b6143fa565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613fc857613fc76143fa565b5b613fd182614442565b9050602081019050919050565b600067ffffffffffffffff821115613ff957613ff86143fa565b5b61400282614442565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614072826141e6565b915061407d836141e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140b2576140b161430f565b5b828201905092915050565b60006140c8826141e6565b91506140d3836141e6565b9250826140e3576140e261433e565b5b828204905092915050565b60006140f9826141e6565b9150614104836141e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561413d5761413c61430f565b5b828202905092915050565b6000614153826141e6565b915061415e836141e6565b9250828210156141715761417061430f565b5b828203905092915050565b6000614187826141c6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561421d578082015181840152602081019050614202565b8381111561422c576000848401525b50505050565b6000600282049050600182168061424a57607f821691505b6020821081141561425e5761425d61436d565b5b50919050565b61426d82614442565b810181811067ffffffffffffffff8211171561428c5761428b6143fa565b5b80604052505050565b60006142a0826141e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142d3576142d261430f565b5b600182019050919050565b60006142e9826141e6565b91506142f4836141e6565b9250826143045761430361433e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f57686974656c697374206973206e6f7420616374697665000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f50757263686173652065786365656473206d6178207768697465656400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360008201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d6178207075626c696360008201527f20737570706c79206f66204e4654730000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f53686f756c6420686176652073616d65206c656e677468000000000000000000600082015250565b7f416c6c207075626c696320746f6b656e732068617665206265656e206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560008201527f64206e756d626572206f66207075626c696320746f6b656e7300000000000000602082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b614bad8161417c565b8114614bb857600080fd5b50565b614bc48161418e565b8114614bcf57600080fd5b50565b614bdb8161419a565b8114614be657600080fd5b50565b614bf2816141e6565b8114614bfd57600080fd5b5056fea26469706673582212206b7f469e6a8b23e50d6e0b1d75fff1dcf374d533f4189e6d66212f14f5ea0acf64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80636352211e11610118578063b88d4fde116100a0578063e748e07c1161006f578063e748e07c1461077a578063e8254174146107a5578063e985e9c5146107ce578063e9be0f3f1461080b578063f2fde38b146108365761020f565b8063b88d4fde146106c0578063c151a5f8146106e9578063c87b56dd14610712578063d1d80f301461074f5761020f565b806392642744116100e757806392642744146105fa57806395d89b41146106165780639dfde20114610641578063a22cb4651461066c578063a475b5dd146106955761020f565b80636352211e1461053e57806370a082311461057b578063715018a6146105b85780638da5cb5b146105cf5761020f565b80632f745c591161019b57806342842e0e1161016a57806342842e0e1461046d5780634f6ccce7146104965780634f9b563c146104d35780635f0f45b2146104fc57806360d938dc146105135761020f565b80632f745c59146103c75780633542aee2146104045780633ccfd60b1461042d5780633f8121a2146104445761020f565b806318160ddd116101e257806318160ddd146102e257806322f3e2d41461030d5780632333f3c41461033857806323b872dd146103755780632750fc781461039e5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061345b565b61085f565b6040516102489190613b38565b60405180910390f35b34801561025d57600080fd5b50610266610871565b6040516102739190613b53565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e919061352d565b610903565b6040516102b09190613ad1565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613376565b610988565b005b3480156102ee57600080fd5b506102f7610aa0565b6040516103049190613f15565b60405180910390f35b34801561031957600080fd5b50610322610aad565b60405161032f9190613b38565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a91906131f3565b610ac0565b60405161036c9190613f15565b60405180910390f35b34801561038157600080fd5b5061039c60048036038101906103979190613260565b610ad8565b005b3480156103aa57600080fd5b506103c560048036038101906103c0919061342e565b610b38565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190613376565b610bd1565b6040516103fb9190613f15565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190613376565b610c76565b005b34801561043957600080fd5b50610442610d44565b005b34801561045057600080fd5b5061046b6004803603810190610466919061342e565b610e66565b005b34801561047957600080fd5b50610494600480360381019061048f9190613260565b610eff565b005b3480156104a257600080fd5b506104bd60048036038101906104b8919061352d565b610f1f565b6040516104ca9190613f15565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f5919061342e565b610f90565b005b34801561050857600080fd5b50610511611029565b005b34801561051f57600080fd5b506105286110c2565b6040516105359190613b38565b60405180910390f35b34801561054a57600080fd5b506105656004803603810190610560919061352d565b6110d5565b6040516105729190613ad1565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d91906131f3565b611187565b6040516105af9190613f15565b60405180910390f35b3480156105c457600080fd5b506105cd61123f565b005b3480156105db57600080fd5b506105e46112c7565b6040516105f19190613ad1565b60405180910390f35b610614600480360381019061060f919061352d565b6112f1565b005b34801561062257600080fd5b5061062b61161c565b6040516106389190613b53565b60405180910390f35b34801561064d57600080fd5b506106566116ae565b6040516106639190613f15565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190613336565b6116b4565b005b3480156106a157600080fd5b506106aa611835565b6040516106b79190613b38565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e291906132b3565b611848565b005b3480156106f557600080fd5b50610710600480360381019061070b91906133b6565b6118aa565b005b34801561071e57600080fd5b506107396004803603810190610734919061352d565b611aa5565b6040516107469190613b53565b60405180910390f35b34801561075b57600080fd5b50610764611b6e565b6040516107719190613f15565b60405180910390f35b34801561078657600080fd5b5061078f611b74565b60405161079c9190613f15565b60405180910390f35b3480156107b157600080fd5b506107cc60048036038101906107c791906134b5565b611b79565b005b3480156107da57600080fd5b506107f560048036038101906107f09190613220565b611c27565b6040516108029190613b38565b60405180910390f35b34801561081757600080fd5b50610820611cbb565b60405161082d9190613f15565b60405180910390f35b34801561084257600080fd5b5061085d600480360381019061085891906131f3565b611cc1565b005b600061086a82611db9565b9050919050565b60606000805461088090614232565b80601f01602080910402602001604051908101604052809291908181526020018280546108ac90614232565b80156108f95780601f106108ce576101008083540402835291602001916108f9565b820191906000526020600020905b8154815290600101906020018083116108dc57829003601f168201915b5050505050905090565b600061090e82611e33565b61094d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094490613d95565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610993826110d5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fb90613e15565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a23611e9f565b73ffffffffffffffffffffffffffffffffffffffff161480610a525750610a5181610a4c611e9f565b611c27565b5b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613cf5565b60405180910390fd5b610a9b8383611ea7565b505050565b6000600880549050905090565b600f60019054906101000a900460ff1681565b60106020528060005260406000206000915090505481565b610ae9610ae3611e9f565b82611f60565b610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90613e55565b60405180910390fd5b610b3383838361203e565b505050565b610b40611e9f565b73ffffffffffffffffffffffffffffffffffffffff16610b5e6112c7565b73ffffffffffffffffffffffffffffffffffffffff1614610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab90613db5565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000610bdc83611187565b8210610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490613b95565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c7e611e9f565b73ffffffffffffffffffffffffffffffffffffffff16610c9c6112c7565b73ffffffffffffffffffffffffffffffffffffffff1614610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce990613db5565b60405180910390fd5b6127118110610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90613d35565b60405180910390fd5b610d40828261229a565b5050565b610d4c611e9f565b73ffffffffffffffffffffffffffffffffffffffff16610d6a6112c7565b73ffffffffffffffffffffffffffffffffffffffff1614610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790613db5565b60405180910390fd5b600047905060008111610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90613cb5565b60405180910390fd5b7375bbabd451e7badcf3569f4df8ba0be52b7a911f73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e62573d6000803e3d6000fd5b5050565b610e6e611e9f565b73ffffffffffffffffffffffffffffffffffffffff16610e8c6112c7565b73ffffffffffffffffffffffffffffffffffffffff1614610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990613db5565b60405180910390fd5b80600f60026101000a81548160ff02191690831515021790555050565b610f1a83838360405180602001604052806000815250611848565b505050565b6000610f29610aa0565b8210610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6190613e75565b60405180910390fd5b60088281548110610f7e57610f7d6143cb565b5b90600052602060002001549050919050565b610f98611e9f565b73ffffffffffffffffffffffffffffffffffffffff16610fb66112c7565b73ffffffffffffffffffffffffffffffffffffffff161461100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390613db5565b60405180910390fd5b80600f60036101000a81548160ff02191690831515021790555050565b611031611e9f565b73ffffffffffffffffffffffffffffffffffffffff1661104f6112c7565b73ffffffffffffffffffffffffffffffffffffffff16146110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90613db5565b60405180910390fd5b6001600f60006101000a81548160ff021916908315150217905550565b600f60029054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590613d55565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90613d15565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611247611e9f565b73ffffffffffffffffffffffffffffffffffffffff166112656112c7565b73ffffffffffffffffffffffffffffffffffffffff16146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290613db5565b60405180910390fd5b6112c560006122b8565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60019054906101000a900460ff16611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790613c75565b60405180910390fd5b600f60029054906101000a900460ff1661138f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138690613b75565b60405180910390fd5b6126ac61139a610aa0565b106113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190613eb5565b60405180910390fd5b600381111561141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590613ef5565b60405180910390fd5b6126ac61144f60125461144184611433610aa0565b61237e90919063ffffffff16565b61239490919063ffffffff16565b1115611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148790613e35565b60405180910390fd5b60036114e482601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461237e90919063ffffffff16565b1115611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90613bd5565b60405180910390fd5b3461153b82600e546123aa90919063ffffffff16565b1461157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290613c95565b60405180910390fd5b6000600190505b818111611618576001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115d99190614067565b92505081905550611605336116006012546115f2610aa0565b61239490919063ffffffff16565b61229a565b808061161090614295565b915050611582565b5050565b60606001805461162b90614232565b80601f016020809104026020016040519081016040528092919081815260200182805461165790614232565b80156116a45780601f10611679576101008083540402835291602001916116a4565b820191906000526020600020905b81548152906001019060200180831161168757829003601f168201915b5050505050905090565b600e5481565b6116bc611e9f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190613c55565b60405180910390fd5b8060056000611737611e9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e4611e9f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118299190613b38565b60405180910390a35050565b600f60009054906101000a900460ff1681565b611859611853611e9f565b83611f60565b611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613e55565b60405180910390fd5b6118a4848484846123c0565b50505050565b6118b2611e9f565b73ffffffffffffffffffffffffffffffffffffffff166118d06112c7565b73ffffffffffffffffffffffffffffffffffffffff1614611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90613db5565b60405180910390fd5b805182511461196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190613e95565b60405180910390fd5b60005b8251811015611aa0576126ac82828151811061198c5761198b6143cb565b5b602002602001015110156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90613ed5565b60405180910390fd5b6127118282815181106119eb576119ea6143cb565b5b602002602001015110611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a90613d35565b60405180910390fd5b611a71838281518110611a4957611a486143cb565b5b6020026020010151838381518110611a6457611a636143cb565b5b602002602001015161229a565b611a87600160125461237e90919063ffffffff16565b6012819055508080611a9890614295565b91505061196d565b505050565b6060611ab082611e33565b611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690613df5565b60405180910390fd5b600f60009054906101000a900460ff16611b3857600c611b0e8361241c565b600d604051602001611b2293929190613aa0565b6040516020818303038152906040529050611b69565b600b611b438361241c565b600d604051602001611b5793929190613aa0565b60405160208183030381529060405290505b919050565b6126ac81565b600381565b611b81611e9f565b73ffffffffffffffffffffffffffffffffffffffff16611b9f6112c7565b73ffffffffffffffffffffffffffffffffffffffff1614611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec90613db5565b60405180910390fd5b81600c9080519060200190611c0b929190612ecb565b5080600b9080519060200190611c22929190612ecb565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60125481565b611cc9611e9f565b73ffffffffffffffffffffffffffffffffffffffff16611ce76112c7565b73ffffffffffffffffffffffffffffffffffffffff1614611d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3490613db5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da490613bf5565b60405180910390fd5b611db6816122b8565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e2c5750611e2b8261257d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f1a836110d5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f6b82611e33565b611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190613cd5565b60405180910390fd5b6000611fb5836110d5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061202457508373ffffffffffffffffffffffffffffffffffffffff1661200c84610903565b73ffffffffffffffffffffffffffffffffffffffff16145b8061203557506120348185611c27565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661205e826110d5565b73ffffffffffffffffffffffffffffffffffffffff16146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab90613dd5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b90613c35565b60405180910390fd5b61212f83838361265f565b61213a600082611ea7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218a9190614148565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e19190614067565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122b482826040518060200160405280600081525061266f565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361238c9190614067565b905092915050565b600081836123a29190614148565b905092915050565b600081836123b891906140ee565b905092915050565b6123cb84848461203e565b6123d7848484846126ca565b612416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240d90613bb5565b60405180910390fd5b50505050565b60606000821415612464576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612578565b600082905060005b6000821461249657808061247f90614295565b915050600a8261248f91906140bd565b915061246c565b60008167ffffffffffffffff8111156124b2576124b16143fa565b5b6040519080825280601f01601f1916602001820160405280156124e45781602001600182028036833780820191505090505b5090505b60008514612571576001826124fd9190614148565b9150600a8561250c91906142de565b60306125189190614067565b60f81b81838151811061252e5761252d6143cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561256a91906140bd565b94506124e8565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061264857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612658575061265782612861565b5b9050919050565b61266a8383836128cb565b505050565b61267983836129df565b61268660008484846126ca565b6126c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bc90613bb5565b60405180910390fd5b505050565b60006126eb8473ffffffffffffffffffffffffffffffffffffffff16612bad565b15612854578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612714611e9f565b8786866040518563ffffffff1660e01b81526004016127369493929190613aec565b602060405180830381600087803b15801561275057600080fd5b505af192505050801561278157506040513d601f19601f8201168201806040525081019061277e9190613488565b60015b612804573d80600081146127b1576040519150601f19603f3d011682016040523d82523d6000602084013e6127b6565b606091505b506000815114156127fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f390613bb5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612859565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128d6838383612bc0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129195761291481612bc5565b612958565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612957576129568382612c0e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561299b5761299681612d7b565b6129da565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129d9576129d88282612e4c565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4690613d75565b60405180910390fd5b612a5881611e33565b15612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f90613c15565b60405180910390fd5b612aa46000838361265f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af49190614067565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c1b84611187565b612c259190614148565b9050600060076000848152602001908152602001600020549050818114612d0a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d8f9190614148565b9050600060096000848152602001908152602001600020549050600060088381548110612dbf57612dbe6143cb565b5b906000526020600020015490508060088381548110612de157612de06143cb565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e3057612e2f61439c565b5b6001900381819060005260206000200160009055905550505050565b6000612e5783611187565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612ed790614232565b90600052602060002090601f016020900481019282612ef95760008555612f40565b82601f10612f1257805160ff1916838001178555612f40565b82800160010185558215612f40579182015b82811115612f3f578251825591602001919060010190612f24565b5b509050612f4d9190612f51565b5090565b5b80821115612f6a576000816000905550600101612f52565b5090565b6000612f81612f7c84613f55565b613f30565b90508083825260208201905082856020860282011115612fa457612fa361442e565b5b60005b85811015612fd45781612fba88826130d2565b845260208401935060208301925050600181019050612fa7565b5050509392505050565b6000612ff1612fec84613f81565b613f30565b905080838252602082019050828560208602820111156130145761301361442e565b5b60005b85811015613044578161302a88826131de565b845260208401935060208301925050600181019050613017565b5050509392505050565b600061306161305c84613fad565b613f30565b90508281526020810184848401111561307d5761307c614433565b5b6130888482856141f0565b509392505050565b60006130a361309e84613fde565b613f30565b9050828152602081018484840111156130bf576130be614433565b5b6130ca8482856141f0565b509392505050565b6000813590506130e181614ba4565b92915050565b600082601f8301126130fc576130fb614429565b5b813561310c848260208601612f6e565b91505092915050565b600082601f83011261312a57613129614429565b5b813561313a848260208601612fde565b91505092915050565b60008135905061315281614bbb565b92915050565b60008135905061316781614bd2565b92915050565b60008151905061317c81614bd2565b92915050565b600082601f83011261319757613196614429565b5b81356131a784826020860161304e565b91505092915050565b600082601f8301126131c5576131c4614429565b5b81356131d5848260208601613090565b91505092915050565b6000813590506131ed81614be9565b92915050565b6000602082840312156132095761320861443d565b5b6000613217848285016130d2565b91505092915050565b600080604083850312156132375761323661443d565b5b6000613245858286016130d2565b9250506020613256858286016130d2565b9150509250929050565b6000806000606084860312156132795761327861443d565b5b6000613287868287016130d2565b9350506020613298868287016130d2565b92505060406132a9868287016131de565b9150509250925092565b600080600080608085870312156132cd576132cc61443d565b5b60006132db878288016130d2565b94505060206132ec878288016130d2565b93505060406132fd878288016131de565b925050606085013567ffffffffffffffff81111561331e5761331d614438565b5b61332a87828801613182565b91505092959194509250565b6000806040838503121561334d5761334c61443d565b5b600061335b858286016130d2565b925050602061336c85828601613143565b9150509250929050565b6000806040838503121561338d5761338c61443d565b5b600061339b858286016130d2565b92505060206133ac858286016131de565b9150509250929050565b600080604083850312156133cd576133cc61443d565b5b600083013567ffffffffffffffff8111156133eb576133ea614438565b5b6133f7858286016130e7565b925050602083013567ffffffffffffffff81111561341857613417614438565b5b61342485828601613115565b9150509250929050565b6000602082840312156134445761344361443d565b5b600061345284828501613143565b91505092915050565b6000602082840312156134715761347061443d565b5b600061347f84828501613158565b91505092915050565b60006020828403121561349e5761349d61443d565b5b60006134ac8482850161316d565b91505092915050565b600080604083850312156134cc576134cb61443d565b5b600083013567ffffffffffffffff8111156134ea576134e9614438565b5b6134f6858286016131b0565b925050602083013567ffffffffffffffff81111561351757613516614438565b5b613523858286016131b0565b9150509250929050565b6000602082840312156135435761354261443d565b5b6000613551848285016131de565b91505092915050565b6135638161417c565b82525050565b6135728161418e565b82525050565b600061358382614024565b61358d818561403a565b935061359d8185602086016141ff565b6135a681614442565b840191505092915050565b60006135bc8261402f565b6135c6818561404b565b93506135d68185602086016141ff565b6135df81614442565b840191505092915050565b60006135f58261402f565b6135ff818561405c565b935061360f8185602086016141ff565b80840191505092915050565b6000815461362881614232565b613632818661405c565b9450600182166000811461364d576001811461365e57613691565b60ff19831686528186019350613691565b6136678561400f565b60005b838110156136895781548189015260018201915060208101905061366a565b838801955050505b50505092915050565b60006136a760178361404b565b91506136b282614453565b602082019050919050565b60006136ca602b8361404b565b91506136d58261447c565b604082019050919050565b60006136ed60328361404b565b91506136f8826144cb565b604082019050919050565b6000613710601c8361404b565b915061371b8261451a565b602082019050919050565b600061373360268361404b565b915061373e82614543565b604082019050919050565b6000613756601c8361404b565b915061376182614592565b602082019050919050565b600061377960248361404b565b9150613784826145bb565b604082019050919050565b600061379c60198361404b565b91506137a78261460a565b602082019050919050565b60006137bf60128361404b565b91506137ca82614633565b602082019050919050565b60006137e2601f8361404b565b91506137ed8261465c565b602082019050919050565b600061380560208361404b565b915061381082614685565b602082019050919050565b6000613828602c8361404b565b9150613833826146ae565b604082019050919050565b600061384b60388361404b565b9150613856826146fd565b604082019050919050565b600061386e602a8361404b565b91506138798261474c565b604082019050919050565b600061389160388361404b565b915061389c8261479b565b604082019050919050565b60006138b460298361404b565b91506138bf826147ea565b604082019050919050565b60006138d760208361404b565b91506138e282614839565b602082019050919050565b60006138fa602c8361404b565b915061390582614862565b604082019050919050565b600061391d60208361404b565b9150613928826148b1565b602082019050919050565b600061394060298361404b565b915061394b826148da565b604082019050919050565b6000613963602f8361404b565b915061396e82614929565b604082019050919050565b600061398660218361404b565b915061399182614978565b604082019050919050565b60006139a9602f8361404b565b91506139b4826149c7565b604082019050919050565b60006139cc60318361404b565b91506139d782614a16565b604082019050919050565b60006139ef602c8361404b565b91506139fa82614a65565b604082019050919050565b6000613a1260178361404b565b9150613a1d82614ab4565b602082019050919050565b6000613a3560228361404b565b9150613a4082614add565b604082019050919050565b6000613a5860398361404b565b9150613a6382614b2c565b604082019050919050565b6000613a7b60208361404b565b9150613a8682614b7b565b602082019050919050565b613a9a816141e6565b82525050565b6000613aac828661361b565b9150613ab882856135ea565b9150613ac4828461361b565b9150819050949350505050565b6000602082019050613ae6600083018461355a565b92915050565b6000608082019050613b01600083018761355a565b613b0e602083018661355a565b613b1b6040830185613a91565b8181036060830152613b2d8184613578565b905095945050505050565b6000602082019050613b4d6000830184613569565b92915050565b60006020820190508181036000830152613b6d81846135b1565b905092915050565b60006020820190508181036000830152613b8e8161369a565b9050919050565b60006020820190508181036000830152613bae816136bd565b9050919050565b60006020820190508181036000830152613bce816136e0565b9050919050565b60006020820190508181036000830152613bee81613703565b9050919050565b60006020820190508181036000830152613c0e81613726565b9050919050565b60006020820190508181036000830152613c2e81613749565b9050919050565b60006020820190508181036000830152613c4e8161376c565b9050919050565b60006020820190508181036000830152613c6e8161378f565b9050919050565b60006020820190508181036000830152613c8e816137b2565b9050919050565b60006020820190508181036000830152613cae816137d5565b9050919050565b60006020820190508181036000830152613cce816137f8565b9050919050565b60006020820190508181036000830152613cee8161381b565b9050919050565b60006020820190508181036000830152613d0e8161383e565b9050919050565b60006020820190508181036000830152613d2e81613861565b9050919050565b60006020820190508181036000830152613d4e81613884565b9050919050565b60006020820190508181036000830152613d6e816138a7565b9050919050565b60006020820190508181036000830152613d8e816138ca565b9050919050565b60006020820190508181036000830152613dae816138ed565b9050919050565b60006020820190508181036000830152613dce81613910565b9050919050565b60006020820190508181036000830152613dee81613933565b9050919050565b60006020820190508181036000830152613e0e81613956565b9050919050565b60006020820190508181036000830152613e2e81613979565b9050919050565b60006020820190508181036000830152613e4e8161399c565b9050919050565b60006020820190508181036000830152613e6e816139bf565b9050919050565b60006020820190508181036000830152613e8e816139e2565b9050919050565b60006020820190508181036000830152613eae81613a05565b9050919050565b60006020820190508181036000830152613ece81613a28565b9050919050565b60006020820190508181036000830152613eee81613a4b565b9050919050565b60006020820190508181036000830152613f0e81613a6e565b9050919050565b6000602082019050613f2a6000830184613a91565b92915050565b6000613f3a613f4b565b9050613f468282614264565b919050565b6000604051905090565b600067ffffffffffffffff821115613f7057613f6f6143fa565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f9c57613f9b6143fa565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613fc857613fc76143fa565b5b613fd182614442565b9050602081019050919050565b600067ffffffffffffffff821115613ff957613ff86143fa565b5b61400282614442565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614072826141e6565b915061407d836141e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140b2576140b161430f565b5b828201905092915050565b60006140c8826141e6565b91506140d3836141e6565b9250826140e3576140e261433e565b5b828204905092915050565b60006140f9826141e6565b9150614104836141e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561413d5761413c61430f565b5b828202905092915050565b6000614153826141e6565b915061415e836141e6565b9250828210156141715761417061430f565b5b828203905092915050565b6000614187826141c6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561421d578082015181840152602081019050614202565b8381111561422c576000848401525b50505050565b6000600282049050600182168061424a57607f821691505b6020821081141561425e5761425d61436d565b5b50919050565b61426d82614442565b810181811067ffffffffffffffff8211171561428c5761428b6143fa565b5b80604052505050565b60006142a0826141e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142d3576142d261430f565b5b600182019050919050565b60006142e9826141e6565b91506142f4836141e6565b9250826143045761430361433e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f57686974656c697374206973206e6f7420616374697665000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f50757263686173652065786365656473206d6178207768697465656400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360008201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d6178207075626c696360008201527f20737570706c79206f66204e4654730000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f53686f756c6420686176652073616d65206c656e677468000000000000000000600082015250565b7f416c6c207075626c696320746f6b656e732068617665206265656e206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560008201527f64206e756d626572206f66207075626c696320746f6b656e7300000000000000602082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b614bad8161417c565b8114614bb857600080fd5b50565b614bc48161418e565b8114614bcf57600080fd5b50565b614bdb8161419a565b8114614be657600080fd5b50565b614bf2816141e6565b8114614bfd57600080fd5b5056fea26469706673582212206b7f469e6a8b23e50d6e0b1d75fff1dcf374d533f4189e6d66212f14f5ea0acf64736f6c63430008070033

Deployed Bytecode Sourcemap

49881:5680:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55059:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21493:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23052:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22575:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35182:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50398:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50493:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23942:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50908:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34850:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53401:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51941:280;;;;;;;;;;;;;:::i;:::-;;51162:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24352:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35372:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51421:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50704:98;;;;;;;;;;;;;:::i;:::-;;50425:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21187:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20917:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49250:94;;;;;;;;;;;;;:::i;:::-;;48599:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52382:931;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21662:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50312:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23345:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50373:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24608:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53753:604;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54501:484;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50213:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50162:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51642:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23711:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50610:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49499:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55059:235;55219:4;55249:37;55273:12;55249:23;:37::i;:::-;55242:44;;55059:235;;;:::o;21493:100::-;21547:13;21580:5;21573:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21493:100;:::o;23052:221::-;23128:7;23156:16;23164:7;23156;:16::i;:::-;23148:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23241:15;:24;23257:7;23241:24;;;;;;;;;;;;;;;;;;;;;23234:31;;23052:221;;;:::o;22575:411::-;22656:13;22672:23;22687:7;22672:14;:23::i;:::-;22656:39;;22720:5;22714:11;;:2;:11;;;;22706:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22814:5;22798:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22823:37;22840:5;22847:12;:10;:12::i;:::-;22823:16;:37::i;:::-;22798:62;22776:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22957:21;22966:2;22970:7;22957:8;:21::i;:::-;22645:341;22575:411;;:::o;35182:113::-;35243:7;35270:10;:17;;;;35263:24;;35182:113;:::o;50398:20::-;;;;;;;;;;;;;:::o;50493:51::-;;;;;;;;;;;;;;;;;:::o;23942:339::-;24137:41;24156:12;:10;:12::i;:::-;24170:7;24137:18;:41::i;:::-;24129:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24245:28;24255:4;24261:2;24265:7;24245:9;:28::i;:::-;23942:339;;;:::o;50908:137::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51028:9:::1;51017:8;;:20;;;;;;;;;;;;;;;;;;50908:137:::0;:::o;34850:256::-;34947:7;34983:23;35000:5;34983:16;:23::i;:::-;34975:5;:31;34967:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35072:12;:19;35085:5;35072:19;;;;;;;;;;;;;;;:26;35092:5;35072:26;;;;;;;;;;;;35065:33;;34850:256;;;;:::o;53401:260::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50300:5:::1;53539:8;:18;53531:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;53629:24;53639:3;53644:8;53629:9;:24::i;:::-;53401:260:::0;;:::o;51941:280::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52021:12:::1;52036:21;52021:36;;52086:1;52076:7;:11;52068:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;52151:42;52135:69;;:78;52205:7;52135:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52010:211;51941:280::o:0;51162:149::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51294:9:::1;51276:15;;:27;;;;;;;;;;;;;;;;;;51162:149:::0;:::o;24352:185::-;24490:39;24507:4;24513:2;24517:7;24490:39;;;;;;;;;;;;:16;:39::i;:::-;24352:185;;;:::o;35372:233::-;35447:7;35483:30;:28;:30::i;:::-;35475:5;:38;35467:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35580:10;35591:5;35580:17;;;;;;;;:::i;:::-;;;;;;;;;;35573:24;;35372:233;;;:::o;51421:149::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51553:9:::1;51536:14;;:26;;;;;;;;;;;;;;;;;;51421:149:::0;:::o;50704:98::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50790:4:::1;50781:6;;:13;;;;;;;;;;;;;;;;;;50704:98::o:0;50425:27::-;;;;;;;;;;;;;:::o;21187:239::-;21259:7;21279:13;21295:7;:16;21303:7;21295:16;;;;;;;;;;;;;;;;;;;;;21279:32;;21347:1;21330:19;;:5;:19;;;;21322:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21413:5;21406:12;;;21187:239;;;:::o;20917:208::-;20989:7;21034:1;21017:19;;:5;:19;;;;21009:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21101:9;:16;21111:5;21101:16;;;;;;;;;;;;;;;;21094:23;;20917:208;;;:::o;49250:94::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49315:21:::1;49333:1;49315:9;:21::i;:::-;49250:94::o:0;48599:87::-;48645:7;48672:6;;;;;;;;;;;48665:13;;48599:87;:::o;52382:931::-;52496:8;;;;;;;;;;;52488:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;52546:15;;;;;;;;;;;52538:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;50254:4;52608:13;:11;:13::i;:::-;:30;52600:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;50205:1;52696:12;:32;;52688:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;50254:4;52784:50;52820:13;;52784:31;52802:12;52784:13;:11;:13::i;:::-;:17;;:31;;;;:::i;:::-;:35;;:50;;;;:::i;:::-;:68;;52776:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;50205:1;52923:46;52956:12;52923:16;:28;52940:10;52923:28;;;;;;;;;;;;;;;;:32;;:46;;;;:::i;:::-;:66;;52915:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;53068:9;53041:23;53051:12;53041:5;;:9;;:23;;;;:::i;:::-;:36;53033:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;53129:9;53141:1;53129:13;;53124:182;53149:12;53144:1;:17;53124:182;;53219:1;53187:16;:28;53204:10;53187:28;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;53239:55;53249:10;53261:32;53279:13;;53261;:11;:13::i;:::-;:17;;:32;;;;:::i;:::-;53239:9;:55::i;:::-;53163:3;;;;;:::i;:::-;;;;53124:182;;;;52382:931;:::o;21662:104::-;21718:13;21751:7;21744:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21662:104;:::o;50312:41::-;;;;:::o;23345:295::-;23460:12;:10;:12::i;:::-;23448:24;;:8;:24;;;;23440:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23560:8;23515:18;:32;23534:12;:10;:12::i;:::-;23515:32;;;;;;;;;;;;;;;:42;23548:8;23515:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23613:8;23584:48;;23599:12;:10;:12::i;:::-;23584:48;;;23623:8;23584:48;;;;;;:::i;:::-;;;;;;;;23345:295;;:::o;50373:18::-;;;;;;;;;;;;;:::o;24608:328::-;24783:41;24802:12;:10;:12::i;:::-;24816:7;24783:18;:41::i;:::-;24775:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24889:39;24903:4;24909:2;24913:7;24922:5;24889:13;:39::i;:::-;24608:328;;;;:::o;53753:604::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53930:8:::1;:15;53916:3;:10;:29;53908:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53988:9;53984:366;54007:3;:10;54003:1;:14;53984:366;;;50254:4;54046:8;54055:1;54046:11;;;;;;;;:::i;:::-;;;;;;;;:29;;54038:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;50300:5;54160:8;54169:1;54160:11;;;;;;;;:::i;:::-;;;;;;;;:21;54152:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;54257:30;54267:3;54271:1;54267:6;;;;;;;;:::i;:::-;;;;;;;;54275:8;54284:1;54275:11;;;;;;;;:::i;:::-;;;;;;;;54257:9;:30::i;:::-;54318:20;54336:1;54318:13;;:17;;:20;;;;:::i;:::-;54302:13;:36;;;;54019:3;;;;;:::i;:::-;;;;53984:366;;;;53753:604:::0;;:::o;54501:484::-;54640:13;54680:17;54688:8;54680:7;:17::i;:::-;54672:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;54765:6;;;;;;;;;;;54760:218;;54819:8;54829:19;:8;:17;:19::i;:::-;54850:9;54802:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54788:73;;;;54760:218;54925:7;54934:19;:8;:17;:19::i;:::-;54955:9;54908:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54894:72;;54501:484;;;;:::o;50213:45::-;50254:4;50213:45;:::o;50162:44::-;50205:1;50162:44;:::o;51642:197::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51797:9:::1;51786:8;:20;;;;;;;;;;;;:::i;:::-;;51827:4;51817:7;:14;;;;;;;;;;;;:::i;:::-;;51642:197:::0;;:::o;23711:164::-;23808:4;23832:18;:25;23851:5;23832:25;;;;;;;;;;;;;;;:35;23858:8;23832:35;;;;;;;;;;;;;;;;;;;;;;;;;23825:42;;23711:164;;;;:::o;50610:28::-;;;;:::o;49499:192::-;48830:12;:10;:12::i;:::-;48819:23;;:7;:5;:7::i;:::-;:23;;;48811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49608:1:::1;49588:22;;:8;:22;;;;49580:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49664:19;49674:8;49664:9;:19::i;:::-;49499:192:::0;:::o;34542:224::-;34644:4;34683:35;34668:50;;;:11;:50;;;;:90;;;;34722:36;34746:11;34722:23;:36::i;:::-;34668:90;34661:97;;34542:224;;;:::o;26446:127::-;26511:4;26563:1;26535:30;;:7;:16;26543:7;26535:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26528:37;;26446:127;;;:::o;16055:98::-;16108:7;16135:10;16128:17;;16055:98;:::o;30428:174::-;30530:2;30503:15;:24;30519:7;30503:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30586:7;30582:2;30548:46;;30557:23;30572:7;30557:14;:23::i;:::-;30548:46;;;;;;;;;;;;30428:174;;:::o;26740:348::-;26833:4;26858:16;26866:7;26858;:16::i;:::-;26850:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26934:13;26950:23;26965:7;26950:14;:23::i;:::-;26934:39;;27003:5;26992:16;;:7;:16;;;:51;;;;27036:7;27012:31;;:20;27024:7;27012:11;:20::i;:::-;:31;;;26992:51;:87;;;;27047:32;27064:5;27071:7;27047:16;:32::i;:::-;26992:87;26984:96;;;26740:348;;;;:::o;29732:578::-;29891:4;29864:31;;:23;29879:7;29864:14;:23::i;:::-;:31;;;29856:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29974:1;29960:16;;:2;:16;;;;29952:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30030:39;30051:4;30057:2;30061:7;30030:20;:39::i;:::-;30134:29;30151:1;30155:7;30134:8;:29::i;:::-;30195:1;30176:9;:15;30186:4;30176:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30224:1;30207:9;:13;30217:2;30207:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30255:2;30236:7;:16;30244:7;30236:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30294:7;30290:2;30275:27;;30284:4;30275:27;;;;;;;;;;;;29732:578;;;:::o;27430:110::-;27506:26;27516:2;27520:7;27506:26;;;;;;;;;;;;:9;:26::i;:::-;27430:110;;:::o;49699:173::-;49755:16;49774:6;;;;;;;;;;;49755:25;;49800:8;49791:6;;:17;;;;;;;;;;;;;;;;;;49855:8;49824:40;;49845:8;49824:40;;;;;;;;;;;;49744:128;49699:173;:::o;43461:98::-;43519:7;43550:1;43546;:5;;;;:::i;:::-;43539:12;;43461:98;;;;:::o;43842:::-;43900:7;43931:1;43927;:5;;;;:::i;:::-;43920:12;;43842:98;;;;:::o;44199:::-;44257:7;44288:1;44284;:5;;;;:::i;:::-;44277:12;;44199:98;;;;:::o;25818:315::-;25975:28;25985:4;25991:2;25995:7;25975:9;:28::i;:::-;26022:48;26045:4;26051:2;26055:7;26064:5;26022:22;:48::i;:::-;26014:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25818:315;;;;:::o;16557:723::-;16613:13;16843:1;16834:5;:10;16830:53;;;16861:10;;;;;;;;;;;;;;;;;;;;;16830:53;16893:12;16908:5;16893:20;;16924:14;16949:78;16964:1;16956:4;:9;16949:78;;16982:8;;;;;:::i;:::-;;;;17013:2;17005:10;;;;;:::i;:::-;;;16949:78;;;17037:19;17069:6;17059:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17037:39;;17087:154;17103:1;17094:5;:10;17087:154;;17131:1;17121:11;;;;;:::i;:::-;;;17198:2;17190:5;:10;;;;:::i;:::-;17177:2;:24;;;;:::i;:::-;17164:39;;17147:6;17154;17147:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17227:2;17218:11;;;;;:::i;:::-;;;17087:154;;;17265:6;17251:21;;;;;16557:723;;;;:::o;20548:305::-;20650:4;20702:25;20687:40;;;:11;:40;;;;:105;;;;20759:33;20744:48;;;:11;:48;;;;20687:105;:158;;;;20809:36;20833:11;20809:23;:36::i;:::-;20687:158;20667:178;;20548:305;;;:::o;55307:249::-;55500:48;55527:5;55534:3;55539:8;55500:26;:48::i;:::-;55307:249;;;:::o;27767:321::-;27897:18;27903:2;27907:7;27897:5;:18::i;:::-;27948:54;27979:1;27983:2;27987:7;27996:5;27948:22;:54::i;:::-;27926:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27767:321;;;:::o;31167:799::-;31322:4;31343:15;:2;:13;;;:15::i;:::-;31339:620;;;31395:2;31379:36;;;31416:12;:10;:12::i;:::-;31430:4;31436:7;31445:5;31379:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31375:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31638:1;31621:6;:13;:18;31617:272;;;31664:60;;;;;;;;;;:::i;:::-;;;;;;;;31617:272;31839:6;31833:13;31824:6;31820:2;31816:15;31809:38;31375:529;31512:41;;;31502:51;;;:6;:51;;;;31495:58;;;;;31339:620;31943:4;31936:11;;31167:799;;;;;;;:::o;19089:157::-;19174:4;19213:25;19198:40;;;:11;:40;;;;19191:47;;19089:157;;;:::o;36218:589::-;36362:45;36389:4;36395:2;36399:7;36362:26;:45::i;:::-;36440:1;36424:18;;:4;:18;;;36420:187;;;36459:40;36491:7;36459:31;:40::i;:::-;36420:187;;;36529:2;36521:10;;:4;:10;;;36517:90;;36548:47;36581:4;36587:7;36548:32;:47::i;:::-;36517:90;36420:187;36635:1;36621:16;;:2;:16;;;36617:183;;;36654:45;36691:7;36654:36;:45::i;:::-;36617:183;;;36727:4;36721:10;;:2;:10;;;36717:83;;36748:40;36776:2;36780:7;36748:27;:40::i;:::-;36717:83;36617:183;36218:589;;;:::o;28424:382::-;28518:1;28504:16;;:2;:16;;;;28496:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28577:16;28585:7;28577;:16::i;:::-;28576:17;28568:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28639:45;28668:1;28672:2;28676:7;28639:20;:45::i;:::-;28714:1;28697:9;:13;28707:2;28697:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28745:2;28726:7;:16;28734:7;28726:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28790:7;28786:2;28765:33;;28782:1;28765:33;;;;;;;;;;;;28424:382;;:::o;8122:387::-;8182:4;8390:12;8457:7;8445:20;8437:28;;8500:1;8493:4;:8;8486:15;;;8122:387;;;:::o;32538:126::-;;;;:::o;37530:164::-;37634:10;:17;;;;37607:15;:24;37623:7;37607:24;;;;;;;;;;;:44;;;;37662:10;37678:7;37662:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37530:164;:::o;38321:988::-;38587:22;38637:1;38612:22;38629:4;38612:16;:22::i;:::-;:26;;;;:::i;:::-;38587:51;;38649:18;38670:17;:26;38688:7;38670:26;;;;;;;;;;;;38649:47;;38817:14;38803:10;:28;38799:328;;38848:19;38870:12;:18;38883:4;38870:18;;;;;;;;;;;;;;;:34;38889:14;38870:34;;;;;;;;;;;;38848:56;;38954:11;38921:12;:18;38934:4;38921:18;;;;;;;;;;;;;;;:30;38940:10;38921:30;;;;;;;;;;;:44;;;;39071:10;39038:17;:30;39056:11;39038:30;;;;;;;;;;;:43;;;;38833:294;38799:328;39223:17;:26;39241:7;39223:26;;;;;;;;;;;39216:33;;;39267:12;:18;39280:4;39267:18;;;;;;;;;;;;;;;:34;39286:14;39267:34;;;;;;;;;;;39260:41;;;38402:907;;38321:988;;:::o;39604:1079::-;39857:22;39902:1;39882:10;:17;;;;:21;;;;:::i;:::-;39857:46;;39914:18;39935:15;:24;39951:7;39935:24;;;;;;;;;;;;39914:45;;40286:19;40308:10;40319:14;40308:26;;;;;;;;:::i;:::-;;;;;;;;;;40286:48;;40372:11;40347:10;40358;40347:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40483:10;40452:15;:28;40468:11;40452:28;;;;;;;;;;;:41;;;;40624:15;:24;40640:7;40624:24;;;;;;;;;;;40617:31;;;40659:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39675:1008;;;39604:1079;:::o;37108:221::-;37193:14;37210:20;37227:2;37210:16;:20::i;:::-;37193:37;;37268:7;37241:12;:16;37254:2;37241:16;;;;;;;;;;;;;;;:24;37258:6;37241:24;;;;;;;;;;;:34;;;;37315:6;37286:17;:26;37304:7;37286:26;;;;;;;;;;;:35;;;;37182:147;37108:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:619::-;5445:6;5453;5461;5510:2;5498:9;5489:7;5485:23;5481:32;5478:119;;;5516:79;;:::i;:::-;5478:119;5636:1;5661:53;5706:7;5697:6;5686:9;5682:22;5661:53;:::i;:::-;5651:63;;5607:117;5763:2;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5734:118;5891:2;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5862:118;5368:619;;;;;:::o;5993:943::-;6088:6;6096;6104;6112;6161:3;6149:9;6140:7;6136:23;6132:33;6129:120;;;6168:79;;:::i;:::-;6129:120;6288:1;6313:53;6358:7;6349:6;6338:9;6334:22;6313:53;:::i;:::-;6303:63;;6259:117;6415:2;6441:53;6486:7;6477:6;6466:9;6462:22;6441:53;:::i;:::-;6431:63;;6386:118;6543:2;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6514:118;6699:2;6688:9;6684:18;6671:32;6730:18;6722:6;6719:30;6716:117;;;6752:79;;:::i;:::-;6716:117;6857:62;6911:7;6902:6;6891:9;6887:22;6857:62;:::i;:::-;6847:72;;6642:287;5993:943;;;;;;;:::o;6942:468::-;7007:6;7015;7064:2;7052:9;7043:7;7039:23;7035:32;7032:119;;;7070:79;;:::i;:::-;7032:119;7190:1;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7161:117;7317:2;7343:50;7385:7;7376:6;7365:9;7361:22;7343:50;:::i;:::-;7333:60;;7288:115;6942:468;;;;;:::o;7416:474::-;7484:6;7492;7541:2;7529:9;7520:7;7516:23;7512:32;7509:119;;;7547:79;;:::i;:::-;7509:119;7667:1;7692:53;7737:7;7728:6;7717:9;7713:22;7692:53;:::i;:::-;7682:63;;7638:117;7794:2;7820:53;7865:7;7856:6;7845:9;7841:22;7820:53;:::i;:::-;7810:63;;7765:118;7416:474;;;;;:::o;7896:894::-;8014:6;8022;8071:2;8059:9;8050:7;8046:23;8042:32;8039:119;;;8077:79;;:::i;:::-;8039:119;8225:1;8214:9;8210:17;8197:31;8255:18;8247:6;8244:30;8241:117;;;8277:79;;:::i;:::-;8241:117;8382:78;8452:7;8443:6;8432:9;8428:22;8382:78;:::i;:::-;8372:88;;8168:302;8537:2;8526:9;8522:18;8509:32;8568:18;8560:6;8557:30;8554:117;;;8590:79;;:::i;:::-;8554:117;8695:78;8765:7;8756:6;8745:9;8741:22;8695:78;:::i;:::-;8685:88;;8480:303;7896:894;;;;;:::o;8796:323::-;8852:6;8901:2;8889:9;8880:7;8876:23;8872:32;8869:119;;;8907:79;;:::i;:::-;8869:119;9027:1;9052:50;9094:7;9085:6;9074:9;9070:22;9052:50;:::i;:::-;9042:60;;8998:114;8796:323;;;;:::o;9125:327::-;9183:6;9232:2;9220:9;9211:7;9207:23;9203:32;9200:119;;;9238:79;;:::i;:::-;9200:119;9358:1;9383:52;9427:7;9418:6;9407:9;9403:22;9383:52;:::i;:::-;9373:62;;9329:116;9125:327;;;;:::o;9458:349::-;9527:6;9576:2;9564:9;9555:7;9551:23;9547:32;9544:119;;;9582:79;;:::i;:::-;9544:119;9702:1;9727:63;9782:7;9773:6;9762:9;9758:22;9727:63;:::i;:::-;9717:73;;9673:127;9458:349;;;;:::o;9813:834::-;9901:6;9909;9958:2;9946:9;9937:7;9933:23;9929:32;9926:119;;;9964:79;;:::i;:::-;9926:119;10112:1;10101:9;10097:17;10084:31;10142:18;10134:6;10131:30;10128:117;;;10164:79;;:::i;:::-;10128:117;10269:63;10324:7;10315:6;10304:9;10300:22;10269:63;:::i;:::-;10259:73;;10055:287;10409:2;10398:9;10394:18;10381:32;10440:18;10432:6;10429:30;10426:117;;;10462:79;;:::i;:::-;10426:117;10567:63;10622:7;10613:6;10602:9;10598:22;10567:63;:::i;:::-;10557:73;;10352:288;9813:834;;;;;:::o;10653:329::-;10712:6;10761:2;10749:9;10740:7;10736:23;10732:32;10729:119;;;10767:79;;:::i;:::-;10729:119;10887:1;10912:53;10957:7;10948:6;10937:9;10933:22;10912:53;:::i;:::-;10902:63;;10858:117;10653:329;;;;:::o;10988:118::-;11075:24;11093:5;11075:24;:::i;:::-;11070:3;11063:37;10988:118;;:::o;11112:109::-;11193:21;11208:5;11193:21;:::i;:::-;11188:3;11181:34;11112:109;;:::o;11227:360::-;11313:3;11341:38;11373:5;11341:38;:::i;:::-;11395:70;11458:6;11453:3;11395:70;:::i;:::-;11388:77;;11474:52;11519:6;11514:3;11507:4;11500:5;11496:16;11474:52;:::i;:::-;11551:29;11573:6;11551:29;:::i;:::-;11546:3;11542:39;11535:46;;11317:270;11227:360;;;;:::o;11593:364::-;11681:3;11709:39;11742:5;11709:39;:::i;:::-;11764:71;11828:6;11823:3;11764:71;:::i;:::-;11757:78;;11844:52;11889:6;11884:3;11877:4;11870:5;11866:16;11844:52;:::i;:::-;11921:29;11943:6;11921:29;:::i;:::-;11916:3;11912:39;11905:46;;11685:272;11593:364;;;;:::o;11963:377::-;12069:3;12097:39;12130:5;12097:39;:::i;:::-;12152:89;12234:6;12229:3;12152:89;:::i;:::-;12145:96;;12250:52;12295:6;12290:3;12283:4;12276:5;12272:16;12250:52;:::i;:::-;12327:6;12322:3;12318:16;12311:23;;12073:267;11963:377;;;;:::o;12370:845::-;12473:3;12510:5;12504:12;12539:36;12565:9;12539:36;:::i;:::-;12591:89;12673:6;12668:3;12591:89;:::i;:::-;12584:96;;12711:1;12700:9;12696:17;12727:1;12722:137;;;;12873:1;12868:341;;;;12689:520;;12722:137;12806:4;12802:9;12791;12787:25;12782:3;12775:38;12842:6;12837:3;12833:16;12826:23;;12722:137;;12868:341;12935:38;12967:5;12935:38;:::i;:::-;12995:1;13009:154;13023:6;13020:1;13017:13;13009:154;;;13097:7;13091:14;13087:1;13082:3;13078:11;13071:35;13147:1;13138:7;13134:15;13123:26;;13045:4;13042:1;13038:12;13033:17;;13009:154;;;13192:6;13187:3;13183:16;13176:23;;12875:334;;12689:520;;12477:738;;12370:845;;;;:::o;13221:366::-;13363:3;13384:67;13448:2;13443:3;13384:67;:::i;:::-;13377:74;;13460:93;13549:3;13460:93;:::i;:::-;13578:2;13573:3;13569:12;13562:19;;13221:366;;;:::o;13593:::-;13735:3;13756:67;13820:2;13815:3;13756:67;:::i;:::-;13749:74;;13832:93;13921:3;13832:93;:::i;:::-;13950:2;13945:3;13941:12;13934:19;;13593:366;;;:::o;13965:::-;14107:3;14128:67;14192:2;14187:3;14128:67;:::i;:::-;14121:74;;14204:93;14293:3;14204:93;:::i;:::-;14322:2;14317:3;14313:12;14306:19;;13965:366;;;:::o;14337:::-;14479:3;14500:67;14564:2;14559:3;14500:67;:::i;:::-;14493:74;;14576:93;14665:3;14576:93;:::i;:::-;14694:2;14689:3;14685:12;14678:19;;14337:366;;;:::o;14709:::-;14851:3;14872:67;14936:2;14931:3;14872:67;:::i;:::-;14865:74;;14948:93;15037:3;14948:93;:::i;:::-;15066:2;15061:3;15057:12;15050:19;;14709:366;;;:::o;15081:::-;15223:3;15244:67;15308:2;15303:3;15244:67;:::i;:::-;15237:74;;15320:93;15409:3;15320:93;:::i;:::-;15438:2;15433:3;15429:12;15422:19;;15081:366;;;:::o;15453:::-;15595:3;15616:67;15680:2;15675:3;15616:67;:::i;:::-;15609:74;;15692:93;15781:3;15692:93;:::i;:::-;15810:2;15805:3;15801:12;15794:19;;15453:366;;;:::o;15825:::-;15967:3;15988:67;16052:2;16047:3;15988:67;:::i;:::-;15981:74;;16064:93;16153:3;16064:93;:::i;:::-;16182:2;16177:3;16173:12;16166:19;;15825:366;;;:::o;16197:::-;16339:3;16360:67;16424:2;16419:3;16360:67;:::i;:::-;16353:74;;16436:93;16525:3;16436:93;:::i;:::-;16554:2;16549:3;16545:12;16538:19;;16197:366;;;:::o;16569:::-;16711:3;16732:67;16796:2;16791:3;16732:67;:::i;:::-;16725:74;;16808:93;16897:3;16808:93;:::i;:::-;16926:2;16921:3;16917:12;16910:19;;16569:366;;;:::o;16941:::-;17083:3;17104:67;17168:2;17163:3;17104:67;:::i;:::-;17097:74;;17180:93;17269:3;17180:93;:::i;:::-;17298:2;17293:3;17289:12;17282:19;;16941:366;;;:::o;17313:::-;17455:3;17476:67;17540:2;17535:3;17476:67;:::i;:::-;17469:74;;17552:93;17641:3;17552:93;:::i;:::-;17670:2;17665:3;17661:12;17654:19;;17313:366;;;:::o;17685:::-;17827:3;17848:67;17912:2;17907:3;17848:67;:::i;:::-;17841:74;;17924:93;18013:3;17924:93;:::i;:::-;18042:2;18037:3;18033:12;18026:19;;17685:366;;;:::o;18057:::-;18199:3;18220:67;18284:2;18279:3;18220:67;:::i;:::-;18213:74;;18296:93;18385:3;18296:93;:::i;:::-;18414:2;18409:3;18405:12;18398:19;;18057:366;;;:::o;18429:::-;18571:3;18592:67;18656:2;18651:3;18592:67;:::i;:::-;18585:74;;18668:93;18757:3;18668:93;:::i;:::-;18786:2;18781:3;18777:12;18770:19;;18429:366;;;:::o;18801:::-;18943:3;18964:67;19028:2;19023:3;18964:67;:::i;:::-;18957:74;;19040:93;19129:3;19040:93;:::i;:::-;19158:2;19153:3;19149:12;19142:19;;18801:366;;;:::o;19173:::-;19315:3;19336:67;19400:2;19395:3;19336:67;:::i;:::-;19329:74;;19412:93;19501:3;19412:93;:::i;:::-;19530:2;19525:3;19521:12;19514:19;;19173:366;;;:::o;19545:::-;19687:3;19708:67;19772:2;19767:3;19708:67;:::i;:::-;19701:74;;19784:93;19873:3;19784:93;:::i;:::-;19902:2;19897:3;19893:12;19886:19;;19545:366;;;:::o;19917:::-;20059:3;20080:67;20144:2;20139:3;20080:67;:::i;:::-;20073:74;;20156:93;20245:3;20156:93;:::i;:::-;20274:2;20269:3;20265:12;20258:19;;19917:366;;;:::o;20289:::-;20431:3;20452:67;20516:2;20511:3;20452:67;:::i;:::-;20445:74;;20528:93;20617:3;20528:93;:::i;:::-;20646:2;20641:3;20637:12;20630:19;;20289:366;;;:::o;20661:::-;20803:3;20824:67;20888:2;20883:3;20824:67;:::i;:::-;20817:74;;20900:93;20989:3;20900:93;:::i;:::-;21018:2;21013:3;21009:12;21002:19;;20661:366;;;:::o;21033:::-;21175:3;21196:67;21260:2;21255:3;21196:67;:::i;:::-;21189:74;;21272:93;21361:3;21272:93;:::i;:::-;21390:2;21385:3;21381:12;21374:19;;21033:366;;;:::o;21405:::-;21547:3;21568:67;21632:2;21627:3;21568:67;:::i;:::-;21561:74;;21644:93;21733:3;21644:93;:::i;:::-;21762:2;21757:3;21753:12;21746:19;;21405:366;;;:::o;21777:::-;21919:3;21940:67;22004:2;21999:3;21940:67;:::i;:::-;21933:74;;22016:93;22105:3;22016:93;:::i;:::-;22134:2;22129:3;22125:12;22118:19;;21777:366;;;:::o;22149:::-;22291:3;22312:67;22376:2;22371:3;22312:67;:::i;:::-;22305:74;;22388:93;22477:3;22388:93;:::i;:::-;22506:2;22501:3;22497:12;22490:19;;22149:366;;;:::o;22521:::-;22663:3;22684:67;22748:2;22743:3;22684:67;:::i;:::-;22677:74;;22760:93;22849:3;22760:93;:::i;:::-;22878:2;22873:3;22869:12;22862:19;;22521:366;;;:::o;22893:::-;23035:3;23056:67;23120:2;23115:3;23056:67;:::i;:::-;23049:74;;23132:93;23221:3;23132:93;:::i;:::-;23250:2;23245:3;23241:12;23234:19;;22893:366;;;:::o;23265:::-;23407:3;23428:67;23492:2;23487:3;23428:67;:::i;:::-;23421:74;;23504:93;23593:3;23504:93;:::i;:::-;23622:2;23617:3;23613:12;23606:19;;23265:366;;;:::o;23637:::-;23779:3;23800:67;23864:2;23859:3;23800:67;:::i;:::-;23793:74;;23876:93;23965:3;23876:93;:::i;:::-;23994:2;23989:3;23985:12;23978:19;;23637:366;;;:::o;24009:118::-;24096:24;24114:5;24096:24;:::i;:::-;24091:3;24084:37;24009:118;;:::o;24133:583::-;24355:3;24377:92;24465:3;24456:6;24377:92;:::i;:::-;24370:99;;24486:95;24577:3;24568:6;24486:95;:::i;:::-;24479:102;;24598:92;24686:3;24677:6;24598:92;:::i;:::-;24591:99;;24707:3;24700:10;;24133:583;;;;;;:::o;24722:222::-;24815:4;24853:2;24842:9;24838:18;24830:26;;24866:71;24934:1;24923:9;24919:17;24910:6;24866:71;:::i;:::-;24722:222;;;;:::o;24950:640::-;25145:4;25183:3;25172:9;25168:19;25160:27;;25197:71;25265:1;25254:9;25250:17;25241:6;25197:71;:::i;:::-;25278:72;25346:2;25335:9;25331:18;25322:6;25278:72;:::i;:::-;25360;25428:2;25417:9;25413:18;25404:6;25360:72;:::i;:::-;25479:9;25473:4;25469:20;25464:2;25453:9;25449:18;25442:48;25507:76;25578:4;25569:6;25507:76;:::i;:::-;25499:84;;24950:640;;;;;;;:::o;25596:210::-;25683:4;25721:2;25710:9;25706:18;25698:26;;25734:65;25796:1;25785:9;25781:17;25772:6;25734:65;:::i;:::-;25596:210;;;;:::o;25812:313::-;25925:4;25963:2;25952:9;25948:18;25940:26;;26012:9;26006:4;26002:20;25998:1;25987:9;25983:17;25976:47;26040:78;26113:4;26104:6;26040:78;:::i;:::-;26032:86;;25812:313;;;;:::o;26131:419::-;26297:4;26335:2;26324:9;26320:18;26312:26;;26384:9;26378:4;26374:20;26370:1;26359:9;26355:17;26348:47;26412:131;26538:4;26412:131;:::i;:::-;26404:139;;26131:419;;;:::o;26556:::-;26722:4;26760:2;26749:9;26745:18;26737:26;;26809:9;26803:4;26799:20;26795:1;26784:9;26780:17;26773:47;26837:131;26963:4;26837:131;:::i;:::-;26829:139;;26556:419;;;:::o;26981:::-;27147:4;27185:2;27174:9;27170:18;27162:26;;27234:9;27228:4;27224:20;27220:1;27209:9;27205:17;27198:47;27262:131;27388:4;27262:131;:::i;:::-;27254:139;;26981:419;;;:::o;27406:::-;27572:4;27610:2;27599:9;27595:18;27587:26;;27659:9;27653:4;27649:20;27645:1;27634:9;27630:17;27623:47;27687:131;27813:4;27687:131;:::i;:::-;27679:139;;27406:419;;;:::o;27831:::-;27997:4;28035:2;28024:9;28020:18;28012:26;;28084:9;28078:4;28074:20;28070:1;28059:9;28055:17;28048:47;28112:131;28238:4;28112:131;:::i;:::-;28104:139;;27831:419;;;:::o;28256:::-;28422:4;28460:2;28449:9;28445:18;28437:26;;28509:9;28503:4;28499:20;28495:1;28484:9;28480:17;28473:47;28537:131;28663:4;28537:131;:::i;:::-;28529:139;;28256:419;;;:::o;28681:::-;28847:4;28885:2;28874:9;28870:18;28862:26;;28934:9;28928:4;28924:20;28920:1;28909:9;28905:17;28898:47;28962:131;29088:4;28962:131;:::i;:::-;28954:139;;28681:419;;;:::o;29106:::-;29272:4;29310:2;29299:9;29295:18;29287:26;;29359:9;29353:4;29349:20;29345:1;29334:9;29330:17;29323:47;29387:131;29513:4;29387:131;:::i;:::-;29379:139;;29106:419;;;:::o;29531:::-;29697:4;29735:2;29724:9;29720:18;29712:26;;29784:9;29778:4;29774:20;29770:1;29759:9;29755:17;29748:47;29812:131;29938:4;29812:131;:::i;:::-;29804:139;;29531:419;;;:::o;29956:::-;30122:4;30160:2;30149:9;30145:18;30137:26;;30209:9;30203:4;30199:20;30195:1;30184:9;30180:17;30173:47;30237:131;30363:4;30237:131;:::i;:::-;30229:139;;29956:419;;;:::o;30381:::-;30547:4;30585:2;30574:9;30570:18;30562:26;;30634:9;30628:4;30624:20;30620:1;30609:9;30605:17;30598:47;30662:131;30788:4;30662:131;:::i;:::-;30654:139;;30381:419;;;:::o;30806:::-;30972:4;31010:2;30999:9;30995:18;30987:26;;31059:9;31053:4;31049:20;31045:1;31034:9;31030:17;31023:47;31087:131;31213:4;31087:131;:::i;:::-;31079:139;;30806:419;;;:::o;31231:::-;31397:4;31435:2;31424:9;31420:18;31412:26;;31484:9;31478:4;31474:20;31470:1;31459:9;31455:17;31448:47;31512:131;31638:4;31512:131;:::i;:::-;31504:139;;31231:419;;;:::o;31656:::-;31822:4;31860:2;31849:9;31845:18;31837:26;;31909:9;31903:4;31899:20;31895:1;31884:9;31880:17;31873:47;31937:131;32063:4;31937:131;:::i;:::-;31929:139;;31656:419;;;:::o;32081:::-;32247:4;32285:2;32274:9;32270:18;32262:26;;32334:9;32328:4;32324:20;32320:1;32309:9;32305:17;32298:47;32362:131;32488:4;32362:131;:::i;:::-;32354:139;;32081:419;;;:::o;32506:::-;32672:4;32710:2;32699:9;32695:18;32687:26;;32759:9;32753:4;32749:20;32745:1;32734:9;32730:17;32723:47;32787:131;32913:4;32787:131;:::i;:::-;32779:139;;32506:419;;;:::o;32931:::-;33097:4;33135:2;33124:9;33120:18;33112:26;;33184:9;33178:4;33174:20;33170:1;33159:9;33155:17;33148:47;33212:131;33338:4;33212:131;:::i;:::-;33204:139;;32931:419;;;:::o;33356:::-;33522:4;33560:2;33549:9;33545:18;33537:26;;33609:9;33603:4;33599:20;33595:1;33584:9;33580:17;33573:47;33637:131;33763:4;33637:131;:::i;:::-;33629:139;;33356:419;;;:::o;33781:::-;33947:4;33985:2;33974:9;33970:18;33962:26;;34034:9;34028:4;34024:20;34020:1;34009:9;34005:17;33998:47;34062:131;34188:4;34062:131;:::i;:::-;34054:139;;33781:419;;;:::o;34206:::-;34372:4;34410:2;34399:9;34395:18;34387:26;;34459:9;34453:4;34449:20;34445:1;34434:9;34430:17;34423:47;34487:131;34613:4;34487:131;:::i;:::-;34479:139;;34206:419;;;:::o;34631:::-;34797:4;34835:2;34824:9;34820:18;34812:26;;34884:9;34878:4;34874:20;34870:1;34859:9;34855:17;34848:47;34912:131;35038:4;34912:131;:::i;:::-;34904:139;;34631:419;;;:::o;35056:::-;35222:4;35260:2;35249:9;35245:18;35237:26;;35309:9;35303:4;35299:20;35295:1;35284:9;35280:17;35273:47;35337:131;35463:4;35337:131;:::i;:::-;35329:139;;35056:419;;;:::o;35481:::-;35647:4;35685:2;35674:9;35670:18;35662:26;;35734:9;35728:4;35724:20;35720:1;35709:9;35705:17;35698:47;35762:131;35888:4;35762:131;:::i;:::-;35754:139;;35481:419;;;:::o;35906:::-;36072:4;36110:2;36099:9;36095:18;36087:26;;36159:9;36153:4;36149:20;36145:1;36134:9;36130:17;36123:47;36187:131;36313:4;36187:131;:::i;:::-;36179:139;;35906:419;;;:::o;36331:::-;36497:4;36535:2;36524:9;36520:18;36512:26;;36584:9;36578:4;36574:20;36570:1;36559:9;36555:17;36548:47;36612:131;36738:4;36612:131;:::i;:::-;36604:139;;36331:419;;;:::o;36756:::-;36922:4;36960:2;36949:9;36945:18;36937:26;;37009:9;37003:4;36999:20;36995:1;36984:9;36980:17;36973:47;37037:131;37163:4;37037:131;:::i;:::-;37029:139;;36756:419;;;:::o;37181:::-;37347:4;37385:2;37374:9;37370:18;37362:26;;37434:9;37428:4;37424:20;37420:1;37409:9;37405:17;37398:47;37462:131;37588:4;37462:131;:::i;:::-;37454:139;;37181:419;;;:::o;37606:::-;37772:4;37810:2;37799:9;37795:18;37787:26;;37859:9;37853:4;37849:20;37845:1;37834:9;37830:17;37823:47;37887:131;38013:4;37887:131;:::i;:::-;37879:139;;37606:419;;;:::o;38031:::-;38197:4;38235:2;38224:9;38220:18;38212:26;;38284:9;38278:4;38274:20;38270:1;38259:9;38255:17;38248:47;38312:131;38438:4;38312:131;:::i;:::-;38304:139;;38031:419;;;:::o;38456:222::-;38549:4;38587:2;38576:9;38572:18;38564:26;;38600:71;38668:1;38657:9;38653:17;38644:6;38600:71;:::i;:::-;38456:222;;;;:::o;38684:129::-;38718:6;38745:20;;:::i;:::-;38735:30;;38774:33;38802:4;38794:6;38774:33;:::i;:::-;38684:129;;;:::o;38819:75::-;38852:6;38885:2;38879:9;38869:19;;38819:75;:::o;38900:311::-;38977:4;39067:18;39059:6;39056:30;39053:56;;;39089:18;;:::i;:::-;39053:56;39139:4;39131:6;39127:17;39119:25;;39199:4;39193;39189:15;39181:23;;38900:311;;;:::o;39217:::-;39294:4;39384:18;39376:6;39373:30;39370:56;;;39406:18;;:::i;:::-;39370:56;39456:4;39448:6;39444:17;39436:25;;39516:4;39510;39506:15;39498:23;;39217:311;;;:::o;39534:307::-;39595:4;39685:18;39677:6;39674:30;39671:56;;;39707:18;;:::i;:::-;39671:56;39745:29;39767:6;39745:29;:::i;:::-;39737:37;;39829:4;39823;39819:15;39811:23;;39534:307;;;:::o;39847:308::-;39909:4;39999:18;39991:6;39988:30;39985:56;;;40021:18;;:::i;:::-;39985:56;40059:29;40081:6;40059:29;:::i;:::-;40051:37;;40143:4;40137;40133:15;40125:23;;39847:308;;;:::o;40161:141::-;40210:4;40233:3;40225:11;;40256:3;40253:1;40246:14;40290:4;40287:1;40277:18;40269:26;;40161:141;;;:::o;40308:98::-;40359:6;40393:5;40387:12;40377:22;;40308:98;;;:::o;40412:99::-;40464:6;40498:5;40492:12;40482:22;;40412:99;;;:::o;40517:168::-;40600:11;40634:6;40629:3;40622:19;40674:4;40669:3;40665:14;40650:29;;40517:168;;;;:::o;40691:169::-;40775:11;40809:6;40804:3;40797:19;40849:4;40844:3;40840:14;40825:29;;40691:169;;;;:::o;40866:148::-;40968:11;41005:3;40990:18;;40866:148;;;;:::o;41020:305::-;41060:3;41079:20;41097:1;41079:20;:::i;:::-;41074:25;;41113:20;41131:1;41113:20;:::i;:::-;41108:25;;41267:1;41199:66;41195:74;41192:1;41189:81;41186:107;;;41273:18;;:::i;:::-;41186:107;41317:1;41314;41310:9;41303:16;;41020:305;;;;:::o;41331:185::-;41371:1;41388:20;41406:1;41388:20;:::i;:::-;41383:25;;41422:20;41440:1;41422:20;:::i;:::-;41417:25;;41461:1;41451:35;;41466:18;;:::i;:::-;41451:35;41508:1;41505;41501:9;41496:14;;41331:185;;;;:::o;41522:348::-;41562:7;41585:20;41603:1;41585:20;:::i;:::-;41580:25;;41619:20;41637:1;41619:20;:::i;:::-;41614:25;;41807:1;41739:66;41735:74;41732:1;41729:81;41724:1;41717:9;41710:17;41706:105;41703:131;;;41814:18;;:::i;:::-;41703:131;41862:1;41859;41855:9;41844:20;;41522:348;;;;:::o;41876:191::-;41916:4;41936:20;41954:1;41936:20;:::i;:::-;41931:25;;41970:20;41988:1;41970:20;:::i;:::-;41965:25;;42009:1;42006;42003:8;42000:34;;;42014:18;;:::i;:::-;42000:34;42059:1;42056;42052:9;42044:17;;41876:191;;;;:::o;42073:96::-;42110:7;42139:24;42157:5;42139:24;:::i;:::-;42128:35;;42073:96;;;:::o;42175:90::-;42209:7;42252:5;42245:13;42238:21;42227:32;;42175:90;;;:::o;42271:149::-;42307:7;42347:66;42340:5;42336:78;42325:89;;42271:149;;;:::o;42426:126::-;42463:7;42503:42;42496:5;42492:54;42481:65;;42426:126;;;:::o;42558:77::-;42595:7;42624:5;42613:16;;42558:77;;;:::o;42641:154::-;42725:6;42720:3;42715;42702:30;42787:1;42778:6;42773:3;42769:16;42762:27;42641:154;;;:::o;42801:307::-;42869:1;42879:113;42893:6;42890:1;42887:13;42879:113;;;42978:1;42973:3;42969:11;42963:18;42959:1;42954:3;42950:11;42943:39;42915:2;42912:1;42908:10;42903:15;;42879:113;;;43010:6;43007:1;43004:13;43001:101;;;43090:1;43081:6;43076:3;43072:16;43065:27;43001:101;42850:258;42801:307;;;:::o;43114:320::-;43158:6;43195:1;43189:4;43185:12;43175:22;;43242:1;43236:4;43232:12;43263:18;43253:81;;43319:4;43311:6;43307:17;43297:27;;43253:81;43381:2;43373:6;43370:14;43350:18;43347:38;43344:84;;;43400:18;;:::i;:::-;43344:84;43165:269;43114:320;;;:::o;43440:281::-;43523:27;43545:4;43523:27;:::i;:::-;43515:6;43511:40;43653:6;43641:10;43638:22;43617:18;43605:10;43602:34;43599:62;43596:88;;;43664:18;;:::i;:::-;43596:88;43704:10;43700:2;43693:22;43483:238;43440:281;;:::o;43727:233::-;43766:3;43789:24;43807:5;43789:24;:::i;:::-;43780:33;;43835:66;43828:5;43825:77;43822:103;;;43905:18;;:::i;:::-;43822:103;43952:1;43945:5;43941:13;43934:20;;43727:233;;;:::o;43966:176::-;43998:1;44015:20;44033:1;44015:20;:::i;:::-;44010:25;;44049:20;44067:1;44049:20;:::i;:::-;44044:25;;44088:1;44078:35;;44093:18;;:::i;:::-;44078:35;44134:1;44131;44127:9;44122:14;;43966:176;;;;:::o;44148:180::-;44196:77;44193:1;44186:88;44293:4;44290:1;44283:15;44317:4;44314:1;44307:15;44334:180;44382:77;44379:1;44372:88;44479:4;44476:1;44469:15;44503:4;44500:1;44493:15;44520:180;44568:77;44565:1;44558:88;44665:4;44662:1;44655:15;44689:4;44686:1;44679:15;44706:180;44754:77;44751:1;44744:88;44851:4;44848:1;44841:15;44875:4;44872:1;44865:15;44892:180;44940:77;44937:1;44930:88;45037:4;45034:1;45027:15;45061:4;45058:1;45051:15;45078:180;45126:77;45123:1;45116:88;45223:4;45220:1;45213:15;45247:4;45244:1;45237:15;45264:117;45373:1;45370;45363:12;45387:117;45496:1;45493;45486:12;45510:117;45619:1;45616;45609:12;45633:117;45742:1;45739;45732:12;45756:117;45865:1;45862;45855:12;45879:102;45920:6;45971:2;45967:7;45962:2;45955:5;45951:14;45947:28;45937:38;;45879:102;;;:::o;45987:173::-;46127:25;46123:1;46115:6;46111:14;46104:49;45987:173;:::o;46166:230::-;46306:34;46302:1;46294:6;46290:14;46283:58;46375:13;46370:2;46362:6;46358:15;46351:38;46166:230;:::o;46402:237::-;46542:34;46538:1;46530:6;46526:14;46519:58;46611:20;46606:2;46598:6;46594:15;46587:45;46402:237;:::o;46645:178::-;46785:30;46781:1;46773:6;46769:14;46762:54;46645:178;:::o;46829:225::-;46969:34;46965:1;46957:6;46953:14;46946:58;47038:8;47033:2;47025:6;47021:15;47014:33;46829:225;:::o;47060:178::-;47200:30;47196:1;47188:6;47184:14;47177:54;47060:178;:::o;47244:223::-;47384:34;47380:1;47372:6;47368:14;47361:58;47453:6;47448:2;47440:6;47436:15;47429:31;47244:223;:::o;47473:175::-;47613:27;47609:1;47601:6;47597:14;47590:51;47473:175;:::o;47654:168::-;47794:20;47790:1;47782:6;47778:14;47771:44;47654:168;:::o;47828:181::-;47968:33;47964:1;47956:6;47952:14;47945:57;47828:181;:::o;48015:182::-;48155:34;48151:1;48143:6;48139:14;48132:58;48015:182;:::o;48203:231::-;48343:34;48339:1;48331:6;48327:14;48320:58;48412:14;48407:2;48399:6;48395:15;48388:39;48203:231;:::o;48440:243::-;48580:34;48576:1;48568:6;48564:14;48557:58;48649:26;48644:2;48636:6;48632:15;48625:51;48440:243;:::o;48689:229::-;48829:34;48825:1;48817:6;48813:14;48806:58;48898:12;48893:2;48885:6;48881:15;48874:37;48689:229;:::o;48924:243::-;49064:34;49060:1;49052:6;49048:14;49041:58;49133:26;49128:2;49120:6;49116:15;49109:51;48924:243;:::o;49173:228::-;49313:34;49309:1;49301:6;49297:14;49290:58;49382:11;49377:2;49369:6;49365:15;49358:36;49173:228;:::o;49407:182::-;49547:34;49543:1;49535:6;49531:14;49524:58;49407:182;:::o;49595:231::-;49735:34;49731:1;49723:6;49719:14;49712:58;49804:14;49799:2;49791:6;49787:15;49780:39;49595:231;:::o;49832:182::-;49972:34;49968:1;49960:6;49956:14;49949:58;49832:182;:::o;50020:228::-;50160:34;50156:1;50148:6;50144:14;50137:58;50229:11;50224:2;50216:6;50212:15;50205:36;50020:228;:::o;50254:234::-;50394:34;50390:1;50382:6;50378:14;50371:58;50463:17;50458:2;50450:6;50446:15;50439:42;50254:234;:::o;50494:220::-;50634:34;50630:1;50622:6;50618:14;50611:58;50703:3;50698:2;50690:6;50686:15;50679:28;50494:220;:::o;50720:234::-;50860:34;50856:1;50848:6;50844:14;50837:58;50929:17;50924:2;50916:6;50912:15;50905:42;50720:234;:::o;50960:236::-;51100:34;51096:1;51088:6;51084:14;51077:58;51169:19;51164:2;51156:6;51152:15;51145:44;50960:236;:::o;51202:231::-;51342:34;51338:1;51330:6;51326:14;51319:58;51411:14;51406:2;51398:6;51394:15;51387:39;51202:231;:::o;51439:173::-;51579:25;51575:1;51567:6;51563:14;51556:49;51439:173;:::o;51618:221::-;51758:34;51754:1;51746:6;51742:14;51735:58;51827:4;51822:2;51814:6;51810:15;51803:29;51618:221;:::o;51845:244::-;51985:34;51981:1;51973:6;51969:14;51962:58;52054:27;52049:2;52041:6;52037:15;52030:52;51845:244;:::o;52095:182::-;52235:34;52231:1;52223:6;52219:14;52212:58;52095:182;:::o;52283:122::-;52356:24;52374:5;52356:24;:::i;:::-;52349:5;52346:35;52336:63;;52395:1;52392;52385:12;52336:63;52283:122;:::o;52411:116::-;52481:21;52496:5;52481:21;:::i;:::-;52474:5;52471:32;52461:60;;52517:1;52514;52507:12;52461:60;52411:116;:::o;52533:120::-;52605:23;52622:5;52605:23;:::i;:::-;52598:5;52595:34;52585:62;;52643:1;52640;52633:12;52585:62;52533:120;:::o;52659:122::-;52732:24;52750:5;52732:24;:::i;:::-;52725:5;52722:35;52712:63;;52771:1;52768;52761:12;52712:63;52659:122;:::o

Swarm Source

ipfs://6b7f469e6a8b23e50d6e0b1d75fff1dcf374d533f4189e6d66212f14f5ea0acf
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.