ETH Price: $3,270.72 (-1.20%)
Gas: 11 Gwei

Token

SecretDriverClub (SDRCL)
 

Overview

Max Total Supply

1,405 SDRCL

Holders

692

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SDRCL
0xaf88dbddb9eb09a74fa60280a60f7d5c60bb6bf6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Motorsport Web3 Community and help build our latest project car.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SecretDriverClub

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-15
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol



pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol



pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: contracts/SecretDriverClub.sol


pragma solidity ^0.8.0;






contract SecretDriverClub is EIP712, ERC721, ERC721Enumerable, Ownable {
    using Strings for uint256;

    struct FeesWallets {
        address wallet;
        uint256 fees;
    }

    FeesWallets[] public feesWallets;

    bool public isBaseUrlFrozen = false;
    string public unrevealedTokenUri =
        "ipfs://QmRt4p5w47anQmVyuCkMqohZd5tzh4JWT4WJ7W5xYMatfo";
    bool public isRevealed = false;
    uint256 public startingIndex = 0;

    bool public saleIsActive = false;
    bool public preSaleIsActive = false;
    uint256 public presaleSold = 0;

    bool public whitelistSaleIsActive = false;

    string private _baseURIextended;

    uint256 public tokenPrice = 0.06 ether;

    uint256 public constant MAX_SUPPLY = 5555;
    uint256 public constant MAX_PUBLIC_MINT_PER_TRANSACTION = 10;

    string private constant SIGNING_DOMAIN = "SDC";
    string private constant SIGNATURE_VERSION = "1";

    mapping(address => uint256) public whitelistAmountMintedPerWallet;

    address private whiteListeSigner =
        0xcccc97afd1f1a3c2656a926DbEF961890E572CCD;

    constructor()
        ERC721("SecretDriverClub", "SDRCL")
        EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION)
    {
        // Smartcontract Dev fees 3%
        feesWallets.push(
            FeesWallets(0xffe6788BE411C4353B3b2c546D0401D4d8B2b3eD, 300)
        );
                
        feesWallets.push(
            FeesWallets(0xE4ED79d23A3a500FD31904eF87C74DB12Ad33B82, 300)
        );
    }

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

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

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        if (!isRevealed) {
            return unrevealedTokenUri;
        }

        string memory baseURI = _baseURI();
        if (tokenId >= 5556) {
            return
                bytes(baseURI).length > 0
                    ? string(abi.encodePacked(baseURI, tokenId.toString()))
                    : "";
        } else {
            return
                bytes(baseURI).length > 0
                    ? string(
                        abi.encodePacked(
                            baseURI,
                            (((startingIndex + tokenId) % MAX_SUPPLY) + 1)
                                .toString()
                        )
                    )
                    : "";
        }
    }

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

    function setTokenPrice(uint256 price_) external onlyOwner {
        tokenPrice = price_;
    }

    function setWhiteListSigner(address signer) external onlyOwner {
        whiteListeSigner = signer;
    }

    function freezeBaseUrl() external onlyOwner {
        isBaseUrlFrozen = true;
    }

    function reveal(string memory baseUrl_) external onlyOwner {
        require(!isRevealed);
        startingIndex =
            uint256(
                keccak256(abi.encodePacked(block.difficulty, block.timestamp))
            ) %
            MAX_SUPPLY;
        _baseURIextended = baseUrl_;
        isRevealed = true;
    }

    function setUnrevealedURI(string memory unrevealedTokenUri_)
        external
        onlyOwner
    {
        unrevealedTokenUri = unrevealedTokenUri_;
    }

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

    function setSaleState(bool newState) public onlyOwner {
        saleIsActive = newState;
    }

    function setPresaleState(bool newState) public onlyOwner {
        preSaleIsActive = newState;
    }

    function setWhitelisteSaleState(bool newState) public onlyOwner {
        whitelistSaleIsActive = newState;
    }

    function addFeesWallet(address wallet, uint256 feesPercentageX100)
        public
        onlyOwner
    {
        uint256 totalFees = 0;
        for (uint256 i = 0; i < feesWallets.length; i++) {
            totalFees += feesWallets[i].fees;
        }
        require(totalFees + feesPercentageX100 < 10000);
        feesWallets.push(FeesWallets(wallet, feesPercentageX100));
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        for (uint256 i = 0; i < feesWallets.length; i++) {
            uint256 fee = (balance * feesWallets[i].fees) / 10000;
            // We don't use transfer because any fail would cause funds to be locked forever
            payable(feesWallets[i].wallet).call{value: fee}("");
        }
        payable(msg.sender).call{value: address(this).balance}("");
    }

    function buyTokensPresale(uint256 numberOfTokens) public payable {
        require(preSaleIsActive, "presale not open");
        presaleSold += numberOfTokens;
        require(presaleSold <= 555, "presale ended");
        applyBuyToken(numberOfTokens, tokenPrice);
    }

    function airDropToken(address target, uint256 id) public onlyOwner {
        require(id >= 5556);
        _safeMint(target, id);
    }

    function buyTokens(uint256 numberOfTokens) public payable {
        require(saleIsActive, "sale not open");
        applyBuyToken(numberOfTokens, tokenPrice);
    }

    function applyBuyToken(uint256 numberOfTokens, uint256 price) private {
        uint256 ts = totalSupply() + 1;
        require(msg.sender == tx.origin);
        require(ts + numberOfTokens <= MAX_SUPPLY + 1, "not enough supply");
        require(price * numberOfTokens <= msg.value, "invalid ethers sent");
        require(
            numberOfTokens <= MAX_PUBLIC_MINT_PER_TRANSACTION,
            "too many token per transaction"
        );
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

    function buyTokenWithWhiteList(
        uint256 numberOfTokens,
        uint256 price,
        bytes calldata signature
    ) public payable {
        require(whitelistSaleIsActive, "whitelist sale not open");
        verifyWhitelistSignature(signature, msg.sender, price);
        whitelistAmountMintedPerWallet[msg.sender] += numberOfTokens;
        require(
            whitelistAmountMintedPerWallet[msg.sender] <= 10,
            "10 max per wallet"
        );
        applyBuyToken(numberOfTokens, price);
    }

    function verifyWhitelistSignature(
        bytes calldata signature,
        address targetWallet,
        uint256 price
    ) internal view {
        bytes32 digest = hashWhitelisteSignature(targetWallet, price);
        address result = ECDSA.recover(digest, signature);
        require(result == whiteListeSigner, "bad signature");
    }

    function hashWhitelisteSignature(address targetWallet, uint256 price)
        internal
        view
        returns (bytes32)
    {
        return
            _hashTypedDataV4(
                keccak256(
                    abi.encode(
                        keccak256("Ticket(address wallet,uint256 price)"),
                        targetWallet,
                        price
                    )
                )
            );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PUBLIC_MINT_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"feesPercentageX100","type":"uint256"}],"name":"addFeesWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"airDropToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"buyTokenWithWhiteList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"buyTokensPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feesWallets","outputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"fees","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeBaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBaseUrlFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUrl_","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedTokenUri_","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setWhiteListSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setWhitelisteSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAmountMintedPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040526000600c60006101000a81548160ff021916908315150217905550604051806060016040528060358152602001620063e160359139600d9080519060200190620000519291906200056d565b506000600e60006101000a81548160ff0219169083151502179055506000600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff02191690831515021790555060006011556000601260006101000a81548160ff02191690831515021790555066d529ae9e86000060145573cccc97afd1f1a3c2656a926dbef961890e572ccd601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200013557600080fd5b506040518060400160405280601081526020017f536563726574447269766572436c7562000000000000000000000000000000008152506040518060400160405280600581526020017f534452434c0000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f53444300000000000000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260c081815250508160e081815250504660a08181525050620002768184846200046360201b60201c565b6080818152505080610100818152505050505050508160009080519060200190620002a39291906200056d565b508060019080519060200190620002bc9291906200056d565b505050620002df620002d36200049f60201b60201c565b620004a760201b60201c565b600b604051806040016040528073ffe6788be411c4353b3b2c546d0401d4d8b2b3ed73ffffffffffffffffffffffffffffffffffffffff16815260200161012c815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050600b604051806040016040528073e4ed79d23a3a500fd31904ef87c74db12ad33b8273ffffffffffffffffffffffffffffffffffffffff16815260200161012c815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550506200075a565b600083838346306040516020016200048095949392919062000650565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200057b90620006f5565b90600052602060002090601f0160209004810192826200059f5760008555620005eb565b82601f10620005ba57805160ff1916838001178555620005eb565b82800160010185558215620005eb579182015b82811115620005ea578251825591602001919060010190620005cd565b5b509050620005fa9190620005fe565b5090565b5b8082111562000619576000816000905550600101620005ff565b5090565b6200062881620006ad565b82525050565b6200063981620006c1565b82525050565b6200064a81620006eb565b82525050565b600060a0820190506200066760008301886200062e565b6200067660208301876200062e565b6200068560408301866200062e565b6200069460608301856200063f565b620006a360808301846200061d565b9695505050505050565b6000620006ba82620006cb565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200070e57607f821691505b602082108114156200072557620007246200072b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05160c05160e05161010051615c426200079f6000396000613b9101526000613bd301526000613bb201526000613b3e01526000613b660152615c426000f3fe6080604052600436106102885760003560e01c80636352211e1161015a578063a22cb465116100c1578063dc3837471161007a578063dc383747146109ac578063e6faa927146109c8578063e985e9c5146109e4578063eb8d244414610a21578063f2fde38b14610a4c578063fe2c7fee14610a7557610288565b8063a22cb465146108a0578063b88d4fde146108c9578063bce4d6ae146108f2578063c4e370951461091b578063c87b56dd14610944578063cb774d471461098157610288565b80637d53f26d116101135780637d53f26d146107a25780637ff9b596146107cb57806384bdb6e0146107f65780638da5cb5b1461081f57806395d89b411461084a5780639dcacf241461087557610288565b80636352211e146106825780636a61e5fc146106bf57806370a08231146106e857806370c8331414610725578063715018a61461074e57806375ebbee11461076557610288565b80632f745c59116101fe57806346764cd6116101b757806346764cd61461058657806348cebd671461059d5780634c261247146105c85780634f6ccce7146105f157806354214f691461062e57806355f804b31461065957610288565b80632f745c591461048457806332cb6b0c146104c15780633610724e146104ec5780633854cb07146105085780633ccfd60b1461054657806342842e0e1461055d57610288565b80630b690d05116102505780630b690d051461038657806310b5454d146103af57806318160ddd146103da5780631f0234d81461040557806323b872dd146104305780632e9231ab1461045957610288565b806301ffc9a71461028d57806306c536ab146102ca57806306fdde03146102f5578063081812fc14610320578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906141f7565b610a9e565b6040516102c19190614a06565b60405180910390f35b3480156102d657600080fd5b506102df610ab0565b6040516102ec9190614af0565b60405180910390f35b34801561030157600080fd5b5061030a610b3e565b6040516103179190614af0565b60405180910390f35b34801561032c57600080fd5b506103476004803603810190610342919061429a565b610bd0565b6040516103549190614976565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f919061418a565b610c55565b005b34801561039257600080fd5b506103ad60048036038101906103a8919061418a565b610d6d565b005b3480156103bb57600080fd5b506103c4610f08565b6040516103d19190614a06565b60405180910390f35b3480156103e657600080fd5b506103ef610f1b565b6040516103fc9190614ef2565b60405180910390f35b34801561041157600080fd5b5061041a610f28565b6040516104279190614a06565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190614074565b610f3b565b005b34801561046557600080fd5b5061046e610f9b565b60405161047b9190614ef2565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a6919061418a565b610fa0565b6040516104b89190614ef2565b60405180910390f35b3480156104cd57600080fd5b506104d6611045565b6040516104e39190614ef2565b60405180910390f35b6105066004803603810190610501919061429a565b61104b565b005b34801561051457600080fd5b5061052f600480360381019061052a919061429a565b6110a9565b60405161053d9291906149dd565b60405180910390f35b34801561055257600080fd5b5061055b6110fd565b005b34801561056957600080fd5b50610584600480360381019061057f9190614074565b6112ff565b005b34801561059257600080fd5b5061059b61131f565b005b3480156105a957600080fd5b506105b26113b8565b6040516105bf9190614ef2565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea9190614251565b6113be565b005b3480156105fd57600080fd5b506106186004803603810190610613919061429a565b6114c8565b6040516106259190614ef2565b60405180910390f35b34801561063a57600080fd5b50610643611539565b6040516106509190614a06565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190614251565b61154c565b005b34801561068e57600080fd5b506106a960048036038101906106a4919061429a565b6115fc565b6040516106b69190614976565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e1919061429a565b6116ae565b005b3480156106f457600080fd5b5061070f600480360381019061070a9190614007565b611734565b60405161071c9190614ef2565b60405180910390f35b34801561073157600080fd5b5061074c6004803603810190610747919061418a565b6117ec565b005b34801561075a57600080fd5b50610763611885565b005b34801561077157600080fd5b5061078c60048036038101906107879190614007565b61190d565b6040516107999190614ef2565b60405180910390f35b3480156107ae57600080fd5b506107c960048036038101906107c491906141ca565b611925565b005b3480156107d757600080fd5b506107e06119be565b6040516107ed9190614ef2565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190614007565b6119c4565b005b34801561082b57600080fd5b50610834611a84565b6040516108419190614976565b60405180910390f35b34801561085657600080fd5b5061085f611aae565b60405161086c9190614af0565b60405180910390f35b34801561088157600080fd5b5061088a611b40565b6040516108979190614a06565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c2919061414a565b611b53565b005b3480156108d557600080fd5b506108f060048036038101906108eb91906140c7565b611cd4565b005b3480156108fe57600080fd5b50610919600480360381019061091491906141ca565b611d36565b005b34801561092757600080fd5b50610942600480360381019061093d91906141ca565b611dcf565b005b34801561095057600080fd5b5061096b6004803603810190610966919061429a565b611e68565b6040516109789190614af0565b60405180910390f35b34801561098d57600080fd5b50610996612036565b6040516109a39190614ef2565b60405180910390f35b6109c660048036038101906109c1919061429a565b61203c565b005b6109e260048036038101906109dd91906142c7565b6120fa565b005b3480156109f057600080fd5b50610a0b6004803603810190610a069190614034565b61223e565b604051610a189190614a06565b60405180910390f35b348015610a2d57600080fd5b50610a366122d2565b604051610a439190614a06565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190614007565b6122e5565b005b348015610a8157600080fd5b50610a9c6004803603810190610a979190614251565b6123dd565b005b6000610aa982612473565b9050919050565b600d8054610abd906151c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae9906151c4565b8015610b365780601f10610b0b57610100808354040283529160200191610b36565b820191906000526020600020905b815481529060010190602001808311610b1957829003601f168201915b505050505081565b606060008054610b4d906151c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b79906151c4565b8015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b5050505050905090565b6000610bdb826124ed565b610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190614dd2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c60826115fc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890614e72565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cf0612559565b73ffffffffffffffffffffffffffffffffffffffff161480610d1f5750610d1e81610d19612559565b61223e565b5b610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590614cf2565b60405180910390fd5b610d688383612561565b505050565b610d75612559565b73ffffffffffffffffffffffffffffffffffffffff16610d93611a84565b73ffffffffffffffffffffffffffffffffffffffff1614610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090614df2565b60405180910390fd5b6000805b600b80549050811015610e4057600b8181548110610e0e57610e0d6153a0565b5b90600052602060002090600202016001015482610e2b9190614fe2565b91508080610e3890615227565b915050610ded565b506127108282610e509190614fe2565b10610e5a57600080fd5b600b60405180604001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200184815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050505050565b601260009054906101000a900460ff1681565b6000600880549050905090565b601060019054906101000a900460ff1681565b610f4c610f46612559565b8261261a565b610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8290614eb2565b60405180910390fd5b610f968383836126f8565b505050565b600a81565b6000610fab83611734565b8210610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe390614b72565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115b381565b601060009054906101000a900460ff1661109a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109190614e52565b60405180910390fd5b6110a681601454612954565b50565b600b81815481106110b957600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b611105612559565b73ffffffffffffffffffffffffffffffffffffffff16611123611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090614df2565b60405180910390fd5b600047905060005b600b80549050811015611292576000612710600b83815481106111a7576111a66153a0565b5b906000526020600020906002020160010154846111c49190615069565b6111ce9190615038565b9050600b82815481106111e4576111e36153a0565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160405161123990614935565b60006040518083038185875af1925050503d8060008114611276576040519150601f19603f3d011682016040523d82523d6000602084013e61127b565b606091505b50505050808061128a90615227565b915050611181565b503373ffffffffffffffffffffffffffffffffffffffff16476040516112b790614935565b60006040518083038185875af1925050503d80600081146112f4576040519150601f19603f3d011682016040523d82523d6000602084013e6112f9565b606091505b50505050565b61131a83838360405180602001604052806000815250611cd4565b505050565b611327612559565b73ffffffffffffffffffffffffffffffffffffffff16611345611a84565b73ffffffffffffffffffffffffffffffffffffffff161461139b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139290614df2565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b60115481565b6113c6612559565b73ffffffffffffffffffffffffffffffffffffffff166113e4611a84565b73ffffffffffffffffffffffffffffffffffffffff161461143a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143190614df2565b60405180910390fd5b600e60009054906101000a900460ff161561145457600080fd5b6115b3444260405160200161146a92919061494a565b6040516020818303038152906040528051906020012060001c61148d9190615284565b600f8190555080601390805190602001906114a9929190613dc5565b506001600e60006101000a81548160ff02191690831515021790555050565b60006114d2610f1b565b8210611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a90614ed2565b60405180910390fd5b60088281548110611527576115266153a0565b5b90600052602060002001549050919050565b600e60009054906101000a900460ff1681565b611554612559565b73ffffffffffffffffffffffffffffffffffffffff16611572611a84565b73ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90614df2565b60405180910390fd5b600c60009054906101000a900460ff16156115e257600080fd5b80601390805190602001906115f8929190613dc5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90614d32565b60405180910390fd5b80915050919050565b6116b6612559565b73ffffffffffffffffffffffffffffffffffffffff166116d4611a84565b73ffffffffffffffffffffffffffffffffffffffff161461172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190614df2565b60405180910390fd5b8060148190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90614d12565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117f4612559565b73ffffffffffffffffffffffffffffffffffffffff16611812611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185f90614df2565b60405180910390fd5b6115b481101561187757600080fd5b6118818282612acb565b5050565b61188d612559565b73ffffffffffffffffffffffffffffffffffffffff166118ab611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f890614df2565b60405180910390fd5b61190b6000612ae9565b565b60156020528060005260406000206000915090505481565b61192d612559565b73ffffffffffffffffffffffffffffffffffffffff1661194b611a84565b73ffffffffffffffffffffffffffffffffffffffff16146119a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199890614df2565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60145481565b6119cc612559565b73ffffffffffffffffffffffffffffffffffffffff166119ea611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3790614df2565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611abd906151c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae9906151c4565b8015611b365780601f10611b0b57610100808354040283529160200191611b36565b820191906000526020600020905b815481529060010190602001808311611b1957829003601f168201915b5050505050905090565b600c60009054906101000a900460ff1681565b611b5b612559565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090614c12565b60405180910390fd5b8060056000611bd6612559565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c83612559565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cc89190614a06565b60405180910390a35050565b611ce5611cdf612559565b8361261a565b611d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1b90614eb2565b60405180910390fd5b611d3084848484612baf565b50505050565b611d3e612559565b73ffffffffffffffffffffffffffffffffffffffff16611d5c611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da990614df2565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b611dd7612559565b73ffffffffffffffffffffffffffffffffffffffff16611df5611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290614df2565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6060611e73826124ed565b611eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea990614e32565b60405180910390fd5b600e60009054906101000a900460ff16611f5857600d8054611ed3906151c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611eff906151c4565b8015611f4c5780601f10611f2157610100808354040283529160200191611f4c565b820191906000526020600020905b815481529060010190602001808311611f2f57829003601f168201915b50505050509050612031565b6000611f62612c0b565b90506115b48310611fbe576000815111611f8b5760405180602001604052806000815250611fb6565b80611f9584612c9d565b604051602001611fa69291906148da565b6040516020818303038152906040525b915050612031565b6000815111611fdc576040518060200160405280600081525061202d565b8061200c60016115b386600f54611ff39190614fe2565b611ffd9190615284565b6120079190614fe2565b612c9d565b60405160200161201d9291906148da565b6040516020818303038152906040525b9150505b919050565b600f5481565b601060019054906101000a900460ff1661208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290614d72565b60405180910390fd5b806011600082825461209d9190614fe2565b9250508190555061022b60115411156120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e290614d52565b60405180910390fd5b6120f781601454612954565b50565b601260009054906101000a900460ff16612149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214090614b32565b60405180910390fd5b61215582823386612dfe565b83601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121a49190614fe2565b92505081905550600a601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561222e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222590614cd2565b60405180910390fd5b6122388484612954565b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b6122ed612559565b73ffffffffffffffffffffffffffffffffffffffff1661230b611a84565b73ffffffffffffffffffffffffffffffffffffffff1614612361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235890614df2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890614bb2565b60405180910390fd5b6123da81612ae9565b50565b6123e5612559565b73ffffffffffffffffffffffffffffffffffffffff16612403611a84565b73ffffffffffffffffffffffffffffffffffffffff1614612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245090614df2565b60405180910390fd5b80600d908051906020019061246f929190613dc5565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124e657506124e582612ef6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125d4836115fc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612625826124ed565b612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265b90614c72565b60405180910390fd5b600061266f836115fc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126de57508373ffffffffffffffffffffffffffffffffffffffff166126c684610bd0565b73ffffffffffffffffffffffffffffffffffffffff16145b806126ef57506126ee818561223e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612718826115fc565b73ffffffffffffffffffffffffffffffffffffffff161461276e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276590614e12565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d590614bf2565b60405180910390fd5b6127e9838383612fd8565b6127f4600082612561565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461284491906150c3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461289b9190614fe2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006001612960610f1b565b61296a9190614fe2565b90503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129a457600080fd5b60016115b36129b39190614fe2565b83826129bf9190614fe2565b1115612a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f790614e92565b60405180910390fd5b348383612a0d9190615069565b1115612a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4590614cb2565b60405180910390fd5b600a831115612a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8990614c92565b60405180910390fd5b60005b83811015612ac557612ab2338284612aad9190614fe2565b612acb565b8080612abd90615227565b915050612a95565b50505050565b612ae5828260405180602001604052806000815250612fe8565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612bba8484846126f8565b612bc684848484613043565b612c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfc90614b92565b60405180910390fd5b50505050565b606060138054612c1a906151c4565b80601f0160208091040260200160405190810160405280929190818152602001828054612c46906151c4565b8015612c935780601f10612c6857610100808354040283529160200191612c93565b820191906000526020600020905b815481529060010190602001808311612c7657829003601f168201915b5050505050905090565b60606000821415612ce5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612df9565b600082905060005b60008214612d17578080612d0090615227565b915050600a82612d109190615038565b9150612ced565b60008167ffffffffffffffff811115612d3357612d326153cf565b5b6040519080825280601f01601f191660200182016040528015612d655781602001600182028036833780820191505090505b5090505b60008514612df257600182612d7e91906150c3565b9150600a85612d8d9190615284565b6030612d999190614fe2565b60f81b818381518110612daf57612dae6153a0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612deb9190615038565b9450612d69565b8093505050505b919050565b6000612e0a83836131da565b90506000612e5c8287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613237565b9050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee590614c32565b60405180910390fd5b505050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fc157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fd15750612fd08261325e565b5b9050919050565b612fe38383836132c8565b505050565b612ff283836133dc565b612fff6000848484613043565b61303e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303590614b92565b60405180910390fd5b505050565b60006130648473ffffffffffffffffffffffffffffffffffffffff166135aa565b156131cd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261308d612559565b8786866040518563ffffffff1660e01b81526004016130af9493929190614991565b602060405180830381600087803b1580156130c957600080fd5b505af19250505080156130fa57506040513d601f19601f820116820180604052508101906130f79190614224565b60015b61317d573d806000811461312a576040519150601f19603f3d011682016040523d82523d6000602084013e61312f565b606091505b50600081511415613175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316c90614b92565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131d2565b600190505b949350505050565b600061322f7ff8e87b583ac6d8bdd485e0ebd74ad24b615b84b9510df04a1fd59d81b2039ca7848460405160200161321493929190614a21565b604051602081830303815290604052805190602001206135bd565b905092915050565b600080600061324685856135d7565b915091506132538161365a565b819250505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132d383838361382f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133165761331181613834565b613355565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461335457613353838261387d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561339857613393816139ea565b6133d7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133d6576133d58282613abb565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561344c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344390614db2565b60405180910390fd5b613455816124ed565b15613495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348c90614bd2565b60405180910390fd5b6134a160008383612fd8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134f19190614fe2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60006135d06135ca613b3a565b83613bfd565b9050919050565b6000806041835114156136195760008060006020860151925060408601519150606086015160001a905061360d87828585613c30565b94509450505050613653565b60408351141561364a57600080602085015191506040850151905061363f868383613d3d565b935093505050613653565b60006002915091505b9250929050565b6000600481111561366e5761366d615313565b5b81600481111561368157613680615313565b5b141561368c5761382c565b600160048111156136a05761369f615313565b5b8160048111156136b3576136b2615313565b5b14156136f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136eb90614b12565b60405180910390fd5b6002600481111561370857613707615313565b5b81600481111561371b5761371a615313565b5b141561375c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375390614b52565b60405180910390fd5b600360048111156137705761376f615313565b5b81600481111561378357613782615313565b5b14156137c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bb90614c52565b60405180910390fd5b6004808111156137d7576137d6615313565b5b8160048111156137ea576137e9615313565b5b141561382b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382290614d92565b60405180910390fd5b5b50565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161388a84611734565b61389491906150c3565b9050600060076000848152602001908152602001600020549050818114613979576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506139fe91906150c3565b9050600060096000848152602001908152602001600020549050600060088381548110613a2e57613a2d6153a0565b5b906000526020600020015490508060088381548110613a5057613a4f6153a0565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a9f57613a9e615371565b5b6001900381819060005260206000200160009055905550505050565b6000613ac683611734565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415613b8c577f00000000000000000000000000000000000000000000000000000000000000009050613bfa565b613bf77f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613d8b565b90505b90565b60008282604051602001613c129291906148fe565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613c6b576000600391509150613d34565b601b8560ff1614158015613c835750601c8560ff1614155b15613c95576000600491509150613d34565b600060018787878760405160008152602001604052604051613cba9493929190614aab565b6020604051602081039080840390855afa158015613cdc573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613d2b57600060019250925050613d34565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613d7d87828885613c30565b935093505050935093915050565b60008383834630604051602001613da6959493929190614a58565b6040516020818303038152906040528051906020012090509392505050565b828054613dd1906151c4565b90600052602060002090601f016020900481019282613df35760008555613e3a565b82601f10613e0c57805160ff1916838001178555613e3a565b82800160010185558215613e3a579182015b82811115613e39578251825591602001919060010190613e1e565b5b509050613e479190613e4b565b5090565b5b80821115613e64576000816000905550600101613e4c565b5090565b6000613e7b613e7684614f32565b614f0d565b905082815260208101848484011115613e9757613e9661540d565b5b613ea2848285615182565b509392505050565b6000613ebd613eb884614f63565b614f0d565b905082815260208101848484011115613ed957613ed861540d565b5b613ee4848285615182565b509392505050565b600081359050613efb81615bb0565b92915050565b600081359050613f1081615bc7565b92915050565b600081359050613f2581615bde565b92915050565b600081519050613f3a81615bde565b92915050565b60008083601f840112613f5657613f55615403565b5b8235905067ffffffffffffffff811115613f7357613f726153fe565b5b602083019150836001820283011115613f8f57613f8e615408565b5b9250929050565b600082601f830112613fab57613faa615403565b5b8135613fbb848260208601613e68565b91505092915050565b600082601f830112613fd957613fd8615403565b5b8135613fe9848260208601613eaa565b91505092915050565b60008135905061400181615bf5565b92915050565b60006020828403121561401d5761401c615417565b5b600061402b84828501613eec565b91505092915050565b6000806040838503121561404b5761404a615417565b5b600061405985828601613eec565b925050602061406a85828601613eec565b9150509250929050565b60008060006060848603121561408d5761408c615417565b5b600061409b86828701613eec565b93505060206140ac86828701613eec565b92505060406140bd86828701613ff2565b9150509250925092565b600080600080608085870312156140e1576140e0615417565b5b60006140ef87828801613eec565b945050602061410087828801613eec565b935050604061411187828801613ff2565b925050606085013567ffffffffffffffff81111561413257614131615412565b5b61413e87828801613f96565b91505092959194509250565b6000806040838503121561416157614160615417565b5b600061416f85828601613eec565b925050602061418085828601613f01565b9150509250929050565b600080604083850312156141a1576141a0615417565b5b60006141af85828601613eec565b92505060206141c085828601613ff2565b9150509250929050565b6000602082840312156141e0576141df615417565b5b60006141ee84828501613f01565b91505092915050565b60006020828403121561420d5761420c615417565b5b600061421b84828501613f16565b91505092915050565b60006020828403121561423a57614239615417565b5b600061424884828501613f2b565b91505092915050565b60006020828403121561426757614266615417565b5b600082013567ffffffffffffffff81111561428557614284615412565b5b61429184828501613fc4565b91505092915050565b6000602082840312156142b0576142af615417565b5b60006142be84828501613ff2565b91505092915050565b600080600080606085870312156142e1576142e0615417565b5b60006142ef87828801613ff2565b945050602061430087828801613ff2565b935050604085013567ffffffffffffffff81111561432157614320615412565b5b61432d87828801613f40565b925092505092959194509250565b614344816150f7565b82525050565b61435381615109565b82525050565b61436281615115565b82525050565b61437961437482615115565b615270565b82525050565b600061438a82614f94565b6143948185614faa565b93506143a4818560208601615191565b6143ad8161541c565b840191505092915050565b60006143c382614f9f565b6143cd8185614fc6565b93506143dd818560208601615191565b6143e68161541c565b840191505092915050565b60006143fc82614f9f565b6144068185614fd7565b9350614416818560208601615191565b80840191505092915050565b600061442f601883614fc6565b915061443a8261542d565b602082019050919050565b6000614452601783614fc6565b915061445d82615456565b602082019050919050565b6000614475601f83614fc6565b91506144808261547f565b602082019050919050565b6000614498602b83614fc6565b91506144a3826154a8565b604082019050919050565b60006144bb603283614fc6565b91506144c6826154f7565b604082019050919050565b60006144de602683614fc6565b91506144e982615546565b604082019050919050565b6000614501601c83614fc6565b915061450c82615595565b602082019050919050565b6000614524600283614fd7565b915061452f826155be565b600282019050919050565b6000614547602483614fc6565b9150614552826155e7565b604082019050919050565b600061456a601983614fc6565b915061457582615636565b602082019050919050565b600061458d600d83614fc6565b91506145988261565f565b602082019050919050565b60006145b0602283614fc6565b91506145bb82615688565b604082019050919050565b60006145d3602c83614fc6565b91506145de826156d7565b604082019050919050565b60006145f6601e83614fc6565b915061460182615726565b602082019050919050565b6000614619601383614fc6565b91506146248261574f565b602082019050919050565b600061463c601183614fc6565b915061464782615778565b602082019050919050565b600061465f603883614fc6565b915061466a826157a1565b604082019050919050565b6000614682602a83614fc6565b915061468d826157f0565b604082019050919050565b60006146a5602983614fc6565b91506146b08261583f565b604082019050919050565b60006146c8600d83614fc6565b91506146d38261588e565b602082019050919050565b60006146eb601083614fc6565b91506146f6826158b7565b602082019050919050565b600061470e602283614fc6565b9150614719826158e0565b604082019050919050565b6000614731602083614fc6565b915061473c8261592f565b602082019050919050565b6000614754602c83614fc6565b915061475f82615958565b604082019050919050565b6000614777602083614fc6565b9150614782826159a7565b602082019050919050565b600061479a602983614fc6565b91506147a5826159d0565b604082019050919050565b60006147bd602f83614fc6565b91506147c882615a1f565b604082019050919050565b60006147e0600d83614fc6565b91506147eb82615a6e565b602082019050919050565b6000614803602183614fc6565b915061480e82615a97565b604082019050919050565b6000614826601183614fc6565b915061483182615ae6565b602082019050919050565b6000614849600083614fbb565b915061485482615b0f565b600082019050919050565b600061486c603183614fc6565b915061487782615b12565b604082019050919050565b600061488f602c83614fc6565b915061489a82615b61565b604082019050919050565b6148ae8161516b565b82525050565b6148c56148c08261516b565b61527a565b82525050565b6148d481615175565b82525050565b60006148e682856143f1565b91506148f282846143f1565b91508190509392505050565b600061490982614517565b91506149158285614368565b6020820191506149258284614368565b6020820191508190509392505050565b60006149408261483c565b9150819050919050565b600061495682856148b4565b60208201915061496682846148b4565b6020820191508190509392505050565b600060208201905061498b600083018461433b565b92915050565b60006080820190506149a6600083018761433b565b6149b3602083018661433b565b6149c060408301856148a5565b81810360608301526149d2818461437f565b905095945050505050565b60006040820190506149f2600083018561433b565b6149ff60208301846148a5565b9392505050565b6000602082019050614a1b600083018461434a565b92915050565b6000606082019050614a366000830186614359565b614a43602083018561433b565b614a5060408301846148a5565b949350505050565b600060a082019050614a6d6000830188614359565b614a7a6020830187614359565b614a876040830186614359565b614a9460608301856148a5565b614aa1608083018461433b565b9695505050505050565b6000608082019050614ac06000830187614359565b614acd60208301866148cb565b614ada6040830185614359565b614ae76060830184614359565b95945050505050565b60006020820190508181036000830152614b0a81846143b8565b905092915050565b60006020820190508181036000830152614b2b81614422565b9050919050565b60006020820190508181036000830152614b4b81614445565b9050919050565b60006020820190508181036000830152614b6b81614468565b9050919050565b60006020820190508181036000830152614b8b8161448b565b9050919050565b60006020820190508181036000830152614bab816144ae565b9050919050565b60006020820190508181036000830152614bcb816144d1565b9050919050565b60006020820190508181036000830152614beb816144f4565b9050919050565b60006020820190508181036000830152614c0b8161453a565b9050919050565b60006020820190508181036000830152614c2b8161455d565b9050919050565b60006020820190508181036000830152614c4b81614580565b9050919050565b60006020820190508181036000830152614c6b816145a3565b9050919050565b60006020820190508181036000830152614c8b816145c6565b9050919050565b60006020820190508181036000830152614cab816145e9565b9050919050565b60006020820190508181036000830152614ccb8161460c565b9050919050565b60006020820190508181036000830152614ceb8161462f565b9050919050565b60006020820190508181036000830152614d0b81614652565b9050919050565b60006020820190508181036000830152614d2b81614675565b9050919050565b60006020820190508181036000830152614d4b81614698565b9050919050565b60006020820190508181036000830152614d6b816146bb565b9050919050565b60006020820190508181036000830152614d8b816146de565b9050919050565b60006020820190508181036000830152614dab81614701565b9050919050565b60006020820190508181036000830152614dcb81614724565b9050919050565b60006020820190508181036000830152614deb81614747565b9050919050565b60006020820190508181036000830152614e0b8161476a565b9050919050565b60006020820190508181036000830152614e2b8161478d565b9050919050565b60006020820190508181036000830152614e4b816147b0565b9050919050565b60006020820190508181036000830152614e6b816147d3565b9050919050565b60006020820190508181036000830152614e8b816147f6565b9050919050565b60006020820190508181036000830152614eab81614819565b9050919050565b60006020820190508181036000830152614ecb8161485f565b9050919050565b60006020820190508181036000830152614eeb81614882565b9050919050565b6000602082019050614f0760008301846148a5565b92915050565b6000614f17614f28565b9050614f2382826151f6565b919050565b6000604051905090565b600067ffffffffffffffff821115614f4d57614f4c6153cf565b5b614f568261541c565b9050602081019050919050565b600067ffffffffffffffff821115614f7e57614f7d6153cf565b5b614f878261541c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fed8261516b565b9150614ff88361516b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561502d5761502c6152b5565b5b828201905092915050565b60006150438261516b565b915061504e8361516b565b92508261505e5761505d6152e4565b5b828204905092915050565b60006150748261516b565b915061507f8361516b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150b8576150b76152b5565b5b828202905092915050565b60006150ce8261516b565b91506150d98361516b565b9250828210156150ec576150eb6152b5565b5b828203905092915050565b60006151028261514b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156151af578082015181840152602081019050615194565b838111156151be576000848401525b50505050565b600060028204905060018216806151dc57607f821691505b602082108114156151f0576151ef615342565b5b50919050565b6151ff8261541c565b810181811067ffffffffffffffff8211171561521e5761521d6153cf565b5b80604052505050565b60006152328261516b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615265576152646152b5565b5b600182019050919050565b6000819050919050565b6000819050919050565b600061528f8261516b565b915061529a8361516b565b9250826152aa576152a96152e4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f77686974656c6973742073616c65206e6f74206f70656e000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f626164207369676e617475726500000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f746f6f206d616e7920746f6b656e20706572207472616e73616374696f6e0000600082015250565b7f696e76616c6964206574686572732073656e7400000000000000000000000000600082015250565b7f3130206d6178207065722077616c6c6574000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f70726573616c6520656e64656400000000000000000000000000000000000000600082015250565b7f70726573616c65206e6f74206f70656e00000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f73616c65206e6f74206f70656e00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f75676820737570706c79000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615bb9816150f7565b8114615bc457600080fd5b50565b615bd081615109565b8114615bdb57600080fd5b50565b615be78161511f565b8114615bf257600080fd5b50565b615bfe8161516b565b8114615c0957600080fd5b5056fea2646970667358221220eb968e05a24f3c693facab16c73b7b58fb113a95cde9f7e8a16629d39b3d8a3464736f6c63430008070033697066733a2f2f516d5274347035773437616e516d567975436b4d716f685a6435747a68344a575434574a37573578594d6174666f

