ETH Price: $3,902.09 (-0.30%)

Token

Sweet Donuts (DONUTS)
 

Overview

Max Total Supply

0 DONUTS

Holders

20

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
7 DONUTS
0xbee1314a430d80aea224860b020dce7ec25eed98
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Donuts

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-04
*/

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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

pragma solidity ^0.8.0;

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


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

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

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 contracts/libraries/Randomize.sol

pragma solidity 0.8.6;

// small library to randomize using (min, max, seed, offsetBit etc...)
library Randomize {
    struct Random {
        uint256 seed;
        uint256 offsetBit;
    }

    /// @notice get an random number between (min and max) using seed and offseting bits
    ///         this function assumes that max is never bigger than 0xffffff (hex color with opacity included)
    /// @dev this function is simply used to get random number using a seed.
    ///      if does bitshifting operations to try to reuse the same seed as much as possible.
    ///      should be enough for anyth
    /// @param random the randomizer
    /// @param min the minimum
    /// @param max the maximum
    /// @return result the resulting pseudo random number
    function next(
        Random memory random,
        uint256 min,
        uint256 max
    ) internal pure returns (uint256 result) {
        uint256 newSeed = random.seed;
        uint256 newOffset = random.offsetBit + 3;

        uint256 maxOffset = 4;
        uint256 mask = 0xf;
        if (max > 0xfffff) {
            mask = 0xffffff;
            maxOffset = 24;
        } else if (max > 0xffff) {
            mask = 0xfffff;
            maxOffset = 20;
        } else if (max > 0xfff) {
            mask = 0xffff;
            maxOffset = 16;
        } else if (max > 0xff) {
            mask = 0xfff;
            maxOffset = 12;
        } else if (max > 0xf) {
            mask = 0xff;
            maxOffset = 8;
        }

        // if offsetBit is too high to get the max number
        // just get new seed and restart offset to 0
        if (newOffset > (256 - maxOffset)) {
            newOffset = 0;
            newSeed = uint256(keccak256(abi.encode(newSeed)));
        }

        uint256 offseted = (newSeed >> newOffset);
        uint256 part = offseted & mask;
        result = min + (part % (max - min));

        random.seed = newSeed;
        random.offsetBit = newOffset;
    }

    function nextInt(
        Random memory random,
        uint256 min,
        uint256 max
    ) internal pure returns (int256 result) {
        result = int256(Randomize.next(random, min, max));
    }
}


// File contracts/Donuts.sol

pragma solidity 0.8.6;