Deployed Bytecode

0x6080604052600436106102885760003560e01c80636352211e1161015a578063a22cb465116100c1578063dc3837471161007a578063dc383747146109ac578063e6faa927146109c8578063e985e9c5146109e4578063eb8d244414610a21578063f2fde38b14610a4c578063fe2c7fee14610a7557610288565b8063a22cb465146108a0578063b88d4fde146108c9578063bce4d6ae146108f2578063c4e370951461091b578063c87b56dd14610944578063cb774d471461098157610288565b80637d53f26d116101135780637d53f26d146107a25780637ff9b596146107cb57806384bdb6e0146107f65780638da5cb5b1461081f57806395d89b411461084a5780639dcacf241461087557610288565b80636352211e146106825780636a61e5fc146106bf57806370a08231146106e857806370c8331414610725578063715018a61461074e57806375ebbee11461076557610288565b80632f745c59116101fe57806346764cd6116101b757806346764cd61461058657806348cebd671461059d5780634c261247146105c85780634f6ccce7146105f157806354214f691461062e57806355f804b31461065957610288565b80632f745c591461048457806332cb6b0c146104c15780633610724e146104ec5780633854cb07146105085780633ccfd60b1461054657806342842e0e1461055d57610288565b80630b690d05116102505780630b690d051461038657806310b5454d146103af57806318160ddd146103da5780631f0234d81461040557806323b872dd146104305780632e9231ab1461045957610288565b806301ffc9a71461028d57806306c536ab146102ca57806306fdde03146102f5578063081812fc14610320578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906141f7565b610a9e565b6040516102c19190614a06565b60405180910390f35b3480156102d657600080fd5b506102df610ab0565b6040516102ec9190614af0565b60405180910390f35b34801561030157600080fd5b5061030a610b3e565b6040516103179190614af0565b60405180910390f35b34801561032c57600080fd5b506103476004803603810190610342919061429a565b610bd0565b6040516103549190614976565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f919061418a565b610c55565b005b34801561039257600080fd5b506103ad60048036038101906103a8919061418a565b610d6d565b005b3480156103bb57600080fd5b506103c4610f08565b6040516103d19190614a06565b60405180910390f35b3480156103e657600080fd5b506103ef610f1b565b6040516103fc9190614ef2565b60405180910390f35b34801561041157600080fd5b5061041a610f28565b6040516104279190614a06565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190614074565b610f3b565b005b34801561046557600080fd5b5061046e610f9b565b60405161047b9190614ef2565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a6919061418a565b610fa0565b6040516104b89190614ef2565b60405180910390f35b3480156104cd57600080fd5b506104d6611045565b6040516104e39190614ef2565b60405180910390f35b6105066004803603810190610501919061429a565b61104b565b005b34801561051457600080fd5b5061052f600480360381019061052a919061429a565b6110a9565b60405161053d9291906149dd565b60405180910390f35b34801561055257600080fd5b5061055b6110fd565b005b34801561056957600080fd5b50610584600480360381019061057f9190614074565b6112ff565b005b34801561059257600080fd5b5061059b61131f565b005b3480156105a957600080fd5b506105b26113b8565b6040516105bf9190614ef2565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea9190614251565b6113be565b005b3480156105fd57600080fd5b506106186004803603810190610613919061429a565b6114c8565b6040516106259190614ef2565b60405180910390f35b34801561063a57600080fd5b50610643611539565b6040516106509190614a06565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190614251565b61154c565b005b34801561068e57600080fd5b506106a960048036038101906106a4919061429a565b6115fc565b6040516106b69190614976565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e1919061429a565b6116ae565b005b3480156106f457600080fd5b5061070f600480360381019061070a9190614007565b611734565b60405161071c9190614ef2565b60405180910390f35b34801561073157600080fd5b5061074c6004803603810190610747919061418a565b6117ec565b005b34801561075a57600080fd5b50610763611885565b005b34801561077157600080fd5b5061078c60048036038101906107879190614007565b61190d565b6040516107999190614ef2565b60405180910390f35b3480156107ae57600080fd5b506107c960048036038101906107c491906141ca565b611925565b005b3480156107d757600080fd5b506107e06119be565b6040516107ed9190614ef2565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190614007565b6119c4565b005b34801561082b57600080fd5b50610834611a84565b6040516108419190614976565b60405180910390f35b34801561085657600080fd5b5061085f611aae565b60405161086c9190614af0565b60405180910390f35b34801561088157600080fd5b5061088a611b40565b6040516108979190614a06565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c2919061414a565b611b53565b005b3480156108d557600080fd5b506108f060048036038101906108eb91906140c7565b611cd4565b005b3480156108fe57600080fd5b50610919600480360381019061091491906141ca565b611d36565b005b34801561092757600080fd5b50610942600480360381019061093d91906141ca565b611dcf565b005b34801561095057600080fd5b5061096b6004803603810190610966919061429a565b611e68565b6040516109789190614af0565b60405180910390f35b34801561098d57600080fd5b50610996612036565b6040516109a39190614ef2565b60405180910390f35b6109c660048036038101906109c1919061429a565b61203c565b005b6109e260048036038101906109dd91906142c7565b6120fa565b005b3480156109f057600080fd5b50610a0b6004803603810190610a069190614034565b61223e565b604051610a189190614a06565b60405180910390f35b348015610a2d57600080fd5b50610a366122d2565b604051610a439190614a06565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190614007565b6122e5565b005b348015610a8157600080fd5b50610a9c6004803603810190610a979190614251565b6123dd565b005b6000610aa982612473565b9050919050565b600d8054610abd906151c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae9906151c4565b8015610b365780601f10610b0b57610100808354040283529160200191610b36565b820191906000526020600020905b815481529060010190602001808311610b1957829003601f168201915b505050505081565b606060008054610b4d906151c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b79906151c4565b8015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b5050505050905090565b6000610bdb826124ed565b610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190614dd2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c60826115fc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890614e72565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cf0612559565b73ffffffffffffffffffffffffffffffffffffffff161480610d1f5750610d1e81610d19612559565b61223e565b5b610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590614cf2565b60405180910390fd5b610d688383612561565b505050565b610d75612559565b73ffffffffffffffffffffffffffffffffffffffff16610d93611a84565b73ffffffffffffffffffffffffffffffffffffffff1614610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090614df2565b60405180910390fd5b6000805b600b80549050811015610e4057600b8181548110610e0e57610e0d6153a0565b5b90600052602060002090600202016001015482610e2b9190614fe2565b91508080610e3890615227565b915050610ded565b506127108282610e509190614fe2565b10610e5a57600080fd5b600b60405180604001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200184815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050505050565b601260009054906101000a900460ff1681565b6000600880549050905090565b601060019054906101000a900460ff1681565b610f4c610f46612559565b8261261a565b610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8290614eb2565b60405180910390fd5b610f968383836126f8565b505050565b600a81565b6000610fab83611734565b8210610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe390614b72565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115b381565b601060009054906101000a900460ff1661109a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109190614e52565b60405180910390fd5b6110a681601454612954565b50565b600b81815481106110b957600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b611105612559565b73ffffffffffffffffffffffffffffffffffffffff16611123611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090614df2565b60405180910390fd5b600047905060005b600b80549050811015611292576000612710600b83815481106111a7576111a66153a0565b5b906000526020600020906002020160010154846111c49190615069565b6111ce9190615038565b9050600b82815481106111e4576111e36153a0565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160405161123990614935565b60006040518083038185875af1925050503d8060008114611276576040519150601f19603f3d011682016040523d82523d6000602084013e61127b565b606091505b50505050808061128a90615227565b915050611181565b503373ffffffffffffffffffffffffffffffffffffffff16476040516112b790614935565b60006040518083038185875af1925050503d80600081146112f4576040519150601f19603f3d011682016040523d82523d6000602084013e6112f9565b606091505b50505050565b61131a83838360405180602001604052806000815250611cd4565b505050565b611327612559565b73ffffffffffffffffffffffffffffffffffffffff16611345611a84565b73ffffffffffffffffffffffffffffffffffffffff161461139b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139290614df2565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b60115481565b6113c6612559565b73ffffffffffffffffffffffffffffffffffffffff166113e4611a84565b73ffffffffffffffffffffffffffffffffffffffff161461143a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143190614df2565b60405180910390fd5b600e60009054906101000a900460ff161561145457600080fd5b6115b3444260405160200161146a92919061494a565b6040516020818303038152906040528051906020012060001c61148d9190615284565b600f8190555080601390805190602001906114a9929190613dc5565b506001600e60006101000a81548160ff02191690831515021790555050565b60006114d2610f1b565b8210611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a90614ed2565b60405180910390fd5b60088281548110611527576115266153a0565b5b90600052602060002001549050919050565b600e60009054906101000a900460ff1681565b611554612559565b73ffffffffffffffffffffffffffffffffffffffff16611572611a84565b73ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90614df2565b60405180910390fd5b600c60009054906101000a900460ff16156115e257600080fd5b80601390805190602001906115f8929190613dc5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90614d32565b60405180910390fd5b80915050919050565b6116b6612559565b73ffffffffffffffffffffffffffffffffffffffff166116d4611a84565b73ffffffffffffffffffffffffffffffffffffffff161461172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190614df2565b60405180910390fd5b8060148190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90614d12565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117f4612559565b73ffffffffffffffffffffffffffffffffffffffff16611812611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185f90614df2565b60405180910390fd5b6115b481101561187757600080fd5b6118818282612acb565b5050565b61188d612559565b73ffffffffffffffffffffffffffffffffffffffff166118ab611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f890614df2565b60405180910390fd5b61190b6000612ae9565b565b60156020528060005260406000206000915090505481565b61192d612559565b73ffffffffffffffffffffffffffffffffffffffff1661194b611a84565b73ffffffffffffffffffffffffffffffffffffffff16146119a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199890614df2565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60145481565b6119cc612559565b73ffffffffffffffffffffffffffffffffffffffff166119ea611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3790614df2565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611abd906151c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae9906151c4565b8015611b365780601f10611b0b57610100808354040283529160200191611b36565b820191906000526020600020905b815481529060010190602001808311611b1957829003601f168201915b5050505050905090565b600c60009054906101000a900460ff1681565b611b5b612559565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090614c12565b60405180910390fd5b8060056000611bd6612559565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c83612559565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cc89190614a06565b60405180910390a35050565b611ce5611cdf612559565b8361261a565b611d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1b90614eb2565b60405180910390fd5b611d3084848484612baf565b50505050565b611d3e612559565b73ffffffffffffffffffffffffffffffffffffffff16611d5c611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da990614df2565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b611dd7612559565b73ffffffffffffffffffffffffffffffffffffffff16611df5611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290614df2565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6060611e73826124ed565b611eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea990614e32565b60405180910390fd5b600e60009054906101000a900460ff16611f5857600d8054611ed3906151c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611eff906151c4565b8015611f4c5780601f10611f2157610100808354040283529160200191611f4c565b820191906000526020600020905b815481529060010190602001808311611f2f57829003601f168201915b50505050509050612031565b6000611f62612c0b565b90506115b48310611fbe576000815111611f8b5760405180602001604052806000815250611fb6565b80611f9584612c9d565b604051602001611fa69291906148da565b6040516020818303038152906040525b915050612031565b6000815111611fdc576040518060200160405280600081525061202d565b8061200c60016115b386600f54611ff39190614fe2565b611ffd9190615284565b6120079190614fe2565b612c9d565b60405160200161201d9291906148da565b6040516020818303038152906040525b9150505b919050565b600f5481565b601060019054906101000a900460ff1661208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290614d72565b60405180910390fd5b806011600082825461209d9190614fe2565b9250508190555061022b60115411156120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e290614d52565b60405180910390fd5b6120f781601454612954565b50565b601260009054906101000a900460ff16612149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214090614b32565b60405180910390fd5b61215582823386612dfe565b83601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121a49190614fe2565b92505081905550600a601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561222e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222590614cd2565b60405180910390fd5b6122388484612954565b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b6122ed612559565b73ffffffffffffffffffffffffffffffffffffffff1661230b611a84565b73ffffffffffffffffffffffffffffffffffffffff1614612361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235890614df2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890614bb2565b60405180910390fd5b6123da81612ae9565b50565b6123e5612559565b73ffffffffffffffffffffffffffffffffffffffff16612403611a84565b73ffffffffffffffffffffffffffffffffffffffff1614612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245090614df2565b60405180910390fd5b80600d908051906020019061246f929190613dc5565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124e657506124e582612ef6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125d4836115fc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612625826124ed565b612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265b90614c72565b60405180910390fd5b600061266f836115fc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126de57508373ffffffffffffffffffffffffffffffffffffffff166126c684610bd0565b73ffffffffffffffffffffffffffffffffffffffff16145b806126ef57506126ee818561223e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612718826115fc565b73ffffffffffffffffffffffffffffffffffffffff161461276e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276590614e12565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d590614bf2565b60405180910390fd5b6127e9838383612fd8565b6127f4600082612561565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461284491906150c3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461289b9190614fe2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006001612960610f1b565b61296a9190614fe2565b90503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129a457600080fd5b60016115b36129b39190614fe2565b83826129bf9190614fe2565b1115612a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f790614e92565b60405180910390fd5b348383612a0d9190615069565b1115612a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4590614cb2565b60405180910390fd5b600a831115612a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8990614c92565b60405180910390fd5b60005b83811015612ac557612ab2338284612aad9190614fe2565b612acb565b8080612abd90615227565b915050612a95565b50505050565b612ae5828260405180602001604052806000815250612fe8565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612bba8484846126f8565b612bc684848484613043565b612c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfc90614b92565b60405180910390fd5b50505050565b606060138054612c1a906151c4565b80601f0160208091040260200160405190810160405280929190818152602001828054612c46906151c4565b8015612c935780601f10612c6857610100808354040283529160200191612c93565b820191906000526020600020905b815481529060010190602001808311612c7657829003601f168201915b5050505050905090565b60606000821415612ce5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612df9565b600082905060005b60008214612d17578080612d0090615227565b915050600a82612d109190615038565b9150612ced565b60008167ffffffffffffffff811115612d3357612d326153cf565b5b6040519080825280601f01601f191660200182016040528015612d655781602001600182028036833780820191505090505b5090505b60008514612df257600182612d7e91906150c3565b9150600a85612d8d9190615284565b6030612d999190614fe2565b60f81b818381518110612daf57612dae6153a0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612deb9190615038565b9450612d69565b8093505050505b919050565b6000612e0a83836131da565b90506000612e5c8287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613237565b9050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee590614c32565b60405180910390fd5b505050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fc157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fd15750612fd08261325e565b5b9050919050565b612fe38383836132c8565b505050565b612ff283836133dc565b612fff6000848484613043565b61303e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303590614b92565b60405180910390fd5b505050565b60006130648473ffffffffffffffffffffffffffffffffffffffff166135aa565b156131cd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261308d612559565b8786866040518563ffffffff1660e01b81526004016130af9493929190614991565b602060405180830381600087803b1580156130c957600080fd5b505af19250505080156130fa57506040513d601f19601f820116820180604052508101906130f79190614224565b60015b61317d573d806000811461312a576040519150601f19603f3d011682016040523d82523d6000602084013e61312f565b606091505b50600081511415613175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316c90614b92565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131d2565b600190505b949350505050565b600061322f7ff8e87b583ac6d8bdd485e0ebd74ad24b615b84b9510df04a1fd59d81b2039ca7848460405160200161321493929190614a21565b604051602081830303815290604052805190602001206135bd565b905092915050565b600080600061324685856135d7565b915091506132538161365a565b819250505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132d383838361382f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133165761331181613834565b613355565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461335457613353838261387d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561339857613393816139ea565b6133d7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133d6576133d58282613abb565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561344c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344390614db2565b60405180910390fd5b613455816124ed565b15613495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348c90614bd2565b60405180910390fd5b6134a160008383612fd8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134f19190614fe2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60006135d06135ca613b3a565b83613bfd565b9050919050565b6000806041835114156136195760008060006020860151925060408601519150606086015160001a905061360d87828585613c30565b94509450505050613653565b60408351141561364a57600080602085015191506040850151905061363f868383613d3d565b935093505050613653565b60006002915091505b9250929050565b6000600481111561366e5761366d615313565b5b81600481111561368157613680615313565b5b141561368c5761382c565b600160048111156136a05761369f615313565b5b8160048111156136b3576136b2615313565b5b14156136f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136eb90614b12565b60405180910390fd5b6002600481111561370857613707615313565b5b81600481111561371b5761371a615313565b5b141561375c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375390614b52565b60405180910390fd5b600360048111156137705761376f615313565b5b81600481111561378357613782615313565b5b14156137c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bb90614c52565b60405180910390fd5b6004808111156137d7576137d6615313565b5b8160048111156137ea576137e9615313565b5b141561382b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382290614d92565b60405180910390fd5b5b50565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161388a84611734565b61389491906150c3565b9050600060076000848152602001908152602001600020549050818114613979576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506139fe91906150c3565b9050600060096000848152602001908152602001600020549050600060088381548110613a2e57613a2d6153a0565b5b906000526020600020015490508060088381548110613a5057613a4f6153a0565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a9f57613a9e615371565b5b6001900381819060005260206000200160009055905550505050565b6000613ac683611734565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f0000000000000000000000000000000000000000000000000000000000000001461415613b8c577fd52582ca3ab32b51518dc530400935c8eccaf1a550e27a3a13c7cbdda2f5ec0a9050613bfa565b613bf77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fdfb4c68fd6fd41fd66c88a48056f4c58314a6e78371fd06ce8b0b7c800976f417fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613d8b565b90505b90565b60008282604051602001613c129291906148fe565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613c6b576000600391509150613d34565b601b8560ff1614158015613c835750601c8560ff1614155b15613c95576000600491509150613d34565b600060018787878760405160008152602001604052604051613cba9493929190614aab565b6020604051602081039080840390855afa158015613cdc573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613d2b57600060019250925050613d34565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613d7d87828885613c30565b935093505050935093915050565b60008383834630604051602001613da6959493929190614a58565b6040516020818303038152906040528051906020012090509392505050565b828054613dd1906151c4565b90600052602060002090601f016020900481019282613df35760008555613e3a565b82601f10613e0c57805160ff1916838001178555613e3a565b82800160010185558215613e3a579182015b82811115613e39578251825591602001919060010190613e1e565b5b509050613e479190613e4b565b5090565b5b80821115613e64576000816000905550600101613e4c565b5090565b6000613e7b613e7684614f32565b614f0d565b905082815260208101848484011115613e9757613e9661540d565b5b613ea2848285615182565b509392505050565b6000613ebd613eb884614f63565b614f0d565b905082815260208101848484011115613ed957613ed861540d565b5b613ee4848285615182565b509392505050565b600081359050613efb81615bb0565b92915050565b600081359050613f1081615bc7565b92915050565b600081359050613f2581615bde565b92915050565b600081519050613f3a81615bde565b92915050565b60008083601f840112613f5657613f55615403565b5b8235905067ffffffffffffffff811115613f7357613f726153fe565b5b602083019150836001820283011115613f8f57613f8e615408565b5b9250929050565b600082601f830112613fab57613faa615403565b5b8135613fbb848260208601613e68565b91505092915050565b600082601f830112613fd957613fd8615403565b5b8135613fe9848260208601613eaa565b91505092915050565b60008135905061400181615bf5565b92915050565b60006020828403121561401d5761401c615417565b5b600061402b84828501613eec565b91505092915050565b6000806040838503121561404b5761404a615417565b5b600061405985828601613eec565b925050602061406a85828601613eec565b9150509250929050565b60008060006060848603121561408d5761408c615417565b5b600061409b86828701613eec565b93505060206140ac86828701613eec565b92505060406140bd86828701613ff2565b9150509250925092565b600080600080608085870312156140e1576140e0615417565b5b60006140ef87828801613eec565b945050602061410087828801613eec565b935050604061411187828801613ff2565b925050606085013567ffffffffffffffff81111561413257614131615412565b5b61413e87828801613f96565b91505092959194509250565b6000806040838503121561416157614160615417565b5b600061416f85828601613eec565b925050602061418085828601613f01565b9150509250929050565b600080604083850312156141a1576141a0615417565b5b60006141af85828601613eec565b92505060206141c085828601613ff2565b9150509250929050565b6000602082840312156141e0576141df615417565b5b60006141ee84828501613f01565b91505092915050565b60006020828403121561420d5761420c615417565b5b600061421b84828501613f16565b91505092915050565b60006020828403121561423a57614239615417565b5b600061424884828501613f2b565b91505092915050565b60006020828403121561426757614266615417565b5b600082013567ffffffffffffffff81111561428557614284615412565b5b61429184828501613fc4565b91505092915050565b6000602082840312156142b0576142af615417565b5b60006142be84828501613ff2565b91505092915050565b600080600080606085870312156142e1576142e0615417565b5b60006142ef87828801613ff2565b945050602061430087828801613ff2565b935050604085013567ffffffffffffffff81111561432157614320615412565b5b61432d87828801613f40565b925092505092959194509250565b614344816150f7565b82525050565b61435381615109565b82525050565b61436281615115565b82525050565b61437961437482615115565b615270565b82525050565b600061438a82614f94565b6143948185614faa565b93506143a4818560208601615191565b6143ad8161541c565b840191505092915050565b60006143c382614f9f565b6143cd8185614fc6565b93506143dd818560208601615191565b6143e68161541c565b840191505092915050565b60006143fc82614f9f565b6144068185614fd7565b9350614416818560208601615191565b80840191505092915050565b600061442f601883614fc6565b915061443a8261542d565b602082019050919050565b6000614452601783614fc6565b915061445d82615456565b602082019050919050565b6000614475601f83614fc6565b91506144808261547f565b602082019050919050565b6000614498602b83614fc6565b91506144a3826154a8565b604082019050919050565b60006144bb603283614fc6565b91506144c6826154f7565b604082019050919050565b60006144de602683614fc6565b91506144e982615546565b604082019050919050565b6000614501601c83614fc6565b915061450c82615595565b602082019050919050565b6000614524600283614fd7565b915061452f826155be565b600282019050919050565b6000614547602483614fc6565b9150614552826155e7565b604082019050919050565b600061456a601983614fc6565b915061457582615636565b602082019050919050565b600061458d600d83614fc6565b91506145988261565f565b602082019050919050565b60006145b0602283614fc6565b91506145bb82615688565b604082019050919050565b60006145d3602c83614fc6565b91506145de826156d7565b604082019050919050565b60006145f6601e83614fc6565b915061460182615726565b602082019050919050565b6000614619601383614fc6565b91506146248261574f565b602082019050919050565b600061463c601183614fc6565b915061464782615778565b602082019050919050565b600061465f603883614fc6565b915061466a826157a1565b604082019050919050565b6000614682602a83614fc6565b915061468d826157f0565b604082019050919050565b60006146a5602983614fc6565b91506146b08261583f565b604082019050919050565b60006146c8600d83614fc6565b91506146d38261588e565b602082019050919050565b60006146eb601083614fc6565b91506146f6826158b7565b602082019050919050565b600061470e602283614fc6565b9150614719826158e0565b604082019050919050565b6000614731602083614fc6565b915061473c8261592f565b602082019050919050565b6000614754602c83614fc6565b915061475f82615958565b604082019050919050565b6000614777602083614fc6565b9150614782826159a7565b602082019050919050565b600061479a602983614fc6565b91506147a5826159d0565b604082019050919050565b60006147bd602f83614fc6565b91506147c882615a1f565b604082019050919050565b60006147e0600d83614fc6565b91506147eb82615a6e565b602082019050919050565b6000614803602183614fc6565b915061480e82615a97565b604082019050919050565b6000614826601183614fc6565b915061483182615ae6565b602082019050919050565b6000614849600083614fbb565b915061485482615b0f565b600082019050919050565b600061486c603183614fc6565b915061487782615b12565b604082019050919050565b600061488f602c83614fc6565b915061489a82615b61565b604082019050919050565b6148ae8161516b565b82525050565b6148c56148c08261516b565b61527a565b82525050565b6148d481615175565b82525050565b60006148e682856143f1565b91506148f282846143f1565b91508190509392505050565b600061490982614517565b91506149158285614368565b6020820191506149258284614368565b6020820191508190509392505050565b60006149408261483c565b9150819050919050565b600061495682856148b4565b60208201915061496682846148b4565b6020820191508190509392505050565b600060208201905061498b600083018461433b565b92915050565b60006080820190506149a6600083018761433b565b6149b3602083018661433b565b6149c060408301856148a5565b81810360608301526149d2818461437f565b905095945050505050565b60006040820190506149f2600083018561433b565b6149ff60208301846148a5565b9392505050565b6000602082019050614a1b600083018461434a565b92915050565b6000606082019050614a366000830186614359565b614a43602083018561433b565b614a5060408301846148a5565b949350505050565b600060a082019050614a6d6000830188614359565b614a7a6020830187614359565b614a876040830186614359565b614a9460608301856148a5565b614aa1608083018461433b565b9695505050505050565b6000608082019050614ac06000830187614359565b614acd60208301866148cb565b614ada6040830185614359565b614ae76060830184614359565b95945050505050565b60006020820190508181036000830152614b0a81846143b8565b905092915050565b60006020820190508181036000830152614b2b81614422565b9050919050565b60006020820190508181036000830152614b4b81614445565b9050919050565b60006020820190508181036000830152614b6b81614468565b9050919050565b60006020820190508181036000830152614b8b8161448b565b9050919050565b60006020820190508181036000830152614bab816144ae565b9050919050565b60006020820190508181036000830152614bcb816144d1565b9050919050565b60006020820190508181036000830152614beb816144f4565b9050919050565b60006020820190508181036000830152614c0b8161453a565b9050919050565b60006020820190508181036000830152614c2b8161455d565b9050919050565b60006020820190508181036000830152614c4b81614580565b9050919050565b60006020820190508181036000830152614c6b816145a3565b9050919050565b60006020820190508181036000830152614c8b816145c6565b9050919050565b60006020820190508181036000830152614cab816145e9565b9050919050565b60006020820190508181036000830152614ccb8161460c565b9050919050565b60006020820190508181036000830152614ceb8161462f565b9050919050565b60006020820190508181036000830152614d0b81614652565b9050919050565b60006020820190508181036000830152614d2b81614675565b9050919050565b60006020820190508181036000830152614d4b81614698565b9050919050565b60006020820190508181036000830152614d6b816146bb565b9050919050565b60006020820190508181036000830152614d8b816146de565b9050919050565b60006020820190508181036000830152614dab81614701565b9050919050565b60006020820190508181036000830152614dcb81614724565b9050919050565b60006020820190508181036000830152614deb81614747565b9050919050565b60006020820190508181036000830152614e0b8161476a565b9050919050565b60006020820190508181036000830152614e2b8161478d565b9050919050565b60006020820190508181036000830152614e4b816147b0565b9050919050565b60006020820190508181036000830152614e6b816147d3565b9050919050565b60006020820190508181036000830152614e8b816147f6565b9050919050565b60006020820190508181036000830152614eab81614819565b9050919050565b60006020820190508181036000830152614ecb8161485f565b9050919050565b60006020820190508181036000830152614eeb81614882565b9050919050565b6000602082019050614f0760008301846148a5565b92915050565b6000614f17614f28565b9050614f2382826151f6565b919050565b6000604051905090565b600067ffffffffffffffff821115614f4d57614f4c6153cf565b5b614f568261541c565b9050602081019050919050565b600067ffffffffffffffff821115614f7e57614f7d6153cf565b5b614f878261541c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fed8261516b565b9150614ff88361516b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561502d5761502c6152b5565b5b828201905092915050565b60006150438261516b565b915061504e8361516b565b92508261505e5761505d6152e4565b5b828204905092915050565b60006150748261516b565b915061507f8361516b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150b8576150b76152b5565b5b828202905092915050565b60006150ce8261516b565b91506150d98361516b565b9250828210156150ec576150eb6152b5565b5b828203905092915050565b60006151028261514b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156151af578082015181840152602081019050615194565b838111156151be576000848401525b50505050565b600060028204905060018216806151dc57607f821691505b602082108114156151f0576151ef615342565b5b50919050565b6151ff8261541c565b810181811067ffffffffffffffff8211171561521e5761521d6153cf565b5b80604052505050565b60006152328261516b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615265576152646152b5565b5b600182019050919050565b6000819050919050565b6000819050919050565b600061528f8261516b565b915061529a8361516b565b9250826152aa576152a96152e4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f77686974656c6973742073616c65206e6f74206f70656e000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f626164207369676e617475726500000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f746f6f206d616e7920746f6b656e20706572207472616e73616374696f6e0000600082015250565b7f696e76616c6964206574686572732073656e7400000000000000000000000000600082015250565b7f3130206d6178207065722077616c6c6574000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f70726573616c6520656e64656400000000000000000000000000000000000000600082015250565b7f70726573616c65206e6f74206f70656e00000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f73616c65206e6f74206f70656e00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f75676820737570706c79000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615bb9816150f7565b8114615bc457600080fd5b50565b615bd081615109565b8114615bdb57600080fd5b50565b615be78161511f565b8114615bf257600080fd5b50565b615bfe8161516b565b8114615c0957600080fd5b5056fea2646970667358221220eb968e05a24f3c693facab16c73b7b58fb113a95cde9f7e8a16629d39b3d8a3464736f6c63430008070033