/// @title Sweet Donuts
/// @notice Donuts NFTs procedurally generated on-chain!
/// @author clemlak
contract Donuts is ERC721 {
    using Randomize for Randomize.Random;
    using Strings for uint256;
    using Strings for uint8;
    using Strings for uint16;
    using Strings for uint24;

    error WrongPrice();
    error QuantityTooBig();
    error AboveMaxSold();
    error TooSoon();
    error KeyAlreadyUsed();
    error WrongKey();

    uint256 public price;
    uint256 public maxQty;
    uint256 public maxSold;
    uint256 public startTimestamp;
    address public collector;

    uint256 public sold;
    uint256[] public recipes;

    mapping(bytes32 => bool) public isKeyUsed;

    struct Recipe {
        uint8 bgId;
        uint8 baseId;
        uint8 glazeId;
        uint16 glazeOffset;
        uint24 glazeColor;
        uint8 toppingId;
        uint24 toppingColor;
        uint8 biteId;
    }

    constructor(
        uint256 _price,
        uint256 _maxQty,
        uint256 _maxSold,
        uint256 _startTimestamp
    ) ERC721("Sweet Donuts", "DONUTS") {
        price = _price;
        maxQty = _maxQty;
        maxSold = _maxSold;
        startTimestamp = _startTimestamp;
        collector = msg.sender;
    }

    function bake(uint256 qty) external payable {
        if (block.timestamp < startTimestamp) revert TooSoon();
        if (msg.value != price * qty) revert WrongPrice();
        if (qty > maxQty) revert QuantityTooBig();
        if (sold + qty > maxSold) revert AboveMaxSold();

        for (uint256 i = 0; i < qty; i += 1) {
            uint256 recipe = uint256(keccak256(abi.encodePacked(block.timestamp + recipes.length)));
            recipes.push(recipe);
            _mint(msg.sender, recipes.length - 1);
            sold += 1;
        }
    }

    function claim(bytes32 key, bytes memory signature) external {
        if (block.timestamp < startTimestamp) revert TooSoon();
        if (isKeyUsed[key]) revert KeyAlreadyUsed();

        address signer = recover(key, signature);

        if (signer == collector) {
            isKeyUsed[key] = true;

            uint256 recipe = uint256(keccak256(abi.encodePacked(block.timestamp + recipes.length)));
            recipes.push(recipe);
            _mint(msg.sender, recipes.length - 1);
        } else {
            revert WrongKey();
        }
    }

    function recover(bytes32 hash, bytes memory signature) private pure returns (address) {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (signature.length != 65) {
            return address(0);
        }

        assembly {
            r := mload(add(signature, 32))
            s := mload(add(signature, 64))
            v := byte(0, mload(add(signature, 96)))
        }

        if (v < 27) {
            v += 27;
        }

        if (v != 27 && v != 28) {
            return address(0);
        } else {
            return ecrecover(
                keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),
                v, r, s
            );
        }
    }

    function withdraw() external {
        payable(collector).transfer(address(this).balance);
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(
            'data:application/json;utf8,{"name":"',
            "Sweet Donut #",
            tokenId.toString(),
            '","image":"data:image/svg+xml;utf8,',
            getSVG(tokenId),
            '",',
            '"license":"Full ownership with unlimited commercial rights.","creator":"@clemlak",',
            '"description":"Sweet Donuts: Procedurally generated Donuts NFT on Ethereum!"',
            '}'
        ));
    }

    function getSVG(uint256 tokenId) private view returns (string memory) {
        uint256 seed = recipes[tokenId];

        Randomize.Random memory random = Randomize.Random({
            seed: seed,
            offsetBit: 0
        });

        Recipe memory recipe = Recipe({
            bgId: uint8(random.next(0, 9)),
            baseId: uint8(random.next(0, 6)),
            glazeId: random.next(0, 100) > 5 ?
                random.next(0, 100) > 20 ? uint8(random.next(2, 12)) : 1
                : 0,
            glazeOffset: uint16(random.next(200, 350)),
            glazeColor: uint24(random.next(0, type(uint24).max)),
            toppingId: random.next(0, 100) > 50 ? uint8(random.next(1, 3)) : 0,
            toppingColor: uint24(random.next(0, type(uint24).max)),
            biteId: random.next(0, 100) > 90 ? 1 : 0
        });

        return string(abi.encodePacked(
            "<svg width='600' height='600' xmlns='http://www.w3.org/2000/svg'>",
            "<rect width='600' height='600' fill='#",
            getBgColor(recipe.bgId),
            "'/>",
            "<defs><pattern id='p' width='100' height='100' patternUnits='userSpaceOnUse' patternTransform='translate(",
            "0",
            random.next(0, 99).toString(),
            ") rotate(",
            random.next(0, 360).toString(),
            ")'>",
            recipe.glazeId > 1 ? getGlazePattern(recipe.glazeId) : "",
            recipe.toppingId > 0 ? getTopping(recipe.toppingId, recipe.toppingColor) : "",
            "</pattern></defs>",
            "<mask id='donut'><ellipse cx='300' cy='300' rx='240' ry='215' fill='#fff'/>",
            "<ellipse cx='300' cy='270' rx='70' ry='40' fill='#000'/></mask>",
            recipe.glazeId > 0 ? string(abi.encodePacked(
                "<clipPath id='glaze'><path d='M 40 80 Q 0 ",
                recipe.glazeOffset.toString(),
                " 58 333 T 143 400 T 223 400 T 347 400 T 504 400 T 550 80'/></clipPath>"
            )) : "",
            "<ellipse cx='300' cy='270' rx='70' ry='40' fill='#",
            getBaseColor(recipe.baseId),
            "'/>",
            "<ellipse cx='300' cy='300' rx='70' ry='30' fill='#",
            getBgColor(recipe.bgId),
            "' stroke='#422900' stroke-width='8'/>",
            "<g mask='url(#donut)'>",
            "<ellipse cx='300' cy='300' rx='240' ry='215' fill='#",
            getBaseColor(recipe.baseId),
            "'/>",
            recipe.glazeId > 0 ? string(abi.encodePacked(
                "<path d='M 40 80 Q 0 ",
                recipe.glazeOffset.toString(),
                " 58 333 T 143 400 T 223 400 T 347 400 T 504 400 T 550 80' fill='#",
                toHexStringNoPrefix(recipe.glazeColor, 3),
                "'/>"
            )) : "",
            "<ellipse cx='300' cy='300' rx='240' ry='215' fill='url(#p)' clip-path='url(#glaze)'/>",
            recipe.glazeId > 0 ? string(abi.encodePacked(
                "<path d='M 40 80 Q 0 ",
                recipe.glazeOffset.toString(),
                " 58 333 T 143 400 T 223 400 T 347 400 T 504 400 T 550 80' fill-opacity='0' stroke='#422900' stroke-width='8'/>"
            )) : "",
            "<ellipse cx='300' cy='300' rx='240' ry='215' fill-opacity='0' stroke='#422900' stroke-width='16'/>",
            recipe.biteId > 0 ? string(abi.encodePacked(
                "<path d='M 366 69 Q 334 119 376 135 Q 363 188 421 175 Q 426 231 477 204 Q 518 247 542 178' fill='#",
                getBgColor(recipe.bgId),
                "' stroke='#422900' stroke-width='8'/>"
            )) : "",
            "<path d='M 571 156 Q 532 498 169 518 Q 597 573 570 156' fill='#000' fill-opacity='0.1'/></g>",
            "<ellipse cx='300' cy='270' rx='70' ry='40' fill='#EFB45E' stroke='#422900' stroke-width='8' fill-opacity='0'/></svg>"
        ));
    }

    bytes16 internal constant ALPHABET = '0123456789abcdef';

    function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length);
        for (uint256 i = buffer.length; i > 0; i--) {
            buffer[i - 1] = ALPHABET[value & 0xf];
            value >>= 4;
        }
        return string(buffer);
    }

    function getBgColor(uint8 index) private pure returns (string memory) {
        string[9] memory colors = ["FFADAD", "FFD6A5", "FDFFB6", "CAFFBF", "9BF6FF", "A0C4FF", "BDB2FF", "FFC6FF", "FFFFFC"];
        return colors[index];
    }

    function getBaseColor(uint8 index) private pure returns (string memory) {
        string[6] memory colors = ["FF9E53", "FFC261", "F488B7", "503C3E", "FD6564", "B6571E"];
        return colors[index];
    }

    function getGlazePattern(uint8 index) private pure returns (string memory) {
        string[10] memory patterns = [
            "<line x1='0' y='0' x2='0' y2='100' stroke='#fff' stroke-width='20'/>",
            "<circle fill-opacity='0' stroke='#fff' stroke-width='10' r='50'/>"
            "<circle cy='100' cx='100' fill-opacity='0' stroke='#fff' stroke-width='10' r='50'/>",
            "<path d='M0,100 L50,0 L100,100' fill-opacity='0' stroke='#fff' stroke-width='10'/>",
            "<path d='M 50 20 L 70 75 L 20 40 L 80 40 L 30 75 L 50 20' fill='#fff'/>",
            "<circle cx='50' cy='50' fill='#fff' r='15'/>",
            "<rect width='100' height='100' fill-opacity='0' stroke-width='10' stroke='#fff'/>",
            "<rect width='20' height='20' fill='#fff'/>",
            "<path d='M50 47a1 1 0 0 0-19 10l19 22 19-22a1 1 0 0 0-19-10' fill='#fff'/>",
            "<path fill='#fff' d='M0 0h50v50H0zM50 50h50v50H50z'/>",
            "<circle cx='50' cy='25' r='10' fill='#fff'/>"
            "<circle cx='40' cy='35' r='10' fill='#fff'/>"
            "<circle cx='50' cy='45' r='10' fill='#fff'/>"
            "<circle cx='60' cy='35' r='10' fill='#fff'/>"
        ];

        return patterns[index - 2];
    }

    function getTopping(uint8 index, uint24 color) private pure returns (string memory) {
        string[2] memory topping = [
            string(abi.encodePacked(
                "<line x1='10' y1='10' x2='20' y2='30' stroke='#",
                toHexStringNoPrefix(color, 3),
                "' stroke-linecap='round' stroke-width='5'/>"
                "<line x1='85' y1='35' x2='60' y2='60' stroke='#",
                toHexStringNoPrefix(color, 3),
                "' stroke-linecap='round' stroke-width='5'/>"
                "<line x1='35' y1='85' x2='60' y2='80' stroke='#",
                toHexStringNoPrefix(color, 3),
                "' stroke-linecap='round' stroke-width='5'/>"
            )),
            string(abi.encodePacked(
                "<circle fill='#",
                toHexStringNoPrefix(color, 3),
                "' cx='10' cy='10' r='8'/>",
                "<circle fill='#",
                toHexStringNoPrefix(color, 3),
                "' cx='20' cy='50' r='10'/>",
                "<circle fill='#",
                toHexStringNoPrefix(color, 3),
                "' cx='50' cy='30' r='15'/>"
            ))
        ];

        return topping[index - 1];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_maxQty","type":"uint256"},{"internalType":"uint256","name":"_maxSold","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AboveMaxSold","type":"error"},{"inputs":[],"name":"KeyAlreadyUsed","type":"error"},{"inputs":[],"name":"QuantityTooBig","type":"error"},{"inputs":[],"name":"TooSoon","type":"error"},{"inputs":[],"name":"WrongKey","type":"error"},{"inputs":[],"name":"WrongPrice","type":"error"},{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"bake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"isKeyUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"recipes","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTimestamp","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005a3738038062005a37833981810160405281019062000037919062000205565b6040518060400160405280600c81526020017f537765657420446f6e75747300000000000000000000000000000000000000008152506040518060400160405280600681526020017f444f4e55545300000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb9291906200013e565b508060019080519060200190620000d49291906200013e565b5050508360068190555082600781905550816008819055508060098190555033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505062000305565b8280546200014c9062000281565b90600052602060002090601f016020900481019282620001705760008555620001bc565b82601f106200018b57805160ff1916838001178555620001bc565b82800160010185558215620001bc579182015b82811115620001bb5782518255916020019190600101906200019e565b5b509050620001cb9190620001cf565b5090565b5b80821115620001ea576000816000905550600101620001d0565b5090565b600081519050620001ff81620002eb565b92915050565b60008060008060808587031215620002225762000221620002e6565b5b60006200023287828801620001ee565b94505060206200024587828801620001ee565b93505060406200025887828801620001ee565b92505060606200026b87828801620001ee565b91505092959194509250565b6000819050919050565b600060028204905060018216806200029a57607f821691505b60208210811415620002b157620002b0620002b7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620002f68162000277565b81146200030257600080fd5b50565b61572280620003156000396000f3fe60806040526004361061014b5760003560e01c8063913e77ad116100b6578063c7a954801161006f578063c7a9548014610483578063c87b56dd146104ae578063dab9c37d146104eb578063e6fd48bc14610528578063e985e9c514610553578063f0331024146105905761014b565b8063913e77ad1461039457806395d89b41146103bf578063a035b1fe146103ea578063a22cb46514610415578063b4ced2101461043e578063b88d4fde1461045a5761014b565b80633ccfd60b116101085780633ccfd60b1461027257806342842e0e14610289578063443c227c146102b25780636352211e146102ef57806370a082311461032c578063848628bf146103695761014b565b806301ffc9a71461015057806302c7e7af1461018d57806306fdde03146101b8578063081812fc146101e3578063095ea7b31461022057806323b872dd14610249575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190612da7565b6105b9565b6040516101849190613aee565b60405180910390f35b34801561019957600080fd5b506101a261069b565b6040516101af9190613d10565b60405180910390f35b3480156101c457600080fd5b506101cd6106a1565b6040516101da9190613b4e565b60405180910390f35b3480156101ef57600080fd5b5061020a60048036038101906102059190612e01565b610733565b6040516102179190613a87565b60405180910390f35b34801561022c57600080fd5b5061024760048036038101906102429190612cde565b6107b8565b005b34801561025557600080fd5b50610270600480360381019061026b9190612bc8565b6108d0565b005b34801561027e57600080fd5b50610287610930565b005b34801561029557600080fd5b506102b060048036038101906102ab9190612bc8565b61099b565b005b3480156102be57600080fd5b506102d960048036038101906102d49190612e01565b6109bb565b6040516102e69190613d10565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190612e01565b6109df565b6040516103239190613a87565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e9190612b5b565b610a91565b6040516103609190613d10565b60405180910390f35b34801561037557600080fd5b5061037e610b49565b60405161038b9190613d10565b60405180910390f35b3480156103a057600080fd5b506103a9610b4f565b6040516103b69190613a87565b60405180910390f35b3480156103cb57600080fd5b506103d4610b75565b6040516103e19190613b4e565b60405180910390f35b3480156103f657600080fd5b506103ff610c07565b60405161040c9190613d10565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190612c9e565b610c0d565b005b61045860048036038101906104539190612e01565b610d8e565b005b34801561046657600080fd5b50610481600480360381019061047c9190612c1b565b610f55565b005b34801561048f57600080fd5b50610498610fb7565b6040516104a59190613d10565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d09190612e01565b610fbd565b6040516104e29190613b4e565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190612d1e565b610ff8565b60405161051f9190613aee565b60405180910390f35b34801561053457600080fd5b5061053d611018565b60405161054a9190613d10565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190612b88565b61101e565b6040516105879190613aee565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190612d4b565b6110b2565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610694575061069382611295565b5b9050919050565b600b5481565b6060600080546106b09061403b565b80601f01602080910402602001604051908101604052809291908181526020018280546106dc9061403b565b80156107295780601f106106fe57610100808354040283529160200191610729565b820191906000526020600020905b81548152906001019060200180831161070c57829003601f168201915b5050505050905090565b600061073e826112ff565b61077d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077490613c90565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107c3826109df565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90613cd0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661085361136b565b73ffffffffffffffffffffffffffffffffffffffff16148061088257506108818161087c61136b565b61101e565b5b6108c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b890613c10565b60405180910390fd5b6108cb8383611373565b505050565b6108e16108db61136b565b8261142c565b610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091790613cf0565b60405180910390fd5b61092b83838361150a565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610998573d6000803e3d6000fd5b50565b6109b683838360405180602001604052806000815250610f55565b505050565b600c81815481106109cb57600080fd5b906000526020600020016000915090505481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f90613c50565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af990613c30565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60085481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610b849061403b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb09061403b565b8015610bfd5780601f10610bd257610100808354040283529160200191610bfd565b820191906000526020600020905b815481529060010190602001808311610be057829003601f168201915b5050505050905090565b60065481565b610c1561136b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a90613bd0565b60405180910390fd5b8060056000610c9061136b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d3d61136b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d829190613aee565b60405180910390a35050565b600954421015610dca576040517f6fed7d8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600654610dd89190613e82565b3414610e10576040517ff7760f2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600754811115610e4c576040517f4d33d82f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085481600b54610e5d9190613dc4565b1115610e95576040517fe27e70fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610f51576000600c8054905042610eb39190613dc4565b604051602001610ec39190613a6c565b6040516020818303038152906040528051906020012060001c9050600c819080600181540180825580915050600190039060005260206000200160009091909190915055610f22336001600c80549050610f1d9190613edc565b611766565b6001600b6000828254610f359190613dc4565b9250508190555050600181610f4a9190613dc4565b9050610e98565b5050565b610f66610f6061136b565b8361142c565b610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613cf0565b60405180910390fd5b610fb184848484611934565b50505050565b60075481565b6060610fc882611990565b610fd183611af1565b604051602001610fe29291906137fb565b6040516020818303038152906040529050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60095481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6009544210156110ee576040517f6fed7d8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d600083815260200190815260200160002060009054906101000a900460ff1615611146576040517f12b3b8ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111528383611f3c565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561125e576001600d600085815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600c80549050426111e99190613dc4565b6040516020016111f99190613a6c565b6040516020818303038152906040528051906020012060001c9050600c819080600181540180825580915050600190039060005260206000200160009091909190915055611258336001600c805490506112539190613edc565b611766565b50611290565b6040517f431e164800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166113e6836109df565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611437826112ff565b611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d90613bf0565b60405180910390fd5b6000611481836109df565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114f057508373ffffffffffffffffffffffffffffffffffffffff166114d884610733565b73ffffffffffffffffffffffffffffffffffffffff16145b806115015750611500818561101e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661152a826109df565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790613cb0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e790613bb0565b60405180910390fd5b6115fb838383612035565b611606600082611373565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116569190613edc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116ad9190613dc4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90613c70565b60405180910390fd5b6117df816112ff565b1561181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690613b90565b60405180910390fd5b61182b60008383612035565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461187b9190613dc4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61193f84848461150a565b61194b8484848461203a565b61198a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190613b70565b60405180910390fd5b50505050565b606060008214156119d8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611aec565b600082905060005b60008214611a0a5780806119f39061409e565b915050600a82611a039190613e51565b91506119e0565b60008167ffffffffffffffff811115611a2657611a256141e8565b5b6040519080825280601f01601f191660200182016040528015611a585781602001600182028036833780820191505090505b5090505b60008514611ae557600182611a719190613edc565b9150600a85611a8091906140fb565b6030611a8c9190613dc4565b60f81b818381518110611aa257611aa16141b9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ade9190613e51565b9450611a5c565b8093505050505b919050565b60606000600c8381548110611b0957611b086141b9565b5b9060005260206000200154905060006040518060400160405280838152602001600081525090506000604051806101000160405280611b5560006009866121d19092919063ffffffff16565b60ff168152602001611b7460006006866121d19092919063ffffffff16565b60ff1681526020016005611b9560006064876121d19092919063ffffffff16565b11611ba1576000611bdf565b6014611bba60006064876121d19092919063ffffffff16565b11611bc6576001611bde565b611bdd6002600c866121d19092919063ffffffff16565b5b5b60ff168152602001611bff60c861015e866121d19092919063ffffffff16565b61ffff168152602001611c23600062ffffff8016866121d19092919063ffffffff16565b62ffffff1681526020016032611c4660006064876121d19092919063ffffffff16565b11611c52576000611c6a565b611c6960016003866121d19092919063ffffffff16565b5b60ff168152602001611c8d600062ffffff8016866121d19092919063ffffffff16565b62ffffff168152602001605a611cb060006064876121d19092919063ffffffff16565b11611cbc576000611cbf565b60015b60ff168152509050611cd4816000015161230e565b611cf3611cee60006063866121d19092919063ffffffff16565b611990565b611d13611d0e6000610168876121d19092919063ffffffff16565b611990565b6001846040015160ff1611611d375760405180602001604052806000815250611d45565b611d448460400151612554565b5b60008560a0015160ff1611611d695760405180602001604052806000815250611d7c565b611d7b8560a001518660c001516126bf565b5b6000866040015160ff1611611da05760405180602001604052806000815250611dd1565b611db1866060015161ffff16611990565b604051602001611dc191906137ce565b6040516020818303038152906040525b611dde87602001516127aa565b611deb886000015161230e565b611df889602001516127aa565b60008a6040015160ff1611611e1c5760405180602001604052806000815250611e62565b611e2d8a6060015161ffff16611990565b611e418b6080015162ffffff16600361293e565b604051602001611e52929190613709565b6040516020818303038152906040525b60008b6040015160ff1611611e865760405180602001604052806000815250611eb7565b611e978b6060015161ffff16611990565b604051602001611ea7919061374e565b6040516020818303038152906040525b60008c60e0015160ff1611611edb5760405180602001604052806000815250611f08565b611ee88c6000015161230e565b604051602001611ef891906137a1565b6040516020818303038152906040525b604051602001611f239c9b9a9998979695949392919061386c565b6040516020818303038152906040529350505050919050565b6000806000806041855114611f57576000935050505061202f565b6020850151925060408501519150606085015160001a9050601b8160ff161015611f8b57601b81611f889190613e1a565b90505b601b8160ff1614158015611fa35750601c8160ff1614155b15611fb4576000935050505061202f565b600186604051602001611fc7919061377b565b6040516020818303038152906040528051906020012082858560405160008152602001604052604051611ffd9493929190613b09565b6020604051602081039080840390855afa15801561201f573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b505050565b600061205b8473ffffffffffffffffffffffffffffffffffffffff16612a5a565b156121c4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261208461136b565b8786866040518563ffffffff1660e01b81526004016120a69493929190613aa2565b602060405180830381600087803b1580156120c057600080fd5b505af19250505080156120f157506040513d601f19601f820116820180604052508101906120ee9190612dd4565b60015b612174573d8060008114612121576040519150601f19603f3d011682016040523d82523d6000602084013e612126565b606091505b5060008151141561216c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216390613b70565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121c9565b600190505b949350505050565b600080846000015190506000600386602001516121ee9190613dc4565b90506000600490506000600f9050620fffff8611156122165762ffffff905060189150612274565b61ffff86111561222f57620fffff905060149150612273565b610fff8611156122475761ffff905060109150612272565b60ff86111561225e57610fff9050600c9150612271565b600f8611156122705760ff9050600891505b5b5b5b5b816101006122829190613edc565b8311156122ba57600092508360405160200161229e9190613d10565b6040516020818303038152906040528051906020012060001c93505b60008385901c90506000828216905088886122d59190613edc565b816122e091906140fb565b896122eb9190613dc4565b9650858a6000018181525050848a60200181815250505050505050509392505050565b606060006040518061012001604052806040518060400160405280600681526020017f464641444144000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f464644364135000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f464446464236000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f434146464246000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f394246364646000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f413043344646000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f424442324646000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f464643364646000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f46464646464300000000000000000000000000000000000000000000000000008152508152509050808360ff1660098110612547576125466141b9565b5b6020020151915050919050565b6060600060405180610140016040528060405180608001604052806044815260200161543e6044913981526020016040518060c00160405280609481526020016155ce6094913981526020016040518060800160405280605281526020016154cc6052913981526020016040518060800160405280604781526020016153a66047913981526020016040518060600160405280602c8152602001615697602c913981526020016040518060800160405280605181526020016153ed6051913981526020016040518060600160405280602a81526020016156c3602a913981526020016040518060800160405280604a8152602001615482604a913981526020016040518060600160405280603581526020016156626035913981526020016040518060e0016040528060b0815260200161551e60b0913981525090508060028461269e9190613f10565b60ff16600a81106126b2576126b16141b9565b5b6020020151915050919050565b6060600060405180604001604052806126de8562ffffff16600361293e565b6126ee8662ffffff16600361293e565b6126fe8762ffffff16600361293e565b604051602001612710939291906136ac565b60405160208183030381529060405281526020016127348562ffffff16600361293e565b6127448662ffffff16600361293e565b6127548762ffffff16600361293e565b604051602001612766939291906139f9565b6040516020818303038152906040528152509050806001856127889190613f10565b60ff166002811061279c5761279b6141b9565b5b602002015191505092915050565b606060006040518060c001604052806040518060400160405280600681526020017f464639453533000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f464643323631000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f463438384237000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353033433345000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f464436353634000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f42363537314500000000000000000000000000000000000000000000000000008152508152509050808360ff1660068110612931576129306141b9565b5b6020020151915050919050565b6060600082600261294f9190613e82565b67ffffffffffffffff811115612968576129676141e8565b5b6040519080825280601f01601f19166020018201604052801561299a5781602001600182028036833780820191505090505b5090506000815190505b6000811115612a4f577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129e3576129e26141b9565b5b1a60f81b826001836129f59190613edc565b81518110612a0657612a056141b9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508080612a4790614011565b9150506129a4565b508091505092915050565b600080823b905060008111915050919050565b6000612a80612a7b84613d50565b613d2b565b905082815260208101848484011115612a9c57612a9b61421c565b5b612aa7848285613fcf565b509392505050565b600081359050612abe81615332565b92915050565b600081359050612ad381615349565b92915050565b600081359050612ae881615360565b92915050565b600081359050612afd81615377565b92915050565b600081519050612b1281615377565b92915050565b600082601f830112612b2d57612b2c614217565b5b8135612b3d848260208601612a6d565b91505092915050565b600081359050612b558161538e565b92915050565b600060208284031215612b7157612b70614226565b5b6000612b7f84828501612aaf565b91505092915050565b60008060408385031215612b9f57612b9e614226565b5b6000612bad85828601612aaf565b9250506020612bbe85828601612aaf565b9150509250929050565b600080600060608486031215612be157612be0614226565b5b6000612bef86828701612aaf565b9350506020612c0086828701612aaf565b9250506040612c1186828701612b46565b9150509250925092565b60008060008060808587031215612c3557612c34614226565b5b6000612c4387828801612aaf565b9450506020612c5487828801612aaf565b9350506040612c6587828801612b46565b925050606085013567ffffffffffffffff811115612c8657612c85614221565b5b612c9287828801612b18565b91505092959194509250565b60008060408385031215612cb557612cb4614226565b5b6000612cc385828601612aaf565b9250506020612cd485828601612ac4565b9150509250929050565b60008060408385031215612cf557612cf4614226565b5b6000612d0385828601612aaf565b9250506020612d1485828601612b46565b9150509250929050565b600060208284031215612d3457612d33614226565b5b6000612d4284828501612ad9565b91505092915050565b60008060408385031215612d6257612d61614226565b5b6000612d7085828601612ad9565b925050602083013567ffffffffffffffff811115612d9157612d90614221565b5b612d9d85828601612b18565b9150509250929050565b600060208284031215612dbd57612dbc614226565b5b6000612dcb84828501612aee565b91505092915050565b600060208284031215612dea57612de9614226565b5b6000612df884828501612b03565b91505092915050565b600060208284031215612e1757612e16614226565b5b6000612e2584828501612b46565b91505092915050565b612e3781613f44565b82525050565b612e4681613f56565b82525050565b612e5581613f62565b82525050565b612e6c612e6782613f62565b6140e7565b82525050565b6000612e7d82613d81565b612e878185613d97565b9350612e97818560208601613fde565b612ea08161422b565b840191505092915050565b6000612eb682613d8c565b612ec08185613da8565b9350612ed0818560208601613fde565b612ed98161422b565b840191505092915050565b6000612eef82613d8c565b612ef98185613db9565b9350612f09818560208601613fde565b80840191505092915050565b6000612f22602f83613db9565b9150612f2d8261423c565b602f82019050919050565b6000612f45600183613db9565b9150612f508261428b565b600182019050919050565b6000612f68601583613db9565b9150612f73826142b4565b601582019050919050565b6000612f8b601c83613db9565b9150612f96826142dd565b601c82019050919050565b6000612fae603283613da8565b9150612fb982614306565b604082019050919050565b6000612fd1600283613db9565b9150612fdc82614355565b600282019050919050565b6000612ff4606283613db9565b9150612fff8261437e565b606282019050919050565b6000613017602383613db9565b915061302282614419565b602382019050919050565b600061303a601c83613da8565b915061304582614468565b602082019050919050565b600061305d600983613db9565b915061306882614491565b600982019050919050565b6000613080602a83613db9565b915061308b826144ba565b602a82019050919050565b60006130a3605283613db9565b91506130ae82614509565b605282019050919050565b60006130c6605c83613db9565b91506130d18261457e565b605c82019050919050565b60006130e9604183613db9565b91506130f4826145f3565b604182019050919050565b600061310c602483613da8565b915061311782614668565b604082019050919050565b600061312f601983613da8565b915061313a826146b7565b602082019050919050565b6000613152601683613db9565b915061315d826146e0565b601682019050919050565b6000613175602c83613da8565b915061318082614709565b604082019050919050565b6000613198603283613db9565b91506131a382614758565b603282019050919050565b60006131bb604c83613db9565b91506131c6826147a7565b604c82019050919050565b60006131de603283613db9565b91506131e98261481c565b603282019050919050565b6000613201605a83613db9565b915061320c8261486b565b605a82019050919050565b6000613224602583613db9565b915061322f826148e0565b602582019050919050565b6000613247600383613db9565b91506132528261492f565b600382019050919050565b600061326a603883613da8565b915061327582614958565b604082019050919050565b600061328d602a83613da8565b9150613298826149a7565b604082019050919050565b60006132b0602983613da8565b91506132bb826149f6565b604082019050919050565b60006132d3601a83613db9565b91506132de82614a45565b601a82019050919050565b60006132f6605583613db9565b915061330182614a6e565b605582019050919050565b6000613319602083613da8565b915061332482614ae3565b602082019050919050565b600061333c600183613db9565b915061334782614b0c565b600182019050919050565b600061335f602483613db9565b915061336a82614b35565b602482019050919050565b6000613382602c83613da8565b915061338d82614b84565b604082019050919050565b60006133a5604b83613db9565b91506133b082614bd3565b604b82019050919050565b60006133c8607483613db9565b91506133d382614c48565b607482019050919050565b60006133eb604183613db9565b91506133f682614ce3565b604182019050919050565b600061340e602b83613db9565b915061341982614d58565b602b82019050919050565b6000613431602983613da8565b915061343c82614da7565b604082019050919050565b6000613454603483613db9565b915061345f82614df6565b603482019050919050565b6000613477600f83613db9565b915061348282614e45565b600f82019050919050565b600061349a603f83613db9565b91506134a582614e6e565b603f82019050919050565b60006134bd606e83613db9565b91506134c882614ebd565b606e82019050919050565b60006134e0601a83613db9565b91506134eb82614f58565b601a82019050919050565b6000613503605a83613db9565b915061350e82614f81565b605a82019050919050565b6000613526602183613da8565b915061353182614ff6565b604082019050919050565b6000613549602683613db9565b915061355482615045565b602682019050919050565b600061356c603183613da8565b915061357782615094565b604082019050919050565b600061358f601983613db9565b915061359a826150e3565b601982019050919050565b60006135b2601183613db9565b91506135bd8261510c565b601182019050919050565b60006135d5604683613db9565b91506135e082615135565b604682019050919050565b60006135f8606983613db9565b9150613603826151aa565b606982019050919050565b600061361b600d83613db9565b915061362682615245565b600d82019050919050565b600061363e606283613db9565b91506136498261526e565b606282019050919050565b6000613661600383613db9565b915061366c82615309565b600382019050919050565b61368081613fb8565b82525050565b61369761369282613fb8565b6140f1565b82525050565b6136a681613fc2565b82525050565b60006136b782612f15565b91506136c38286612ee4565b91506136ce826134f6565b91506136da8285612ee4565b91506136e5826131f4565b91506136f18284612ee4565b91506136fc82613401565b9150819050949350505050565b600061371482612f5b565b91506137208285612ee4565b915061372b826130dc565b91506137378284612ee4565b91506137428261323a565b91508190509392505050565b600061375982612f5b565b91506137658284612ee4565b9150613770826134b0565b915081905092915050565b600061378682612f7e565b91506137928284612e5b565b60208201915081905092915050565b60006137ac82612fe7565b91506137b88284612ee4565b91506137c382613217565b915081905092915050565b60006137d982613073565b91506137e58284612ee4565b91506137f0826135c8565b915081905092915050565b600061380682613352565b91506138118261360e565b915061381d8285612ee4565b91506138288261300a565b91506138348284612ee4565b915061383f82612fc4565b915061384a82613096565b9150613855826131ae565b91506138608261332f565b91508190509392505050565b6000613877826133de565b91506138828261353c565b915061388e828f612ee4565b91506138998261323a565b91506138a4826135eb565b91506138af82612f38565b91506138bb828e612ee4565b91506138c682613050565b91506138d2828d612ee4565b91506138dd82613654565b91506138e9828c612ee4565b91506138f5828b612ee4565b9150613900826135a5565b915061390b82613398565b91506139168261348d565b9150613922828a612ee4565b915061392d8261318b565b91506139398289612ee4565b91506139448261323a565b915061394f826131d1565b915061395b8288612ee4565b915061396682613217565b915061397182613145565b915061397c82613447565b91506139888287612ee4565b91506139938261323a565b915061399f8286612ee4565b91506139aa826132e9565b91506139b68285612ee4565b91506139c182613631565b91506139cd8284612ee4565b91506139d8826130b9565b91506139e3826133bb565b91508190509d9c50505050505050505050505050565b6000613a048261346a565b9150613a108286612ee4565b9150613a1b82613582565b9150613a268261346a565b9150613a328285612ee4565b9150613a3d826132c6565b9150613a488261346a565b9150613a548284612ee4565b9150613a5f826134d3565b9150819050949350505050565b6000613a788284613686565b60208201915081905092915050565b6000602082019050613a9c6000830184612e2e565b92915050565b6000608082019050613ab76000830187612e2e565b613ac46020830186612e2e565b613ad16040830185613677565b8181036060830152613ae38184612e72565b905095945050505050565b6000602082019050613b036000830184612e3d565b92915050565b6000608082019050613b1e6000830187612e4c565b613b2b602083018661369d565b613b386040830185612e4c565b613b456060830184612e4c565b95945050505050565b60006020820190508181036000830152613b688184612eab565b905092915050565b60006020820190508181036000830152613b8981612fa1565b9050919050565b60006020820190508181036000830152613ba98161302d565b9050919050565b60006020820190508181036000830152613bc9816130ff565b9050919050565b60006020820190508181036000830152613be981613122565b9050919050565b60006020820190508181036000830152613c0981613168565b9050919050565b60006020820190508181036000830152613c298161325d565b9050919050565b60006020820190508181036000830152613c4981613280565b9050919050565b60006020820190508181036000830152613c69816132a3565b9050919050565b60006020820190508181036000830152613c898161330c565b9050919050565b60006020820190508181036000830152613ca981613375565b9050919050565b60006020820190508181036000830152613cc981613424565b9050919050565b60006020820190508181036000830152613ce981613519565b9050919050565b60006020820190508181036000830152613d098161355f565b9050919050565b6000602082019050613d256000830184613677565b92915050565b6000613d35613d46565b9050613d41828261406d565b919050565b6000604051905090565b600067ffffffffffffffff821115613d6b57613d6a6141e8565b5b613d748261422b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dcf82613fb8565b9150613dda83613fb8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e0f57613e0e61412c565b5b828201905092915050565b6000613e2582613fc2565b9150613e3083613fc2565b92508260ff03821115613e4657613e4561412c565b5b828201905092915050565b6000613e5c82613fb8565b9150613e6783613fb8565b925082613e7757613e7661415b565b5b828204905092915050565b6000613e8d82613fb8565b9150613e9883613fb8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ed157613ed061412c565b5b828202905092915050565b6000613ee782613fb8565b9150613ef283613fb8565b925082821015613f0557613f0461412c565b5b828203905092915050565b6000613f1b82613fc2565b9150613f2683613fc2565b925082821015613f3957613f3861412c565b5b828203905092915050565b6000613f4f82613f98565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613ffc578082015181840152602081019050613fe1565b8381111561400b576000848401525b50505050565b600061401c82613fb8565b915060008214156140305761402f61412c565b5b600182039050919050565b6000600282049050600182168061405357607f821691505b602082108114156140675761406661418a565b5b50919050565b6140768261422b565b810181811067ffffffffffffffff82111715614095576140946141e8565b5b80604052505050565b60006140a982613fb8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140dc576140db61412c565b5b600182019050919050565b6000819050919050565b6000819050919050565b600061410682613fb8565b915061411183613fb8565b9250826141215761412061415b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f3c6c696e652078313d273130272079313d273130272078323d2732302720793260008201527f3d27333027207374726f6b653d27230000000000000000000000000000000000602082015250565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c7061746820643d274d20343020383020512030200000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c7061746820643d274d2033363620363920512033333420313139203337362060008201527f313335205120333633203138382034323120313735205120343236203233312060208201527f34373720323034205120353138203234372035343220313738272066696c6c3d60408201527f2723000000000000000000000000000000000000000000000000000000000000606082015250565b7f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b757460008201527f66382c0000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f2920726f74617465280000000000000000000000000000000000000000000000600082015250565b7f3c636c6970506174682069643d27676c617a65273e3c7061746820643d274d2060008201527f3430203830205120302000000000000000000000000000000000000000000000602082015250565b7f226c6963656e7365223a2246756c6c206f776e6572736869702077697468207560008201527f6e6c696d6974656420636f6d6d65726369616c207269676874732e222c22637260208201527f6561746f72223a2240636c656d6c616b222c0000000000000000000000000000604082015250565b7f3c7061746820643d274d2035373120313536205120353332203439382031363960008201527f20353138205120353937203537332035373020313536272066696c6c3d27233060208201527f3030272066696c6c2d6f7061636974793d27302e31272f3e3c2f673e00000000604082015250565b7f203538203333332054203134332034303020542032323320343030205420333460008201527f372034303020542035303420343030205420353530203830272066696c6c3d2760208201527f2300000000000000000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f3c67206d61736b3d2775726c2823646f6e757429273e00000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f3c656c6c697073652063783d27333030272063793d27323730272072783d273760008201527f30272072793d273430272066696c6c3d27230000000000000000000000000000602082015250565b7f226465736372697074696f6e223a22537765657420446f6e7574733a2050726f60008201527f6365647572616c6c792067656e65726174656420446f6e757473204e4654206f60208201527f6e20457468657265756d21220000000000000000000000000000000000000000604082015250565b7f3c656c6c697073652063783d27333030272063793d27333030272072783d273760008201527f30272072793d273330272066696c6c3d27230000000000000000000000000000602082015250565b7f27207374726f6b652d6c696e656361703d27726f756e6427207374726f6b652d60008201527f77696474683d2735272f3e3c6c696e652078313d273335272079313d2738352760208201527f2078323d273630272079323d27383027207374726f6b653d2723000000000000604082015250565b7f27207374726f6b653d272334323239303027207374726f6b652d77696474683d60008201527f2738272f3e000000000000000000000000000000000000000000000000000000602082015250565b7f272f3e0000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f272063783d273230272063793d2735302720723d273130272f3e000000000000600082015250565b7f3c656c6c697073652063783d27333030272063793d27333030272072783d273260008201527f3430272072793d27323135272066696c6c3d2775726c282370292720636c697060208201527f2d706174683d2775726c2823676c617a6529272f3e0000000000000000000000604082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d60008201527f65223a2200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f3c6d61736b2069643d27646f6e7574273e3c656c6c697073652063783d27333060008201527f30272063793d27333030272072783d27323430272072793d273231352720666960208201527f6c6c3d2723666666272f3e000000000000000000000000000000000000000000604082015250565b7f3c656c6c697073652063783d27333030272063793d27323730272072783d273760008201527f30272072793d273430272066696c6c3d272345464234354527207374726f6b6560208201527f3d272334323239303027207374726f6b652d77696474683d2738272066696c6c60408201527f2d6f7061636974793d2730272f3e3c2f7376673e000000000000000000000000606082015250565b7f3c7376672077696474683d2736303027206865696768743d273630302720786d60008201527f6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672760208201527f3e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f27207374726f6b652d6c696e656361703d27726f756e6427207374726f6b652d60008201527f77696474683d2735272f3e000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f3c656c6c697073652063783d27333030272063793d27333030272072783d273260008201527f3430272072793d27323135272066696c6c3d2723000000000000000000000000602082015250565b7f3c636972636c652066696c6c3d27230000000000000000000000000000000000600082015250565b7f3c656c6c697073652063783d27333030272063793d27323730272072783d273760008201527f30272072793d273430272066696c6c3d2723303030272f3e3c2f6d61736b3e00602082015250565b7f203538203333332054203134332034303020542032323320343030205420333460008201527f372034303020542035303420343030205420353530203830272066696c6c2d6f60208201527f7061636974793d273027207374726f6b653d272334323239303027207374726f60408201527f6b652d77696474683d2738272f3e000000000000000000000000000000000000606082015250565b7f272063783d273530272063793d2733302720723d273135272f3e000000000000600082015250565b7f27207374726f6b652d6c696e656361703d27726f756e6427207374726f6b652d60008201527f77696474683d2735272f3e3c6c696e652078313d273835272079313d2733352760208201527f2078323d273630272079323d27363027207374726f6b653d2723000000000000604082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f3c726563742077696474683d2736303027206865696768743d2736303027206660008201527f696c6c3d27230000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f272063783d273130272063793d2731302720723d2738272f3e00000000000000600082015250565b7f3c2f7061747465726e3e3c2f646566733e000000000000000000000000000000600082015250565b7f203538203333332054203134332034303020542032323320343030205420333460008201527f372034303020542035303420343030205420353530203830272f3e3c2f636c6960208201527f70506174683e0000000000000000000000000000000000000000000000000000604082015250565b7f3c646566733e3c7061747465726e2069643d2770272077696474683d2731303060008201527f27206865696768743d2731303027207061747465726e556e6974733d2775736560208201527f7253706163654f6e55736527207061747465726e5472616e73666f726d3d277460408201527f72616e736c617465280000000000000000000000000000000000000000000000606082015250565b7f537765657420446f6e7574202300000000000000000000000000000000000000600082015250565b7f3c656c6c697073652063783d27333030272063793d27333030272072783d273260008201527f3430272072793d27323135272066696c6c2d6f7061636974793d27302720737460208201527f726f6b653d272334323239303027207374726f6b652d77696474683d2731362760408201527f2f3e000000000000000000000000000000000000000000000000000000000000606082015250565b7f29273e0000000000000000000000000000000000000000000000000000000000600082015250565b61533b81613f44565b811461534657600080fd5b50565b61535281613f56565b811461535d57600080fd5b50565b61536981613f62565b811461537457600080fd5b50565b61538081613f6c565b811461538b57600080fd5b50565b61539781613fb8565b81146153a257600080fd5b5056fe3c7061746820643d274d203530203230204c203730203735204c203230203430204c203830203430204c203330203735204c203530203230272066696c6c3d2723666666272f3e3c726563742077696474683d2731303027206865696768743d27313030272066696c6c2d6f7061636974793d273027207374726f6b652d77696474683d27313027207374726f6b653d2723666666272f3e3c6c696e652078313d27302720793d2730272078323d2730272079323d2731303027207374726f6b653d272366666627207374726f6b652d77696474683d273230272f3e3c7061746820643d274d3530203437613120312030203020302d31392031306c31392032322031392d3232613120312030203020302d31392d3130272066696c6c3d2723666666272f3e3c7061746820643d274d302c313030204c35302c30204c3130302c313030272066696c6c2d6f7061636974793d273027207374726f6b653d272366666627207374726f6b652d77696474683d273130272f3e3c636972636c652063783d273530272063793d2732352720723d273130272066696c6c3d2723666666272f3e3c636972636c652063783d273430272063793d2733352720723d273130272066696c6c3d2723666666272f3e3c636972636c652063783d273530272063793d2734352720723d273130272066696c6c3d2723666666272f3e3c636972636c652063783d273630272063793d2733352720723d273130272066696c6c3d2723666666272f3e3c636972636c652066696c6c2d6f7061636974793d273027207374726f6b653d272366666627207374726f6b652d77696474683d2731302720723d273530272f3e3c636972636c652063793d27313030272063783d27313030272066696c6c2d6f7061636974793d273027207374726f6b653d272366666627207374726f6b652d77696474683d2731302720723d273530272f3e3c706174682066696c6c3d27236666662720643d274d30203068353076353048307a4d35302035306835307635304835307a272f3e3c636972636c652063783d273530272063793d273530272066696c6c3d27236666662720723d273135272f3e3c726563742077696474683d27323027206865696768743d273230272066696c6c3d2723666666272f3ea2646970667358221220577f4dd0add4fc72173f3c7447d5aee3336590e0ffd3c544fdaa0410189f649764736f6c63430008060033000000000000000000000000000000000000000000000000006a94d74f430000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000061329ae0

Deployed Bytecode

0x60806040526004361061014b5760003560e01c8063913e77ad116100b6578063c7a954801161006f578063c7a9548014610483578063c87b56dd146104ae578063dab9c37d146104eb578063e6fd48bc14610528578063e985e9c514610553578063f0331024146105905761014b565b8063913e77ad1461039457806395d89b41146103bf578063a035b1fe146103ea578063a22cb46514610415578063b4ced2101461043e578063b88d4fde1461045a5761014b565b80633ccfd60b116101085780633ccfd60b1461027257806342842e0e14610289578063443c227c146102b25780636352211e146102ef57806370a082311461032c578063848628bf146103695761014b565b806301ffc9a71461015057806302c7e7af1461018d57806306fdde03146101b8578063081812fc146101e3578063095ea7b31461022057806323b872dd14610249575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190612da7565b6105b9565b6040516101849190613aee565b60405180910390f35b34801561019957600080fd5b506101a261069b565b6040516101af9190613d10565b60405180910390f35b3480156101c457600080fd5b506101cd6106a1565b6040516101da9190613b4e565b60405180910390f35b3480156101ef57600080fd5b5061020a60048036038101906102059190612e01565b610733565b6040516102179190613a87565b60405180910390f35b34801561022c57600080fd5b5061024760048036038101906102429190612cde565b6107b8565b005b34801561025557600080fd5b50610270600480360381019061026b9190612bc8565b6108d0565b005b34801561027e57600080fd5b50610287610930565b005b34801561029557600080fd5b506102b060048036038101906102ab9190612bc8565b61099b565b005b3480156102be57600080fd5b506102d960048036038101906102d49190612e01565b6109bb565b6040516102e69190613d10565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190612e01565b6109df565b6040516103239190613a87565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e9190612b5b565b610a91565b6040516103609190613d10565b60405180910390f35b34801561037557600080fd5b5061037e610b49565b60405161038b9190613d10565b60405180910390f35b3480156103a057600080fd5b506103a9610b4f565b6040516103b69190613a87565b60405180910390f35b3480156103cb57600080fd5b506103d4610b75565b6040516103e19190613b4e565b60405180910390f35b3480156103f657600080fd5b506103ff610c07565b60405161040c9190613d10565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190612c9e565b610c0d565b005b61045860048036038101906104539190612e01565b610d8e565b005b34801561046657600080fd5b50610481600480360381019061047c9190612c1b565b610f55565b005b34801561048f57600080fd5b50610498610fb7565b6040516104a59190613d10565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d09190612e01565b610fbd565b6040516104e29190613b4e565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190612d1e565b610ff8565b60405161051f9190613aee565b60405180910390f35b34801561053457600080fd5b5061053d611018565b60405161054a9190613d10565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190612b88565b61101e565b6040516105879190613aee565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190612d4b565b6110b2565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610694575061069382611295565b5b9050919050565b600b5481565b6060600080546106b09061403b565b80601f01602080910402602001604051908101604052809291908181526020018280546106dc9061403b565b80156107295780601f106106fe57610100808354040283529160200191610729565b820191906000526020600020905b81548152906001019060200180831161070c57829003601f168201915b5050505050905090565b600061073e826112ff565b61077d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077490613c90565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107c3826109df565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90613cd0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661085361136b565b73ffffffffffffffffffffffffffffffffffffffff16148061088257506108818161087c61136b565b61101e565b5b6108c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b890613c10565b60405180910390fd5b6108cb8383611373565b505050565b6108e16108db61136b565b8261142c565b610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091790613cf0565b60405180910390fd5b61092b83838361150a565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610998573d6000803e3d6000fd5b50565b6109b683838360405180602001604052806000815250610f55565b505050565b600c81815481106109cb57600080fd5b906000526020600020016000915090505481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f90613c50565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af990613c30565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60085481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610b849061403b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb09061403b565b8015610bfd5780601f10610bd257610100808354040283529160200191610bfd565b820191906000526020600020905b815481529060010190602001808311610be057829003601f168201915b5050505050905090565b60065481565b610c1561136b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a90613bd0565b60405180910390fd5b8060056000610c9061136b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d3d61136b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d829190613aee565b60405180910390a35050565b600954421015610dca576040517f6fed7d8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600654610dd89190613e82565b3414610e10576040517ff7760f2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600754811115610e4c576040517f4d33d82f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085481600b54610e5d9190613dc4565b1115610e95576040517fe27e70fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610f51576000600c8054905042610eb39190613dc4565b604051602001610ec39190613a6c565b6040516020818303038152906040528051906020012060001c9050600c819080600181540180825580915050600190039060005260206000200160009091909190915055610f22336001600c80549050610f1d9190613edc565b611766565b6001600b6000828254610f359190613dc4565b9250508190555050600181610f4a9190613dc4565b9050610e98565b5050565b610f66610f6061136b565b8361142c565b610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613cf0565b60405180910390fd5b610fb184848484611934565b50505050565b60075481565b6060610fc882611990565b610fd183611af1565b604051602001610fe29291906137fb565b6040516020818303038152906040529050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60095481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6009544210156110ee576040517f6fed7d8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d600083815260200190815260200160002060009054906101000a900460ff1615611146576040517f12b3b8ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111528383611f3c565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561125e576001600d600085815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600c80549050426111e99190613dc4565b6040516020016111f99190613a6c565b6040516020818303038152906040528051906020012060001c9050600c819080600181540180825580915050600190039060005260206000200160009091909190915055611258336001600c805490506112539190613edc565b611766565b50611290565b6040517f431e164800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166113e6836109df565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611437826112ff565b611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d90613bf0565b60405180910390fd5b6000611481836109df565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114f057508373ffffffffffffffffffffffffffffffffffffffff166114d884610733565b73ffffffffffffffffffffffffffffffffffffffff16145b806115015750611500818561101e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661152a826109df565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790613cb0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e790613bb0565b60405180910390fd5b6115fb838383612035565b611606600082611373565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116569190613edc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116ad9190613dc4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90613c70565b60405180910390fd5b6117df816112ff565b1561181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690613b90565b60405180910390fd5b61182b60008383612035565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461187b9190613dc4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61193f84848461150a565b61194b8484848461203a565b61198a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190613b70565b60405180910390fd5b50505050565b606060008214156119d8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611aec565b600082905060005b60008214611a0a5780806119f39061409e565b915050600a82611a039190613e51565b91506119e0565b60008167ffffffffffffffff811115611a2657611a256141e8565b5b6040519080825280601f01601f191660200182016040528015611a585781602001600182028036833780820191505090505b5090505b60008514611ae557600182611a719190613edc565b9150600a85611a8091906140fb565b6030611a8c9190613dc4565b60f81b818381518110611aa257611aa16141b9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ade9190613e51565b9450611a5c565b8093505050505b919050565b60606000600c8381548110611b0957611b086141b9565b5b9060005260206000200154905060006040518060400160405280838152602001600081525090506000604051806101000160405280611b5560006009866121d19092919063ffffffff16565b60ff168152602001611b7460006006866121d19092919063ffffffff16565b60ff1681526020016005611b9560006064876121d19092919063ffffffff16565b11611ba1576000611bdf565b6014611bba60006064876121d19092919063ffffffff16565b11611bc6576001611bde565b611bdd6002600c866121d19092919063ffffffff16565b5b5b60ff168152602001611bff60c861015e866121d19092919063ffffffff16565b61ffff168152602001611c23600062ffffff8016866121d19092919063ffffffff16565b62ffffff1681526020016032611c4660006064876121d19092919063ffffffff16565b11611c52576000611c6a565b611c6960016003866121d19092919063ffffffff16565b5b60ff168152602001611c8d600062ffffff8016866121d19092919063ffffffff16565b62ffffff168152602001605a611cb060006064876121d19092919063ffffffff16565b11611cbc576000611cbf565b60015b60ff168152509050611cd4816000015161230e565b611cf3611cee60006063866121d19092919063ffffffff16565b611990565b611d13611d0e6000610168876121d19092919063ffffffff16565b611990565b6001846040015160ff1611611d375760405180602001604052806000815250611d45565b611d448460400151612554565b5b60008560a0015160ff1611611d695760405180602001604052806000815250611d7c565b611d7b8560a001518660c001516126bf565b5b6000866040015160ff1611611da05760405180602001604052806000815250611dd1565b611db1866060015161ffff16611990565b604051602001611dc191906137ce565b6040516020818303038152906040525b611dde87602001516127aa565b611deb886000015161230e565b611df889602001516127aa565b60008a6040015160ff1611611e1c5760405180602001604052806000815250611e62565b611e2d8a6060015161ffff16611990565b611e418b6080015162ffffff16600361293e565b604051602001611e52929190613709565b6040516020818303038152906040525b60008b6040015160ff1611611e865760405180602001604052806000815250611eb7565b611e978b6060015161ffff16611990565b604051602001611ea7919061374e565b6040516020818303038152906040525b60008c60e0015160ff1611611edb5760405180602001604052806000815250611f08565b611ee88c6000015161230e565b604051602001611ef891906137a1565b6040516020818303038152906040525b604051602001611f239c9b9a9998979695949392919061386c565b6040516020818303038152906040529350505050919050565b6000806000806041855114611f57576000935050505061202f565b6020850151925060408501519150606085015160001a9050601b8160ff161015611f8b57601b81611f889190613e1a565b90505b601b8160ff1614158015611fa35750601c8160ff1614155b15611fb4576000935050505061202f565b600186604051602001611fc7919061377b565b6040516020818303038152906040528051906020012082858560405160008152602001604052604051611ffd9493929190613b09565b6020604051602081039080840390855afa15801561201f573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b505050565b600061205b8473ffffffffffffffffffffffffffffffffffffffff16612a5a565b156121c4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261208461136b565b8786866040518563ffffffff1660e01b81526004016120a69493929190613aa2565b602060405180830381600087803b1580156120c057600080fd5b505af19250505080156120f157506040513d601f19601f820116820180604052508101906120ee9190612dd4565b60015b612174573d8060008114612121576040519150601f19603f3d011682016040523d82523d6000602084013e612126565b606091505b5060008151141561216c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216390613b70565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121c9565b600190505b949350505050565b600080846000015190506000600386602001516121ee9190613dc4565b90506000600490506000600f9050620fffff8611156122165762ffffff905060189150612274565b61ffff86111561222f57620fffff905060149150612273565b610fff8611156122475761ffff905060109150612272565b60ff86111561225e57610fff9050600c9150612271565b600f8611156122705760ff9050600891505b5b5b5b5b816101006122829190613edc565b8311156122ba57600092508360405160200161229e9190613d10565b6040516020818303038152906040528051906020012060001c93505b60008385901c90506000828216905088886122d59190613edc565b816122e091906140fb565b896122eb9190613dc4565b9650858a6000018181525050848a60200181815250505050505050509392505050565b606060006040518061012001604052806040518060400160405280600681526020017f464641444144000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f464644364135000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f464446464236000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f434146464246000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f394246364646000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f413043344646000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f424442324646000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f464643364646000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f46464646464300000000000000000000000000000000000000000000000000008152508152509050808360ff1660098110612547576125466141b9565b5b6020020151915050919050565b6060600060405180610140016040528060405180608001604052806044815260200161543e6044913981526020016040518060c00160405280609481526020016155ce6094913981526020016040518060800160405280605281526020016154cc6052913981526020016040518060800160405280604781526020016153a66047913981526020016040518060600160405280602c8152602001615697602c913981526020016040518060800160405280605181526020016153ed6051913981526020016040518060600160405280602a81526020016156c3602a913981526020016040518060800160405280604a8152602001615482604a913981526020016040518060600160405280603581526020016156626035913981526020016040518060e0016040528060b0815260200161551e60b0913981525090508060028461269e9190613f10565b60ff16600a81106126b2576126b16141b9565b5b6020020151915050919050565b6060600060405180604001604052806126de8562ffffff16600361293e565b6126ee8662ffffff16600361293e565b6126fe8762ffffff16600361293e565b604051602001612710939291906136ac565b60405160208183030381529060405281526020016127348562ffffff16600361293e565b6127448662ffffff16600361293e565b6127548762ffffff16600361293e565b604051602001612766939291906139f9565b6040516020818303038152906040528152509050806001856127889190613f10565b60ff166002811061279c5761279b6141b9565b5b602002015191505092915050565b606060006040518060c001604052806040518060400160405280600681526020017f464639453533000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f464643323631000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f463438384237000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353033433345000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f464436353634000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f42363537314500000000000000000000000000000000000000000000000000008152508152509050808360ff1660068110612931576129306141b9565b5b6020020151915050919050565b6060600082600261294f9190613e82565b67ffffffffffffffff811115612968576129676141e8565b5b6040519080825280601f01601f19166020018201604052801561299a5781602001600182028036833780820191505090505b5090506000815190505b6000811115612a4f577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129e3576129e26141b9565b5b1a60f81b826001836129f59190613edc565b81518110612a0657612a056141b9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508080612a4790614011565b9150506129a4565b508091505092915050565b600080823b905060008111915050919050565b6000612a80612a7b84613d50565b613d2b565b905082815260208101848484011115612a9c57612a9b61421c565b5b612aa7848285613fcf565b509392505050565b600081359050612abe81615332565b92915050565b600081359050612ad381615349565b92915050565b600081359050612ae881615360565b92915050565b600081359050612afd81615377565b92915050565b600081519050612b1281615377565b92915050565b600082601f830112612b2d57612b2c614217565b5b8135612b3d848260208601612a6d565b91505092915050565b600081359050612b558161538e565b92915050565b600060208284031215612b7157612b70614226565b5b6000612b7f84828501612aaf565b91505092915050565b60008060408385031215612b9f57612b9e614226565b5b6000612bad85828601612aaf565b9250506020612bbe85828601612aaf565b9150509250929050565b600080600060608486031215612be157612be0614226565b5b6000612bef86828701612aaf565b9350506020612c0086828701612aaf565b9250506040612c1186828701612b46565b9150509250925092565b60008060008060808587031215612c3557612c34614226565b5b6000612c4387828801612aaf565b9450506020612c5487828801612aaf565b9350506040612c6587828801612b46565b925050606085013567ffffffffffffffff811115612c8657612c85614221565b5b612c9287828801612b18565b91505092959194509250565b60008060408385031215612cb557612cb4614226565b5b6000612cc385828601612aaf565b9250506020612cd485828601612ac4565b9150509250929050565b60008060408385031215612cf557612cf4614226565b5b6000612d0385828601612aaf565b9250506020612d1485828601612b46565b9150509250929050565b600060208284031215612d3457612d33614226565b5b6000612d4284828501612ad9565b91505092915050565b60008060408385031215612d6257612d61614226565b5b6000612d7085828601612ad9565b925050602083013567ffffffffffffffff811115612d9157612d90614221565b5b612d9d85828601612b18565b9150509250929050565b600060208284031215612dbd57612dbc614226565b5b6000612dcb84828501612aee565b91505092915050565b600060208284031215612dea57612de9614226565b5b6000612df884828501612b03565b91505092915050565b600060208284031215612e1757612e16614226565b5b6000612e2584828501612b46565b91505092915050565b612e3781613f44565b82525050565b612e4681613f56565b82525050565b612e5581613f62565b82525050565b612e6c612e6782613f62565b6140e7565b82525050565b6000612e7d82613d81565b612e878185613d97565b9350612e97818560208601613fde565b612ea08161422b565b840191505092915050565b6000612eb682613d8c565b612ec08185613da8565b9350612ed0818560208601613fde565b612ed98161422b565b840191505092915050565b6000612eef82613d8c565b612ef98185613db9565b9350612f09818560208601613fde565b80840191505092915050565b6000612f22602f83613db9565b9150612f2d8261423c565b602f82019050919050565b6000612f45600183613db9565b9150612f508261428b565b600182019050919050565b6000612f68601583613db9565b9150612f73826142b4565b601582019050919050565b6000612f8b601c83613db9565b9150612f96826142dd565b601c82019050919050565b6000612fae603283613da8565b9150612fb982614306565b604082019050919050565b6000612fd1600283613db9565b9150612fdc82614355565b600282019050919050565b6000612ff4606283613db9565b9150612fff8261437e565b606282019050919050565b6000613017602383613db9565b915061302282614419565b602382019050919050565b600061303a601c83613da8565b915061304582614468565b602082019050919050565b600061305d600983613db9565b915061306882614491565b600982019050919050565b6000613080602a83613db9565b915061308b826144ba565b602a82019050919050565b60006130a3605283613db9565b91506130ae82614509565b605282019050919050565b60006130c6605c83613db9565b91506130d18261457e565b605c82019050919050565b60006130e9604183613db9565b91506130f4826145f3565b604182019050919050565b600061310c602483613da8565b915061311782614668565b604082019050919050565b600061312f601983613da8565b915061313a826146b7565b602082019050919050565b6000613152601683613db9565b915061315d826146e0565b601682019050919050565b6000613175602c83613da8565b915061318082614709565b604082019050919050565b6000613198603283613db9565b91506131a382614758565b603282019050919050565b60006131bb604c83613db9565b91506131c6826147a7565b604c82019050919050565b60006131de603283613db9565b91506131e98261481c565b603282019050919050565b6000613201605a83613db9565b915061320c8261486b565b605a82019050919050565b6000613224602583613db9565b915061322f826148e0565b602582019050919050565b6000613247600383613db9565b91506132528261492f565b600382019050919050565b600061326a603883613da8565b915061327582614958565b604082019050919050565b600061328d602a83613da8565b9150613298826149a7565b604082019050919050565b60006132b0602983613da8565b91506132bb826149f6565b604082019050919050565b60006132d3601a83613db9565b91506132de82614a45565b601a82019050919050565b60006132f6605583613db9565b915061330182614a6e565b605582019050919050565b6000613319602083613da8565b915061332482614ae3565b602082019050919050565b600061333c600183613db9565b915061334782614b0c565b600182019050919050565b600061335f602483613db9565b915061336a82614b35565b602482019050919050565b6000613382602c83613da8565b915061338d82614b84565b604082019050919050565b60006133a5604b83613db9565b91506133b082614bd3565b604b82019050919050565b60006133c8607483613db9565b91506133d382614c48565b607482019050919050565b60006133eb604183613db9565b91506133f682614ce3565b604182019050919050565b600061340e602b83613db9565b915061341982614d58565b602b82019050919050565b6000613431602983613da8565b915061343c82614da7565b604082019050919050565b6000613454603483613db9565b915061345f82614df6565b603482019050919050565b6000613477600f83613db9565b915061348282614e45565b600f82019050919050565b600061349a603f83613db9565b91506134a582614e6e565b603f82019050919050565b60006134bd606e83613db9565b91506134c882614ebd565b606e82019050919050565b60006134e0601a83613db9565b91506134eb82614f58565b601a82019050919050565b6000613503605a83613db9565b915061350e82614f81565b605a82019050919050565b6000613526602183613da8565b915061353182614ff6565b604082019050919050565b6000613549602683613db9565b915061355482615045565b602682019050919050565b600061356c603183613da8565b915061357782615094565b604082019050919050565b600061358f601983613db9565b915061359a826150e3565b601982019050919050565b60006135b2601183613db9565b91506135bd8261510c565b601182019050919050565b60006135d5604683613db9565b91506135e082615135565b604682019050919050565b60006135f8606983613db9565b9150613603826151aa565b606982019050919050565b600061361b600d83613db9565b915061362682615245565b600d82019050919050565b600061363e606283613db9565b91506136498261526e565b606282019050919050565b6000613661600383613db9565b915061366c82615309565b600382019050919050565b61368081613fb8565b82525050565b61369761369282613fb8565b6140f1565b82525050565b6136a681613fc2565b82525050565b60006136b782612f15565b91506136c38286612ee4565b91506136ce826134f6565b91506136da8285612ee4565b91506136e5826131f4565b91506136f18284612ee4565b91506136fc82613401565b9150819050949350505050565b600061371482612f5b565b91506137208285612ee4565b915061372b826130dc565b91506137378284612ee4565b91506137428261323a565b91508190509392505050565b600061375982612f5b565b91506137658284612ee4565b9150613770826134b0565b915081905092915050565b600061378682612f7e565b91506137928284612e5b565b60208201915081905092915050565b60006137ac82612fe7565b91506137b88284612ee4565b91506137c382613217565b915081905092915050565b60006137d982613073565b91506137e58284612ee4565b91506137f0826135c8565b915081905092915050565b600061380682613352565b91506138118261360e565b915061381d8285612ee4565b91506138288261300a565b91506138348284612ee4565b915061383f82612fc4565b915061384a82613096565b9150613855826131ae565b91506138608261332f565b91508190509392505050565b6000613877826133de565b91506138828261353c565b915061388e828f612ee4565b91506138998261323a565b91506138a4826135eb565b91506138af82612f38565b91506138bb828e612ee4565b91506138c682613050565b91506138d2828d612ee4565b91506138dd82613654565b91506138e9828c612ee4565b91506138f5828b612ee4565b9150613900826135a5565b915061390b82613398565b91506139168261348d565b9150613922828a612ee4565b915061392d8261318b565b91506139398289612ee4565b91506139448261323a565b915061394f826131d1565b915061395b8288612ee4565b915061396682613217565b915061397182613145565b915061397c82613447565b91506139888287612ee4565b91506139938261323a565b915061399f8286612ee4565b91506139aa826132e9565b91506139b68285612ee4565b91506139c182613631565b91506139cd8284612ee4565b91506139d8826130b9565b91506139e3826133bb565b91508190509d9c50505050505050505050505050565b6000613a048261346a565b9150613a108286612ee4565b9150613a1b82613582565b9150613a268261346a565b9150613a328285612ee4565b9150613a3d826132c6565b9150613a488261346a565b9150613a548284612ee4565b9150613a5f826134d3565b9150819050949350505050565b6000613a788284613686565b60208201915081905092915050565b6000602082019050613a9c6000830184612e2e565b92915050565b6000608082019050613ab76000830187612e2e565b613ac46020830186612e2e565b613ad16040830185613677565b8181036060830152613ae38184612e72565b905095945050505050565b6000602082019050613b036000830184612e3d565b92915050565b6000608082019050613b1e6000830187612e4c565b613b2b602083018661369d565b613b386040830185612e4c565b613b456060830184612e4c565b95945050505050565b60006020820190508181036000830152613b688184612eab565b905092915050565b60006020820190508181036000830152613b8981612fa1565b9050919050565b60006020820190508181036000830152613ba98161302d565b9050919050565b60006020820190508181036000830152613bc9816130ff565b9050919050565b60006020820190508181036000830152613be981613122565b9050919050565b60006020820190508181036000830152613c0981613168565b9050919050565b60006020820190508181036000830152613c298161325d565b9050919050565b60006020820190508181036000830152613c4981613280565b9050919050565b60006020820190508181036000830152613c69816132a3565b9050919050565b60006020820190508181036000830152613c898161330c565b9050919050565b60006020820190508181036000830152613ca981613375565b9050919050565b60006020820190508181036000830152613cc981613424565b9050919050565b60006020820190508181036000830152613ce981613519565b9050919050565b60006020820190508181036000830152613d098161355f565b9050919050565b6000602082019050613d256000830184613677565b92915050565b6000613d35613d46565b9050613d41828261406d565b919050565b6000604051905090565b600067ffffffffffffffff821115613d6b57613d6a6141e8565b5b613d748261422b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dcf82613fb8565b9150613dda83613fb8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e0f57613e0e61412c565b5b828201905092915050565b6000613e2582613fc2565b9150613e3083613fc2565b92508260ff03821115613e4657613e4561412c565b5b828201905092915050565b6000613e5c82613fb8565b9150613e6783613fb8565b925082613e7757613e7661415b565b5b828204905092915050565b6000613e8d82613fb8565b9150613e9883613fb8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ed157613ed061412c565b5b828202905092915050565b6000613ee782613fb8565b9150613ef283613fb8565b925082821015613f0557613f0461412c565b5b828203905092915050565b6000613f1b82613fc2565b9150613f2683613fc2565b925082821015613f3957613f3861412c565b5b828203905092915050565b6000613f4f82613f98565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613ffc578082015181840152602081019050613fe1565b8381111561400b576000848401525b50505050565b600061401c82613fb8565b915060008214156140305761402f61412c565b5b600182039050919050565b6000600282049050600182168061405357607f821691505b602082108114156140675761406661418a565b5b50919050565b6140768261422b565b810181811067ffffffffffffffff82111715614095576140946141e8565b5b80604052505050565b60006140a982613fb8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140dc576140db61412c565b5b600182019050919050565b6000819050919050565b6000819050919050565b600061410682613fb8565b915061411183613fb8565b9250826141215761412061415b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f3c6c696e652078313d273130272079313d273130272078323d2732302720793260008201527f3d27333027207374726f6b653d27230000000000000000000000000000000000602082015250565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c7061746820643d274d20343020383020512030200000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c7061746820643d274d2033363620363920512033333420313139203337362060008201527f313335205120333633203138382034323120313735205120343236203233312060208201527f34373720323034205120353138203234372035343220313738272066696c6c3d60408201527f2723000000000000000000000000000000000000000000000000000000000000606082015250565b7f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b757460008201527f66382c0000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f2920726f74617465280000000000000000000000000000000000000000000000600082015250565b7f3c636c6970506174682069643d27676c617a65273e3c7061746820643d274d2060008201527f3430203830205120302000000000000000000000000000000000000000000000602082015250565b7f226c6963656e7365223a2246756c6c206f776e6572736869702077697468207560008201527f6e6c696d6974656420636f6d6d65726369616c207269676874732e222c22637260208201527f6561746f72223a2240636c656d6c616b222c0000000000000000000000000000604082015250565b7f3c7061746820643d274d2035373120313536205120353332203439382031363960008201527f20353138205120353937203537332035373020313536272066696c6c3d27233060208201527f3030272066696c6c2d6f7061636974793d27302e31272f3e3c2f673e00000000604082015250565b7f203538203333332054203134332034303020542032323320343030205420333460008201527f372034303020542035303420343030205420353530203830272066696c6c3d2760208201527f2300000000000000000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f3c67206d61736b3d2775726c2823646f6e757429273e00000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f3c656c6c697073652063783d27333030272063793d27323730272072783d273760008201527f30272072793d273430272066696c6c3d27230000000000000000000000000000602082015250565b7f226465736372697074696f6e223a22537765657420446f6e7574733a2050726f60008201527f6365647572616c6c792067656e65726174656420446f6e757473204e4654206f60208201527f6e20457468657265756d21220000000000000000000000000000000000000000604082015250565b7f3c656c6c697073652063783d27333030272063793d27333030272072783d273760008201527f30272072793d273330272066696c6c3d27230000000000000000000000000000602082015250565b7f27207374726f6b652d6c696e656361703d27726f756e6427207374726f6b652d60008201527f77696474683d2735272f3e3c6c696e652078313d273335272079313d2738352760208201527f2078323d273630272079323d27383027207374726f6b653d2723000000000000604082015250565b7f27207374726f6b653d272334323239303027207374726f6b652d77696474683d60008201527f2738272f3e000000000000000000000000000000000000000000000000000000602082015250565b7f272f3e0000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f272063783d273230272063793d2735302720723d273130272f3e000000000000600082015250565b7f3c656c6c697073652063783d27333030272063793d27333030272072783d273260008201527f3430272072793d27323135272066696c6c3d2775726c282370292720636c697060208201527f2d706174683d2775726c2823676c617a6529272f3e0000000000000000000000604082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d60008201527f65223a2200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f3c6d61736b2069643d27646f6e7574273e3c656c6c697073652063783d27333060008201527f30272063793d27333030272072783d27323430272072793d273231352720666960208201527f6c6c3d2723666666272f3e000000000000000000000000000000000000000000604082015250565b7f3c656c6c697073652063783d27333030272063793d27323730272072783d273760008201527f30272072793d273430272066696c6c3d272345464234354527207374726f6b6560208201527f3d272334323239303027207374726f6b652d77696474683d2738272066696c6c60408201527f2d6f7061636974793d2730272f3e3c2f7376673e000000000000000000000000606082015250565b7f3c7376672077696474683d2736303027206865696768743d273630302720786d60008201527f6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672760208201527f3e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f27207374726f6b652d6c696e656361703d27726f756e6427207374726f6b652d60008201527f77696474683d2735272f3e000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f3c656c6c697073652063783d27333030272063793d27333030272072783d273260008201527f3430272072793d27323135272066696c6c3d2723000000000000000000000000602082015250565b7f3c636972636c652066696c6c3d27230000000000000000000000000000000000600082015250565b7f3c656c6c697073652063783d27333030272063793d27323730272072783d273760008201527f30272072793d273430272066696c6c3d2723303030272f3e3c2f6d61736b3e00602082015250565b7f203538203333332054203134332034303020542032323320343030205420333460008201527f372034303020542035303420343030205420353530203830272066696c6c2d6f60208201527f7061636974793d273027207374726f6b653d272334323239303027207374726f60408201527f6b652d77696474683d2738272f3e000000000000000000000000000000000000606082015250565b7f272063783d273530272063793d2733302720723d273135272f3e000000000000600082015250565b7f27207374726f6b652d6c696e656361703d27726f756e6427207374726f6b652d60008201527f77696474683d2735272f3e3c6c696e652078313d273835272079313d2733352760208201527f2078323d273630272079323d27363027207374726f6b653d2723000000000000604082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f3c726563742077696474683d2736303027206865696768743d2736303027206660008201527f696c6c3d27230000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f272063783d273130272063793d2731302720723d2738272f3e00000000000000600082015250565b7f3c2f7061747465726e3e3c2f646566733e000000000000000000000000000000600082015250565b7f203538203333332054203134332034303020542032323320343030205420333460008201527f372034303020542035303420343030205420353530203830272f3e3c2f636c6960208201527f70506174683e0000000000000000000000000000000000000000000000000000604082015250565b7f3c646566733e3c7061747465726e2069643d2770272077696474683d2731303060008201527f27206865696768743d2731303027207061747465726e556e6974733d2775736560208201527f7253706163654f6e55736527207061747465726e5472616e73666f726d3d277460408201527f72616e736c617465280000000000000000000000000000000000000000000000606082015250565b7f537765657420446f6e7574202300000000000000000000000000000000000000600082015250565b7f3c656c6c697073652063783d27333030272063793d27333030272072783d273260008201527f3430272072793d27323135272066696c6c2d6f7061636974793d27302720737460208201527f726f6b653d272334323239303027207374726f6b652d77696474683d2731362760408201527f2f3e000000000000000000000000000000000000000000000000000000000000606082015250565b7f29273e0000000000000000000000000000000000000000000000000000000000600082015250565b61533b81613f44565b811461534657600080fd5b50565b61535281613f56565b811461535d57600080fd5b50565b61536981613f62565b811461537457600080fd5b50565b61538081613f6c565b811461538b57600080fd5b50565b61539781613fb8565b81146153a257600080fd5b5056fe3c7061746820643d274d203530203230204c203730203735204c203230203430204c203830203430204c203330203735204c203530203230272066696c6c3d2723666666272f3e3c726563742077696474683d2731303027206865696768743d27313030272066696c6c2d6f7061636974793d273027207374726f6b652d77696474683d27313027207374726f6b653d2723666666272f3e3c6c696e652078313d27302720793d2730272078323d2730272079323d2731303027207374726f6b653d272366666627207374726f6b652d77696474683d273230272f3e3c7061746820643d274d3530203437613120312030203020302d31392031306c31392032322031392d3232613120312030203020302d31392d3130272066696c6c3d2723666666272f3e3c7061746820643d274d302c313030204c35302c30204c3130302c313030272066696c6c2d6f7061636974793d273027207374726f6b653d272366666627207374726f6b652d77696474683d273130272f3e3c636972636c652063783d273530272063793d2732352720723d273130272066696c6c3d2723666666272f3e3c636972636c652063783d273430272063793d2733352720723d273130272066696c6c3d2723666666272f3e3c636972636c652063783d273530272063793d2734352720723d273130272066696c6c3d2723666666272f3e3c636972636c652063783d273630272063793d2733352720723d273130272066696c6c3d2723666666272f3e3c636972636c652066696c6c2d6f7061636974793d273027207374726f6b653d272366666627207374726f6b652d77696474683d2731302720723d273530272f3e3c636972636c652063793d27313030272063783d27313030272066696c6c2d6f7061636974793d273027207374726f6b653d272366666627207374726f6b652d77696474683d2731302720723d273530272f3e3c706174682066696c6c3d27236666662720643d274d30203068353076353048307a4d35302035306835307635304835307a272f3e3c636972636c652063783d273530272063793d273530272066696c6c3d27236666662720723d273135272f3e3c726563742077696474683d27323027206865696768743d273230272066696c6c3d2723666666272f3ea2646970667358221220577f4dd0add4fc72173f3c7447d5aee3336590e0ffd3c544fdaa0410189f649764736f6c63430008060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000006a94d74f430000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000061329ae0

-----Decoded View---------------
Arg [0] : _price (uint256): 30000000000000000
Arg [1] : _maxQty (uint256): 36
Arg [2] : _maxSold (uint256): 10000
Arg [3] : _startTimestamp (uint256): 1630706400

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000006a94d74f430000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 0000000000000000000000000000000000000000000000000000000061329ae0


Deployed Bytecode Sourcemap

44292:11002:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20706:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44804:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21651:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23210:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22733:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24100:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47362:98;;;;;;;;;;;;;:::i;:::-;;24510:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44830:24;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21345:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21075:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44706:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44771:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21820:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44651:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23503:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45484:561;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24766:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44678:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47468:568;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44863:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44735:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23869:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46053:567;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20706:305;20808:4;20860:25;20845:40;;;:11;:40;;;;:105;;;;20917:33;20902:48;;;:11;:48;;;;20845:105;:158;;;;20967:36;20991:11;20967:23;:36::i;:::-;20845:158;20825:178;;20706:305;;;:::o;44804:19::-;;;;:::o;21651:100::-;21705:13;21738:5;21731:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21651:100;:::o;23210:221::-;23286:7;23314:16;23322:7;23314;:16::i;:::-;23306:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23399:15;:24;23415:7;23399:24;;;;;;;;;;;;;;;;;;;;;23392:31;;23210:221;;;:::o;22733:411::-;22814:13;22830:23;22845:7;22830:14;:23::i;:::-;22814:39;;22878:5;22872:11;;:2;:11;;;;22864:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22972:5;22956:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22981:37;22998:5;23005:12;:10;:12::i;:::-;22981:16;:37::i;:::-;22956:62;22934:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23115:21;23124:2;23128:7;23115:8;:21::i;:::-;22803:341;22733:411;;:::o;24100:339::-;24295:41;24314:12;:10;:12::i;:::-;24328:7;24295:18;:41::i;:::-;24287:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24403:28;24413:4;24419:2;24423:7;24403:9;:28::i;:::-;24100:339;;;:::o;47362:98::-;47410:9;;;;;;;;;;;47402:27;;:50;47430:21;47402:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47362:98::o;24510:185::-;24648:39;24665:4;24671:2;24675:7;24648:39;;;;;;;;;;;;:16;:39::i;:::-;24510:185;;;:::o;44830:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21345:239::-;21417:7;21437:13;21453:7;:16;21461:7;21453:16;;;;;;;;;;;;;;;;;;;;;21437:32;;21505:1;21488:19;;:5;:19;;;;21480:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21571:5;21564:12;;;21345:239;;;:::o;21075:208::-;21147:7;21192:1;21175:19;;:5;:19;;;;21167:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21259:9;:16;21269:5;21259:16;;;;;;;;;;;;;;;;21252:23;;21075:208;;;:::o;44706:22::-;;;;:::o;44771:24::-;;;;;;;;;;;;;:::o;21820:104::-;21876:13;21909:7;21902:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21820:104;:::o;44651:20::-;;;;:::o;23503:295::-;23618:12;:10;:12::i;:::-;23606:24;;:8;:24;;;;23598:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23718:8;23673:18;:32;23692:12;:10;:12::i;:::-;23673:32;;;;;;;;;;;;;;;:42;23706:8;23673:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23771:8;23742:48;;23757:12;:10;:12::i;:::-;23742:48;;;23781:8;23742:48;;;;;;:::i;:::-;;;;;;;;23503:295;;:::o;45484:561::-;45561:14;;45543:15;:32;45539:54;;;45584:9;;;;;;;;;;;;;;45539:54;45629:3;45621:5;;:11;;;;:::i;:::-;45608:9;:24;45604:49;;45641:12;;;;;;;;;;;;;;45604:49;45674:6;;45668:3;:12;45664:41;;;45689:16;;;;;;;;;;;;;;45664:41;45733:7;;45727:3;45720:4;;:10;;;;:::i;:::-;:20;45716:47;;;45749:14;;;;;;;;;;;;;;45716:47;45781:9;45776:262;45800:3;45796:1;:7;45776:262;;;45828:14;45898:7;:14;;;;45880:15;:32;;;;:::i;:::-;45863:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;45853:61;;;;;;45845:70;;45828:87;;45930:7;45943:6;45930:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45965:37;45971:10;46000:1;45983:7;:14;;;;:18;;;;:::i;:::-;45965:5;:37::i;:::-;46025:1;46017:4;;:9;;;;;;;:::i;:::-;;;;;;;;45813:225;45810:1;45805:6;;;;;:::i;:::-;;;45776:262;;;;45484:561;:::o;24766:328::-;24941:41;24960:12;:10;:12::i;:::-;24974:7;24941:18;:41::i;:::-;24933:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25047:39;25061:4;25067:2;25071:7;25080:5;25047:13;:39::i;:::-;24766:328;;;;:::o;44678:21::-;;;;:::o;47468:568::-;47533:13;47687:18;:7;:16;:18::i;:::-;47772:15;47779:7;47772:6;:15::i;:::-;47573:454;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47559:469;;47468:568;;;:::o;44863:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;44735:29::-;;;;:::o;23869:164::-;23966:4;23990:18;:25;24009:5;23990:25;;;;;;;;;;;;;;;:35;24016:8;23990:35;;;;;;;;;;;;;;;;;;;;;;;;;23983:42;;23869:164;;;;:::o;46053:567::-;46147:14;;46129:15;:32;46125:54;;;46170:9;;;;;;;;;;;;;;46125:54;46194:9;:14;46204:3;46194:14;;;;;;;;;;;;;;;;;;;;;46190:43;;;46217:16;;;;;;;;;;;;;;46190:43;46246:14;46263:23;46271:3;46276:9;46263:7;:23::i;:::-;46246:40;;46313:9;;;;;;;;;;;46303:19;;:6;:19;;;46299:314;;;46356:4;46339:9;:14;46349:3;46339:14;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46377:14;46447:7;:14;;;;46429:15;:32;;;;:::i;:::-;46412:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;46402:61;;;;;;46394:70;;46377:87;;46479:7;46492:6;46479:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46514:37;46520:10;46549:1;46532:7;:14;;;;:18;;;;:::i;:::-;46514:5;:37::i;:::-;46324:239;46299:314;;;46591:10;;;;;;;;;;;;;;46299:314;46114:506;46053:567;;:::o;19208:157::-;19293:4;19332:25;19317:40;;;:11;:40;;;;19310:47;;19208:157;;;:::o;26604:127::-;26669:4;26721:1;26693:30;;:7;:16;26701:7;26693:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26686:37;;26604:127;;;:::o;16120:98::-;16173:7;16200:10;16193:17;;16120:98;:::o;30586:174::-;30688:2;30661:15;:24;30677:7;30661:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30744:7;30740:2;30706:46;;30715:23;30730:7;30715:14;:23::i;:::-;30706:46;;;;;;;;;;;;30586:174;;:::o;26898:348::-;26991:4;27016:16;27024:7;27016;:16::i;:::-;27008:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27092:13;27108:23;27123:7;27108:14;:23::i;:::-;27092:39;;27161:5;27150:16;;:7;:16;;;:51;;;;27194:7;27170:31;;:20;27182:7;27170:11;:20::i;:::-;:31;;;27150:51;:87;;;;27205:32;27222:5;27229:7;27205:16;:32::i;:::-;27150:87;27142:96;;;26898:348;;;;:::o;29890:578::-;30049:4;30022:31;;:23;30037:7;30022:14;:23::i;:::-;:31;;;30014:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30132:1;30118:16;;:2;:16;;;;30110:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30188:39;30209:4;30215:2;30219:7;30188:20;:39::i;:::-;30292:29;30309:1;30313:7;30292:8;:29::i;:::-;30353:1;30334:9;:15;30344:4;30334:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30382:1;30365:9;:13;30375:2;30365:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30413:2;30394:7;:16;30402:7;30394:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30452:7;30448:2;30433:27;;30442:4;30433:27;;;;;;;;;;;;29890:578;;;:::o;28582:382::-;28676:1;28662:16;;:2;:16;;;;28654:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28735:16;28743:7;28735;:16::i;:::-;28734:17;28726:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28797:45;28826:1;28830:2;28834:7;28797:20;:45::i;:::-;28872:1;28855:9;:13;28865:2;28855:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28903:2;28884:7;:16;28892:7;28884:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28948:7;28944:2;28923:33;;28940:1;28923:33;;;;;;;;;;;;28582:382;;:::o;25976:315::-;26133:28;26143:4;26149:2;26153:7;26133:9;:28::i;:::-;26180:48;26203:4;26209:2;26213:7;26222:5;26180:22;:48::i;:::-;26172:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25976:315;;;;:::o;16649:723::-;16705:13;16935:1;16926:5;:10;16922:53;;;16953:10;;;;;;;;;;;;;;;;;;;;;16922:53;16985:12;17000:5;16985:20;;17016:14;17041:78;17056:1;17048:4;:9;17041:78;;17074:8;;;;;:::i;:::-;;;;17105:2;17097:10;;;;;:::i;:::-;;;17041:78;;;17129:19;17161:6;17151:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17129:39;;17179:154;17195:1;17186:5;:10;17179:154;;17223:1;17213:11;;;;;:::i;:::-;;;17290:2;17282:5;:10;;;;:::i;:::-;17269:2;:24;;;;:::i;:::-;17256:39;;17239:6;17246;17239:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17319:2;17310:11;;;;;:::i;:::-;;;17179:154;;;17357:6;17343:21;;;;;16649:723;;;;:::o;48044:3900::-;48099:13;48125:12;48140:7;48148;48140:16;;;;;;;;:::i;:::-;;;;;;;;;;48125:31;;48169:30;48202:81;;;;;;;;48240:4;48202:81;;;;48270:1;48202:81;;;48169:114;;48296:20;48319:584;;;;;;;;48353:17;48365:1;48368;48353:6;:11;;:17;;;;;:::i;:::-;48319:584;;;;;;48400:17;48412:1;48415;48400:6;:11;;:17;;;;;:::i;:::-;48319:584;;;;;;48464:1;48442:19;48454:1;48457:3;48442:6;:11;;:19;;;;;:::i;:::-;:23;:120;;48561:1;48442:120;;;48507:2;48485:19;48497:1;48500:3;48485:6;:11;;:19;;;;;:::i;:::-;:24;:56;;48540:1;48485:56;;;48518:18;48530:1;48533:2;48518:6;:11;;:18;;;;;:::i;:::-;48485:56;48442:120;48319:584;;;;;;48597:21;48609:3;48614;48597:6;:11;;:21;;;;;:::i;:::-;48319:584;;;;;;48653:32;48665:1;48668:16;48653:32;;:6;:11;;:32;;;;;:::i;:::-;48319:584;;;;;;48734:2;48712:19;48724:1;48727:3;48712:6;:11;;:19;;;;;:::i;:::-;:24;:55;;48766:1;48712:55;;;48745:17;48757:1;48760;48745:6;:11;;:17;;;;;:::i;:::-;48712:55;48319:584;;;;;;48803:32;48815:1;48818:16;48803:32;;:6;:11;;:32;;;;;:::i;:::-;48319:584;;;;;;48881:2;48859:19;48871:1;48874:3;48859:6;:11;;:19;;;;;:::i;:::-;:24;:32;;48890:1;48859:32;;;48886:1;48859:32;48319:584;;;;;48296:607;;49098:23;49109:6;:11;;;49098:10;:23::i;:::-;49296:29;:18;49308:1;49311:2;49296:6;:11;;:18;;;;;:::i;:::-;:27;:29::i;:::-;49366:30;:19;49378:1;49381:3;49366:6;:11;;:19;;;;;:::i;:::-;:28;:30::i;:::-;49448:1;49431:6;:14;;;:18;;;:57;;;;;;;;;;;;;;;;;49452:31;49468:6;:14;;;49452:15;:31::i;:::-;49431:57;49522:1;49503:6;:16;;;:20;;;:77;;;;;;;;;;;;;;;;;49526:49;49537:6;:16;;;49555:6;:19;;;49526:10;:49::i;:::-;49503:77;49818:1;49801:6;:14;;;:18;;;:267;;;;;;;;;;;;;;;;;49927:29;:6;:18;;;:27;;;:29::i;:::-;49829:233;;;;;;;;:::i;:::-;;;;;;;;;;;;;49801:267;50150:27;50163:6;:13;;;50150:12;:27::i;:::-;50279:23;50290:6;:11;;;50279:10;:23::i;:::-;50479:27;50492:6;:13;;;50479:12;:27::i;:::-;50558:1;50541:6;:14;;;:18;;;:325;;;;;;;;;;;;;;;;;50646:29;:6;:18;;;:27;;;:29::i;:::-;50780:41;50800:6;:17;;;50780:41;;50819:1;50780:19;:41::i;:::-;50569:291;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50541:325;51000:1;50983:6;:14;;;:18;;;:286;;;;;;;;;;;;;;;;;51088:29;:6;:18;;;:27;;;:29::i;:::-;51011:252;;;;;;;;:::i;:::-;;;;;;;;;;;;;50983:286;51415:1;51399:6;:13;;;:17;;;:283;;;;;;;;;;;;;;;;;51580:23;51591:6;:11;;;51580:10;:23::i;:::-;51426:250;;;;;;;;:::i;:::-;;;;;;;;;;;;;51399:283;48930:3005;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48916:3020;;;;;48044:3900;;;:::o;46628:726::-;46705:7;46725:9;46745;46765:7;46809:2;46789:9;:16;:22;46785:72;;46843:1;46828:17;;;;;;;46785:72;46919:2;46908:9;46904:18;46898:25;46893:30;;46963:2;46952:9;46948:18;46942:25;46937:30;;47015:2;47004:9;47000:18;46994:25;46991:1;46986:34;46981:39;;47051:2;47047:1;:6;;;47043:46;;;47075:2;47070:7;;;;;:::i;:::-;;;47043:46;47110:2;47105:1;:7;;;;:18;;;;;47121:2;47116:1;:7;;;;47105:18;47101:246;;;47155:1;47140:17;;;;;;;47101:246;47197:138;47288:4;47235:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;47225:69;;;;;;47313:1;47316;47319;47197:138;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47190:145;;;;;46628:726;;;;;:::o;32696:126::-;;;;:::o;31325:799::-;31480:4;31501:15;:2;:13;;;:15::i;:::-;31497:620;;;31553:2;31537:36;;;31574:12;:10;:12::i;:::-;31588:4;31594:7;31603:5;31537:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31533:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31796:1;31779:6;:13;:18;31775:272;;;31822:60;;;;;;;;;;:::i;:::-;;;;;;;;31775:272;31997:6;31991:13;31982:6;31978:2;31974:15;31967:38;31533:529;31670:41;;;31660:51;;;:6;:51;;;;31653:58;;;;;31497:620;32101:4;32094:11;;31325:799;;;;;;;:::o;42668:1238::-;42787:14;42814:15;42832:6;:11;;;42814:29;;42854:17;42893:1;42874:6;:16;;;:20;;;;:::i;:::-;42854:40;;42907:17;42927:1;42907:21;;42939:12;42954:3;42939:18;;42978:7;42972:3;:13;42968:453;;;43009:8;43002:15;;43044:2;43032:14;;42968:453;;;43074:6;43068:3;:12;43064:357;;;43104:7;43097:14;;43138:2;43126:14;;43064:357;;;43168:5;43162:3;:11;43158:263;;;43197:6;43190:13;;43230:2;43218:14;;43158:263;;;43260:4;43254:3;:10;43250:171;;;43288:5;43281:12;;43320:2;43308:14;;43250:171;;;43350:3;43344;:9;43340:81;;;43377:4;43370:11;;43408:1;43396:13;;43340:81;43250:171;43158:263;43064:357;42968:453;43569:9;43563:3;:15;;;;:::i;:::-;43550:9;:29;43546:139;;;43608:1;43596:13;;43663:7;43652:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;43642:30;;;;;;43634:39;;43624:49;;43546:139;43697:16;43728:9;43717:7;:20;;43697:41;;43749:12;43775:4;43764:8;:15;43749:30;;43820:3;43814;:9;;;;:::i;:::-;43806:4;:18;;;;:::i;:::-;43799:3;:26;;;;:::i;:::-;43790:35;;43852:7;43838:6;:11;;:21;;;;;43889:9;43870:6;:16;;:28;;;;;42803:1103;;;;;;42668:1238;;;;;:::o;52360:236::-;52415:13;52441:23;:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52575:6;52582:5;52575:13;;;;;;;;;:::i;:::-;;;;;;52568:20;;;52360:236;;;:::o;52820:1246::-;52880:13;52906:26;:1113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54039:8;54056:1;54048:5;:9;;;;:::i;:::-;54039:19;;;;;;;;;:::i;:::-;;;;;;54032:26;;;52820:1246;;;:::o;54074:1217::-;54143:13;54169:24;:1076;;;;;;;;54321:29;54341:5;54321:29;;54348:1;54321:19;:29::i;:::-;54500;54520:5;54500:29;;54527:1;54500:19;:29::i;:::-;54679;54699:5;54679:29;;54706:1;54679:19;:29::i;:::-;54218:569;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54169:1076;;;;54881:29;54901:5;54881:29;;54908:1;54881:19;:29::i;:::-;55011;55031:5;55011:29;;55038:1;55011:19;:29::i;:::-;55142;55162:5;55142:29;;55169:1;55142:19;:29::i;:::-;54810:423;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54169:1076;;;;;55265:7;55281:1;55273:5;:9;;;;:::i;:::-;55265:18;;;;;;;;;:::i;:::-;;;;;;55258:25;;;54074:1217;;;;:::o;52604:208::-;52661:13;52687:23;:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52791:6;52798:5;52791:13;;;;;;;;;:::i;:::-;;;;;;52784:20;;;52604:208;;;:::o;52016:336::-;52099:13;52125:19;52161:6;52157:1;:10;;;;:::i;:::-;52147:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52125:43;;52184:9;52196:6;:13;52184:25;;52179:134;52215:1;52211;:5;52179:134;;;52254:8;52271:3;52263:5;:11;52254:21;;;;;;;:::i;:::-;;;;;52238:6;52249:1;52245;:5;;;;:::i;:::-;52238:13;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;52300:1;52290:11;;;;;52218:3;;;;;:::i;:::-;;;;52179:134;;;;52337:6;52323:21;;;52016:336;;;;:::o;8160:387::-;8220:4;8428:12;8495:7;8483:20;8475:28;;8538:1;8531:4;:8;8524:15;;;8160:387;;;:::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:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;475:87;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;617:84;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:137::-;897:5;935:6;922:20;913:29;;951:32;977:5;951:32;:::i;:::-;903:86;;;;:::o;995:141::-;1051:5;1082:6;1076:13;1067:22;;1098:32;1124:5;1098:32;:::i;:::-;1057:79;;;;:::o;1155:338::-;1210:5;1259:3;1252:4;1244:6;1240:17;1236:27;1226:2;;1267:79;;:::i;:::-;1226:2;1384:6;1371:20;1409:78;1483:3;1475:6;1468:4;1460:6;1456:17;1409:78;:::i;:::-;1400:87;;1216:277;;;;;:::o;1499:139::-;1545:5;1583:6;1570:20;1561:29;;1599:33;1626:5;1599:33;:::i;:::-;1551:87;;;;:::o;1644:329::-;1703:6;1752:2;1740:9;1731:7;1727:23;1723:32;1720:2;;;1758:79;;:::i;:::-;1720:2;1878:1;1903:53;1948:7;1939:6;1928:9;1924:22;1903:53;:::i;:::-;1893:63;;1849:117;1710:263;;;;:::o;1979:474::-;2047:6;2055;2104:2;2092:9;2083:7;2079:23;2075:32;2072:2;;;2110:79;;:::i;:::-;2072:2;2230:1;2255:53;2300:7;2291:6;2280:9;2276:22;2255:53;:::i;:::-;2245:63;;2201:117;2357:2;2383:53;2428:7;2419:6;2408:9;2404:22;2383:53;:::i;:::-;2373:63;;2328:118;2062:391;;;;;:::o;2459:619::-;2536:6;2544;2552;2601:2;2589:9;2580:7;2576:23;2572:32;2569:2;;;2607:79;;:::i;:::-;2569:2;2727:1;2752:53;2797:7;2788:6;2777:9;2773:22;2752:53;:::i;:::-;2742:63;;2698:117;2854:2;2880:53;2925:7;2916:6;2905:9;2901:22;2880:53;:::i;:::-;2870:63;;2825:118;2982:2;3008:53;3053:7;3044:6;3033:9;3029:22;3008:53;:::i;:::-;2998:63;;2953:118;2559:519;;;;;:::o;3084:943::-;3179:6;3187;3195;3203;3252:3;3240:9;3231:7;3227:23;3223:33;3220:2;;;3259:79;;:::i;:::-;3220:2;3379:1;3404:53;3449:7;3440:6;3429:9;3425:22;3404:53;:::i;:::-;3394:63;;3350:117;3506:2;3532:53;3577:7;3568:6;3557:9;3553:22;3532:53;:::i;:::-;3522:63;;3477:118;3634:2;3660:53;3705:7;3696:6;3685:9;3681:22;3660:53;:::i;:::-;3650:63;;3605:118;3790:2;3779:9;3775:18;3762:32;3821:18;3813:6;3810:30;3807:2;;;3843:79;;:::i;:::-;3807:2;3948:62;4002:7;3993:6;3982:9;3978:22;3948:62;:::i;:::-;3938:72;;3733:287;3210:817;;;;;;;:::o;4033:468::-;4098:6;4106;4155:2;4143:9;4134:7;4130:23;4126:32;4123:2;;;4161:79;;:::i;:::-;4123:2;4281:1;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4252:117;4408:2;4434:50;4476:7;4467:6;4456:9;4452:22;4434:50;:::i;:::-;4424:60;;4379:115;4113:388;;;;;:::o;4507:474::-;4575:6;4583;4632:2;4620:9;4611:7;4607:23;4603:32;4600:2;;;4638:79;;:::i;:::-;4600:2;4758:1;4783:53;4828:7;4819:6;4808:9;4804:22;4783:53;:::i;:::-;4773:63;;4729:117;4885:2;4911:53;4956:7;4947:6;4936:9;4932:22;4911:53;:::i;:::-;4901:63;;4856:118;4590:391;;;;;:::o;4987:329::-;5046:6;5095:2;5083:9;5074:7;5070:23;5066:32;5063:2;;;5101:79;;:::i;:::-;5063:2;5221:1;5246:53;5291:7;5282:6;5271:9;5267:22;5246:53;:::i;:::-;5236:63;;5192:117;5053:263;;;;:::o;5322:652::-;5399:6;5407;5456:2;5444:9;5435:7;5431:23;5427:32;5424:2;;;5462:79;;:::i;:::-;5424:2;5582:1;5607:53;5652:7;5643:6;5632:9;5628:22;5607:53;:::i;:::-;5597:63;;5553:117;5737:2;5726:9;5722:18;5709:32;5768:18;5760:6;5757:30;5754:2;;;5790:79;;:::i;:::-;5754:2;5895:62;5949:7;5940:6;5929:9;5925:22;5895:62;:::i;:::-;5885:72;;5680:287;5414:560;;;;;:::o;5980:327::-;6038:6;6087:2;6075:9;6066:7;6062:23;6058:32;6055:2;;;6093:79;;:::i;:::-;6055:2;6213:1;6238:52;6282:7;6273:6;6262:9;6258:22;6238:52;:::i;:::-;6228:62;;6184:116;6045:262;;;;:::o;6313:349::-;6382:6;6431:2;6419:9;6410:7;6406:23;6402:32;6399:2;;;6437:79;;:::i;:::-;6399:2;6557:1;6582:63;6637:7;6628:6;6617:9;6613:22;6582:63;:::i;:::-;6572:73;;6528:127;6389:273;;;;:::o;6668:329::-;6727:6;6776:2;6764:9;6755:7;6751:23;6747:32;6744:2;;;6782:79;;:::i;:::-;6744:2;6902:1;6927:53;6972:7;6963:6;6952:9;6948:22;6927:53;:::i;:::-;6917:63;;6873:117;6734:263;;;;:::o;7003:118::-;7090:24;7108:5;7090:24;:::i;:::-;7085:3;7078:37;7068:53;;:::o;7127:109::-;7208:21;7223:5;7208:21;:::i;:::-;7203:3;7196:34;7186:50;;:::o;7242:118::-;7329:24;7347:5;7329:24;:::i;:::-;7324:3;7317:37;7307:53;;:::o;7366:157::-;7471:45;7491:24;7509:5;7491:24;:::i;:::-;7471:45;:::i;:::-;7466:3;7459:58;7449:74;;:::o;7529:360::-;7615:3;7643:38;7675:5;7643:38;:::i;:::-;7697:70;7760:6;7755:3;7697:70;:::i;:::-;7690:77;;7776:52;7821:6;7816:3;7809:4;7802:5;7798:16;7776:52;:::i;:::-;7853:29;7875:6;7853:29;:::i;:::-;7848:3;7844:39;7837:46;;7619:270;;;;;:::o;7895:364::-;7983:3;8011:39;8044:5;8011:39;:::i;:::-;8066:71;8130:6;8125:3;8066:71;:::i;:::-;8059:78;;8146:52;8191:6;8186:3;8179:4;8172:5;8168:16;8146:52;:::i;:::-;8223:29;8245:6;8223:29;:::i;:::-;8218:3;8214:39;8207:46;;7987:272;;;;;:::o;8265:377::-;8371:3;8399:39;8432:5;8399:39;:::i;:::-;8454:89;8536:6;8531:3;8454:89;:::i;:::-;8447:96;;8552:52;8597:6;8592:3;8585:4;8578:5;8574:16;8552:52;:::i;:::-;8629:6;8624:3;8620:16;8613:23;;8375:267;;;;;:::o;8648:402::-;8808:3;8829:85;8911:2;8906:3;8829:85;:::i;:::-;8822:92;;8923:93;9012:3;8923:93;:::i;:::-;9041:2;9036:3;9032:12;9025:19;;8812:238;;;:::o;9056:400::-;9216:3;9237:84;9319:1;9314:3;9237:84;:::i;:::-;9230:91;;9330:93;9419:3;9330:93;:::i;:::-;9448:1;9443:3;9439:11;9432:18;;9220:236;;;:::o;9462:402::-;9622:3;9643:85;9725:2;9720:3;9643:85;:::i;:::-;9636:92;;9737:93;9826:3;9737:93;:::i;:::-;9855:2;9850:3;9846:12;9839:19;;9626:238;;;:::o;9870:402::-;10030:3;10051:85;10133:2;10128:3;10051:85;:::i;:::-;10044:92;;10145:93;10234:3;10145:93;:::i;:::-;10263:2;10258:3;10254:12;10247:19;;10034:238;;;:::o;10278:366::-;10420:3;10441:67;10505:2;10500:3;10441:67;:::i;:::-;10434:74;;10517:93;10606:3;10517:93;:::i;:::-;10635:2;10630:3;10626:12;10619:19;;10424:220;;;:::o;10650:400::-;10810:3;10831:84;10913:1;10908:3;10831:84;:::i;:::-;10824:91;;10924:93;11013:3;10924:93;:::i;:::-;11042:1;11037:3;11033:11;11026:18;;10814:236;;;:::o;11056:402::-;11216:3;11237:85;11319:2;11314:3;11237:85;:::i;:::-;11230:92;;11331:93;11420:3;11331:93;:::i;:::-;11449:2;11444:3;11440:12;11433:19;;11220:238;;;:::o;11464:402::-;11624:3;11645:85;11727:2;11722:3;11645:85;:::i;:::-;11638:92;;11739:93;11828:3;11739:93;:::i;:::-;11857:2;11852:3;11848:12;11841:19;;11628:238;;;:::o;11872:366::-;12014:3;12035:67;12099:2;12094:3;12035:67;:::i;:::-;12028:74;;12111:93;12200:3;12111:93;:::i;:::-;12229:2;12224:3;12220:12;12213:19;;12018:220;;;:::o;12244:400::-;12404:3;12425:84;12507:1;12502:3;12425:84;:::i;:::-;12418:91;;12518:93;12607:3;12518:93;:::i;:::-;12636:1;12631:3;12627:11;12620:18;;12408:236;;;:::o;12650:402::-;12810:3;12831:85;12913:2;12908:3;12831:85;:::i;:::-;12824:92;;12925:93;13014:3;12925:93;:::i;:::-;13043:2;13038:3;13034:12;13027:19;;12814:238;;;:::o;13058:402::-;13218:3;13239:85;13321:2;13316:3;13239:85;:::i;:::-;13232:92;;13333:93;13422:3;13333:93;:::i;:::-;13451:2;13446:3;13442:12;13435:19;;13222:238;;;:::o;13466:402::-;13626:3;13647:85;13729:2;13724:3;13647:85;:::i;:::-;13640:92;;13741:93;13830:3;13741:93;:::i;:::-;13859:2;13854:3;13850:12;13843:19;;13630:238;;;:::o;13874:402::-;14034:3;14055:85;14137:2;14132:3;14055:85;:::i;:::-;14048:92;;14149:93;14238:3;14149:93;:::i;:::-;14267:2;14262:3;14258:12;14251:19;;14038:238;;;:::o;14282:366::-;14424:3;14445:67;14509:2;14504:3;14445:67;:::i;:::-;14438:74;;14521:93;14610:3;14521:93;:::i;:::-;14639:2;14634:3;14630:12;14623:19;;14428:220;;;:::o;14654:366::-;14796:3;14817:67;14881:2;14876:3;14817:67;:::i;:::-;14810:74;;14893:93;14982:3;14893:93;:::i;:::-;15011:2;15006:3;15002:12;14995:19;;14800:220;;;:::o;15026:402::-;15186:3;15207:85;15289:2;15284:3;15207:85;:::i;:::-;15200:92;;15301:93;15390:3;15301:93;:::i;:::-;15419:2;15414:3;15410:12;15403:19;;15190:238;;;:::o;15434:366::-;15576:3;15597:67;15661:2;15656:3;15597:67;:::i;:::-;15590:74;;15673:93;15762:3;15673:93;:::i;:::-;15791:2;15786:3;15782:12;15775:19;;15580:220;;;:::o;15806:402::-;15966:3;15987:85;16069:2;16064:3;15987:85;:::i;:::-;15980:92;;16081:93;16170:3;16081:93;:::i;:::-;16199:2;16194:3;16190:12;16183:19;;15970:238;;;:::o;16214:402::-;16374:3;16395:85;16477:2;16472:3;16395:85;:::i;:::-;16388:92;;16489:93;16578:3;16489:93;:::i;:::-;16607:2;16602:3;16598:12;16591:19;;16378:238;;;:::o;16622:402::-;16782:3;16803:85;16885:2;16880:3;16803:85;:::i;:::-;16796:92;;16897:93;16986:3;16897:93;:::i;:::-;17015:2;17010:3;17006:12;16999:19;;16786:238;;;:::o;17030:402::-;17190:3;17211:85;17293:2;17288:3;17211:85;:::i;:::-;17204:92;;17305:93;17394:3;17305:93;:::i;:::-;17423:2;17418:3;17414:12;17407:19;;17194:238;;;:::o;17438:402::-;17598:3;17619:85;17701:2;17696:3;17619:85;:::i;:::-;17612:92;;17713:93;17802:3;17713:93;:::i;:::-;17831:2;17826:3;17822:12;17815:19;;17602:238;;;:::o;17846:400::-;18006:3;18027:84;18109:1;18104:3;18027:84;:::i;:::-;18020:91;;18120:93;18209:3;18120:93;:::i;:::-;18238:1;18233:3;18229:11;18222:18;;18010:236;;;:::o;18252:366::-;18394:3;18415:67;18479:2;18474:3;18415:67;:::i;:::-;18408:74;;18491:93;18580:3;18491:93;:::i;:::-;18609:2;18604:3;18600:12;18593:19;;18398:220;;;:::o;18624:366::-;18766:3;18787:67;18851:2;18846:3;18787:67;:::i;:::-;18780:74;;18863:93;18952:3;18863:93;:::i;:::-;18981:2;18976:3;18972:12;18965:19;;18770:220;;;:::o;18996:366::-;19138:3;19159:67;19223:2;19218:3;19159:67;:::i;:::-;19152:74;;19235:93;19324:3;19235:93;:::i;:::-;19353:2;19348:3;19344:12;19337:19;;19142:220;;;:::o;19368:402::-;19528:3;19549:85;19631:2;19626:3;19549:85;:::i;:::-;19542:92;;19643:93;19732:3;19643:93;:::i;:::-;19761:2;19756:3;19752:12;19745:19;;19532:238;;;:::o;19776:402::-;19936:3;19957:85;20039:2;20034:3;19957:85;:::i;:::-;19950:92;;20051:93;20140:3;20051:93;:::i;:::-;20169:2;20164:3;20160:12;20153:19;;19940:238;;;:::o;20184:366::-;20326:3;20347:67;20411:2;20406:3;20347:67;:::i;:::-;20340:74;;20423:93;20512:3;20423:93;:::i;:::-;20541:2;20536:3;20532:12;20525:19;;20330:220;;;:::o;20556:400::-;20716:3;20737:84;20819:1;20814:3;20737:84;:::i;:::-;20730:91;;20830:93;20919:3;20830:93;:::i;:::-;20948:1;20943:3;20939:11;20932:18;;20720:236;;;:::o;20962:402::-;21122:3;21143:85;21225:2;21220:3;21143:85;:::i;:::-;21136:92;;21237:93;21326:3;21237:93;:::i;:::-;21355:2;21350:3;21346:12;21339:19;;21126:238;;;:::o;21370:366::-;21512:3;21533:67;21597:2;21592:3;21533:67;:::i;:::-;21526:74;;21609:93;21698:3;21609:93;:::i;:::-;21727:2;21722:3;21718:12;21711:19;;21516:220;;;:::o;21742:402::-;21902:3;21923:85;22005:2;22000:3;21923:85;:::i;:::-;21916:92;;22017:93;22106:3;22017:93;:::i;:::-;22135:2;22130:3;22126:12;22119:19;;21906:238;;;:::o;22150:404::-;22310:3;22331:86;22413:3;22408;22331:86;:::i;:::-;22324:93;;22426;22515:3;22426:93;:::i;:::-;22544:3;22539;22535:13;22528:20;;22314:240;;;:::o;22560:402::-;22720:3;22741:85;22823:2;22818:3;22741:85;:::i;:::-;22734:92;;22835:93;22924:3;22835:93;:::i;:::-;22953:2;22948:3;22944:12;22937:19;;22724:238;;;:::o;22968:402::-;23128:3;23149:85;23231:2;23226:3;23149:85;:::i;:::-;23142:92;;23243:93;23332:3;23243:93;:::i;:::-;23361:2;23356:3;23352:12;23345:19;;23132:238;;;:::o;23376:366::-;23518:3;23539:67;23603:2;23598:3;23539:67;:::i;:::-;23532:74;;23615:93;23704:3;23615:93;:::i;:::-;23733:2;23728:3;23724:12;23717:19;;23522:220;;;:::o;23748:402::-;23908:3;23929:85;24011:2;24006:3;23929:85;:::i;:::-;23922:92;;24023:93;24112:3;24023:93;:::i;:::-;24141:2;24136:3;24132:12;24125:19;;23912:238;;;:::o;24156:402::-;24316:3;24337:85;24419:2;24414:3;24337:85;:::i;:::-;24330:92;;24431:93;24520:3;24431:93;:::i;:::-;24549:2;24544:3;24540:12;24533:19;;24320:238;;;:::o;24564:402::-;24724:3;24745:85;24827:2;24822:3;24745:85;:::i;:::-;24738:92;;24839:93;24928:3;24839:93;:::i;:::-;24957:2;24952:3;24948:12;24941:19;;24728:238;;;:::o;24972:404::-;25132:3;25153:86;25235:3;25230;25153:86;:::i;:::-;25146:93;;25248;25337:3;25248:93;:::i;:::-;25366:3;25361;25357:13;25350:20;;25136:240;;;:::o;25382:402::-;25542:3;25563:85;25645:2;25640:3;25563:85;:::i;:::-;25556:92;;25657:93;25746:3;25657:93;:::i;:::-;25775:2;25770:3;25766:12;25759:19;;25546:238;;;:::o;25790:402::-;25950:3;25971:85;26053:2;26048:3;25971:85;:::i;:::-;25964:92;;26065:93;26154:3;26065:93;:::i;:::-;26183:2;26178:3;26174:12;26167:19;;25954:238;;;:::o;26198:366::-;26340:3;26361:67;26425:2;26420:3;26361:67;:::i;:::-;26354:74;;26437:93;26526:3;26437:93;:::i;:::-;26555:2;26550:3;26546:12;26539:19;;26344:220;;;:::o;26570:402::-;26730:3;26751:85;26833:2;26828:3;26751:85;:::i;:::-;26744:92;;26845:93;26934:3;26845:93;:::i;:::-;26963:2;26958:3;26954:12;26947:19;;26734:238;;;:::o;26978:366::-;27120:3;27141:67;27205:2;27200:3;27141:67;:::i;:::-;27134:74;;27217:93;27306:3;27217:93;:::i;:::-;27335:2;27330:3;27326:12;27319:19;;27124:220;;;:::o;27350:402::-;27510:3;27531:85;27613:2;27608:3;27531:85;:::i;:::-;27524:92;;27625:93;27714:3;27625:93;:::i;:::-;27743:2;27738:3;27734:12;27727:19;;27514:238;;;:::o;27758:402::-;27918:3;27939:85;28021:2;28016:3;27939:85;:::i;:::-;27932:92;;28033:93;28122:3;28033:93;:::i;:::-;28151:2;28146:3;28142:12;28135:19;;27922:238;;;:::o;28166:402::-;28326:3;28347:85;28429:2;28424:3;28347:85;:::i;:::-;28340:92;;28441:93;28530:3;28441:93;:::i;:::-;28559:2;28554:3;28550:12;28543:19;;28330:238;;;:::o;28574:404::-;28734:3;28755:86;28837:3;28832;28755:86;:::i;:::-;28748:93;;28850;28939:3;28850:93;:::i;:::-;28968:3;28963;28959:13;28952:20;;28738:240;;;:::o;28984:402::-;29144:3;29165:85;29247:2;29242:3;29165:85;:::i;:::-;29158:92;;29259:93;29348:3;29259:93;:::i;:::-;29377:2;29372:3;29368:12;29361:19;;29148:238;;;:::o;29392:402::-;29552:3;29573:85;29655:2;29650:3;29573:85;:::i;:::-;29566:92;;29667:93;29756:3;29667:93;:::i;:::-;29785:2;29780:3;29776:12;29769:19;;29556:238;;;:::o;29800:400::-;29960:3;29981:84;30063:1;30058:3;29981:84;:::i;:::-;29974:91;;30074:93;30163:3;30074:93;:::i;:::-;30192:1;30187:3;30183:11;30176:18;;29964:236;;;:::o;30206:118::-;30293:24;30311:5;30293:24;:::i;:::-;30288:3;30281:37;30271:53;;:::o;30330:157::-;30435:45;30455:24;30473:5;30455:24;:::i;:::-;30435:45;:::i;:::-;30430:3;30423:58;30413:74;;:::o;30493:112::-;30576:22;30592:5;30576:22;:::i;:::-;30571:3;30564:35;30554:51;;:::o;30611:1659::-;31243:3;31265:148;31409:3;31265:148;:::i;:::-;31258:155;;31430:95;31521:3;31512:6;31430:95;:::i;:::-;31423:102;;31542:148;31686:3;31542:148;:::i;:::-;31535:155;;31707:95;31798:3;31789:6;31707:95;:::i;:::-;31700:102;;31819:148;31963:3;31819:148;:::i;:::-;31812:155;;31984:95;32075:3;32066:6;31984:95;:::i;:::-;31977:102;;32096:148;32240:3;32096:148;:::i;:::-;32089:155;;32261:3;32254:10;;31247:1023;;;;;;:::o;32276:1233::-;32759:3;32781:148;32925:3;32781:148;:::i;:::-;32774:155;;32946:95;33037:3;33028:6;32946:95;:::i;:::-;32939:102;;33058:148;33202:3;33058:148;:::i;:::-;33051:155;;33223:95;33314:3;33305:6;33223:95;:::i;:::-;33216:102;;33335:148;33479:3;33335:148;:::i;:::-;33328:155;;33500:3;33493:10;;32763:746;;;;;:::o;33515:807::-;33849:3;33871:148;34015:3;33871:148;:::i;:::-;33864:155;;34036:95;34127:3;34118:6;34036:95;:::i;:::-;34029:102;;34148:148;34292:3;34148:148;:::i;:::-;34141:155;;34313:3;34306:10;;33853:469;;;;:::o;34328:522::-;34541:3;34563:148;34707:3;34563:148;:::i;:::-;34556:155;;34721:75;34792:3;34783:6;34721:75;:::i;:::-;34821:2;34816:3;34812:12;34805:19;;34841:3;34834:10;;34545:305;;;;:::o;34856:807::-;35190:3;35212:148;35356:3;35212:148;:::i;:::-;35205:155;;35377:95;35468:3;35459:6;35377:95;:::i;:::-;35370:102;;35489:148;35633:3;35489:148;:::i;:::-;35482:155;;35654:3;35647:10;;35194:469;;;;:::o;35669:807::-;36003:3;36025:148;36169:3;36025:148;:::i;:::-;36018:155;;36190:95;36281:3;36272:6;36190:95;:::i;:::-;36183:102;;36302:148;36446:3;36302:148;:::i;:::-;36295:155;;36467:3;36460:10;;36007:469;;;;:::o;36482:2297::-;37369:3;37391:148;37535:3;37391:148;:::i;:::-;37384:155;;37556:148;37700:3;37556:148;:::i;:::-;37549:155;;37721:95;37812:3;37803:6;37721:95;:::i;:::-;37714:102;;37833:148;37977:3;37833:148;:::i;:::-;37826:155;;37998:95;38089:3;38080:6;37998:95;:::i;:::-;37991:102;;38110:148;38254:3;38110:148;:::i;:::-;38103:155;;38275:148;38419:3;38275:148;:::i;:::-;38268:155;;38440:148;38584:3;38440:148;:::i;:::-;38433:155;;38605:148;38749:3;38605:148;:::i;:::-;38598:155;;38770:3;38763:10;;37373:1406;;;;;:::o;38785:7625::-;41568:3;41590:148;41734:3;41590:148;:::i;:::-;41583:155;;41755:148;41899:3;41755:148;:::i;:::-;41748:155;;41920:95;42011:3;42002:6;41920:95;:::i;:::-;41913:102;;42032:148;42176:3;42032:148;:::i;:::-;42025:155;;42197:148;42341:3;42197:148;:::i;:::-;42190:155;;42362:148;42506:3;42362:148;:::i;:::-;42355:155;;42527:95;42618:3;42609:6;42527:95;:::i;:::-;42520:102;;42639:148;42783:3;42639:148;:::i;:::-;42632:155;;42804:95;42895:3;42886:6;42804:95;:::i;:::-;42797:102;;42916:148;43060:3;42916:148;:::i;:::-;42909:155;;43081:95;43172:3;43163:6;43081:95;:::i;:::-;43074:102;;43193:95;43284:3;43275:6;43193:95;:::i;:::-;43186:102;;43305:148;43449:3;43305:148;:::i;:::-;43298:155;;43470:148;43614:3;43470:148;:::i;:::-;43463:155;;43635:148;43779:3;43635:148;:::i;:::-;43628:155;;43800:95;43891:3;43882:6;43800:95;:::i;:::-;43793:102;;43912:148;44056:3;43912:148;:::i;:::-;43905:155;;44077:95;44168:3;44159:6;44077:95;:::i;:::-;44070:102;;44189:148;44333:3;44189:148;:::i;:::-;44182:155;;44354:148;44498:3;44354:148;:::i;:::-;44347:155;;44519:95;44610:3;44601:6;44519:95;:::i;:::-;44512:102;;44631:148;44775:3;44631:148;:::i;:::-;44624:155;;44796:148;44940:3;44796:148;:::i;:::-;44789:155;;44961:148;45105:3;44961:148;:::i;:::-;44954:155;;45126:95;45217:3;45208:6;45126:95;:::i;:::-;45119:102;;45238:148;45382:3;45238:148;:::i;:::-;45231:155;;45403:95;45494:3;45485:6;45403:95;:::i;:::-;45396:102;;45515:148;45659:3;45515:148;:::i;:::-;45508:155;;45680:96;45772:3;45762:7;45680:96;:::i;:::-;45673:103;;45793:148;45937:3;45793:148;:::i;:::-;45786:155;;45958:96;46050:3;46040:7;45958:96;:::i;:::-;45951:103;;46071:148;46215:3;46071:148;:::i;:::-;46064:155;;46236:148;46380:3;46236:148;:::i;:::-;46229:155;;46401:3;46394:10;;41572:4838;;;;;;;;;;;;;;;:::o;46416:2191::-;47250:3;47272:148;47416:3;47272:148;:::i;:::-;47265:155;;47437:95;47528:3;47519:6;47437:95;:::i;:::-;47430:102;;47549:148;47693:3;47549:148;:::i;:::-;47542:155;;47714:148;47858:3;47714:148;:::i;:::-;47707:155;;47879:95;47970:3;47961:6;47879:95;:::i;:::-;47872:102;;47991:148;48135:3;47991:148;:::i;:::-;47984:155;;48156:148;48300:3;48156:148;:::i;:::-;48149:155;;48321:95;48412:3;48403:6;48321:95;:::i;:::-;48314:102;;48433:148;48577:3;48433:148;:::i;:::-;48426:155;;48598:3;48591:10;;47254:1353;;;;;;:::o;48613:256::-;48725:3;48740:75;48811:3;48802:6;48740:75;:::i;:::-;48840:2;48835:3;48831:12;48824:19;;48860:3;48853:10;;48729:140;;;;:::o;48875:222::-;48968:4;49006:2;48995:9;48991:18;48983:26;;49019:71;49087:1;49076:9;49072:17;49063:6;49019:71;:::i;:::-;48973:124;;;;:::o;49103:640::-;49298:4;49336:3;49325:9;49321:19;49313:27;;49350:71;49418:1;49407:9;49403:17;49394:6;49350:71;:::i;:::-;49431:72;49499:2;49488:9;49484:18;49475:6;49431:72;:::i;:::-;49513;49581:2;49570:9;49566:18;49557:6;49513:72;:::i;:::-;49632:9;49626:4;49622:20;49617:2;49606:9;49602:18;49595:48;49660:76;49731:4;49722:6;49660:76;:::i;:::-;49652:84;;49303:440;;;;;;;:::o;49749:210::-;49836:4;49874:2;49863:9;49859:18;49851:26;;49887:65;49949:1;49938:9;49934:17;49925:6;49887:65;:::i;:::-;49841:118;;;;:::o;49965:545::-;50138:4;50176:3;50165:9;50161:19;50153:27;;50190:71;50258:1;50247:9;50243:17;50234:6;50190:71;:::i;:::-;50271:68;50335:2;50324:9;50320:18;50311:6;50271:68;:::i;:::-;50349:72;50417:2;50406:9;50402:18;50393:6;50349:72;:::i;:::-;50431;50499:2;50488:9;50484:18;50475:6;50431:72;:::i;:::-;50143:367;;;;;;;:::o;50516:313::-;50629:4;50667:2;50656:9;50652:18;50644:26;;50716:9;50710:4;50706:20;50702:1;50691:9;50687:17;50680:47;50744:78;50817:4;50808:6;50744:78;:::i;:::-;50736:86;;50634:195;;;;:::o;50835:419::-;51001:4;51039:2;51028:9;51024:18;51016:26;;51088:9;51082:4;51078:20;51074:1;51063:9;51059:17;51052:47;51116:131;51242:4;51116:131;:::i;:::-;51108:139;;51006:248;;;:::o;51260:419::-;51426:4;51464:2;51453:9;51449:18;51441:26;;51513:9;51507:4;51503:20;51499:1;51488:9;51484:17;51477:47;51541:131;51667:4;51541:131;:::i;:::-;51533:139;;51431:248;;;:::o;51685:419::-;51851:4;51889:2;51878:9;51874:18;51866:26;;51938:9;51932:4;51928:20;51924:1;51913:9;51909:17;51902:47;51966:131;52092:4;51966:131;:::i;:::-;51958:139;;51856:248;;;:::o;52110:419::-;52276:4;52314:2;52303:9;52299:18;52291:26;;52363:9;52357:4;52353:20;52349:1;52338:9;52334:17;52327:47;52391:131;52517:4;52391:131;:::i;:::-;52383:139;;52281:248;;;:::o;52535:419::-;52701:4;52739:2;52728:9;52724:18;52716:26;;52788:9;52782:4;52778:20;52774:1;52763:9;52759:17;52752:47;52816:131;52942:4;52816:131;:::i;:::-;52808:139;;52706:248;;;:::o;52960:419::-;53126:4;53164:2;53153:9;53149:18;53141:26;;53213:9;53207:4;53203:20;53199:1;53188:9;53184:17;53177:47;53241:131;53367:4;53241:131;:::i;:::-;53233:139;;53131:248;;;:::o;53385:419::-;53551:4;53589:2;53578:9;53574:18;53566:26;;53638:9;53632:4;53628:20;53624:1;53613:9;53609:17;53602:47;53666:131;53792:4;53666:131;:::i;:::-;53658:139;;53556:248;;;:::o;53810:419::-;53976:4;54014:2;54003:9;53999:18;53991:26;;54063:9;54057:4;54053:20;54049:1;54038:9;54034:17;54027:47;54091:131;54217:4;54091:131;:::i;:::-;54083:139;;53981:248;;;:::o;54235:419::-;54401:4;54439:2;54428:9;54424:18;54416:26;;54488:9;54482:4;54478:20;54474:1;54463:9;54459:17;54452:47;54516:131;54642:4;54516:131;:::i;:::-;54508:139;;54406:248;;;:::o;54660:419::-;54826:4;54864:2;54853:9;54849:18;54841:26;;54913:9;54907:4;54903:20;54899:1;54888:9;54884:17;54877:47;54941:131;55067:4;54941:131;:::i;:::-;54933:139;;54831:248;;;:::o;55085:419::-;55251:4;55289:2;55278:9;55274:18;55266:26;;55338:9;55332:4;55328:20;55324:1;55313:9;55309:17;55302:47;55366:131;55492:4;55366:131;:::i;:::-;55358:139;;55256:248;;;:::o;55510:419::-;55676:4;55714:2;55703:9;55699:18;55691:26;;55763:9;55757:4;55753:20;55749:1;55738:9;55734:17;55727:47;55791:131;55917:4;55791:131;:::i;:::-;55783:139;;55681:248;;;:::o;55935:419::-;56101:4;56139:2;56128:9;56124:18;56116:26;;56188:9;56182:4;56178:20;56174:1;56163:9;56159:17;56152:47;56216:131;56342:4;56216:131;:::i;:::-;56208:139;;56106:248;;;:::o;56360:222::-;56453:4;56491:2;56480:9;56476:18;56468:26;;56504:71;56572:1;56561:9;56557:17;56548:6;56504:71;:::i;:::-;56458:124;;;;:::o;56588:129::-;56622:6;56649:20;;:::i;:::-;56639:30;;56678:33;56706:4;56698:6;56678:33;:::i;:::-;56629:88;;;:::o;56723:75::-;56756:6;56789:2;56783:9;56773:19;;56763:35;:::o;56804:307::-;56865:4;56955:18;56947:6;56944:30;56941:2;;;56977:18;;:::i;:::-;56941:2;57015:29;57037:6;57015:29;:::i;:::-;57007:37;;57099:4;57093;57089:15;57081:23;;56870:241;;;:::o;57117:98::-;57168:6;57202:5;57196:12;57186:22;;57175:40;;;:::o;57221:99::-;57273:6;57307:5;57301:12;57291:22;;57280:40;;;:::o;57326:168::-;57409:11;57443:6;57438:3;57431:19;57483:4;57478:3;57474:14;57459:29;;57421:73;;;;:::o;57500:169::-;57584:11;57618:6;57613:3;57606:19;57658:4;57653:3;57649:14;57634:29;;57596:73;;;;:::o;57675:148::-;57777:11;57814:3;57799:18;;57789:34;;;;:::o;57829:305::-;57869:3;57888:20;57906:1;57888:20;:::i;:::-;57883:25;;57922:20;57940:1;57922:20;:::i;:::-;57917:25;;58076:1;58008:66;58004:74;58001:1;57998:81;57995:2;;;58082:18;;:::i;:::-;57995:2;58126:1;58123;58119:9;58112:16;;57873:261;;;;:::o;58140:237::-;58178:3;58197:18;58213:1;58197:18;:::i;:::-;58192:23;;58229:18;58245:1;58229:18;:::i;:::-;58224:23;;58319:1;58313:4;58309:12;58306:1;58303:19;58300:2;;;58325:18;;:::i;:::-;58300:2;58369:1;58366;58362:9;58355:16;;58182:195;;;;:::o;58383:185::-;58423:1;58440:20;58458:1;58440:20;:::i;:::-;58435:25;;58474:20;58492:1;58474:20;:::i;:::-;58469:25;;58513:1;58503:2;;58518:18;;:::i;:::-;58503:2;58560:1;58557;58553:9;58548:14;;58425:143;;;;:::o;58574:348::-;58614:7;58637:20;58655:1;58637:20;:::i;:::-;58632:25;;58671:20;58689:1;58671:20;:::i;:::-;58666:25;;58859:1;58791:66;58787:74;58784:1;58781:81;58776:1;58769:9;58762:17;58758:105;58755:2;;;58866:18;;:::i;:::-;58755:2;58914:1;58911;58907:9;58896:20;;58622:300;;;;:::o;58928:191::-;58968:4;58988:20;59006:1;58988:20;:::i;:::-;58983:25;;59022:20;59040:1;59022:20;:::i;:::-;59017:25;;59061:1;59058;59055:8;59052:2;;;59066:18;;:::i;:::-;59052:2;59111:1;59108;59104:9;59096:17;;58973:146;;;;:::o;59125:185::-;59163:4;59183:18;59199:1;59183:18;:::i;:::-;59178:23;;59215:18;59231:1;59215:18;:::i;:::-;59210:23;;59252:1;59249;59246:8;59243:2;;;59257:18;;:::i;:::-;59243:2;59302:1;59299;59295:9;59287:17;;59168:142;;;;:::o;59316:96::-;59353:7;59382:24;59400:5;59382:24;:::i;:::-;59371:35;;59361:51;;;:::o;59418:90::-;59452:7;59495:5;59488:13;59481:21;59470:32;;59460:48;;;:::o;59514:77::-;59551:7;59580:5;59569:16;;59559:32;;;:::o;59597:149::-;59633:7;59673:66;59666:5;59662:78;59651:89;;59641:105;;;:::o;59752:126::-;59789:7;59829:42;59822:5;59818:54;59807:65;;59797:81;;;:::o;59884:77::-;59921:7;59950:5;59939:16;;59929:32;;;:::o;59967:86::-;60002:7;60042:4;60035:5;60031:16;60020:27;;60010:43;;;:::o;60059:154::-;60143:6;60138:3;60133;60120:30;60205:1;60196:6;60191:3;60187:16;60180:27;60110:103;;;:::o;60219:307::-;60287:1;60297:113;60311:6;60308:1;60305:13;60297:113;;;60396:1;60391:3;60387:11;60381:18;60377:1;60372:3;60368:11;60361:39;60333:2;60330:1;60326:10;60321:15;;60297:113;;;60428:6;60425:1;60422:13;60419:2;;;60508:1;60499:6;60494:3;60490:16;60483:27;60419:2;60268:258;;;;:::o;60532:171::-;60571:3;60594:24;60612:5;60594:24;:::i;:::-;60585:33;;60640:4;60633:5;60630:15;60627:2;;;60648:18;;:::i;:::-;60627:2;60695:1;60688:5;60684:13;60677:20;;60575:128;;;:::o;60709:320::-;60753:6;60790:1;60784:4;60780:12;60770:22;;60837:1;60831:4;60827:12;60858:18;60848:2;;60914:4;60906:6;60902:17;60892:27;;60848:2;60976;60968:6;60965:14;60945:18;60942:38;60939:2;;;60995:18;;:::i;:::-;60939:2;60760:269;;;;:::o;61035:281::-;61118:27;61140:4;61118:27;:::i;:::-;61110:6;61106:40;61248:6;61236:10;61233:22;61212:18;61200:10;61197:34;61194:62;61191:2;;;61259:18;;:::i;:::-;61191:2;61299:10;61295:2;61288:22;61078:238;;;:::o;61322:233::-;61361:3;61384:24;61402:5;61384:24;:::i;:::-;61375:33;;61430:66;61423:5;61420:77;61417:2;;;61500:18;;:::i;:::-;61417:2;61547:1;61540:5;61536:13;61529:20;;61365:190;;;:::o;61561:79::-;61600:7;61629:5;61618:16;;61608:32;;;:::o;61646:79::-;61685:7;61714:5;61703:16;;61693:32;;;:::o;61731:176::-;61763:1;61780:20;61798:1;61780:20;:::i;:::-;61775:25;;61814:20;61832:1;61814:20;:::i;:::-;61809:25;;61853:1;61843:2;;61858:18;;:::i;:::-;61843:2;61899:1;61896;61892:9;61887:14;;61765:142;;;;:::o;61913:180::-;61961:77;61958:1;61951:88;62058:4;62055:1;62048:15;62082:4;62079:1;62072:15;62099:180;62147:77;62144:1;62137:88;62244:4;62241:1;62234:15;62268:4;62265:1;62258:15;62285:180;62333:77;62330:1;62323:88;62430:4;62427:1;62420:15;62454:4;62451:1;62444:15;62471:180;62519:77;62516:1;62509:88;62616:4;62613:1;62606:15;62640:4;62637:1;62630:15;62657:180;62705:77;62702:1;62695:88;62802:4;62799:1;62792:15;62826:4;62823:1;62816:15;62843:117;62952:1;62949;62942:12;62966:117;63075:1;63072;63065:12;63089:117;63198:1;63195;63188:12;63212:117;63321:1;63318;63311:12;63335:102;63376:6;63427:2;63423:7;63418:2;63411:5;63407:14;63403:28;63393:38;;63383:54;;;:::o;63443:234::-;63583:34;63579:1;63571:6;63567:14;63560:58;63652:17;63647:2;63639:6;63635:15;63628:42;63549:128;:::o;63683:151::-;63823:3;63819:1;63811:6;63807:14;63800:27;63789:45;:::o;63840:171::-;63980:23;63976:1;63968:6;63964:14;63957:47;63946:65;:::o;64017:214::-;64157:66;64153:1;64145:6;64141:14;64134:90;64123:108;:::o;64237:237::-;64377:34;64373:1;64365:6;64361:14;64354:58;64446:20;64441:2;64433:6;64429:15;64422:45;64343:131;:::o;64480:214::-;64620:66;64616:1;64608:6;64604:14;64597:90;64586:108;:::o;64700:359::-;64840:34;64836:1;64828:6;64824:14;64817:58;64909:34;64904:2;64896:6;64892:15;64885:59;64978:34;64973:2;64965:6;64961:15;64954:59;65047:4;65042:2;65034:6;65030:15;65023:29;64806:253;:::o;65065:254::-;65205:66;65201:1;65193:6;65189:14;65182:90;65306:5;65301:2;65293:6;65289:15;65282:30;65171:148;:::o;65325:178::-;65465:30;65461:1;65453:6;65449:14;65442:54;65431:72;:::o;65509:159::-;65649:11;65645:1;65637:6;65633:14;65626:35;65615:53;:::o;65674:229::-;65814:34;65810:1;65802:6;65798:14;65791:58;65883:12;65878:2;65870:6;65866:15;65859:37;65780:123;:::o;65909:416::-;66049:66;66045:1;66037:6;66033:14;66026:90;66150:66;66145:2;66137:6;66133:15;66126:91;66251:66;66246:2;66238:6;66234:15;66227:91;66015:310;:::o;66331:316::-;66471:34;66467:1;66459:6;66455:14;66448:58;66540:34;66535:2;66527:6;66523:15;66516:59;66609:30;66604:2;66596:6;66592:15;66585:55;66437:210;:::o;66653:289::-;66793:34;66789:1;66781:6;66777:14;66770:58;66862:34;66857:2;66849:6;66845:15;66838:59;66931:3;66926:2;66918:6;66914:15;66907:28;66759:183;:::o;66948:223::-;67088:34;67084:1;67076:6;67072:14;67065:58;67157:6;67152:2;67144:6;67140:15;67133:31;67054:117;:::o;67177:175::-;67317:27;67313:1;67305:6;67301:14;67294:51;67283:69;:::o;67358:172::-;67498:24;67494:1;67486:6;67482:14;67475:48;67464:66;:::o;67536:231::-;67676:34;67672:1;67664:6;67660:14;67653:58;67745:14;67740:2;67732:6;67728:15;67721:39;67642:125;:::o;67773:237::-;67913:34;67909:1;67901:6;67897:14;67890:58;67982:20;67977:2;67969:6;67965:15;67958:45;67879:131;:::o;68016:384::-;68156:66;68152:1;68144:6;68140:14;68133:90;68257:34;68252:2;68244:6;68240:15;68233:59;68326:66;68321:2;68313:6;68309:15;68302:91;68122:278;:::o;68406:237::-;68546:34;68542:1;68534:6;68530:14;68523:58;68615:20;68610:2;68602:6;68598:15;68591:45;68512:131;:::o;68649:314::-;68789:34;68785:1;68777:6;68773:14;68766:58;68858:34;68853:2;68845:6;68841:15;68834:59;68927:28;68922:2;68914:6;68910:15;68903:53;68755:208;:::o;68969:224::-;69109:34;69105:1;69097:6;69093:14;69086:58;69178:7;69173:2;69165:6;69161:15;69154:32;69075:118;:::o;69199:153::-;69339:5;69335:1;69327:6;69323:14;69316:29;69305:47;:::o;69358:243::-;69498:34;69494:1;69486:6;69482:14;69475:58;69567:26;69562:2;69554:6;69550:15;69543:51;69464:137;:::o;69607:229::-;69747:34;69743:1;69735:6;69731:14;69724:58;69816:12;69811:2;69803:6;69799:15;69792:37;69713:123;:::o;69842:228::-;69982:34;69978:1;69970:6;69966:14;69959:58;70051:11;70046:2;70038:6;70034:15;70027:36;69948:122;:::o;70076:176::-;70216:28;70212:1;70204:6;70200:14;70193:52;70182:70;:::o;70258:309::-;70398:34;70394:1;70386:6;70382:14;70375:58;70467:34;70462:2;70454:6;70450:15;70443:59;70536:23;70531:2;70523:6;70519:15;70512:48;70364:203;:::o;70573:182::-;70713:34;70709:1;70701:6;70697:14;70690:58;70679:76;:::o;70761:143::-;70897:3;70893:1;70885:6;70881:14;70874:27;70867:37;:::o;70906:303::-;71042:66;71038:1;71030:6;71026:14;71019:90;71139:66;71134:2;71126:6;71122:15;71115:91;71012:197;:::o;71211:219::-;71347:34;71343:1;71335:6;71331:14;71324:58;71412:14;71407:2;71399:6;71395:15;71388:39;71317:113;:::o;71432:283::-;71568:34;71564:1;71556:6;71552:14;71545:58;71633:34;71628:2;71620:6;71616:15;71609:59;71698:13;71693:2;71685:6;71681:15;71674:38;71538:177;:::o;71717:357::-;71853:34;71849:1;71841:6;71837:14;71830:58;71918:34;71913:2;71905:6;71901:15;71894:59;71983:34;71978:2;71970:6;71966:15;71959:59;72048:22;72043:2;72035:6;72031:15;72024:47;71823:251;:::o;72076:281::-;72212:34;72208:1;72200:6;72196:14;72189:58;72277:34;72272:2;72264:6;72260:15;72253:59;72346:3;72341:2;72333:6;72329:15;72322:28;72182:175;:::o;72363:230::-;72503:34;72499:1;72491:6;72487:14;72480:58;72572:13;72567:2;72559:6;72555:15;72548:38;72469:124;:::o;72599:228::-;72739:34;72735:1;72727:6;72723:14;72716:58;72808:11;72803:2;72795:6;72791:15;72784:36;72705:122;:::o;72833:239::-;72973:34;72969:1;72961:6;72957:14;72950:58;73042:22;73037:2;73029:6;73025:15;73018:47;72939:133;:::o;73078:165::-;73218:17;73214:1;73206:6;73202:14;73195:41;73184:59;:::o;73249:250::-;73389:34;73385:1;73377:6;73373:14;73366:58;73458:33;73453:2;73445:6;73441:15;73434:58;73355:144;:::o;73505:371::-;73645:34;73641:1;73633:6;73629:14;73622:58;73714:34;73709:2;73701:6;73697:15;73690:59;73783:34;73778:2;73770:6;73766:15;73759:59;73852:16;73847:2;73839:6;73835:15;73828:41;73611:265;:::o;73882:176::-;74022:28;74018:1;74010:6;74006:14;73999:52;73988:70;:::o;74064:314::-;74204:34;74200:1;74192:6;74188:14;74181:58;74273:34;74268:2;74260:6;74256:15;74249:59;74342:28;74337:2;74329:6;74325:15;74318:53;74170:208;:::o;74384:220::-;74524:34;74520:1;74512:6;74508:14;74501:58;74593:3;74588:2;74580:6;74576:15;74569:28;74490:114;:::o;74610:225::-;74750:34;74746:1;74738:6;74734:14;74727:58;74819:8;74814:2;74806:6;74802:15;74795:33;74716:119;:::o;74841:236::-;74981:34;74977:1;74969:6;74965:14;74958:58;75050:19;75045:2;75037:6;75033:15;75026:44;74947:130;:::o;75083:175::-;75223:27;75219:1;75211:6;75207:14;75200:51;75189:69;:::o;75264:167::-;75404:19;75400:1;75392:6;75388:14;75381:43;75370:61;:::o;75437:294::-;75577:34;75573:1;75565:6;75561:14;75554:58;75646:34;75641:2;75633:6;75629:15;75622:59;75715:8;75710:2;75702:6;75698:15;75691:33;75543:188;:::o;75737:370::-;75877:34;75873:1;75865:6;75861:14;75854:58;75946:34;75941:2;75933:6;75929:15;75922:59;76015:34;76010:2;76002:6;75998:15;75991:59;76084:11;76079:2;76071:6;76067:15;76060:36;75843:264;:::o;76117:171::-;76261:15;76257:1;76249:6;76245:14;76238:39;76223:65;:::o;76298:379::-;76442:34;76438:1;76430:6;76426:14;76419:58;76515:34;76510:2;76502:6;76498:15;76491:59;76588:34;76583:2;76575:6;76571:15;76564:59;76661:4;76656:2;76648:6;76644:15;76637:29;76404:273;:::o;76687:153::-;76827:5;76823:1;76815:6;76811:14;76804:29;76793:47;:::o;76846:122::-;76919:24;76937:5;76919:24;:::i;:::-;76912:5;76909:35;76899:2;;76958:1;76955;76948:12;76899:2;76889:79;:::o;76974:116::-;77044:21;77059:5;77044:21;:::i;:::-;77037:5;77034:32;77024:2;;77080:1;77077;77070:12;77024:2;77014:76;:::o;77096:122::-;77169:24;77187:5;77169:24;:::i;:::-;77162:5;77159:35;77149:2;;77208:1;77205;77198:12;77149:2;77139:79;:::o;77224:120::-;77296:23;77313:5;77296:23;:::i;:::-;77289:5;77286:34;77276:2;;77334:1;77331;77324:12;77276:2;77266:78;:::o;77350:122::-;77423:24;77441:5;77423:24;:::i;:::-;77416:5;77413:35;77403:2;;77462:1;77459;77452:12;77403:2;77393:79;:::o

Swarm Source

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