Deployed Bytecode Sourcemap

59368:7816:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61118:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59646:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21621:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23180:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22703:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63781:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59950:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35360:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59869:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24070:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60135:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35028:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60087:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65081:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59563:32;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;64180:465;;;;;;;;;;;;;:::i;:::-;;24480:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62687:85;;;;;;;;;;;;;:::i;:::-;;59911:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62780:333;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35550:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59752:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63291:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21315:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62468:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21045:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64936:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42517:94;;;;;;;;;;;;;:::i;:::-;;60313:65;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63658:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60040:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62572:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41866:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21790:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59604:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23473:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24736:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63548:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63444:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61355:980;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59789:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64653:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65833:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23839:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59830:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42766:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63121:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61118:229;61274:4;61303:36;61327:11;61303:23;:36::i;:::-;61296:43;;61118:229;;;:::o;59646:99::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21621:100::-;21675:13;21708:5;21701:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21621:100;:::o;23180:221::-;23256:7;23284:16;23292:7;23284;:16::i;:::-;23276:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23369:15;:24;23385:7;23369:24;;;;;;;;;;;;;;;;;;;;;23362:31;;23180:221;;;:::o;22703:411::-;22784:13;22800:23;22815:7;22800:14;:23::i;:::-;22784:39;;22848:5;22842:11;;:2;:11;;;;22834:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22942:5;22926:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22951:37;22968:5;22975:12;:10;:12::i;:::-;22951:16;:37::i;:::-;22926:62;22904:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23085:21;23094:2;23098:7;23085:8;:21::i;:::-;22773:341;22703:411;;:::o;63781:391::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63899:17:::1;63936:9:::0;63931:108:::1;63955:11;:18;;;;63951:1;:22;63931:108;;;64008:11;64020:1;64008:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;63995:32;;;;;:::i;:::-;;;63975:3;;;;;:::i;:::-;;;;63931:108;;;;64090:5;64069:18;64057:9;:30;;;;:::i;:::-;:38;64049:47;;;::::0;::::1;;64107:11;64124:39;;;;;;;;64136:6;64124:39;;;;;;64144:18;64124:39;;::::0;64107:57:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63888:284;63781:391:::0;;:::o;59950:41::-;;;;;;;;;;;;;:::o;35360:113::-;35421:7;35448:10;:17;;;;35441:24;;35360:113;:::o;59869:35::-;;;;;;;;;;;;;:::o;24070:339::-;24265:41;24284:12;:10;:12::i;:::-;24298:7;24265:18;:41::i;:::-;24257:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24373:28;24383:4;24389:2;24393:7;24373:9;:28::i;:::-;24070:339;;;:::o;60135:60::-;60193:2;60135:60;:::o;35028:256::-;35125:7;35161:23;35178:5;35161:16;:23::i;:::-;35153:5;:31;35145:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35250:12;:19;35263:5;35250:19;;;;;;;;;;;;;;;:26;35270:5;35250:26;;;;;;;;;;;;35243:33;;35028:256;;;;:::o;60087:41::-;60124:4;60087:41;:::o;65081:167::-;65158:12;;;;;;;;;;;65150:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;65199:41;65213:14;65229:10;;65199:13;:41::i;:::-;65081:167;:::o;59563:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64180:465::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64230:15:::1;64248:21;64230:39;;64285:9;64280:289;64304:11;:18;;;;64300:1;:22;64280:289;;;64344:11;64392:5;64369:11;64381:1;64369:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;64359:7;:29;;;;:::i;:::-;64358:39;;;;:::i;:::-;64344:53;;64514:11;64526:1;64514:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:21;;;;;;;;;;;;64506:35;;64549:3;64506:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64329:240;64324:3;;;;;:::i;:::-;;;;64280:289;;;;64587:10;64579:24;;64611:21;64579:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64219:426;64180:465::o:0;24480:185::-;24618:39;24635:4;24641:2;24645:7;24618:39;;;;;;;;;;;;:16;:39::i;:::-;24480:185;;;:::o;62687:85::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62760:4:::1;62742:15;;:22;;;;;;;;;;;;;;;;;;62687:85::o:0;59911:30::-;;;;:::o;62780:333::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62859:10:::1;;;;;;;;;;;62858:11;62850:20;;;::::0;::::1;;60124:4;62963:16;62981:15;62946:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62936:62;;;;;;62910:103;;:129;;;;:::i;:::-;62881:13;:158;;;;63069:8;63050:16;:27;;;;;;;;;;;;:::i;:::-;;63101:4;63088:10;;:17;;;;;;;;;;;;;;;;;;62780:333:::0;:::o;35550:233::-;35625:7;35661:30;:28;:30::i;:::-;35653:5;:38;35645:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35758:10;35769:5;35758:17;;;;;;;;:::i;:::-;;;;;;;;;;35751:24;;35550:233;;;:::o;59752:30::-;;;;;;;;;;;;;:::o;63291:145::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63374:15:::1;;;;;;;;;;;63373:16;63365:25;;;::::0;::::1;;63420:8;63401:16;:27;;;;;;;;;;;;:::i;:::-;;63291:145:::0;:::o;21315:239::-;21387:7;21407:13;21423:7;:16;21431:7;21423:16;;;;;;;;;;;;;;;;;;;;;21407:32;;21475:1;21458:19;;:5;:19;;;;21450:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21541:5;21534:12;;;21315:239;;;:::o;62468:96::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62550:6:::1;62537:10;:19;;;;62468:96:::0;:::o;21045:208::-;21117:7;21162:1;21145:19;;:5;:19;;;;21137:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21229:9;:16;21239:5;21229:16;;;;;;;;;;;;;;;;21222:23;;21045:208;;;:::o;64936:137::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65028:4:::1;65022:2;:10;;65014:19;;;::::0;::::1;;65044:21;65054:6;65062:2;65044:9;:21::i;:::-;64936:137:::0;;:::o;42517:94::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42582:21:::1;42600:1;42582:9;:21::i;:::-;42517:94::o:0;60313:65::-;;;;;;;;;;;;;;;;;:::o;63658:115::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63757:8:::1;63733:21;;:32;;;;;;;;;;;;;;;;;;63658:115:::0;:::o;60040:38::-;;;;:::o;62572:107::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62665:6:::1;62646:16;;:25;;;;;;;;;;;;;;;;;;62572:107:::0;:::o;41866:87::-;41912:7;41939:6;;;;;;;;;;;41932:13;;41866:87;:::o;21790:104::-;21846:13;21879:7;21872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21790:104;:::o;59604:35::-;;;;;;;;;;;;;:::o;23473:295::-;23588:12;:10;:12::i;:::-;23576:24;;:8;:24;;;;23568:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23688:8;23643:18;:32;23662:12;:10;:12::i;:::-;23643:32;;;;;;;;;;;;;;;:42;23676:8;23643:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23741:8;23712:48;;23727:12;:10;:12::i;:::-;23712:48;;;23751:8;23712:48;;;;;;:::i;:::-;;;;;;;;23473:295;;:::o;24736:328::-;24911:41;24930:12;:10;:12::i;:::-;24944:7;24911:18;:41::i;:::-;24903:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25017:39;25031:4;25037:2;25041:7;25050:5;25017:13;:39::i;:::-;24736:328;;;;:::o;63548:102::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63634:8:::1;63616:15;;:26;;;;;;;;;;;;;;;;;;63548:102:::0;:::o;63444:96::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63524:8:::1;63509:12;;:23;;;;;;;;;;;;;;;;;;63444:96:::0;:::o;61355:980::-;61456:13;61509:16;61517:7;61509;:16::i;:::-;61487:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;61616:10;;;;;;;;;;;61611:69;;61650:18;61643:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61611:69;61692:21;61716:10;:8;:10::i;:::-;61692:34;;61752:4;61741:7;:15;61737:591;;61821:1;61803:7;61797:21;:25;:128;;;;;;;;;;;;;;;;;61870:7;61879:18;:7;:16;:18::i;:::-;61853:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61797:128;61773:152;;;;;61737:591;62006:1;61988:7;61982:21;:25;:334;;;;;;;;;;;;;;;;;62111:7;62149:91;62193:1;60124:4;62168:7;62152:13;;:23;;;;:::i;:::-;62151:38;;;;:::i;:::-;62150:44;;;;:::i;:::-;62149:89;:91::i;:::-;62064:203;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61982:334;61958:358;;;61355:980;;;;:::o;59789:32::-;;;;:::o;64653:275::-;64737:15;;;;;;;;;;;64729:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;64799:14;64784:11;;:29;;;;;;;:::i;:::-;;;;;;;;64847:3;64832:11;;:18;;64824:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;64879:41;64893:14;64909:10;;64879:13;:41::i;:::-;64653:275;:::o;65833:530::-;65997:21;;;;;;;;;;;65989:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;66057:54;66082:9;;66093:10;66105:5;66057:24;:54::i;:::-;66168:14;66122:30;:42;66153:10;66122:42;;;;;;;;;;;;;;;;:60;;;;;;;:::i;:::-;;;;;;;;66261:2;66215:30;:42;66246:10;66215:42;;;;;;;;;;;;;;;;:48;;66193:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;66319:36;66333:14;66349:5;66319:13;:36::i;:::-;65833:530;;;;:::o;23839:164::-;23936:4;23960:18;:25;23979:5;23960:25;;;;;;;;;;;;;;;:35;23986:8;23960:35;;;;;;;;;;;;;;;;;;;;;;;;;23953:42;;23839:164;;;;:::o;59830:32::-;;;;;;;;;;;;;:::o;42766:192::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42875:1:::1;42855:22;;:8;:22;;;;42847:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42931:19;42941:8;42931:9;:19::i;:::-;42766:192:::0;:::o;63121:162::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63256:19:::1;63235:18;:40;;;;;;;;;;;;:::i;:::-;;63121:162:::0;:::o;34720:224::-;34822:4;34861:35;34846:50;;;:11;:50;;;;:90;;;;34900:36;34924:11;34900:23;:36::i;:::-;34846:90;34839:97;;34720:224;;;:::o;26574:127::-;26639:4;26691:1;26663:30;;:7;:16;26671:7;26663:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26656:37;;26574:127;;;:::o;16098:98::-;16151:7;16178:10;16171:17;;16098:98;:::o;30556:174::-;30658:2;30631:15;:24;30647:7;30631:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30714:7;30710:2;30676:46;;30685:23;30700:7;30685:14;:23::i;:::-;30676:46;;;;;;;;;;;;30556:174;;:::o;26868:348::-;26961:4;26986:16;26994:7;26986;:16::i;:::-;26978:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27062:13;27078:23;27093:7;27078:14;:23::i;:::-;27062:39;;27131:5;27120:16;;:7;:16;;;:51;;;;27164:7;27140:31;;:20;27152:7;27140:11;:20::i;:::-;:31;;;27120:51;:87;;;;27175:32;27192:5;27199:7;27175:16;:32::i;:::-;27120:87;27112:96;;;26868:348;;;;:::o;29860:578::-;30019:4;29992:31;;:23;30007:7;29992:14;:23::i;:::-;:31;;;29984:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30102:1;30088:16;;:2;:16;;;;30080:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30158:39;30179:4;30185:2;30189:7;30158:20;:39::i;:::-;30262:29;30279:1;30283:7;30262:8;:29::i;:::-;30323:1;30304:9;:15;30314:4;30304:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30352:1;30335:9;:13;30345:2;30335:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30383:2;30364:7;:16;30372:7;30364:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30422:7;30418:2;30403:27;;30412:4;30403:27;;;;;;;;;;;;29860:578;;;:::o;65256:569::-;65337:10;65366:1;65350:13;:11;:13::i;:::-;:17;;;;:::i;:::-;65337:30;;65400:9;65386:23;;:10;:23;;;65378:32;;;;;;65465:1;60124:4;65452:14;;;;:::i;:::-;65434;65429:2;:19;;;;:::i;:::-;:37;;65421:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;65533:9;65515:14;65507:5;:22;;;;:::i;:::-;:35;;65499:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60193:2;65599:14;:49;;65577:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;65722:9;65717:101;65741:14;65737:1;:18;65717:101;;;65777:29;65787:10;65804:1;65799:2;:6;;;;:::i;:::-;65777:9;:29::i;:::-;65757:3;;;;;:::i;:::-;;;;65717:101;;;;65326:499;65256:569;;:::o;27558:110::-;27634:26;27644:2;27648:7;27634:26;;;;;;;;;;;;:9;:26::i;:::-;27558:110;;:::o;42966:173::-;43022:16;43041:6;;;;;;;;;;;43022:25;;43067:8;43058:6;;:17;;;;;;;;;;;;;;;;;;43122:8;43091:40;;43112:8;43091:40;;;;;;;;;;;;43011:128;42966:173;:::o;25946:315::-;26103:28;26113:4;26119:2;26123:7;26103:9;:28::i;:::-;26150:48;26173:4;26179:2;26183:7;26192:5;26150:22;:48::i;:::-;26142:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25946:315;;;;:::o;62343:117::-;62403:13;62436:16;62429:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62343:117;:::o;16623:723::-;16679:13;16909:1;16900:5;:10;16896:53;;;16927:10;;;;;;;;;;;;;;;;;;;;;16896:53;16959:12;16974:5;16959:20;;16990:14;17015:78;17030:1;17022:4;:9;17015:78;;17048:8;;;;;:::i;:::-;;;;17079:2;17071:10;;;;;:::i;:::-;;;17015:78;;;17103:19;17135:6;17125:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17103:39;;17153:154;17169:1;17160:5;:10;17153:154;;17197:1;17187:11;;;;;:::i;:::-;;;17264:2;17256:5;:10;;;;:::i;:::-;17243:2;:24;;;;:::i;:::-;17230:39;;17213:6;17220;17213:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17293:2;17284:11;;;;;:::i;:::-;;;17153:154;;;17331:6;17317:21;;;;;16623:723;;;;:::o;66371:348::-;66527:14;66544:44;66568:12;66582:5;66544:23;:44::i;:::-;66527:61;;66599:14;66616:32;66630:6;66638:9;;66616:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:32::i;:::-;66599:49;;66677:16;;;;;;;;;;;66667:26;;:6;:26;;;66659:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;66516:203;;66371:348;;;;:::o;20676:305::-;20778:4;20830:25;20815:40;;;:11;:40;;;;:105;;;;20887:33;20872:48;;;:11;:48;;;;20815:105;:158;;;;20937:36;20961:11;20937:23;:36::i;:::-;20815:158;20795:178;;20676:305;;;:::o;60895:215::-;61057:45;61084:4;61090:2;61094:7;61057:26;:45::i;:::-;60895:215;;;:::o;27895:321::-;28025:18;28031:2;28035:7;28025:5;:18::i;:::-;28076:54;28107:1;28111:2;28115:7;28124:5;28076:22;:54::i;:::-;28054:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27895:321;;;:::o;31295:799::-;31450:4;31471:15;:2;:13;;;:15::i;:::-;31467:620;;;31523:2;31507:36;;;31544:12;:10;:12::i;:::-;31558:4;31564:7;31573:5;31507:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31503:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31766:1;31749:6;:13;:18;31745:272;;;31792:60;;;;;;;;;;:::i;:::-;;;;;;;;31745:272;31967:6;31961:13;31952:6;31948:2;31944:15;31937:38;31503:529;31640:41;;;31630:51;;;:6;:51;;;;31623:58;;;;;31467:620;32071:4;32064:11;;31295:799;;;;;;;:::o;66727:454::-;66847:7;66892:281;66996:49;67072:12;67111:5;66959:180;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66927:231;;;;;;66892:16;:281::i;:::-;66872:301;;66727:454;;;;:::o;50173:231::-;50251:7;50272:17;50291:18;50313:27;50324:4;50330:9;50313:10;:27::i;:::-;50271:69;;;;50351:18;50363:5;50351:11;:18::i;:::-;50387:9;50380:16;;;;50173:231;;;;:::o;19180:157::-;19265:4;19304:25;19289:40;;;:11;:40;;;;19282:47;;19180:157;;;:::o;36396:589::-;36540:45;36567:4;36573:2;36577:7;36540:26;:45::i;:::-;36618:1;36602:18;;:4;:18;;;36598:187;;;36637:40;36669:7;36637:31;:40::i;:::-;36598:187;;;36707:2;36699:10;;:4;:10;;;36695:90;;36726:47;36759:4;36765:7;36726:32;:47::i;:::-;36695:90;36598:187;36813:1;36799:16;;:2;:16;;;36795:183;;;36832:45;36869:7;36832:36;:45::i;:::-;36795:183;;;36905:4;36899:10;;:2;:10;;;36895:83;;36926:40;36954:2;36958:7;36926:27;:40::i;:::-;36895:83;36795:183;36396:589;;;:::o;28552:382::-;28646:1;28632:16;;:2;:16;;;;28624:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28705:16;28713:7;28705;:16::i;:::-;28704:17;28696:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28767:45;28796:1;28800:2;28804:7;28767:20;:45::i;:::-;28842:1;28825:9;:13;28835:2;28825:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28873:2;28854:7;:16;28862:7;28854:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28918:7;28914:2;28893:33;;28910:1;28893:33;;;;;;;;;;;;28552:382;;:::o;8142:387::-;8202:4;8410:12;8477:7;8465:20;8457:28;;8520:1;8513:4;:8;8506:15;;;8142:387;;;:::o;59112:167::-;59189:7;59216:55;59238:20;:18;:20::i;:::-;59260:10;59216:21;:55::i;:::-;59209:62;;59112:167;;;:::o;48063:1308::-;48144:7;48153:12;48398:2;48378:9;:16;:22;48374:990;;;48417:9;48441;48465:7;48674:4;48663:9;48659:20;48653:27;48648:32;;48724:4;48713:9;48709:20;48703:27;48698:32;;48782:4;48771:9;48767:20;48761:27;48758:1;48753:36;48748:41;;48825:25;48836:4;48842:1;48845;48848;48825:10;:25::i;:::-;48818:32;;;;;;;;;48374:990;48892:2;48872:9;:16;:22;48868:496;;;48911:9;48935:10;49147:4;49136:9;49132:20;49126:27;49121:32;;49198:4;49187:9;49183:20;49177:27;49171:33;;49240:23;49251:4;49257:1;49260:2;49240:10;:23::i;:::-;49233:30;;;;;;;;48868:496;49312:1;49316:35;49296:56;;;;48063:1308;;;;;;:::o;46334:643::-;46412:20;46403:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;46399:571;;;46449:7;;46399:571;46510:29;46501:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;46497:473;;;46556:34;;;;;;;;;;:::i;:::-;;;;;;;;46497:473;46621:35;46612:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;46608:362;;;46673:41;;;;;;;;;;:::i;:::-;;;;;;;;46608:362;46745:30;46736:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;46732:238;;;46792:44;;;;;;;;;;:::i;:::-;;;;;;;;46732:238;46867:30;46858:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;46854:116;;;46914:44;;;;;;;;;;:::i;:::-;;;;;;;;46854:116;46334:643;;:::o;32666:126::-;;;;:::o;37708:164::-;37812:10;:17;;;;37785:15;:24;37801:7;37785:24;;;;;;;;;;;:44;;;;37840:10;37856:7;37840:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37708:164;:::o;38499:988::-;38765:22;38815:1;38790:22;38807:4;38790:16;:22::i;:::-;:26;;;;:::i;:::-;38765:51;;38827:18;38848:17;:26;38866:7;38848:26;;;;;;;;;;;;38827:47;;38995:14;38981:10;:28;38977:328;;39026:19;39048:12;:18;39061:4;39048:18;;;;;;;;;;;;;;;:34;39067:14;39048:34;;;;;;;;;;;;39026:56;;39132:11;39099:12;:18;39112:4;39099:18;;;;;;;;;;;;;;;:30;39118:10;39099:30;;;;;;;;;;;:44;;;;39249:10;39216:17;:30;39234:11;39216:30;;;;;;;;;;;:43;;;;39011:294;38977:328;39401:17;:26;39419:7;39401:26;;;;;;;;;;;39394:33;;;39445:12;:18;39458:4;39445:18;;;;;;;;;;;;;;;:34;39464:14;39445:34;;;;;;;;;;;39438:41;;;38580:907;;38499:988;;:::o;39782:1079::-;40035:22;40080:1;40060:10;:17;;;;:21;;;;:::i;:::-;40035:46;;40092:18;40113:15;:24;40129:7;40113:24;;;;;;;;;;;;40092:45;;40464:19;40486:10;40497:14;40486:26;;;;;;;;:::i;:::-;;;;;;;;;;40464:48;;40550:11;40525:10;40536;40525:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40661:10;40630:15;:28;40646:11;40630:28;;;;;;;;;;;:41;;;;40802:15;:24;40818:7;40802:24;;;;;;;;;;;40795:31;;;40837:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39853:1008;;;39782:1079;:::o;37286:221::-;37371:14;37388:20;37405:2;37388:16;:20::i;:::-;37371:37;;37446:7;37419:12;:16;37432:2;37419:16;;;;;;;;;;;;;;;:24;37436:6;37419:24;;;;;;;;;;;:34;;;;37493:6;37464:17;:26;37482:7;37464:26;;;;;;;;;;;:35;;;;37360:147;37286:221;;:::o;57918:281::-;57971:7;58012:16;57995:13;:33;57991:201;;;58052:24;58045:31;;;;57991:201;58116:64;58138:10;58150:12;58164:15;58116:21;:64::i;:::-;58109:71;;57918:281;;:::o;54641:196::-;54734:7;54800:15;54817:10;54771:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54761:68;;;;;;54754:75;;54641:196;;;;:::o;51672:1632::-;51803:7;51812:12;52737:66;52732:1;52724:10;;:79;52720:163;;;52836:1;52840:30;52820:51;;;;;;52720:163;52902:2;52897:1;:7;;;;:18;;;;;52913:2;52908:1;:7;;;;52897:18;52893:102;;;52948:1;52952:30;52932:51;;;;;;52893:102;53092:14;53109:24;53119:4;53125:1;53128;53131;53109:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53092:41;;53166:1;53148:20;;:6;:20;;;53144:103;;;53201:1;53205:29;53185:50;;;;;;;53144:103;53267:6;53275:20;53259:37;;;;;51672:1632;;;;;;;;:::o;50667:391::-;50781:7;50790:12;50815:9;50835:7;50890:66;50886:2;50882:75;50877:80;;50994:2;50989;50984:3;50980:12;50976:21;50971:26;;51025:25;51036:4;51042:1;51045;51048;51025:10;:25::i;:::-;51018:32;;;;;;50667:391;;;;;;:::o;58207:263::-;58351:7;58399:8;58409;58419:11;58432:13;58455:4;58388:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58378:84;;;;;;58371:91;;58207:263;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:552::-;1485:8;1495:6;1545:3;1538:4;1530:6;1526:17;1522:27;1512:122;;1553:79;;:::i;:::-;1512:122;1666:6;1653:20;1643:30;;1696:18;1688:6;1685:30;1682:117;;;1718:79;;:::i;:::-;1682:117;1832:4;1824:6;1820:17;1808:29;;1886:3;1878:4;1870:6;1866:17;1856:8;1852:32;1849:41;1846:128;;;1893:79;;:::i;:::-;1846:128;1428:552;;;;;:::o;1999:338::-;2054:5;2103:3;2096:4;2088:6;2084:17;2080:27;2070:122;;2111:79;;:::i;:::-;2070:122;2228:6;2215:20;2253:78;2327:3;2319:6;2312:4;2304:6;2300:17;2253:78;:::i;:::-;2244:87;;2060:277;1999:338;;;;:::o;2357:340::-;2413:5;2462:3;2455:4;2447:6;2443:17;2439:27;2429:122;;2470:79;;:::i;:::-;2429:122;2587:6;2574:20;2612:79;2687:3;2679:6;2672:4;2664:6;2660:17;2612:79;:::i;:::-;2603:88;;2419:278;2357:340;;;;:::o;2703:139::-;2749:5;2787:6;2774:20;2765:29;;2803:33;2830:5;2803:33;:::i;:::-;2703:139;;;;:::o;2848:329::-;2907:6;2956:2;2944:9;2935:7;2931:23;2927:32;2924:119;;;2962:79;;:::i;:::-;2924:119;3082:1;3107:53;3152:7;3143:6;3132:9;3128:22;3107:53;:::i;:::-;3097:63;;3053:117;2848:329;;;;:::o;3183:474::-;3251:6;3259;3308:2;3296:9;3287:7;3283:23;3279:32;3276:119;;;3314:79;;:::i;:::-;3276:119;3434:1;3459:53;3504:7;3495:6;3484:9;3480:22;3459:53;:::i;:::-;3449:63;;3405:117;3561:2;3587:53;3632:7;3623:6;3612:9;3608:22;3587:53;:::i;:::-;3577:63;;3532:118;3183:474;;;;;:::o;3663:619::-;3740:6;3748;3756;3805:2;3793:9;3784:7;3780:23;3776:32;3773:119;;;3811:79;;:::i;:::-;3773:119;3931:1;3956:53;4001:7;3992:6;3981:9;3977:22;3956:53;:::i;:::-;3946:63;;3902:117;4058:2;4084:53;4129:7;4120:6;4109:9;4105:22;4084:53;:::i;:::-;4074:63;;4029:118;4186:2;4212:53;4257:7;4248:6;4237:9;4233:22;4212:53;:::i;:::-;4202:63;;4157:118;3663:619;;;;;:::o;4288:943::-;4383:6;4391;4399;4407;4456:3;4444:9;4435:7;4431:23;4427:33;4424:120;;;4463:79;;:::i;:::-;4424:120;4583:1;4608:53;4653:7;4644:6;4633:9;4629:22;4608:53;:::i;:::-;4598:63;;4554:117;4710:2;4736:53;4781:7;4772:6;4761:9;4757:22;4736:53;:::i;:::-;4726:63;;4681:118;4838:2;4864:53;4909:7;4900:6;4889:9;4885:22;4864:53;:::i;:::-;4854:63;;4809:118;4994:2;4983:9;4979:18;4966:32;5025:18;5017:6;5014:30;5011:117;;;5047:79;;:::i;:::-;5011:117;5152:62;5206:7;5197:6;5186:9;5182:22;5152:62;:::i;:::-;5142:72;;4937:287;4288:943;;;;;;;:::o;5237:468::-;5302:6;5310;5359:2;5347:9;5338:7;5334:23;5330:32;5327:119;;;5365:79;;:::i;:::-;5327:119;5485:1;5510:53;5555:7;5546:6;5535:9;5531:22;5510:53;:::i;:::-;5500:63;;5456:117;5612:2;5638:50;5680:7;5671:6;5660:9;5656:22;5638:50;:::i;:::-;5628:60;;5583:115;5237:468;;;;;:::o;5711:474::-;5779:6;5787;5836:2;5824:9;5815:7;5811:23;5807:32;5804:119;;;5842:79;;:::i;:::-;5804:119;5962:1;5987:53;6032:7;6023:6;6012:9;6008:22;5987:53;:::i;:::-;5977:63;;5933:117;6089:2;6115:53;6160:7;6151:6;6140:9;6136:22;6115:53;:::i;:::-;6105:63;;6060:118;5711:474;;;;;:::o;6191:323::-;6247:6;6296:2;6284:9;6275:7;6271:23;6267:32;6264:119;;;6302:79;;:::i;:::-;6264:119;6422:1;6447:50;6489:7;6480:6;6469:9;6465:22;6447:50;:::i;:::-;6437:60;;6393:114;6191:323;;;;:::o;6520:327::-;6578:6;6627:2;6615:9;6606:7;6602:23;6598:32;6595:119;;;6633:79;;:::i;:::-;6595:119;6753:1;6778:52;6822:7;6813:6;6802:9;6798:22;6778:52;:::i;:::-;6768:62;;6724:116;6520:327;;;;:::o;6853:349::-;6922:6;6971:2;6959:9;6950:7;6946:23;6942:32;6939:119;;;6977:79;;:::i;:::-;6939:119;7097:1;7122:63;7177:7;7168:6;7157:9;7153:22;7122:63;:::i;:::-;7112:73;;7068:127;6853:349;;;;:::o;7208:509::-;7277:6;7326:2;7314:9;7305:7;7301:23;7297:32;7294:119;;;7332:79;;:::i;:::-;7294:119;7480:1;7469:9;7465:17;7452:31;7510:18;7502:6;7499:30;7496:117;;;7532:79;;:::i;:::-;7496:117;7637:63;7692:7;7683:6;7672:9;7668:22;7637:63;:::i;:::-;7627:73;;7423:287;7208:509;;;;:::o;7723:329::-;7782:6;7831:2;7819:9;7810:7;7806:23;7802:32;7799:119;;;7837:79;;:::i;:::-;7799:119;7957:1;7982:53;8027:7;8018:6;8007:9;8003:22;7982:53;:::i;:::-;7972:63;;7928:117;7723:329;;;;:::o;8058:817::-;8146:6;8154;8162;8170;8219:2;8207:9;8198:7;8194:23;8190:32;8187:119;;;8225:79;;:::i;:::-;8187:119;8345:1;8370:53;8415:7;8406:6;8395:9;8391:22;8370:53;:::i;:::-;8360:63;;8316:117;8472:2;8498:53;8543:7;8534:6;8523:9;8519:22;8498:53;:::i;:::-;8488:63;;8443:118;8628:2;8617:9;8613:18;8600:32;8659:18;8651:6;8648:30;8645:117;;;8681:79;;:::i;:::-;8645:117;8794:64;8850:7;8841:6;8830:9;8826:22;8794:64;:::i;:::-;8776:82;;;;8571:297;8058:817;;;;;;;:::o;8881:118::-;8968:24;8986:5;8968:24;:::i;:::-;8963:3;8956:37;8881:118;;:::o;9005:109::-;9086:21;9101:5;9086:21;:::i;:::-;9081:3;9074:34;9005:109;;:::o;9120:118::-;9207:24;9225:5;9207:24;:::i;:::-;9202:3;9195:37;9120:118;;:::o;9244:157::-;9349:45;9369:24;9387:5;9369:24;:::i;:::-;9349:45;:::i;:::-;9344:3;9337:58;9244:157;;:::o;9407:360::-;9493:3;9521:38;9553:5;9521:38;:::i;:::-;9575:70;9638:6;9633:3;9575:70;:::i;:::-;9568:77;;9654:52;9699:6;9694:3;9687:4;9680:5;9676:16;9654:52;:::i;:::-;9731:29;9753:6;9731:29;:::i;:::-;9726:3;9722:39;9715:46;;9497:270;9407:360;;;;:::o;9773:364::-;9861:3;9889:39;9922:5;9889:39;:::i;:::-;9944:71;10008:6;10003:3;9944:71;:::i;:::-;9937:78;;10024:52;10069:6;10064:3;10057:4;10050:5;10046:16;10024:52;:::i;:::-;10101:29;10123:6;10101:29;:::i;:::-;10096:3;10092:39;10085:46;;9865:272;9773:364;;;;:::o;10143:377::-;10249:3;10277:39;10310:5;10277:39;:::i;:::-;10332:89;10414:6;10409:3;10332:89;:::i;:::-;10325:96;;10430:52;10475:6;10470:3;10463:4;10456:5;10452:16;10430:52;:::i;:::-;10507:6;10502:3;10498:16;10491:23;;10253:267;10143:377;;;;:::o;10526:366::-;10668:3;10689:67;10753:2;10748:3;10689:67;:::i;:::-;10682:74;;10765:93;10854:3;10765:93;:::i;:::-;10883:2;10878:3;10874:12;10867:19;;10526:366;;;:::o;10898:::-;11040:3;11061:67;11125:2;11120:3;11061:67;:::i;:::-;11054:74;;11137:93;11226:3;11137:93;:::i;:::-;11255:2;11250:3;11246:12;11239:19;;10898:366;;;:::o;11270:::-;11412:3;11433:67;11497:2;11492:3;11433:67;:::i;:::-;11426:74;;11509:93;11598:3;11509:93;:::i;:::-;11627:2;11622:3;11618:12;11611:19;;11270:366;;;:::o;11642:::-;11784:3;11805:67;11869:2;11864:3;11805:67;:::i;:::-;11798:74;;11881:93;11970:3;11881:93;:::i;:::-;11999:2;11994:3;11990:12;11983:19;;11642:366;;;:::o;12014:::-;12156:3;12177:67;12241:2;12236:3;12177:67;:::i;:::-;12170:74;;12253:93;12342:3;12253:93;:::i;:::-;12371:2;12366:3;12362:12;12355:19;;12014:366;;;:::o;12386:::-;12528:3;12549:67;12613:2;12608:3;12549:67;:::i;:::-;12542:74;;12625:93;12714:3;12625:93;:::i;:::-;12743:2;12738:3;12734:12;12727:19;;12386:366;;;:::o;12758:::-;12900:3;12921:67;12985:2;12980:3;12921:67;:::i;:::-;12914:74;;12997:93;13086:3;12997:93;:::i;:::-;13115:2;13110:3;13106:12;13099:19;;12758:366;;;:::o;13130:400::-;13290:3;13311:84;13393:1;13388:3;13311:84;:::i;:::-;13304:91;;13404:93;13493:3;13404:93;:::i;:::-;13522:1;13517:3;13513:11;13506:18;;13130:400;;;:::o;13536:366::-;13678:3;13699:67;13763:2;13758:3;13699:67;:::i;:::-;13692:74;;13775:93;13864:3;13775:93;:::i;:::-;13893:2;13888:3;13884:12;13877:19;;13536:366;;;:::o;13908:::-;14050:3;14071:67;14135:2;14130:3;14071:67;:::i;:::-;14064:74;;14147:93;14236:3;14147:93;:::i;:::-;14265:2;14260:3;14256:12;14249:19;;13908:366;;;:::o;14280:::-;14422:3;14443:67;14507:2;14502:3;14443:67;:::i;:::-;14436:74;;14519:93;14608:3;14519:93;:::i;:::-;14637:2;14632:3;14628:12;14621:19;;14280:366;;;:::o;14652:::-;14794:3;14815:67;14879:2;14874:3;14815:67;:::i;:::-;14808:74;;14891:93;14980:3;14891:93;:::i;:::-;15009:2;15004:3;15000:12;14993:19;;14652:366;;;:::o;15024:::-;15166:3;15187:67;15251:2;15246:3;15187:67;:::i;:::-;15180:74;;15263:93;15352:3;15263:93;:::i;:::-;15381:2;15376:3;15372:12;15365:19;;15024:366;;;:::o;15396:::-;15538:3;15559:67;15623:2;15618:3;15559:67;:::i;:::-;15552:74;;15635:93;15724:3;15635:93;:::i;:::-;15753:2;15748:3;15744:12;15737:19;;15396:366;;;:::o;15768:::-;15910:3;15931:67;15995:2;15990:3;15931:67;:::i;:::-;15924:74;;16007:93;16096:3;16007:93;:::i;:::-;16125:2;16120:3;16116:12;16109:19;;15768:366;;;:::o;16140:::-;16282:3;16303:67;16367:2;16362:3;16303:67;:::i;:::-;16296:74;;16379:93;16468:3;16379:93;:::i;:::-;16497:2;16492:3;16488:12;16481:19;;16140:366;;;:::o;16512:::-;16654:3;16675:67;16739:2;16734:3;16675:67;:::i;:::-;16668:74;;16751:93;16840:3;16751:93;:::i;:::-;16869:2;16864:3;16860:12;16853:19;;16512:366;;;:::o;16884:::-;17026:3;17047:67;17111:2;17106:3;17047:67;:::i;:::-;17040:74;;17123:93;17212:3;17123:93;:::i;:::-;17241:2;17236:3;17232:12;17225:19;;16884:366;;;:::o;17256:::-;17398:3;17419:67;17483:2;17478:3;17419:67;:::i;:::-;17412:74;;17495:93;17584:3;17495:93;:::i;:::-;17613:2;17608:3;17604:12;17597:19;;17256:366;;;:::o;17628:::-;17770:3;17791:67;17855:2;17850:3;17791:67;:::i;:::-;17784:74;;17867:93;17956:3;17867:93;:::i;:::-;17985:2;17980:3;17976:12;17969:19;;17628:366;;;:::o;18000:::-;18142:3;18163:67;18227:2;18222:3;18163:67;:::i;:::-;18156:74;;18239:93;18328:3;18239:93;:::i;:::-;18357:2;18352:3;18348:12;18341:19;;18000:366;;;:::o;18372:::-;18514:3;18535:67;18599:2;18594:3;18535:67;:::i;:::-;18528:74;;18611:93;18700:3;18611:93;:::i;:::-;18729:2;18724:3;18720:12;18713:19;;18372:366;;;:::o;18744:::-;18886:3;18907:67;18971:2;18966:3;18907:67;:::i;:::-;18900:74;;18983:93;19072:3;18983:93;:::i;:::-;19101:2;19096:3;19092:12;19085:19;;18744:366;;;:::o;19116:::-;19258:3;19279:67;19343:2;19338:3;19279:67;:::i;:::-;19272:74;;19355:93;19444:3;19355:93;:::i;:::-;19473:2;19468:3;19464:12;19457:19;;19116:366;;;:::o;19488:::-;19630:3;19651:67;19715:2;19710:3;19651:67;:::i;:::-;19644:74;;19727:93;19816:3;19727:93;:::i;:::-;19845:2;19840:3;19836:12;19829:19;;19488:366;;;:::o;19860:::-;20002:3;20023:67;20087:2;20082:3;20023:67;:::i;:::-;20016:74;;20099:93;20188:3;20099:93;:::i;:::-;20217:2;20212:3;20208:12;20201:19;;19860:366;;;:::o;20232:::-;20374:3;20395:67;20459:2;20454:3;20395:67;:::i;:::-;20388:74;;20471:93;20560:3;20471:93;:::i;:::-;20589:2;20584:3;20580:12;20573:19;;20232:366;;;:::o;20604:::-;20746:3;20767:67;20831:2;20826:3;20767:67;:::i;:::-;20760:74;;20843:93;20932:3;20843:93;:::i;:::-;20961:2;20956:3;20952:12;20945:19;;20604:366;;;:::o;20976:::-;21118:3;21139:67;21203:2;21198:3;21139:67;:::i;:::-;21132:74;;21215:93;21304:3;21215:93;:::i;:::-;21333:2;21328:3;21324:12;21317:19;;20976:366;;;:::o;21348:::-;21490:3;21511:67;21575:2;21570:3;21511:67;:::i;:::-;21504:74;;21587:93;21676:3;21587:93;:::i;:::-;21705:2;21700:3;21696:12;21689:19;;21348:366;;;:::o;21720:398::-;21879:3;21900:83;21981:1;21976:3;21900:83;:::i;:::-;21893:90;;21992:93;22081:3;21992:93;:::i;:::-;22110:1;22105:3;22101:11;22094:18;;21720:398;;;:::o;22124:366::-;22266:3;22287:67;22351:2;22346:3;22287:67;:::i;:::-;22280:74;;22363:93;22452:3;22363:93;:::i;:::-;22481:2;22476:3;22472:12;22465:19;;22124:366;;;:::o;22496:::-;22638:3;22659:67;22723:2;22718:3;22659:67;:::i;:::-;22652:74;;22735:93;22824:3;22735:93;:::i;:::-;22853:2;22848:3;22844:12;22837:19;;22496:366;;;:::o;22868:118::-;22955:24;22973:5;22955:24;:::i;:::-;22950:3;22943:37;22868:118;;:::o;22992:157::-;23097:45;23117:24;23135:5;23117:24;:::i;:::-;23097:45;:::i;:::-;23092:3;23085:58;22992:157;;:::o;23155:112::-;23238:22;23254:5;23238:22;:::i;:::-;23233:3;23226:35;23155:112;;:::o;23273:435::-;23453:3;23475:95;23566:3;23557:6;23475:95;:::i;:::-;23468:102;;23587:95;23678:3;23669:6;23587:95;:::i;:::-;23580:102;;23699:3;23692:10;;23273:435;;;;;:::o;23714:663::-;23955:3;23977:148;24121:3;23977:148;:::i;:::-;23970:155;;24135:75;24206:3;24197:6;24135:75;:::i;:::-;24235:2;24230:3;24226:12;24219:19;;24248:75;24319:3;24310:6;24248:75;:::i;:::-;24348:2;24343:3;24339:12;24332:19;;24368:3;24361:10;;23714:663;;;;;:::o;24383:379::-;24567:3;24589:147;24732:3;24589:147;:::i;:::-;24582:154;;24753:3;24746:10;;24383:379;;;:::o;24768:397::-;24908:3;24923:75;24994:3;24985:6;24923:75;:::i;:::-;25023:2;25018:3;25014:12;25007:19;;25036:75;25107:3;25098:6;25036:75;:::i;:::-;25136:2;25131:3;25127:12;25120:19;;25156:3;25149:10;;24768:397;;;;;:::o;25171:222::-;25264:4;25302:2;25291:9;25287:18;25279:26;;25315:71;25383:1;25372:9;25368:17;25359:6;25315:71;:::i;:::-;25171:222;;;;:::o;25399:640::-;25594:4;25632:3;25621:9;25617:19;25609:27;;25646:71;25714:1;25703:9;25699:17;25690:6;25646:71;:::i;:::-;25727:72;25795:2;25784:9;25780:18;25771:6;25727:72;:::i;:::-;25809;25877:2;25866:9;25862:18;25853:6;25809:72;:::i;:::-;25928:9;25922:4;25918:20;25913:2;25902:9;25898:18;25891:48;25956:76;26027:4;26018:6;25956:76;:::i;:::-;25948:84;;25399:640;;;;;;;:::o;26045:332::-;26166:4;26204:2;26193:9;26189:18;26181:26;;26217:71;26285:1;26274:9;26270:17;26261:6;26217:71;:::i;:::-;26298:72;26366:2;26355:9;26351:18;26342:6;26298:72;:::i;:::-;26045:332;;;;;:::o;26383:210::-;26470:4;26508:2;26497:9;26493:18;26485:26;;26521:65;26583:1;26572:9;26568:17;26559:6;26521:65;:::i;:::-;26383:210;;;;:::o;26599:442::-;26748:4;26786:2;26775:9;26771:18;26763:26;;26799:71;26867:1;26856:9;26852:17;26843:6;26799:71;:::i;:::-;26880:72;26948:2;26937:9;26933:18;26924:6;26880:72;:::i;:::-;26962;27030:2;27019:9;27015:18;27006:6;26962:72;:::i;:::-;26599:442;;;;;;:::o;27047:664::-;27252:4;27290:3;27279:9;27275:19;27267:27;;27304:71;27372:1;27361:9;27357:17;27348:6;27304:71;:::i;:::-;27385:72;27453:2;27442:9;27438:18;27429:6;27385:72;:::i;:::-;27467;27535:2;27524:9;27520:18;27511:6;27467:72;:::i;:::-;27549;27617:2;27606:9;27602:18;27593:6;27549:72;:::i;:::-;27631:73;27699:3;27688:9;27684:19;27675:6;27631:73;:::i;:::-;27047:664;;;;;;;;:::o;27717:545::-;27890:4;27928:3;27917:9;27913:19;27905:27;;27942:71;28010:1;27999:9;27995:17;27986:6;27942:71;:::i;:::-;28023:68;28087:2;28076:9;28072:18;28063:6;28023:68;:::i;:::-;28101:72;28169:2;28158:9;28154:18;28145:6;28101:72;:::i;:::-;28183;28251:2;28240:9;28236:18;28227:6;28183:72;:::i;:::-;27717:545;;;;;;;:::o;28268:313::-;28381:4;28419:2;28408:9;28404:18;28396:26;;28468:9;28462:4;28458:20;28454:1;28443:9;28439:17;28432:47;28496:78;28569:4;28560:6;28496:78;:::i;:::-;28488:86;;28268:313;;;;:::o;28587:419::-;28753:4;28791:2;28780:9;28776:18;28768:26;;28840:9;28834:4;28830:20;28826:1;28815:9;28811:17;28804:47;28868:131;28994:4;28868:131;:::i;:::-;28860:139;;28587:419;;;:::o;29012:::-;29178:4;29216:2;29205:9;29201:18;29193:26;;29265:9;29259:4;29255:20;29251:1;29240:9;29236:17;29229:47;29293:131;29419:4;29293:131;:::i;:::-;29285:139;;29012:419;;;:::o;29437:::-;29603:4;29641:2;29630:9;29626:18;29618:26;;29690:9;29684:4;29680:20;29676:1;29665:9;29661:17;29654:47;29718:131;29844:4;29718:131;:::i;:::-;29710:139;;29437:419;;;:::o;29862:::-;30028:4;30066:2;30055:9;30051:18;30043:26;;30115:9;30109:4;30105:20;30101:1;30090:9;30086:17;30079:47;30143:131;30269:4;30143:131;:::i;:::-;30135:139;;29862:419;;;:::o;30287:::-;30453:4;30491:2;30480:9;30476:18;30468:26;;30540:9;30534:4;30530:20;30526:1;30515:9;30511:17;30504:47;30568:131;30694:4;30568:131;:::i;:::-;30560:139;;30287:419;;;:::o;30712:::-;30878:4;30916:2;30905:9;30901:18;30893:26;;30965:9;30959:4;30955:20;30951:1;30940:9;30936:17;30929:47;30993:131;31119:4;30993:131;:::i;:::-;30985:139;;30712:419;;;:::o;31137:::-;31303:4;31341:2;31330:9;31326:18;31318:26;;31390:9;31384:4;31380:20;31376:1;31365:9;31361:17;31354:47;31418:131;31544:4;31418:131;:::i;:::-;31410:139;;31137:419;;;:::o;31562:::-;31728:4;31766:2;31755:9;31751:18;31743:26;;31815:9;31809:4;31805:20;31801:1;31790:9;31786:17;31779:47;31843:131;31969:4;31843:131;:::i;:::-;31835:139;;31562:419;;;:::o;31987:::-;32153:4;32191:2;32180:9;32176:18;32168:26;;32240:9;32234:4;32230:20;32226:1;32215:9;32211:17;32204:47;32268:131;32394:4;32268:131;:::i;:::-;32260:139;;31987:419;;;:::o;32412:::-;32578:4;32616:2;32605:9;32601:18;32593:26;;32665:9;32659:4;32655:20;32651:1;32640:9;32636:17;32629:47;32693:131;32819:4;32693:131;:::i;:::-;32685:139;;32412:419;;;:::o;32837:::-;33003:4;33041:2;33030:9;33026:18;33018:26;;33090:9;33084:4;33080:20;33076:1;33065:9;33061:17;33054:47;33118:131;33244:4;33118:131;:::i;:::-;33110:139;;32837:419;;;:::o;33262:::-;33428:4;33466:2;33455:9;33451:18;33443:26;;33515:9;33509:4;33505:20;33501:1;33490:9;33486:17;33479:47;33543:131;33669:4;33543:131;:::i;:::-;33535:139;;33262:419;;;:::o;33687:::-;33853:4;33891:2;33880:9;33876:18;33868:26;;33940:9;33934:4;33930:20;33926:1;33915:9;33911:17;33904:47;33968:131;34094:4;33968:131;:::i;:::-;33960:139;;33687:419;;;:::o;34112:::-;34278:4;34316:2;34305:9;34301:18;34293:26;;34365:9;34359:4;34355:20;34351:1;34340:9;34336:17;34329:47;34393:131;34519:4;34393:131;:::i;:::-;34385:139;;34112:419;;;:::o;34537:::-;34703:4;34741:2;34730:9;34726:18;34718:26;;34790:9;34784:4;34780:20;34776:1;34765:9;34761:17;34754:47;34818:131;34944:4;34818:131;:::i;:::-;34810:139;;34537:419;;;:::o;34962:::-;35128:4;35166:2;35155:9;35151:18;35143:26;;35215:9;35209:4;35205:20;35201:1;35190:9;35186:17;35179:47;35243:131;35369:4;35243:131;:::i;:::-;35235:139;;34962:419;;;:::o;35387:::-;35553:4;35591:2;35580:9;35576:18;35568:26;;35640:9;35634:4;35630:20;35626:1;35615:9;35611:17;35604:47;35668:131;35794:4;35668:131;:::i;:::-;35660:139;;35387:419;;;:::o;35812:::-;35978:4;36016:2;36005:9;36001:18;35993:26;;36065:9;36059:4;36055:20;36051:1;36040:9;36036:17;36029:47;36093:131;36219:4;36093:131;:::i;:::-;36085:139;;35812:419;;;:::o;36237:::-;36403:4;36441:2;36430:9;36426:18;36418:26;;36490:9;36484:4;36480:20;36476:1;36465:9;36461:17;36454:47;36518:131;36644:4;36518:131;:::i;:::-;36510:139;;36237:419;;;:::o;36662:::-;36828:4;36866:2;36855:9;36851:18;36843:26;;36915:9;36909:4;36905:20;36901:1;36890:9;36886:17;36879:47;36943:131;37069:4;36943:131;:::i;:::-;36935:139;;36662:419;;;:::o;37087:::-;37253:4;37291:2;37280:9;37276:18;37268:26;;37340:9;37334:4;37330:20;37326:1;37315:9;37311:17;37304:47;37368:131;37494:4;37368:131;:::i;:::-;37360:139;;37087:419;;;:::o;37512:::-;37678:4;37716:2;37705:9;37701:18;37693:26;;37765:9;37759:4;37755:20;37751:1;37740:9;37736:17;37729:47;37793:131;37919:4;37793:131;:::i;:::-;37785:139;;37512:419;;;:::o;37937:::-;38103:4;38141:2;38130:9;38126:18;38118:26;;38190:9;38184:4;38180:20;38176:1;38165:9;38161:17;38154:47;38218:131;38344:4;38218:131;:::i;:::-;38210:139;;37937:419;;;:::o;38362:::-;38528:4;38566:2;38555:9;38551:18;38543:26;;38615:9;38609:4;38605:20;38601:1;38590:9;38586:17;38579:47;38643:131;38769:4;38643:131;:::i;:::-;38635:139;;38362:419;;;:::o;38787:::-;38953:4;38991:2;38980:9;38976:18;38968:26;;39040:9;39034:4;39030:20;39026:1;39015:9;39011:17;39004:47;39068:131;39194:4;39068:131;:::i;:::-;39060:139;;38787:419;;;:::o;39212:::-;39378:4;39416:2;39405:9;39401:18;39393:26;;39465:9;39459:4;39455:20;39451:1;39440:9;39436:17;39429:47;39493:131;39619:4;39493:131;:::i;:::-;39485:139;;39212:419;;;:::o;39637:::-;39803:4;39841:2;39830:9;39826:18;39818:26;;39890:9;39884:4;39880:20;39876:1;39865:9;39861:17;39854:47;39918:131;40044:4;39918:131;:::i;:::-;39910:139;;39637:419;;;:::o;40062:::-;40228:4;40266:2;40255:9;40251:18;40243:26;;40315:9;40309:4;40305:20;40301:1;40290:9;40286:17;40279:47;40343:131;40469:4;40343:131;:::i;:::-;40335:139;;40062:419;;;:::o;40487:::-;40653:4;40691:2;40680:9;40676:18;40668:26;;40740:9;40734:4;40730:20;40726:1;40715:9;40711:17;40704:47;40768:131;40894:4;40768:131;:::i;:::-;40760:139;;40487:419;;;:::o;40912:::-;41078:4;41116:2;41105:9;41101:18;41093:26;;41165:9;41159:4;41155:20;41151:1;41140:9;41136:17;41129:47;41193:131;41319:4;41193:131;:::i;:::-;41185:139;;40912:419;;;:::o;41337:::-;41503:4;41541:2;41530:9;41526:18;41518:26;;41590:9;41584:4;41580:20;41576:1;41565:9;41561:17;41554:47;41618:131;41744:4;41618:131;:::i;:::-;41610:139;;41337:419;;;:::o;41762:222::-;41855:4;41893:2;41882:9;41878:18;41870:26;;41906:71;41974:1;41963:9;41959:17;41950:6;41906:71;:::i;:::-;41762:222;;;;:::o;41990:129::-;42024:6;42051:20;;:::i;:::-;42041:30;;42080:33;42108:4;42100:6;42080:33;:::i;:::-;41990:129;;;:::o;42125:75::-;42158:6;42191:2;42185:9;42175:19;;42125:75;:::o;42206:307::-;42267:4;42357:18;42349:6;42346:30;42343:56;;;42379:18;;:::i;:::-;42343:56;42417:29;42439:6;42417:29;:::i;:::-;42409:37;;42501:4;42495;42491:15;42483:23;;42206:307;;;:::o;42519:308::-;42581:4;42671:18;42663:6;42660:30;42657:56;;;42693:18;;:::i;:::-;42657:56;42731:29;42753:6;42731:29;:::i;:::-;42723:37;;42815:4;42809;42805:15;42797:23;;42519:308;;;:::o;42833:98::-;42884:6;42918:5;42912:12;42902:22;;42833:98;;;:::o;42937:99::-;42989:6;43023:5;43017:12;43007:22;;42937:99;;;:::o;43042:168::-;43125:11;43159:6;43154:3;43147:19;43199:4;43194:3;43190:14;43175:29;;43042:168;;;;:::o;43216:147::-;43317:11;43354:3;43339:18;;43216:147;;;;:::o;43369:169::-;43453:11;43487:6;43482:3;43475:19;43527:4;43522:3;43518:14;43503:29;;43369:169;;;;:::o;43544:148::-;43646:11;43683:3;43668:18;;43544:148;;;;:::o;43698:305::-;43738:3;43757:20;43775:1;43757:20;:::i;:::-;43752:25;;43791:20;43809:1;43791:20;:::i;:::-;43786:25;;43945:1;43877:66;43873:74;43870:1;43867:81;43864:107;;;43951:18;;:::i;:::-;43864:107;43995:1;43992;43988:9;43981:16;;43698:305;;;;:::o;44009:185::-;44049:1;44066:20;44084:1;44066:20;:::i;:::-;44061:25;;44100:20;44118:1;44100:20;:::i;:::-;44095:25;;44139:1;44129:35;;44144:18;;:::i;:::-;44129:35;44186:1;44183;44179:9;44174:14;;44009:185;;;;:::o;44200:348::-;44240:7;44263:20;44281:1;44263:20;:::i;:::-;44258:25;;44297:20;44315:1;44297:20;:::i;:::-;44292:25;;44485:1;44417:66;44413:74;44410:1;44407:81;44402:1;44395:9;44388:17;44384:105;44381:131;;;44492:18;;:::i;:::-;44381:131;44540:1;44537;44533:9;44522:20;;44200:348;;;;:::o;44554:191::-;44594:4;44614:20;44632:1;44614:20;:::i;:::-;44609:25;;44648:20;44666:1;44648:20;:::i;:::-;44643:25;;44687:1;44684;44681:8;44678:34;;;44692:18;;:::i;:::-;44678:34;44737:1;44734;44730:9;44722:17;;44554:191;;;;:::o;44751:96::-;44788:7;44817:24;44835:5;44817:24;:::i;:::-;44806:35;;44751:96;;;:::o;44853:90::-;44887:7;44930:5;44923:13;44916:21;44905:32;;44853:90;;;:::o;44949:77::-;44986:7;45015:5;45004:16;;44949:77;;;:::o;45032:149::-;45068:7;45108:66;45101:5;45097:78;45086:89;;45032:149;;;:::o;45187:126::-;45224:7;45264:42;45257:5;45253:54;45242:65;;45187:126;;;:::o;45319:77::-;45356:7;45385:5;45374:16;;45319:77;;;:::o;45402:86::-;45437:7;45477:4;45470:5;45466:16;45455:27;;45402:86;;;:::o;45494:154::-;45578:6;45573:3;45568;45555:30;45640:1;45631:6;45626:3;45622:16;45615:27;45494:154;;;:::o;45654:307::-;45722:1;45732:113;45746:6;45743:1;45740:13;45732:113;;;45831:1;45826:3;45822:11;45816:18;45812:1;45807:3;45803:11;45796:39;45768:2;45765:1;45761:10;45756:15;;45732:113;;;45863:6;45860:1;45857:13;45854:101;;;45943:1;45934:6;45929:3;45925:16;45918:27;45854:101;45703:258;45654:307;;;:::o;45967:320::-;46011:6;46048:1;46042:4;46038:12;46028:22;;46095:1;46089:4;46085:12;46116:18;46106:81;;46172:4;46164:6;46160:17;46150:27;;46106:81;46234:2;46226:6;46223:14;46203:18;46200:38;46197:84;;;46253:18;;:::i;:::-;46197:84;46018:269;45967:320;;;:::o;46293:281::-;46376:27;46398:4;46376:27;:::i;:::-;46368:6;46364:40;46506:6;46494:10;46491:22;46470:18;46458:10;46455:34;46452:62;46449:88;;;46517:18;;:::i;:::-;46449:88;46557:10;46553:2;46546:22;46336:238;46293:281;;:::o;46580:233::-;46619:3;46642:24;46660:5;46642:24;:::i;:::-;46633:33;;46688:66;46681:5;46678:77;46675:103;;;46758:18;;:::i;:::-;46675:103;46805:1;46798:5;46794:13;46787:20;;46580:233;;;:::o;46819:79::-;46858:7;46887:5;46876:16;;46819:79;;;:::o;46904:::-;46943:7;46972:5;46961:16;;46904:79;;;:::o;46989:176::-;47021:1;47038:20;47056:1;47038:20;:::i;:::-;47033:25;;47072:20;47090:1;47072:20;:::i;:::-;47067:25;;47111:1;47101:35;;47116:18;;:::i;:::-;47101:35;47157:1;47154;47150:9;47145:14;;46989:176;;;;:::o;47171:180::-;47219:77;47216:1;47209:88;47316:4;47313:1;47306:15;47340:4;47337:1;47330:15;47357:180;47405:77;47402:1;47395:88;47502:4;47499:1;47492:15;47526:4;47523:1;47516:15;47543:180;47591:77;47588:1;47581:88;47688:4;47685:1;47678:15;47712:4;47709:1;47702:15;47729:180;47777:77;47774:1;47767:88;47874:4;47871:1;47864:15;47898:4;47895:1;47888:15;47915:180;47963:77;47960:1;47953:88;48060:4;48057:1;48050:15;48084:4;48081:1;48074:15;48101:180;48149:77;48146:1;48139:88;48246:4;48243:1;48236:15;48270:4;48267:1;48260:15;48287:180;48335:77;48332:1;48325:88;48432:4;48429:1;48422:15;48456:4;48453:1;48446:15;48473:117;48582:1;48579;48572:12;48596:117;48705:1;48702;48695:12;48719:117;48828:1;48825;48818:12;48842:117;48951:1;48948;48941:12;48965:117;49074:1;49071;49064:12;49088:117;49197:1;49194;49187:12;49211:102;49252:6;49303:2;49299:7;49294:2;49287:5;49283:14;49279:28;49269:38;;49211:102;;;:::o;49319:174::-;49459:26;49455:1;49447:6;49443:14;49436:50;49319:174;:::o;49499:173::-;49639:25;49635:1;49627:6;49623:14;49616:49;49499:173;:::o;49678:181::-;49818:33;49814:1;49806:6;49802:14;49795:57;49678:181;:::o;49865:230::-;50005:34;50001:1;49993:6;49989:14;49982:58;50074:13;50069:2;50061:6;50057:15;50050:38;49865:230;:::o;50101:237::-;50241:34;50237:1;50229:6;50225:14;50218:58;50310:20;50305:2;50297:6;50293:15;50286:45;50101:237;:::o;50344:225::-;50484:34;50480:1;50472:6;50468:14;50461:58;50553:8;50548:2;50540:6;50536:15;50529:33;50344:225;:::o;50575:178::-;50715:30;50711:1;50703:6;50699:14;50692:54;50575:178;:::o;50759:214::-;50899:66;50895:1;50887:6;50883:14;50876:90;50759:214;:::o;50979:223::-;51119:34;51115:1;51107:6;51103:14;51096:58;51188:6;51183:2;51175:6;51171:15;51164:31;50979:223;:::o;51208:175::-;51348:27;51344:1;51336:6;51332:14;51325:51;51208:175;:::o;51389:163::-;51529:15;51525:1;51517:6;51513:14;51506:39;51389:163;:::o;51558:221::-;51698:34;51694:1;51686:6;51682:14;51675:58;51767:4;51762:2;51754:6;51750:15;51743:29;51558:221;:::o;51785:231::-;51925:34;51921:1;51913:6;51909:14;51902:58;51994:14;51989:2;51981:6;51977:15;51970:39;51785:231;:::o;52022:180::-;52162:32;52158:1;52150:6;52146:14;52139:56;52022:180;:::o;52208:169::-;52348:21;52344:1;52336:6;52332:14;52325:45;52208:169;:::o;52383:167::-;52523:19;52519:1;52511:6;52507:14;52500:43;52383:167;:::o;52556:243::-;52696:34;52692:1;52684:6;52680:14;52673:58;52765:26;52760:2;52752:6;52748:15;52741:51;52556:243;:::o;52805:229::-;52945:34;52941:1;52933:6;52929:14;52922:58;53014:12;53009:2;53001:6;52997:15;52990:37;52805:229;:::o;53040:228::-;53180:34;53176:1;53168:6;53164:14;53157:58;53249:11;53244:2;53236:6;53232:15;53225:36;53040:228;:::o;53274:163::-;53414:15;53410:1;53402:6;53398:14;53391:39;53274:163;:::o;53443:166::-;53583:18;53579:1;53571:6;53567:14;53560:42;53443:166;:::o;53615:221::-;53755:34;53751:1;53743:6;53739:14;53732:58;53824:4;53819:2;53811:6;53807:15;53800:29;53615:221;:::o;53842:182::-;53982:34;53978:1;53970:6;53966:14;53959:58;53842:182;:::o;54030:231::-;54170:34;54166:1;54158:6;54154:14;54147:58;54239:14;54234:2;54226:6;54222:15;54215:39;54030:231;:::o;54267:182::-;54407:34;54403:1;54395:6;54391:14;54384:58;54267:182;:::o;54455:228::-;54595:34;54591:1;54583:6;54579:14;54572:58;54664:11;54659:2;54651:6;54647:15;54640:36;54455:228;:::o;54689:234::-;54829:34;54825:1;54817:6;54813:14;54806:58;54898:17;54893:2;54885:6;54881:15;54874:42;54689:234;:::o;54929:163::-;55069:15;55065:1;55057:6;55053:14;55046:39;54929:163;:::o;55098:220::-;55238:34;55234:1;55226:6;55222:14;55215:58;55307:3;55302:2;55294:6;55290:15;55283:28;55098:220;:::o;55324:167::-;55464:19;55460:1;55452:6;55448:14;55441:43;55324:167;:::o;55497:114::-;;:::o;55617:236::-;55757:34;55753:1;55745:6;55741:14;55734:58;55826:19;55821:2;55813:6;55809:15;55802:44;55617:236;:::o;55859:231::-;55999:34;55995:1;55987:6;55983:14;55976:58;56068:14;56063:2;56055:6;56051:15;56044:39;55859:231;:::o;56096:122::-;56169:24;56187:5;56169:24;:::i;:::-;56162:5;56159:35;56149:63;;56208:1;56205;56198:12;56149:63;56096:122;:::o;56224:116::-;56294:21;56309:5;56294:21;:::i;:::-;56287:5;56284:32;56274:60;;56330:1;56327;56320:12;56274:60;56224:116;:::o;56346:120::-;56418:23;56435:5;56418:23;:::i;:::-;56411:5;56408:34;56398:62;;56456:1;56453;56446:12;56398:62;56346:120;:::o;56472:122::-;56545:24;56563:5;56545:24;:::i;:::-;56538:5;56535:35;56525:63;;56584:1;56581;56574:12;56525:63;56472:122;:::o

Swarm Source

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