ETH Price: $3,315.44 (-2.81%)
Gas: 12 Gwei

Token

Cats (MICE)
 

Overview

Max Total Supply

10,000 MICE

Holders

504

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
agogojoe.eth
Balance
1 MICE
0x13546cdb4fea70936acacd8e8a07b2117af765ca
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:
Cats

Compiler Version
v0.8.0+commit.c7dfd78e

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

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

// 
/**
 * @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;
}

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

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

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

// 
/**
 * @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;
    }
}

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

// 
/**
 * @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;
    }
}

// 
/**
 * @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 {}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// 
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// 
interface IMiece is IERC20 {
    function burnFrom(address account, uint256 amount) external;
}

// 
library CatsLibrary {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return "";

        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(input, 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        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);
    }

    function parseInt(string memory _a)
        internal
        pure
        returns (uint8 _parsedInt)
    {
        bytes memory bresult = bytes(_a);
        uint8 mint = 0;
        for (uint8 i = 0; i < bresult.length; i++) {
            if (
                (uint8(uint8(bresult[i])) >= 48) &&
                (uint8(uint8(bresult[i])) <= 57)
            ) {
                mint *= 10;
                mint += uint8(bresult[i]) - 48;
            }
        }
        return mint;
    }

    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }

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

// 
contract Cats is ERC721Enumerable {

    using CatsLibrary for uint8;

    struct Trait {
        string traitName;
        string traitType;
        string pixels;
        uint256 pixelCount;
    }
    
    // Price
    uint256 public price = 50000000000000000; // 0.05 eth

    //Mappings
    mapping(uint256 => Trait[]) public traitTypes;
    mapping(string => bool) hashToMinted;
    mapping(uint256 => string) internal tokenIdToHash;

    //uint256s
    uint256 MAX_SUPPLY = 10000;
    uint256 MINTS_PER_TIER = 2000;
    uint256 SEED_NONCE = 0;

    //string arrays
    string[] LETTERS = [
        "a",
        "b",
        "c",
        "d",
        "e",
        "f",
        "g",
        "h",
        "i",
        "j",
        "k",
        "l",
        "m",
        "n",
        "o",
        "p",
        "q",
        "r",
        "s",
        "t",
        "u",
        "v",
        "w",
        "x",
        "y",
        "z"
    ];

    //uint arrays
    uint16[][8] TIERS;

    //address
    address mieceAddress;
    address _owner;

    constructor() ERC721("Cats", "MICE") {
        _owner = msg.sender;

        //Declare all the rarity tiers

        //Hat
        TIERS[0] = [50, 150, 200, 300, 400, 500, 600, 900, 1200, 5700];
        //whiskers
        TIERS[1] = [200, 800, 1000, 3000, 5000];
        //Neck
        TIERS[2] = [300, 800, 900, 1000, 7000];
        //Earrings
        TIERS[3] = [50, 200, 300, 300, 9150];
        //Eyes
        TIERS[4] = [50, 100, 400, 450, 500, 700, 1800, 2000, 2000, 2000];
        //Mouth
        TIERS[5] = [1428, 1428, 1428, 1429, 1429, 1429, 1429];
        //Nose
        TIERS[6] = [2000, 2000, 2000, 2000, 2000];
        //Character
        TIERS[7] = [20, 70, 721, 1000, 1155, 1200, 1300, 1434, 1541, 1559];
    }

    /*
  __  __ _     _   _             ___             _   _             
 |  \/  (_)_ _| |_(_)_ _  __ _  | __|  _ _ _  __| |_(_)___ _ _  ___
 | |\/| | | ' \  _| | ' \/ _` | | _| || | ' \/ _|  _| / _ \ ' \(_-<
 |_|  |_|_|_||_\__|_|_||_\__, | |_| \_,_|_||_\__|\__|_\___/_||_/__/
                         |___/                                     
   */

    /**
     * @dev Converts a digit from 0 - 10000 into its corresponding rarity based on the given rarity tier.
     * @param _randinput The input from 0 - 10000 to use for rarity gen.
     * @param _rarityTier The tier to use.
     */
    function rarityGen(uint256 _randinput, uint8 _rarityTier)
        internal
        view
        returns (string memory)
    {
        uint16 currentLowerBound = 0;
        for (uint8 i = 0; i < TIERS[_rarityTier].length; i++) {
            uint16 thisPercentage = TIERS[_rarityTier][i];
            if (
                _randinput >= currentLowerBound &&
                _randinput < currentLowerBound + thisPercentage
            ) return i.toString();
            currentLowerBound = currentLowerBound + thisPercentage;
        }

        revert();
    }

    /**
     * @dev Generates a 9 digit hash from a tokenId, address, and random number.
     * @param _t The token id to be used within the hash.
     * @param _a The address to be used within the hash.
     * @param _c The custom nonce to be used within the hash.
     */
    function hash(
        uint256 _t,
        address _a,
        uint256 _c
    ) internal returns (string memory) {
        require(_c < 10);

        // This will generate a 9 character string.
        //The last 8 digits are random, the first is 0, due to the mouse not being burned.
        string memory currentHash = "0";

        for (uint8 i = 0; i < 8; i++) {
            SEED_NONCE++;
            uint16 _randinput = uint16(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            block.timestamp,
                            block.difficulty,
                            _t,
                            _a,
                            _c,
                            SEED_NONCE
                        )
                    )
                ) % 10000
            );

            currentHash = string(
                abi.encodePacked(currentHash, rarityGen(_randinput, i))
            );
        }

        if (hashToMinted[currentHash]) return hash(_t, _a, _c + 1);

        return currentHash;
    }

    /**
     * @dev Returns the current miece cost of mint.
     */
    function currentMieceCost() public view returns (uint256) {
        uint256 _totalSupply = totalSupply();

        if (_totalSupply <= 2000) return 1000000000000000000;
        if (_totalSupply > 2000 && _totalSupply <= 4000)
            return 1000000000000000000;
        if (_totalSupply > 4000 && _totalSupply <= 6000)
            return 2000000000000000000;
        if (_totalSupply > 6000 && _totalSupply <= 8000)
            return 3000000000000000000;
        if (_totalSupply > 8000 && _totalSupply <= 10000)
            return 4000000000000000000;

        revert();
    }

    /**
     * @dev Mint internal, this is to avoid code duplication.
     */
    function mintInternal() internal {
        uint256 _totalSupply = totalSupply();
        require(_totalSupply < MAX_SUPPLY);
        require(!CatsLibrary.isContract(msg.sender));

        uint256 thisTokenId = _totalSupply;

        tokenIdToHash[thisTokenId] = hash(thisTokenId, msg.sender, 0);

        hashToMinted[tokenIdToHash[thisTokenId]] = true;

        _mint(msg.sender, thisTokenId);
    }
    

    /**
     * @dev Changes the price
     */
    function changePrice(uint256 _newPrice) public onlyOwner {
        price = _newPrice;
    }

    /**
     * @dev Mints new tokens.
     */
    function mintCats(uint256 _times) public payable {
        require((_times > 0 && _times <= 20) && (msg.value == _times * price) && (totalSupply() < MINTS_PER_TIER), "t");
        
        for(uint256 i=0; i< _times; i++){
             mintInternal();
        }
    }
    /**
     * @dev Mint for Miece
     */
    function mintCatWithToken() public {        
        //Burn this much miece
        IMiece(mieceAddress).burnFrom(msg.sender, currentMieceCost());
        return mintInternal();
    }

    /**
     * @dev Burns and mints new.
     * @param _tokenId The token to burn.
     */
    function burnForMint(uint256 _tokenId) public {
        require(ownerOf(_tokenId) == msg.sender);

        //Burn token
        _transfer(
            msg.sender,
            0x000000000000000000000000000000000000dEaD,
            _tokenId
        );

        mintInternal();
    }


    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;

        payable(msg.sender).transfer(balance);
    }   


    /*
 ____     ___   ____  ___        _____  __ __  ____     __ ______  ____  ___   ____   _____
|    \   /  _] /    ||   \      |     ||  |  ||    \   /  ]      ||    |/   \ |    \ / ___/
|  D  ) /  [_ |  o  ||    \     |   __||  |  ||  _  | /  /|      | |  ||     ||  _  (   \_ 
|    / |    _]|     ||  D  |    |  |_  |  |  ||  |  |/  / |_|  |_| |  ||  O  ||  |  |\__  |
|    \ |   [_ |  _  ||     |    |   _] |  :  ||  |  /   \_  |  |   |  ||     ||  |  |/  \ |
|  .  \|     ||  |  ||     |    |  |   |     ||  |  \     | |  |   |  ||     ||  |  |\    |
|__|\_||_____||__|__||_____|    |__|    \__,_||__|__|\____| |__|  |____|\___/ |__|__| \___|
                                                                                           
*/

    /**
     * @dev Helper function to reduce pixel size within contract
     */
    function letterToNumber(string memory _inputLetter)
        internal
        view
        returns (uint8)
    {
        for (uint8 i = 0; i < LETTERS.length; i++) {
            if (
                keccak256(abi.encodePacked((LETTERS[i]))) ==
                keccak256(abi.encodePacked((_inputLetter)))
            ) return (i + 1);
        }
        revert();
    }

    /**
     * @dev Hash to SVG function
     */
    function hashToSVG(string memory _hash)
        public
        view
        returns (string memory)
    {
        string memory svgString;
        bool[24][24] memory placedPixels;

        for (uint8 i = 0; i < 9; i++) { 
            uint8 thisTraitIndex = CatsLibrary.parseInt(
                CatsLibrary.substring(_hash, i, i + 1)
            );

            for (
                uint16 j = 0;
                j < traitTypes[i][thisTraitIndex].pixelCount; // <
                j++
            ) {
                string memory thisPixel = CatsLibrary.substring(
                    traitTypes[i][thisTraitIndex].pixels,
                    j * 4,
                    j * 4 + 4
                );

                uint8 x = letterToNumber(
                    CatsLibrary.substring(thisPixel, 0, 1)
                );
                uint8 y = letterToNumber(
                    CatsLibrary.substring(thisPixel, 1, 2)
                );

                if (placedPixels[x][y]) continue;

                svgString = string(
                    abi.encodePacked(
                        svgString,
                        "<rect class='c",
                        CatsLibrary.substring(thisPixel, 2, 4),
                        "' x='",
                        x.toString(),
                        "' y='",
                        y.toString(),
                        "'/>"
                    )
                );

                placedPixels[x][y] = true;
            }
        }

        svgString = string(
            abi.encodePacked(
                '<svg id="c" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 24 24"> ',
                svgString,
               // "<style>rect{width:1px;height:1px;} #mouse-svg{shape-rendering: crispedges;} .c00{fill:#000000}.c01{fill:#B1ADAC}.c02{fill:#D7D7D7}.c03{fill:#FFA6A6}.c04{fill:#FFD4D5}.c05{fill:#B9AD95}.c06{fill:#E2D6BE}.c07{fill:#7F625A}.c08{fill:#A58F82}.c09{fill:#4B1E0B}.c10{fill:#6D2C10}.c11{fill:#D8D8D8}.c12{fill:#F5F5F5}.c13{fill:#433D4B}.c14{fill:#8D949C}.c15{fill:#05FF00}.c16{fill:#01C700}.c17{fill:#0B8F08}.c18{fill:#421C13}.c19{fill:#6B392A}.c20{fill:#A35E40}.c21{fill:#DCBD91}.c22{fill:#777777}.c23{fill:#848484}.c24{fill:#ABABAB}.c25{fill:#BABABA}.c26{fill:#C7C7C7}.c27{fill:#EAEAEA}.c28{fill:#0C76AA}.c29{fill:#0E97DB}.c30{fill:#10A4EC}.c31{fill:#13B0FF}.c32{fill:#2EB9FE}.c33{fill:#54CCFF}.c34{fill:#50C0F2}.c35{fill:#54CCFF}.c36{fill:#72DAFF}.c37{fill:#B6EAFF}.c38{fill:#FFFFFF}.c39{fill:#954546}.c40{fill:#0B87F7}.c41{fill:#FF2626}.c42{fill:#180F02}.c43{fill:#2B2319}.c44{fill:#FBDD4B}.c45{fill:#F5B923}.c46{fill:#CC8A18}.c47{fill:#3C2203}.c48{fill:#53320B}.c49{fill:#7B501D}.c50{fill:#FFE646}.c51{fill:#FFD627}.c52{fill:#F5B700}.c53{fill:#242424}.c54{fill:#4A4A4A}.c55{fill:#676767}.c56{fill:#F08306}.c57{fill:#FCA30E}.c58{fill:#FEBC0E}.c59{fill:#FBEC1C}.c60{fill:#14242F}.c61{fill:#B06837}.c62{fill:#8F4B0E}.c63{fill:#D88227}.c64{fill:#B06837}</style></svg>"
                "<style>rect{width:1px;height:1px;}#c{shape-rendering: crispedges;}.c00{fill:#f6767b}.c01{fill:#ffffff}.c02{fill:#000000}.c03{fill:#c1008b}.c04{fill:#dc009e}.c05{fill:#ef00a9}.c06{fill:#ff0043}.c07{fill:#c74249}.c08{fill:#aa343a}.c09{fill:#363737}.c10{fill:#1c1c1c}.c11{fill:#2c2c2c}.c12{fill:#6a9cc5}.c13{fill:#9fd2fc}.c14{fill:#cd6100}.c15{fill:#2f2f2f}.c16{fill:#fd7500}.c17{fill:#f68d2f}.c18{fill:#474747}.c19{fill:#585858}.c20{fill:#242424}.c21{fill:#9c7d6a}.c22{fill:#3e3e3e}.c23{fill:#202020}.c24{fill:#b05514}.c25{fill:#733e39}.c26{fill:#f2d000}.c27{fill:#f3dd00}.c28{fill:#cccccd}.c29{fill:#dad4d2}.c30{fill:#ece3e0}.c31{fill:#00adc0}.c32{fill:#00b8cc}.c33{fill:#00c4db}.c34{fill:#4c3b2f}.c35{fill:#695038}.c36{fill:#b58152}.c37{fill:#008c9b}.c38{fill:#c5c5db}.c39{fill:#00d6ff}.c40{fill:#df3453}.c41{fill:#d4b500}.c42{fill:#523747}.c43{fill:#3f4043}.c44{fill:#5f5e5c}.c45{fill:#c69e94}.c46{fill:#a1958c}.c47{fill:#981870}.c48{fill:#cbba00}.c49{fill:#dfcc00}.c50{fill:#13a72e}.c51{fill:#0c8a24}</style></svg>"
            )
        );

        return svgString;
    }

    /**
     * @dev Hash to metadata function
     */
    function hashToMetadata(string memory _hash)
        public
        view
        returns (string memory)
    {
        string memory metadataString;

        for (uint8 i = 0; i < 9; i++) { //9
            uint8 thisTraitIndex = CatsLibrary.parseInt(
                CatsLibrary.substring(_hash, i, i + 1)
            );

            metadataString = string(
                abi.encodePacked(
                    metadataString,
                    '{"trait_type":"',
                    traitTypes[i][thisTraitIndex].traitType,
                    '","value":"',
                    traitTypes[i][thisTraitIndex].traitName,
                    '"}'
                )
            );

            if (i != 8)
                metadataString = string(abi.encodePacked(metadataString, ","));
        }

        return string(abi.encodePacked("[", metadataString, "]"));
    }

    /**
     * @dev Returns the SVG and metadata for a token Id
     * @param _tokenId The tokenId to return the SVG and metadata for.
     */
    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId));

        string memory tokenHash = _tokenIdToHash(_tokenId);

        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    CatsLibrary.encode(
                        bytes(
                            string(
                                abi.encodePacked(
                                    '{"name": "cmyKatz #',
                                    CatsLibrary.toString(_tokenId),
                                    '", "description": "cmyKatz is a collection of 10,000 unique cats. All the metadata and images stored 100% on-chain.", "image": "data:image/svg+xml;base64,',
                                    CatsLibrary.encode(
                                        bytes(hashToSVG(tokenHash))
                                    ),
                                    '","attributes":',
                                    hashToMetadata(tokenHash),
                                    "}"
                                )
                            )
                        )
                    )
                )
            );
    }

    /**
     * @dev Returns a hash for a given tokenId
     * @param _tokenId The tokenId to return the hash for.
     */
    function _tokenIdToHash(uint256 _tokenId)
        public
        view
        returns (string memory)
    {
        string memory tokenHash = tokenIdToHash[_tokenId];
        //If this is a burned token, override the previous hash
        if (ownerOf(_tokenId) == 0x000000000000000000000000000000000000dEaD) {
            tokenHash = string(
                abi.encodePacked(
                    "1",
                    CatsLibrary.substring(tokenHash, 1, 9)
                )
            );
        }

        return tokenHash;
    }

    /**
     * @dev Returns the wallet of a given wallet. Mainly for ease for frontend devs.
     * @param _wallet The wallet to get the tokens of.
     */
    function walletOfOwner(address _wallet)
        public
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_wallet);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_wallet, i);
        }
        return tokensId;
    }

    /*

  ___   __    __  ____     ___  ____       _____  __ __  ____     __ ______  ____  ___   ____   _____
 /   \ |  |__|  ||    \   /  _]|    \     |     ||  |  ||    \   /  ]      ||    |/   \ |    \ / ___/
|     ||  |  |  ||  _  | /  [_ |  D  )    |   __||  |  ||  _  | /  /|      | |  ||     ||  _  (   \_ 
|  O  ||  |  |  ||  |  ||    _]|    /     |  |_  |  |  ||  |  |/  / |_|  |_| |  ||  O  ||  |  |\__  |
|     ||  `  '  ||  |  ||   [_ |    \     |   _] |  :  ||  |  /   \_  |  |   |  ||     ||  |  |/  \ |
|     | \      / |  |  ||     ||  .  \    |  |   |     ||  |  \     | |  |   |  ||     ||  |  |\    |
 \___/   \_/\_/  |__|__||_____||__|\_|    |__|    \__,_||__|__|\____| |__|  |____|\___/ |__|__| \___|
                                                                                                     


    */

    /**
     * @dev Clears the traits.
     */
    // function clearTraits() public onlyOwner {
    //     for (uint256 i = 0; i < 9; i++) {
    //         delete traitTypes[i];
    //     }
    // }

    /**
     * @dev Add a trait type
     * @param _traitTypeIndex The trait type index
     * @param traits Array of traits to add
     */

    function addTraitType(uint256 _traitTypeIndex, Trait[] memory traits)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < traits.length; i++) {
            traitTypes[_traitTypeIndex].push(
                Trait(
                    traits[i].traitName,
                    traits[i].traitType,
                    traits[i].pixels,
                    traits[i].pixelCount
                )
            );
        }

        return;
    }

    /**
     * @dev Sets the miece ERC20 address
     * @param _mieceAddress The miece address
     */

    function setMieceAddress(address _mieceAddress) public onlyOwner {
        mieceAddress = _mieceAddress;
    }

    /**
     * @dev Transfers ownership
     * @param _newOwner The new owner
     */
    function transferOwnership(address _newOwner) public onlyOwner {
        _owner = _newOwner;
    }

    /**
     * @dev Modifier to only allow owner to call functions
     */
    modifier onlyOwner() {
        require(_owner == msg.sender);
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"uint256","name":"_tokenId","type":"uint256"}],"name":"_tokenIdToHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_traitTypeIndex","type":"uint256"},{"components":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","type":"uint256"}],"internalType":"struct Cats.Trait[]","name":"traits","type":"tuple[]"}],"name":"addTraitType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burnForMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentMieceCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"hashToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"hashToSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCatWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"mintCats","outputs":[],"stateMutability":"payable","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mieceAddress","type":"address"}],"name":"setMieceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitTypes","outputs":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266b1a2bc2ec50000600a55612710600e556107d0600f5560006010556040518061034001604052806040518060400160405280600181526020017f610000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f620000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f630000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f640000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f650000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f660000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f670000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f680000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f690000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6a0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6b0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6c0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6d0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6e0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6f0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f700000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f710000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f720000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f730000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f740000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f750000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f760000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f770000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f780000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f790000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f7a00000000000000000000000000000000000000000000000000000000000000815250815250601190601a6200063a92919062000c8d565b503480156200064857600080fd5b506040518060400160405280600481526020017f43617473000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d494345000000000000000000000000000000000000000000000000000000008152508160009080519060200190620006cd92919062000cf4565b508060019080519060200190620006e692919062000cf4565b50505033601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806101400160405280603261ffff168152602001609661ffff16815260200160c861ffff16815260200161012c61ffff16815260200161019061ffff1681526020016101f461ffff16815260200161025861ffff16815260200161038461ffff1681526020016104b061ffff16815260200161164461ffff168152506012600060088110620007e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190600a620007f692919062000d85565b506040518060a0016040528060c861ffff16815260200161032061ffff1681526020016103e861ffff168152602001610bb861ffff16815260200161138861ffff16815250601260016008811062000877577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b019060056200088892919062000e36565b506040518060a0016040528061012c61ffff16815260200161032061ffff16815260200161038461ffff1681526020016103e861ffff168152602001611b5861ffff1681525060126002600881106200090a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b019060056200091b92919062000e36565b506040518060a00160405280603261ffff16815260200160c861ffff16815260200161012c61ffff16815260200161012c61ffff1681526020016123be61ffff1681525060126003600881106200099b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01906005620009ac92919062000e36565b50604051806101400160405280603261ffff168152602001606461ffff16815260200161019061ffff1681526020016101c261ffff1681526020016101f461ffff1681526020016102bc61ffff16815260200161070861ffff1681526020016107d061ffff1681526020016107d061ffff1681526020016107d061ffff16815250601260046008811062000a69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190600a62000a7a92919062000d85565b506040518060e0016040528061059461ffff16815260200161059461ffff16815260200161059461ffff16815260200161059561ffff16815260200161059561ffff16815260200161059561ffff16815260200161059561ffff16815250601260056008811062000b14577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190600762000b2592919062000ee7565b506040518060a001604052806107d061ffff1681526020016107d061ffff1681526020016107d061ffff1681526020016107d061ffff1681526020016107d061ffff16815250601260066008811062000ba7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190600562000bb892919062000e36565b50604051806101400160405280601461ffff168152602001604661ffff1681526020016102d161ffff1681526020016103e861ffff16815260200161048361ffff1681526020016104b061ffff16815260200161051461ffff16815260200161059a61ffff16815260200161060561ffff16815260200161061761ffff16815250601260076008811062000c75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190600a62000c8692919062000d85565b506200108a565b82805482825590600052602060002090810192821562000ce1579160200282015b8281111562000ce057825182908051906020019062000ccf92919062000cf4565b509160200191906001019062000cae565b5b50905062000cf0919062000f98565b5090565b82805462000d029062001025565b90600052602060002090601f01602090048101928262000d26576000855562000d72565b82601f1062000d4157805160ff191683800117855562000d72565b8280016001018555821562000d72579182015b8281111562000d7157825182559160200191906001019062000d54565b5b50905062000d81919062000fc0565b5090565b82805482825590600052602060002090600f0160109004810192821562000e235791602002820160005b8382111562000df157835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000daf565b801562000e215782816101000a81549061ffff021916905560020160208160010104928301926001030262000df1565b505b50905062000e32919062000fc0565b5090565b82805482825590600052602060002090600f0160109004810192821562000ed45791602002820160005b8382111562000ea257835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000e60565b801562000ed25782816101000a81549061ffff021916905560020160208160010104928301926001030262000ea2565b505b50905062000ee3919062000fc0565b5090565b82805482825590600052602060002090600f0160109004810192821562000f855791602002820160005b8382111562000f5357835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000f11565b801562000f835782816101000a81549061ffff021916905560020160208160010104928301926001030262000f53565b505b50905062000f94919062000fc0565b5090565b5b8082111562000fbc576000818162000fb2919062000fdf565b5060010162000f99565b5090565b5b8082111562000fdb57600081600090555060010162000fc1565b5090565b50805462000fed9062001025565b6000825580601f1062001001575062001022565b601f01602090049060005260206000209081019062001021919062000fc0565b5b50565b600060028204905060018216806200103e57607f821691505b602082108114156200105557620010546200105b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615fb9806200109a6000396000f3fe6080604052600436106101d75760003560e01c806366e3387011610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd146106e7578063d93dfe8814610724578063e985e9c51461074d578063f2fde38b1461078a576101d7565b8063a22cb46514610643578063a2b40d191461066c578063b88d4fde14610695578063c4ef71c7146106be576101d7565b80638a4cc294116100d15780638a4cc294146105a85780639028f135146105d157806395d89b41146105ed578063a035b1fe14610618576101d7565b806366e33870146104da57806370a08231146105175780637e5771401461055457806389ce30741461056b576101d7565b80632f745c591161017a57806342842e0e1161014957806342842e0e146103fa578063438b6300146104235780634f6ccce7146104605780636352211e1461049d576101d7565b80632f745c591461033b5780632fb098d21461037857806332607131146103b85780633ccfd60b146103e3576101d7565b8063081812fc116101b6578063081812fc14610281578063095ea7b3146102be57806318160ddd146102e757806323b872dd14610312576101d7565b80625ea307146101dc57806301ffc9a71461021957806306fdde0314610256575b600080fd5b3480156101e857600080fd5b5061020360048036038101906101fe9190613fd0565b6107b3565b60405161021091906155f9565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b9190613f3d565b6108cb565b60405161024d91906155de565b60405180910390f35b34801561026257600080fd5b5061026b610945565b60405161027891906155f9565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190613fd0565b6109d7565b6040516102b5919061552c565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613f01565b610a5c565b005b3480156102f357600080fd5b506102fc610b74565b6040516103099190615875565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190613dfb565b610b81565b005b34801561034757600080fd5b50610362600480360381019061035d9190613f01565b610be1565b60405161036f9190615875565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a919061404d565b610c86565b6040516103af949392919061561b565b60405180910390f35b3480156103c457600080fd5b506103cd610e6b565b6040516103da9190615875565b60405180910390f35b3480156103ef57600080fd5b506103f8610f3e565b005b34801561040657600080fd5b50610421600480360381019061041c9190613dfb565b610fe7565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613d96565b611007565b60405161045791906155bc565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190613fd0565b611101565b6040516104949190615875565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf9190613fd0565b611198565b6040516104d1919061552c565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc9190613f8f565b61124a565b60405161050e91906155f9565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190613d96565b6113d8565b60405161054b9190615875565b60405180910390f35b34801561056057600080fd5b50610569611490565b005b34801561057757600080fd5b50610592600480360381019061058d9190613f8f565b611530565b60405161059f91906155f9565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613d96565b6118f8565b005b6105eb60048036038101906105e69190613fd0565b611996565b005b3480156105f957600080fd5b50610602611a3c565b60405161060f91906155f9565b60405180910390f35b34801561062457600080fd5b5061062d611ace565b60405161063a9190615875565b60405180910390f35b34801561064f57600080fd5b5061066a60048036038101906106659190613ec5565b611ad4565b005b34801561067857600080fd5b50610693600480360381019061068e9190613fd0565b611c55565b005b3480156106a157600080fd5b506106bc60048036038101906106b79190613e4a565b611cb9565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190613fd0565b611d1b565b005b3480156106f357600080fd5b5061070e60048036038101906107099190613fd0565b611d73565b60405161071b91906155f9565b60405180910390f35b34801561073057600080fd5b5061074b60048036038101906107469190613ff9565b611e07565b005b34801561075957600080fd5b50610774600480360381019061076f9190613dbf565b612055565b60405161078191906155de565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613d96565b6120e9565b005b60606000600d600084815260200190815260200160002080546107d590615cde565b80601f016020809104026020016040519081016040528092919081815260200182805461080190615cde565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905061dead73ffffffffffffffffffffffffffffffffffffffff1661087784611198565b73ffffffffffffffffffffffffffffffffffffffff1614156108c2576108a08160016009612187565b6040516020016108b0919061543d565b60405160208183030381529060405290505b80915050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093e575061093d826122f5565b5b9050919050565b60606000805461095490615cde565b80601f016020809104026020016040519081016040528092919081815260200182805461098090615cde565b80156109cd5780601f106109a2576101008083540402835291602001916109cd565b820191906000526020600020905b8154815290600101906020018083116109b057829003601f168201915b5050505050905090565b60006109e2826123d7565b610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a18906157b5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6782611198565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf906157f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af7612443565b73ffffffffffffffffffffffffffffffffffffffff161480610b265750610b2581610b20612443565b612055565b5b610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c90615735565b60405180910390fd5b610b6f838361244b565b505050565b6000600880549050905090565b610b92610b8c612443565b82612504565b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc890615815565b60405180910390fd5b610bdc8383836125e2565b505050565b6000610bec836113d8565b8210610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490615675565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b6020528160005260406000208181548110610ca257600080fd5b906000526020600020906004020160009150915050806000018054610cc690615cde565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf290615cde565b8015610d3f5780601f10610d1457610100808354040283529160200191610d3f565b820191906000526020600020905b815481529060010190602001808311610d2257829003601f168201915b505050505090806001018054610d5490615cde565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8090615cde565b8015610dcd5780601f10610da257610100808354040283529160200191610dcd565b820191906000526020600020905b815481529060010190602001808311610db057829003601f168201915b505050505090806002018054610de290615cde565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0e90615cde565b8015610e5b5780601f10610e3057610100808354040283529160200191610e5b565b820191906000526020600020905b815481529060010190602001808311610e3e57829003601f168201915b5050505050908060030154905084565b600080610e76610b74565b90506107d08111610e9257670de0b6b3a7640000915050610f3b565b6107d081118015610ea55750610fa08111155b15610ebb57670de0b6b3a7640000915050610f3b565b610fa081118015610ece57506117708111155b15610ee457671bc16d674ec80000915050610f3b565b61177081118015610ef75750611f408111155b15610f0d576729a2241af62c0000915050610f3b565b611f4081118015610f2057506127108111155b15610f3657673782dace9d900000915050610f3b565b600080fd5b90565b3373ffffffffffffffffffffffffffffffffffffffff16601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f9857600080fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fe3573d6000803e3d6000fd5b5050565b61100283838360405180602001604052806000815250611cb9565b505050565b60606000611014836113d8565b905060008167ffffffffffffffff811115611058577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156110865781602001602082028036833780820191505090505b50905060005b828110156110f65761109e8582610be1565b8282815181106110d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806110ee90615d3b565b91505061108c565b508092505050919050565b600061110b610b74565b821061114c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114390615855565b60405180910390fd5b60088281548110611186577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123890615775565b60405180910390fd5b80915050919050565b60608060005b60098160ff1610156113af57600061128361127e868460ff166001866112769190615a6c565b60ff16612187565b61283e565b905082600b60008460ff1681526020019081526020016000208260ff16815481106112d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600101600b60008560ff1681526020019081526020016000208360ff1681548110611339577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160000160405160200161135c93929190615358565b604051602081830303815290604052925060088260ff161461139b578260405160200161138991906152cc565b60405160208183030381529060405292505b5080806113a790615d84565b915050611250565b50806040516020016113c191906153ee565b604051602081830303815290604052915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144090615755565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc6790336114d7610e6b565b6040518363ffffffff1660e01b81526004016114f4929190615593565b600060405180830381600087803b15801561150e57600080fd5b505af1158015611522573d6000803e3d6000fd5b5050505061152e612994565b565b60608061153b613a26565b60005b60098160ff1610156118cb57600061157161156c878460ff166001866115649190615a6c565b60ff16612187565b61283e565b905060005b600b60008460ff1681526020019081526020016000208260ff16815481106115c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301548161ffff1610156118b6576000611706600b60008660ff1681526020019081526020016000208460ff168154811061163a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600201805461165690615cde565b80601f016020809104026020016040519081016040528092919081815260200182805461168290615cde565b80156116cf5780601f106116a4576101008083540402835291602001916116cf565b820191906000526020600020905b8154815290600101906020018083116116b257829003601f168201915b50505050506004846116e19190615ad4565b61ffff16600480866116f39190615ad4565b6116fd91906159de565b61ffff16612187565b9050600061171f61171a8360006001612187565b612a50565b905060006117386117338460016002612187565b612a50565b9050868260ff1660188110611776577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518160ff16601881106117b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151156117c8575050506118a3565b876117d68460026004612187565b6117e28460ff16612b35565b6117ee8460ff16612b35565b60405160200161180194939291906152ee565b60405160208183030381529060405297506001878360ff1660188110611850577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518260ff1660188110611890577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020190151590811515815250505050505b80806118ae90615d10565b915050611576565b505080806118c390615d84565b91505061153e565b50816040516020016118dd91906153c1565b60405160208183030381529060405291508192505050919050565b3373ffffffffffffffffffffffffffffffffffffffff16601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461195257600080fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000811180156119a7575060148111155b80156119bf5750600a54816119bc9190615b10565b34145b80156119d35750600f546119d1610b74565b105b611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0990615835565b60405180910390fd5b60005b81811015611a3857611a25612994565b8080611a3090615d3b565b915050611a15565b5050565b606060018054611a4b90615cde565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7790615cde565b8015611ac45780601f10611a9957610100808354040283529160200191611ac4565b820191906000526020600020905b815481529060010190602001808311611aa757829003601f168201915b5050505050905090565b600a5481565b611adc612443565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b41906156f5565b60405180910390fd5b8060056000611b57612443565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c04612443565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c4991906155de565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611caf57600080fd5b80600a8190555050565b611cca611cc4612443565b83612504565b611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090615815565b60405180910390fd5b611d1584848484612ce2565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16611d3b82611198565b73ffffffffffffffffffffffffffffffffffffffff1614611d5b57600080fd5b611d683361dead836125e2565b611d70612994565b50565b6060611d7e826123d7565b611d8757600080fd5b6000611d92836107b3565b9050611de0611da084612b35565b611db1611dac84611530565b612d3e565b611dba8461124a565b604051602001611dcc9392919061545f565b604051602081830303815290604052612d3e565b604051602001611df0919061541b565b604051602081830303815290604052915050919050565b3373ffffffffffffffffffffffffffffffffffffffff16601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e6157600080fd5b60005b815181101561205057600b60008481526020019081526020016000206040518060800160405280848481518110611ec4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518152602001848481518110611f0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001518152602001848481518110611f58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001518152602001848481518110611fa2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516060015181525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019080519060200190611ff6929190613a54565b506020820151816001019080519060200190612013929190613a54565b506040820151816002019080519060200190612030929190613a54565b50606082015181600301555050808061204890615d3b565b915050611e64565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461214357600080fd5b80601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008490506000848461219c9190615ba5565b67ffffffffffffffff8111156121db577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561220d5781602001600182028036833780820191505090505b50905060008590505b848110156122e857828181518110612257577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b82878361226f9190615ba5565b815181106122a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806122e090615d3b565b915050612216565b5080925050509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123c057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123d057506123cf82612ee9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124be83611198565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061250f826123d7565b61254e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254590615715565b60405180910390fd5b600061255983611198565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125c857508373ffffffffffffffffffffffffffffffffffffffff166125b0846109d7565b73ffffffffffffffffffffffffffffffffffffffff16145b806125d957506125d88185612055565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661260282611198565b73ffffffffffffffffffffffffffffffffffffffff1614612658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264f906157d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bf906156d5565b60405180910390fd5b6126d3838383612f53565b6126de60008261244b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461272e9190615ba5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127859190615a16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808290506000805b82518160ff161015612989576030838260ff1681518110612892577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff16101580156128fe57506039838260ff16815181106128ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1611155b1561297657600a826129109190615b6a565b91506030838260ff1681518110612950577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c6129689190615bd9565b826129739190615a6c565b91505b808061298190615d84565b915050612848565b508092505050919050565b600061299e610b74565b9050600e5481106129ae57600080fd5b6129b733613067565b156129c157600080fd5b60008190506129d28133600061307a565b600d600083815260200190815260200160002090805190602001906129f8929190613a54565b506001600c600d6000848152602001908152602001600020604051612a1d91906153aa565b908152602001604051809103902060006101000a81548160ff021916908315150217905550612a4c33826131d3565b5050565b600080600090505b6011805490508160ff161015612b2a5782604051602001612a799190615291565b6040516020818303038152906040528051906020012060118260ff1681548110612acc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001604051602001612ae691906153aa565b604051602081830303815290604052805190602001201415612b1757600181612b0f9190615a6c565b915050612b30565b8080612b2290615d84565b915050612a58565b50600080fd5b919050565b60606000821415612b7d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cdd565b600082905060005b60008214612baf578080612b9890615d3b565b915050600a82612ba89190615aa3565b9150612b85565b60008167ffffffffffffffff811115612bf1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c235781602001600182028036833780820191505090505b5090505b60008514612cd657600182612c3c9190615ba5565b9150600a85612c4b9190615ddc565b6030612c579190615a16565b60f81b818381518110612c93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ccf9190615aa3565b9450612c27565b8093505050505b919050565b612ced8484846125e2565b612cf9848484846133a1565b612d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2f90615695565b60405180910390fd5b50505050565b6060600082511415612d6157604051806020016040528060008152509050612ee4565b6000604051806060016040528060408152602001615f446040913990506000600360028551612d909190615a16565b612d9a9190615aa3565b6004612da69190615b10565b90506000602082612db79190615a16565b67ffffffffffffffff811115612df6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e285781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612ea3576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612e3c565b600389510660018114612ebd5760028114612ecd57612ed8565b613d3d60f01b6002830352612ed8565b603d60f81b60018303525b50505050508093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f5e838383613538565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fa157612f9c8161353d565b612fe0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fdf57612fde8382613586565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130235761301e816136f3565b613062565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613061576130608282613836565b5b5b505050565b600080823b905060008111915050919050565b6060600a821061308957600080fd5b60006040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905060005b60088160ff16101561317657601060008154809291906130e590615d3b565b91905055506000612710424489898960105460405160200161310c969594939291906154bc565b6040516020818303038152906040528051906020012060001c61312f9190615ddc565b9050826131408261ffff16846138b5565b6040516020016131519291906152a8565b604051602081830303815290604052925050808061316e90615d84565b9150506130c6565b50600c816040516131879190615291565b908152602001604051809103902060009054906101000a900460ff16156131c7576131bf85856001866131ba9190615a16565b61307a565b9150506131cc565b809150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323a90615795565b60405180910390fd5b61324c816123d7565b1561328c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613283906156b5565b60405180910390fd5b61329860008383612f53565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132e89190615a16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006133c28473ffffffffffffffffffffffffffffffffffffffff16613a13565b1561352b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133eb612443565b8786866040518563ffffffff1660e01b815260040161340d9493929190615547565b602060405180830381600087803b15801561342757600080fd5b505af192505050801561345857506040513d601f19601f820116820180604052508101906134559190613f66565b60015b6134db573d8060008114613488576040519150601f19603f3d011682016040523d82523d6000602084013e61348d565b606091505b506000815114156134d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ca90615695565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613530565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613593846113d8565b61359d9190615ba5565b9050600060076000848152602001908152602001600020549050818114613682576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137079190615ba5565b905060006009600084815260200190815260200160002054905060006008838154811061375d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106137a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061381a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613841836113d8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60606000805b60128460ff16600881106138f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01805490508160ff161015613a0757600060128560ff1660088110613946577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018260ff1681548110613982577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508261ffff1686101580156139ca575080836139c391906159de565b61ffff1686105b156139e5576139db8260ff16612b35565b9350505050613a0d565b80836139f191906159de565b92505080806139ff90615d84565b9150506138bb565b50600080fd5b92915050565b600080823b905060008111915050919050565b6040518061030001604052806018905b613a3e613ada565b815260200190600190039081613a365790505090565b828054613a6090615cde565b90600052602060002090601f016020900481019282613a825760008555613ac9565b82601f10613a9b57805160ff1916838001178555613ac9565b82800160010185558215613ac9579182015b82811115613ac8578251825591602001919060010190613aad565b5b509050613ad69190613afd565b5090565b604051806103000160405280601890602082028036833780820191505090505090565b5b80821115613b16576000816000905550600101613afe565b5090565b6000613b2d613b28846158c1565b615890565b9050808382526020820190508260005b85811015613b6d5781358501613b538882613cc5565b845260208401935060208301925050600181019050613b3d565b5050509392505050565b6000613b8a613b85846158ed565b615890565b905082815260208101848484011115613ba257600080fd5b613bad848285615c9c565b509392505050565b6000613bc8613bc38461591d565b615890565b905082815260208101848484011115613be057600080fd5b613beb848285615c9c565b509392505050565b600081359050613c0281615ee7565b92915050565b600082601f830112613c1957600080fd5b8135613c29848260208601613b1a565b91505092915050565b600081359050613c4181615efe565b92915050565b600081359050613c5681615f15565b92915050565b600081519050613c6b81615f15565b92915050565b600082601f830112613c8257600080fd5b8135613c92848260208601613b77565b91505092915050565b600082601f830112613cac57600080fd5b8135613cbc848260208601613bb5565b91505092915050565b600060808284031215613cd757600080fd5b613ce16080615890565b9050600082013567ffffffffffffffff811115613cfd57600080fd5b613d0984828501613c9b565b600083015250602082013567ffffffffffffffff811115613d2957600080fd5b613d3584828501613c9b565b602083015250604082013567ffffffffffffffff811115613d5557600080fd5b613d6184828501613c9b565b6040830152506060613d7584828501613d81565b60608301525092915050565b600081359050613d9081615f2c565b92915050565b600060208284031215613da857600080fd5b6000613db684828501613bf3565b91505092915050565b60008060408385031215613dd257600080fd5b6000613de085828601613bf3565b9250506020613df185828601613bf3565b9150509250929050565b600080600060608486031215613e1057600080fd5b6000613e1e86828701613bf3565b9350506020613e2f86828701613bf3565b9250506040613e4086828701613d81565b9150509250925092565b60008060008060808587031215613e6057600080fd5b6000613e6e87828801613bf3565b9450506020613e7f87828801613bf3565b9350506040613e9087828801613d81565b925050606085013567ffffffffffffffff811115613ead57600080fd5b613eb987828801613c71565b91505092959194509250565b60008060408385031215613ed857600080fd5b6000613ee685828601613bf3565b9250506020613ef785828601613c32565b9150509250929050565b60008060408385031215613f1457600080fd5b6000613f2285828601613bf3565b9250506020613f3385828601613d81565b9150509250929050565b600060208284031215613f4f57600080fd5b6000613f5d84828501613c47565b91505092915050565b600060208284031215613f7857600080fd5b6000613f8684828501613c5c565b91505092915050565b600060208284031215613fa157600080fd5b600082013567ffffffffffffffff811115613fbb57600080fd5b613fc784828501613c9b565b91505092915050565b600060208284031215613fe257600080fd5b6000613ff084828501613d81565b91505092915050565b6000806040838503121561400c57600080fd5b600061401a85828601613d81565b925050602083013567ffffffffffffffff81111561403757600080fd5b61404385828601613c08565b9150509250929050565b6000806040838503121561406057600080fd5b600061406e85828601613d81565b925050602061407f85828601613d81565b9150509250929050565b6000614095838361525c565b60208301905092915050565b6140aa81615c0d565b82525050565b6140c16140bc82615c0d565b615dae565b82525050565b60006140d282615972565b6140dc81856159a0565b93506140e78361594d565b8060005b838110156141185781516140ff8882614089565b975061410a83615993565b9250506001810190506140eb565b5085935050505092915050565b61412e81615c1f565b82525050565b600061413f8261597d565b61414981856159b1565b9350614159818560208601615cab565b61416281615ec9565b840191505092915050565b600061417882615988565b61418281856159c2565b9350614192818560208601615cab565b61419b81615ec9565b840191505092915050565b60006141b182615988565b6141bb81856159d3565b93506141cb818560208601615cab565b80840191505092915050565b600081546141e481615cde565b6141ee81866159d3565b94506001821660008114614209576001811461421a5761424d565b60ff1983168652818601935061424d565b6142238561595d565b60005b8381101561424557815481890152600182019150602081019050614226565b838801955050505b50505092915050565b60006142636005836159d3565b91507f2720793d270000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006142a3609a836159d3565b91507f222c20226465736372697074696f6e223a2022636d794b61747a20697320612060008301527f636f6c6c656374696f6e206f662031302c30303020756e69717565206361747360208301527f2e20416c6c20746865206d6574616461746120616e6420696d6167657320737460408301527f6f7265642031303025206f6e2d636861696e2e222c2022696d616765223a202260608301527f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000006080830152609a82019050919050565b600061437b602b836159c2565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006143e16032836159c2565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006144476068836159d3565b91507f3c7376672069643d22632220786d6c6e733d22687474703a2f2f7777772e773360008301527f2e6f72672f323030302f7376672220707265736572766541737065637452617460208301527f696f3d22784d696e594d696e206d656574222076696577426f783d223020302060408301527f3234203234223e200000000000000000000000000000000000000000000000006060830152606882019050919050565b60006144f9601c836159c2565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006145396005836159d3565b91507f2720783d270000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000614579600f836159d3565b91507f222c2261747472696275746573223a00000000000000000000000000000000006000830152600f82019050919050565b60006145b96001836159d3565b91507f2c000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145f9600e836159d3565b91507f3c7265637420636c6173733d27630000000000000000000000000000000000006000830152600e82019050919050565b60006146396024836159c2565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061469f6019836159c2565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006146df600f836159d3565b91507f7b2274726169745f74797065223a2200000000000000000000000000000000006000830152600f82019050919050565b600061471f602c836159c2565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147856003836159d3565b91507f272f3e00000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b60006147c56038836159c2565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061482b602a836159c2565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148916029836159c2565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006148f86103f8836159d3565b91507f3c7374796c653e726563747b77696474683a3170783b6865696768743a31707860008301527f3b7d23637b73686170652d72656e646572696e673a206372697370656467657360208301527f3b7d2e6330307b66696c6c3a236636373637627d2e6330317b66696c6c3a236660408301527f66666666667d2e6330327b66696c6c3a233030303030307d2e6330337b66696c60608301527f6c3a236331303038627d2e6330347b66696c6c3a236463303039657d2e63303560808301527f7b66696c6c3a236566303061397d2e6330367b66696c6c3a236666303034337d60a08301527f2e6330377b66696c6c3a236337343234397d2e6330387b66696c6c3a2361613360c08301527f3433617d2e6330397b66696c6c3a233336333733377d2e6331307b66696c6c3a60e08301527f233163316331637d2e6331317b66696c6c3a233263326332637d2e6331327b666101008301527f696c6c3a233661396363357d2e6331337b66696c6c3a233966643266637d2e636101208301527f31347b66696c6c3a236364363130307d2e6331357b66696c6c3a2332663266326101408301527f667d2e6331367b66696c6c3a236664373530307d2e6331377b66696c6c3a23666101608301527f36386432667d2e6331387b66696c6c3a233437343734377d2e6331397b66696c6101808301527f6c3a233538353835387d2e6332307b66696c6c3a233234323432347d2e6332316101a08301527f7b66696c6c3a233963376436617d2e6332327b66696c6c3a233365336533657d6101c08301527f2e6332337b66696c6c3a233230323032307d2e6332347b66696c6c3a236230356101e08301527f3531347d2e6332357b66696c6c3a233733336533397d2e6332367b66696c6c3a6102008301527f236632643030307d2e6332377b66696c6c3a236633646430307d2e6332387b666102208301527f696c6c3a236363636363647d2e6332397b66696c6c3a236461643464327d2e636102408301527f33307b66696c6c3a236563653365307d2e6333317b66696c6c3a2330306164636102608301527f307d2e6333327b66696c6c3a233030623863637d2e6333337b66696c6c3a23306102808301527f30633464627d2e6333347b66696c6c3a233463336232667d2e6333357b66696c6102a08301527f6c3a233639353033387d2e6333367b66696c6c3a236235383135327d2e6333376102c08301527f7b66696c6c3a233030386339627d2e6333387b66696c6c3a236335633564627d6102e08301527f2e6333397b66696c6c3a233030643666667d2e6334307b66696c6c3a236466336103008301527f3435337d2e6334317b66696c6c3a236434623530307d2e6334327b66696c6c3a6103208301527f233532333734377d2e6334337b66696c6c3a233366343034337d2e6334347b666103408301527f696c6c3a233566356535637d2e6334357b66696c6c3a236336396539347d2e636103608301527f34367b66696c6c3a236131393538637d2e6334377b66696c6c3a2339383138376103808301527f307d2e6334387b66696c6c3a236362626130307d2e6334397b66696c6c3a23646103a08301527f66636330307d2e6335307b66696c6c3a233133613732657d2e6335317b66696c6103c08301527f6c3a233063386132347d3c2f7374796c653e3c2f7376673e00000000000000006103e08301526103f882019050919050565b6000614deb6002836159d3565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000614e2b6020836159c2565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614e6b6001836159d3565b91507f7d000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614eab602c836159c2565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614f116001836159d3565b91507f5b000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614f516029836159c2565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fb7600b836159d3565b91507f222c2276616c7565223a220000000000000000000000000000000000000000006000830152600b82019050919050565b6000614ff76001836159d3565b91507f5d000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006150376021836159c2565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061509d601d836159d3565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b60006150dd6031836159c2565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006151436001836159d3565b91507f31000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006151836001836159c2565b91507f74000000000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151c3602c836159c2565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006152296013836159d3565b91507f7b226e616d65223a2022636d794b61747a2023000000000000000000000000006000830152601382019050919050565b61526581615c85565b82525050565b61527481615c85565b82525050565b61528b61528682615c85565b615dd2565b82525050565b600061529d82846141a6565b915081905092915050565b60006152b482856141a6565b91506152c082846141a6565b91508190509392505050565b60006152d882846141a6565b91506152e3826145ac565b915081905092915050565b60006152fa82876141a6565b9150615305826145ec565b915061531182866141a6565b915061531c8261452c565b915061532882856141a6565b915061533382614256565b915061533f82846141a6565b915061534a82614778565b915081905095945050505050565b600061536482866141a6565b915061536f826146d2565b915061537b82856141d7565b915061538682614faa565b915061539282846141d7565b915061539d82614dde565b9150819050949350505050565b60006153b682846141d7565b915081905092915050565b60006153cc8261443a565b91506153d882846141a6565b91506153e3826148ea565b915081905092915050565b60006153f982614f04565b915061540582846141a6565b915061541082614fea565b915081905092915050565b600061542682615090565b915061543282846141a6565b915081905092915050565b600061544882615136565b915061545482846141a6565b915081905092915050565b600061546a8261521c565b915061547682866141a6565b915061548182614296565b915061548d82856141a6565b91506154988261456c565b91506154a482846141a6565b91506154af82614e5e565b9150819050949350505050565b60006154c8828961527a565b6020820191506154d8828861527a565b6020820191506154e8828761527a565b6020820191506154f882866140b0565b601482019150615508828561527a565b602082019150615518828461527a565b602082019150819050979650505050505050565b600060208201905061554160008301846140a1565b92915050565b600060808201905061555c60008301876140a1565b61556960208301866140a1565b615576604083018561526b565b81810360608301526155888184614134565b905095945050505050565b60006040820190506155a860008301856140a1565b6155b5602083018461526b565b9392505050565b600060208201905081810360008301526155d681846140c7565b905092915050565b60006020820190506155f36000830184614125565b92915050565b60006020820190508181036000830152615613818461416d565b905092915050565b60006080820190508181036000830152615635818761416d565b90508181036020830152615649818661416d565b9050818103604083015261565d818561416d565b905061566c606083018461526b565b95945050505050565b6000602082019050818103600083015261568e8161436e565b9050919050565b600060208201905081810360008301526156ae816143d4565b9050919050565b600060208201905081810360008301526156ce816144ec565b9050919050565b600060208201905081810360008301526156ee8161462c565b9050919050565b6000602082019050818103600083015261570e81614692565b9050919050565b6000602082019050818103600083015261572e81614712565b9050919050565b6000602082019050818103600083015261574e816147b8565b9050919050565b6000602082019050818103600083015261576e8161481e565b9050919050565b6000602082019050818103600083015261578e81614884565b9050919050565b600060208201905081810360008301526157ae81614e1e565b9050919050565b600060208201905081810360008301526157ce81614e9e565b9050919050565b600060208201905081810360008301526157ee81614f44565b9050919050565b6000602082019050818103600083015261580e8161502a565b9050919050565b6000602082019050818103600083015261582e816150d0565b9050919050565b6000602082019050818103600083015261584e81615176565b9050919050565b6000602082019050818103600083015261586e816151b6565b9050919050565b600060208201905061588a600083018461526b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156158b7576158b6615e9a565b5b8060405250919050565b600067ffffffffffffffff8211156158dc576158db615e9a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561590857615907615e9a565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561593857615937615e9a565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006159e982615c57565b91506159f483615c57565b92508261ffff03821115615a0b57615a0a615e0d565b5b828201905092915050565b6000615a2182615c85565b9150615a2c83615c85565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615a6157615a60615e0d565b5b828201905092915050565b6000615a7782615c8f565b9150615a8283615c8f565b92508260ff03821115615a9857615a97615e0d565b5b828201905092915050565b6000615aae82615c85565b9150615ab983615c85565b925082615ac957615ac8615e3c565b5b828204905092915050565b6000615adf82615c57565b9150615aea83615c57565b92508161ffff0483118215151615615b0557615b04615e0d565b5b828202905092915050565b6000615b1b82615c85565b9150615b2683615c85565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615b5f57615b5e615e0d565b5b828202905092915050565b6000615b7582615c8f565b9150615b8083615c8f565b92508160ff0483118215151615615b9a57615b99615e0d565b5b828202905092915050565b6000615bb082615c85565b9150615bbb83615c85565b925082821015615bce57615bcd615e0d565b5b828203905092915050565b6000615be482615c8f565b9150615bef83615c8f565b925082821015615c0257615c01615e0d565b5b828203905092915050565b6000615c1882615c65565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615cc9578082015181840152602081019050615cae565b83811115615cd8576000848401525b50505050565b60006002820490506001821680615cf657607f821691505b60208210811415615d0a57615d09615e6b565b5b50919050565b6000615d1b82615c57565b915061ffff821415615d3057615d2f615e0d565b5b600182019050919050565b6000615d4682615c85565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615d7957615d78615e0d565b5b600182019050919050565b6000615d8f82615c8f565b915060ff821415615da357615da2615e0d565b5b600182019050919050565b6000615db982615dc0565b9050919050565b6000615dcb82615eda565b9050919050565b6000819050919050565b6000615de782615c85565b9150615df283615c85565b925082615e0257615e01615e3c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b615ef081615c0d565b8114615efb57600080fd5b50565b615f0781615c1f565b8114615f1257600080fd5b50565b615f1e81615c2b565b8114615f2957600080fd5b50565b615f3581615c85565b8114615f4057600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122085b251d88372d1b8b5902e4ec923a693658af6a89471f3a642350b5cfb99afc264736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101d75760003560e01c806366e3387011610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd146106e7578063d93dfe8814610724578063e985e9c51461074d578063f2fde38b1461078a576101d7565b8063a22cb46514610643578063a2b40d191461066c578063b88d4fde14610695578063c4ef71c7146106be576101d7565b80638a4cc294116100d15780638a4cc294146105a85780639028f135146105d157806395d89b41146105ed578063a035b1fe14610618576101d7565b806366e33870146104da57806370a08231146105175780637e5771401461055457806389ce30741461056b576101d7565b80632f745c591161017a57806342842e0e1161014957806342842e0e146103fa578063438b6300146104235780634f6ccce7146104605780636352211e1461049d576101d7565b80632f745c591461033b5780632fb098d21461037857806332607131146103b85780633ccfd60b146103e3576101d7565b8063081812fc116101b6578063081812fc14610281578063095ea7b3146102be57806318160ddd146102e757806323b872dd14610312576101d7565b80625ea307146101dc57806301ffc9a71461021957806306fdde0314610256575b600080fd5b3480156101e857600080fd5b5061020360048036038101906101fe9190613fd0565b6107b3565b60405161021091906155f9565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b9190613f3d565b6108cb565b60405161024d91906155de565b60405180910390f35b34801561026257600080fd5b5061026b610945565b60405161027891906155f9565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190613fd0565b6109d7565b6040516102b5919061552c565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613f01565b610a5c565b005b3480156102f357600080fd5b506102fc610b74565b6040516103099190615875565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190613dfb565b610b81565b005b34801561034757600080fd5b50610362600480360381019061035d9190613f01565b610be1565b60405161036f9190615875565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a919061404d565b610c86565b6040516103af949392919061561b565b60405180910390f35b3480156103c457600080fd5b506103cd610e6b565b6040516103da9190615875565b60405180910390f35b3480156103ef57600080fd5b506103f8610f3e565b005b34801561040657600080fd5b50610421600480360381019061041c9190613dfb565b610fe7565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613d96565b611007565b60405161045791906155bc565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190613fd0565b611101565b6040516104949190615875565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf9190613fd0565b611198565b6040516104d1919061552c565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc9190613f8f565b61124a565b60405161050e91906155f9565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190613d96565b6113d8565b60405161054b9190615875565b60405180910390f35b34801561056057600080fd5b50610569611490565b005b34801561057757600080fd5b50610592600480360381019061058d9190613f8f565b611530565b60405161059f91906155f9565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613d96565b6118f8565b005b6105eb60048036038101906105e69190613fd0565b611996565b005b3480156105f957600080fd5b50610602611a3c565b60405161060f91906155f9565b60405180910390f35b34801561062457600080fd5b5061062d611ace565b60405161063a9190615875565b60405180910390f35b34801561064f57600080fd5b5061066a60048036038101906106659190613ec5565b611ad4565b005b34801561067857600080fd5b50610693600480360381019061068e9190613fd0565b611c55565b005b3480156106a157600080fd5b506106bc60048036038101906106b79190613e4a565b611cb9565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190613fd0565b611d1b565b005b3480156106f357600080fd5b5061070e60048036038101906107099190613fd0565b611d73565b60405161071b91906155f9565b60405180910390f35b34801561073057600080fd5b5061074b60048036038101906107469190613ff9565b611e07565b005b34801561075957600080fd5b50610774600480360381019061076f9190613dbf565b612055565b60405161078191906155de565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613d96565b6120e9565b005b60606000600d600084815260200190815260200160002080546107d590615cde565b80601f016020809104026020016040519081016040528092919081815260200182805461080190615cde565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b5050505050905061dead73ffffffffffffffffffffffffffffffffffffffff1661087784611198565b73ffffffffffffffffffffffffffffffffffffffff1614156108c2576108a08160016009612187565b6040516020016108b0919061543d565b60405160208183030381529060405290505b80915050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093e575061093d826122f5565b5b9050919050565b60606000805461095490615cde565b80601f016020809104026020016040519081016040528092919081815260200182805461098090615cde565b80156109cd5780601f106109a2576101008083540402835291602001916109cd565b820191906000526020600020905b8154815290600101906020018083116109b057829003601f168201915b5050505050905090565b60006109e2826123d7565b610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a18906157b5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6782611198565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf906157f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af7612443565b73ffffffffffffffffffffffffffffffffffffffff161480610b265750610b2581610b20612443565b612055565b5b610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c90615735565b60405180910390fd5b610b6f838361244b565b505050565b6000600880549050905090565b610b92610b8c612443565b82612504565b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc890615815565b60405180910390fd5b610bdc8383836125e2565b505050565b6000610bec836113d8565b8210610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490615675565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b6020528160005260406000208181548110610ca257600080fd5b906000526020600020906004020160009150915050806000018054610cc690615cde565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf290615cde565b8015610d3f5780601f10610d1457610100808354040283529160200191610d3f565b820191906000526020600020905b815481529060010190602001808311610d2257829003601f168201915b505050505090806001018054610d5490615cde565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8090615cde565b8015610dcd5780601f10610da257610100808354040283529160200191610dcd565b820191906000526020600020905b815481529060010190602001808311610db057829003601f168201915b505050505090806002018054610de290615cde565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0e90615cde565b8015610e5b5780601f10610e3057610100808354040283529160200191610e5b565b820191906000526020600020905b815481529060010190602001808311610e3e57829003601f168201915b5050505050908060030154905084565b600080610e76610b74565b90506107d08111610e9257670de0b6b3a7640000915050610f3b565b6107d081118015610ea55750610fa08111155b15610ebb57670de0b6b3a7640000915050610f3b565b610fa081118015610ece57506117708111155b15610ee457671bc16d674ec80000915050610f3b565b61177081118015610ef75750611f408111155b15610f0d576729a2241af62c0000915050610f3b565b611f4081118015610f2057506127108111155b15610f3657673782dace9d900000915050610f3b565b600080fd5b90565b3373ffffffffffffffffffffffffffffffffffffffff16601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f9857600080fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fe3573d6000803e3d6000fd5b5050565b61100283838360405180602001604052806000815250611cb9565b505050565b60606000611014836113d8565b905060008167ffffffffffffffff811115611058577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156110865781602001602082028036833780820191505090505b50905060005b828110156110f65761109e8582610be1565b8282815181106110d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806110ee90615d3b565b91505061108c565b508092505050919050565b600061110b610b74565b821061114c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114390615855565b60405180910390fd5b60088281548110611186577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123890615775565b60405180910390fd5b80915050919050565b60608060005b60098160ff1610156113af57600061128361127e868460ff166001866112769190615a6c565b60ff16612187565b61283e565b905082600b60008460ff1681526020019081526020016000208260ff16815481106112d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600101600b60008560ff1681526020019081526020016000208360ff1681548110611339577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160000160405160200161135c93929190615358565b604051602081830303815290604052925060088260ff161461139b578260405160200161138991906152cc565b60405160208183030381529060405292505b5080806113a790615d84565b915050611250565b50806040516020016113c191906153ee565b604051602081830303815290604052915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144090615755565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc6790336114d7610e6b565b6040518363ffffffff1660e01b81526004016114f4929190615593565b600060405180830381600087803b15801561150e57600080fd5b505af1158015611522573d6000803e3d6000fd5b5050505061152e612994565b565b60608061153b613a26565b60005b60098160ff1610156118cb57600061157161156c878460ff166001866115649190615a6c565b60ff16612187565b61283e565b905060005b600b60008460ff1681526020019081526020016000208260ff16815481106115c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301548161ffff1610156118b6576000611706600b60008660ff1681526020019081526020016000208460ff168154811061163a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600201805461165690615cde565b80601f016020809104026020016040519081016040528092919081815260200182805461168290615cde565b80156116cf5780601f106116a4576101008083540402835291602001916116cf565b820191906000526020600020905b8154815290600101906020018083116116b257829003601f168201915b50505050506004846116e19190615ad4565b61ffff16600480866116f39190615ad4565b6116fd91906159de565b61ffff16612187565b9050600061171f61171a8360006001612187565b612a50565b905060006117386117338460016002612187565b612a50565b9050868260ff1660188110611776577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518160ff16601881106117b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151156117c8575050506118a3565b876117d68460026004612187565b6117e28460ff16612b35565b6117ee8460ff16612b35565b60405160200161180194939291906152ee565b60405160208183030381529060405297506001878360ff1660188110611850577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518260ff1660188110611890577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020190151590811515815250505050505b80806118ae90615d10565b915050611576565b505080806118c390615d84565b91505061153e565b50816040516020016118dd91906153c1565b60405160208183030381529060405291508192505050919050565b3373ffffffffffffffffffffffffffffffffffffffff16601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461195257600080fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000811180156119a7575060148111155b80156119bf5750600a54816119bc9190615b10565b34145b80156119d35750600f546119d1610b74565b105b611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0990615835565b60405180910390fd5b60005b81811015611a3857611a25612994565b8080611a3090615d3b565b915050611a15565b5050565b606060018054611a4b90615cde565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7790615cde565b8015611ac45780601f10611a9957610100808354040283529160200191611ac4565b820191906000526020600020905b815481529060010190602001808311611aa757829003601f168201915b5050505050905090565b600a5481565b611adc612443565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b41906156f5565b60405180910390fd5b8060056000611b57612443565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c04612443565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c4991906155de565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611caf57600080fd5b80600a8190555050565b611cca611cc4612443565b83612504565b611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090615815565b60405180910390fd5b611d1584848484612ce2565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16611d3b82611198565b73ffffffffffffffffffffffffffffffffffffffff1614611d5b57600080fd5b611d683361dead836125e2565b611d70612994565b50565b6060611d7e826123d7565b611d8757600080fd5b6000611d92836107b3565b9050611de0611da084612b35565b611db1611dac84611530565b612d3e565b611dba8461124a565b604051602001611dcc9392919061545f565b604051602081830303815290604052612d3e565b604051602001611df0919061541b565b604051602081830303815290604052915050919050565b3373ffffffffffffffffffffffffffffffffffffffff16601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e6157600080fd5b60005b815181101561205057600b60008481526020019081526020016000206040518060800160405280848481518110611ec4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518152602001848481518110611f0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001518152602001848481518110611f58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001518152602001848481518110611fa2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516060015181525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019080519060200190611ff6929190613a54565b506020820151816001019080519060200190612013929190613a54565b506040820151816002019080519060200190612030929190613a54565b50606082015181600301555050808061204890615d3b565b915050611e64565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461214357600080fd5b80601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008490506000848461219c9190615ba5565b67ffffffffffffffff8111156121db577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561220d5781602001600182028036833780820191505090505b50905060008590505b848110156122e857828181518110612257577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b82878361226f9190615ba5565b815181106122a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806122e090615d3b565b915050612216565b5080925050509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123c057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123d057506123cf82612ee9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124be83611198565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061250f826123d7565b61254e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254590615715565b60405180910390fd5b600061255983611198565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125c857508373ffffffffffffffffffffffffffffffffffffffff166125b0846109d7565b73ffffffffffffffffffffffffffffffffffffffff16145b806125d957506125d88185612055565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661260282611198565b73ffffffffffffffffffffffffffffffffffffffff1614612658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264f906157d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bf906156d5565b60405180910390fd5b6126d3838383612f53565b6126de60008261244b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461272e9190615ba5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127859190615a16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808290506000805b82518160ff161015612989576030838260ff1681518110612892577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff16101580156128fe57506039838260ff16815181106128ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1611155b1561297657600a826129109190615b6a565b91506030838260ff1681518110612950577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c6129689190615bd9565b826129739190615a6c565b91505b808061298190615d84565b915050612848565b508092505050919050565b600061299e610b74565b9050600e5481106129ae57600080fd5b6129b733613067565b156129c157600080fd5b60008190506129d28133600061307a565b600d600083815260200190815260200160002090805190602001906129f8929190613a54565b506001600c600d6000848152602001908152602001600020604051612a1d91906153aa565b908152602001604051809103902060006101000a81548160ff021916908315150217905550612a4c33826131d3565b5050565b600080600090505b6011805490508160ff161015612b2a5782604051602001612a799190615291565b6040516020818303038152906040528051906020012060118260ff1681548110612acc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001604051602001612ae691906153aa565b604051602081830303815290604052805190602001201415612b1757600181612b0f9190615a6c565b915050612b30565b8080612b2290615d84565b915050612a58565b50600080fd5b919050565b60606000821415612b7d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cdd565b600082905060005b60008214612baf578080612b9890615d3b565b915050600a82612ba89190615aa3565b9150612b85565b60008167ffffffffffffffff811115612bf1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c235781602001600182028036833780820191505090505b5090505b60008514612cd657600182612c3c9190615ba5565b9150600a85612c4b9190615ddc565b6030612c579190615a16565b60f81b818381518110612c93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ccf9190615aa3565b9450612c27565b8093505050505b919050565b612ced8484846125e2565b612cf9848484846133a1565b612d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2f90615695565b60405180910390fd5b50505050565b6060600082511415612d6157604051806020016040528060008152509050612ee4565b6000604051806060016040528060408152602001615f446040913990506000600360028551612d909190615a16565b612d9a9190615aa3565b6004612da69190615b10565b90506000602082612db79190615a16565b67ffffffffffffffff811115612df6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e285781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612ea3576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612e3c565b600389510660018114612ebd5760028114612ecd57612ed8565b613d3d60f01b6002830352612ed8565b603d60f81b60018303525b50505050508093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f5e838383613538565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fa157612f9c8161353d565b612fe0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fdf57612fde8382613586565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130235761301e816136f3565b613062565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613061576130608282613836565b5b5b505050565b600080823b905060008111915050919050565b6060600a821061308957600080fd5b60006040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905060005b60088160ff16101561317657601060008154809291906130e590615d3b565b91905055506000612710424489898960105460405160200161310c969594939291906154bc565b6040516020818303038152906040528051906020012060001c61312f9190615ddc565b9050826131408261ffff16846138b5565b6040516020016131519291906152a8565b604051602081830303815290604052925050808061316e90615d84565b9150506130c6565b50600c816040516131879190615291565b908152602001604051809103902060009054906101000a900460ff16156131c7576131bf85856001866131ba9190615a16565b61307a565b9150506131cc565b809150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323a90615795565b60405180910390fd5b61324c816123d7565b1561328c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613283906156b5565b60405180910390fd5b61329860008383612f53565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132e89190615a16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006133c28473ffffffffffffffffffffffffffffffffffffffff16613a13565b1561352b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133eb612443565b8786866040518563ffffffff1660e01b815260040161340d9493929190615547565b602060405180830381600087803b15801561342757600080fd5b505af192505050801561345857506040513d601f19601f820116820180604052508101906134559190613f66565b60015b6134db573d8060008114613488576040519150601f19603f3d011682016040523d82523d6000602084013e61348d565b606091505b506000815114156134d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ca90615695565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613530565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613593846113d8565b61359d9190615ba5565b9050600060076000848152602001908152602001600020549050818114613682576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137079190615ba5565b905060006009600084815260200190815260200160002054905060006008838154811061375d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106137a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061381a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613841836113d8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60606000805b60128460ff16600881106138f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01805490508160ff161015613a0757600060128560ff1660088110613946577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018260ff1681548110613982577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508261ffff1686101580156139ca575080836139c391906159de565b61ffff1686105b156139e5576139db8260ff16612b35565b9350505050613a0d565b80836139f191906159de565b92505080806139ff90615d84565b9150506138bb565b50600080fd5b92915050565b600080823b905060008111915050919050565b6040518061030001604052806018905b613a3e613ada565b815260200190600190039081613a365790505090565b828054613a6090615cde565b90600052602060002090601f016020900481019282613a825760008555613ac9565b82601f10613a9b57805160ff1916838001178555613ac9565b82800160010185558215613ac9579182015b82811115613ac8578251825591602001919060010190613aad565b5b509050613ad69190613afd565b5090565b604051806103000160405280601890602082028036833780820191505090505090565b5b80821115613b16576000816000905550600101613afe565b5090565b6000613b2d613b28846158c1565b615890565b9050808382526020820190508260005b85811015613b6d5781358501613b538882613cc5565b845260208401935060208301925050600181019050613b3d565b5050509392505050565b6000613b8a613b85846158ed565b615890565b905082815260208101848484011115613ba257600080fd5b613bad848285615c9c565b509392505050565b6000613bc8613bc38461591d565b615890565b905082815260208101848484011115613be057600080fd5b613beb848285615c9c565b509392505050565b600081359050613c0281615ee7565b92915050565b600082601f830112613c1957600080fd5b8135613c29848260208601613b1a565b91505092915050565b600081359050613c4181615efe565b92915050565b600081359050613c5681615f15565b92915050565b600081519050613c6b81615f15565b92915050565b600082601f830112613c8257600080fd5b8135613c92848260208601613b77565b91505092915050565b600082601f830112613cac57600080fd5b8135613cbc848260208601613bb5565b91505092915050565b600060808284031215613cd757600080fd5b613ce16080615890565b9050600082013567ffffffffffffffff811115613cfd57600080fd5b613d0984828501613c9b565b600083015250602082013567ffffffffffffffff811115613d2957600080fd5b613d3584828501613c9b565b602083015250604082013567ffffffffffffffff811115613d5557600080fd5b613d6184828501613c9b565b6040830152506060613d7584828501613d81565b60608301525092915050565b600081359050613d9081615f2c565b92915050565b600060208284031215613da857600080fd5b6000613db684828501613bf3565b91505092915050565b60008060408385031215613dd257600080fd5b6000613de085828601613bf3565b9250506020613df185828601613bf3565b9150509250929050565b600080600060608486031215613e1057600080fd5b6000613e1e86828701613bf3565b9350506020613e2f86828701613bf3565b9250506040613e4086828701613d81565b9150509250925092565b60008060008060808587031215613e6057600080fd5b6000613e6e87828801613bf3565b9450506020613e7f87828801613bf3565b9350506040613e9087828801613d81565b925050606085013567ffffffffffffffff811115613ead57600080fd5b613eb987828801613c71565b91505092959194509250565b60008060408385031215613ed857600080fd5b6000613ee685828601613bf3565b9250506020613ef785828601613c32565b9150509250929050565b60008060408385031215613f1457600080fd5b6000613f2285828601613bf3565b9250506020613f3385828601613d81565b9150509250929050565b600060208284031215613f4f57600080fd5b6000613f5d84828501613c47565b91505092915050565b600060208284031215613f7857600080fd5b6000613f8684828501613c5c565b91505092915050565b600060208284031215613fa157600080fd5b600082013567ffffffffffffffff811115613fbb57600080fd5b613fc784828501613c9b565b91505092915050565b600060208284031215613fe257600080fd5b6000613ff084828501613d81565b91505092915050565b6000806040838503121561400c57600080fd5b600061401a85828601613d81565b925050602083013567ffffffffffffffff81111561403757600080fd5b61404385828601613c08565b9150509250929050565b6000806040838503121561406057600080fd5b600061406e85828601613d81565b925050602061407f85828601613d81565b9150509250929050565b6000614095838361525c565b60208301905092915050565b6140aa81615c0d565b82525050565b6140c16140bc82615c0d565b615dae565b82525050565b60006140d282615972565b6140dc81856159a0565b93506140e78361594d565b8060005b838110156141185781516140ff8882614089565b975061410a83615993565b9250506001810190506140eb565b5085935050505092915050565b61412e81615c1f565b82525050565b600061413f8261597d565b61414981856159b1565b9350614159818560208601615cab565b61416281615ec9565b840191505092915050565b600061417882615988565b61418281856159c2565b9350614192818560208601615cab565b61419b81615ec9565b840191505092915050565b60006141b182615988565b6141bb81856159d3565b93506141cb818560208601615cab565b80840191505092915050565b600081546141e481615cde565b6141ee81866159d3565b94506001821660008114614209576001811461421a5761424d565b60ff1983168652818601935061424d565b6142238561595d565b60005b8381101561424557815481890152600182019150602081019050614226565b838801955050505b50505092915050565b60006142636005836159d3565b91507f2720793d270000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006142a3609a836159d3565b91507f222c20226465736372697074696f6e223a2022636d794b61747a20697320612060008301527f636f6c6c656374696f6e206f662031302c30303020756e69717565206361747360208301527f2e20416c6c20746865206d6574616461746120616e6420696d6167657320737460408301527f6f7265642031303025206f6e2d636861696e2e222c2022696d616765223a202260608301527f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000006080830152609a82019050919050565b600061437b602b836159c2565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006143e16032836159c2565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006144476068836159d3565b91507f3c7376672069643d22632220786d6c6e733d22687474703a2f2f7777772e773360008301527f2e6f72672f323030302f7376672220707265736572766541737065637452617460208301527f696f3d22784d696e594d696e206d656574222076696577426f783d223020302060408301527f3234203234223e200000000000000000000000000000000000000000000000006060830152606882019050919050565b60006144f9601c836159c2565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006145396005836159d3565b91507f2720783d270000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000614579600f836159d3565b91507f222c2261747472696275746573223a00000000000000000000000000000000006000830152600f82019050919050565b60006145b96001836159d3565b91507f2c000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145f9600e836159d3565b91507f3c7265637420636c6173733d27630000000000000000000000000000000000006000830152600e82019050919050565b60006146396024836159c2565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061469f6019836159c2565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006146df600f836159d3565b91507f7b2274726169745f74797065223a2200000000000000000000000000000000006000830152600f82019050919050565b600061471f602c836159c2565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147856003836159d3565b91507f272f3e00000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b60006147c56038836159c2565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061482b602a836159c2565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148916029836159c2565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006148f86103f8836159d3565b91507f3c7374796c653e726563747b77696474683a3170783b6865696768743a31707860008301527f3b7d23637b73686170652d72656e646572696e673a206372697370656467657360208301527f3b7d2e6330307b66696c6c3a236636373637627d2e6330317b66696c6c3a236660408301527f66666666667d2e6330327b66696c6c3a233030303030307d2e6330337b66696c60608301527f6c3a236331303038627d2e6330347b66696c6c3a236463303039657d2e63303560808301527f7b66696c6c3a236566303061397d2e6330367b66696c6c3a236666303034337d60a08301527f2e6330377b66696c6c3a236337343234397d2e6330387b66696c6c3a2361613360c08301527f3433617d2e6330397b66696c6c3a233336333733377d2e6331307b66696c6c3a60e08301527f233163316331637d2e6331317b66696c6c3a233263326332637d2e6331327b666101008301527f696c6c3a233661396363357d2e6331337b66696c6c3a233966643266637d2e636101208301527f31347b66696c6c3a236364363130307d2e6331357b66696c6c3a2332663266326101408301527f667d2e6331367b66696c6c3a236664373530307d2e6331377b66696c6c3a23666101608301527f36386432667d2e6331387b66696c6c3a233437343734377d2e6331397b66696c6101808301527f6c3a233538353835387d2e6332307b66696c6c3a233234323432347d2e6332316101a08301527f7b66696c6c3a233963376436617d2e6332327b66696c6c3a233365336533657d6101c08301527f2e6332337b66696c6c3a233230323032307d2e6332347b66696c6c3a236230356101e08301527f3531347d2e6332357b66696c6c3a233733336533397d2e6332367b66696c6c3a6102008301527f236632643030307d2e6332377b66696c6c3a236633646430307d2e6332387b666102208301527f696c6c3a236363636363647d2e6332397b66696c6c3a236461643464327d2e636102408301527f33307b66696c6c3a236563653365307d2e6333317b66696c6c3a2330306164636102608301527f307d2e6333327b66696c6c3a233030623863637d2e6333337b66696c6c3a23306102808301527f30633464627d2e6333347b66696c6c3a233463336232667d2e6333357b66696c6102a08301527f6c3a233639353033387d2e6333367b66696c6c3a236235383135327d2e6333376102c08301527f7b66696c6c3a233030386339627d2e6333387b66696c6c3a236335633564627d6102e08301527f2e6333397b66696c6c3a233030643666667d2e6334307b66696c6c3a236466336103008301527f3435337d2e6334317b66696c6c3a236434623530307d2e6334327b66696c6c3a6103208301527f233532333734377d2e6334337b66696c6c3a233366343034337d2e6334347b666103408301527f696c6c3a233566356535637d2e6334357b66696c6c3a236336396539347d2e636103608301527f34367b66696c6c3a236131393538637d2e6334377b66696c6c3a2339383138376103808301527f307d2e6334387b66696c6c3a236362626130307d2e6334397b66696c6c3a23646103a08301527f66636330307d2e6335307b66696c6c3a233133613732657d2e6335317b66696c6103c08301527f6c3a233063386132347d3c2f7374796c653e3c2f7376673e00000000000000006103e08301526103f882019050919050565b6000614deb6002836159d3565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000614e2b6020836159c2565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614e6b6001836159d3565b91507f7d000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614eab602c836159c2565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614f116001836159d3565b91507f5b000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614f516029836159c2565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fb7600b836159d3565b91507f222c2276616c7565223a220000000000000000000000000000000000000000006000830152600b82019050919050565b6000614ff76001836159d3565b91507f5d000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006150376021836159c2565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061509d601d836159d3565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b60006150dd6031836159c2565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006151436001836159d3565b91507f31000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006151836001836159c2565b91507f74000000000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151c3602c836159c2565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006152296013836159d3565b91507f7b226e616d65223a2022636d794b61747a2023000000000000000000000000006000830152601382019050919050565b61526581615c85565b82525050565b61527481615c85565b82525050565b61528b61528682615c85565b615dd2565b82525050565b600061529d82846141a6565b915081905092915050565b60006152b482856141a6565b91506152c082846141a6565b91508190509392505050565b60006152d882846141a6565b91506152e3826145ac565b915081905092915050565b60006152fa82876141a6565b9150615305826145ec565b915061531182866141a6565b915061531c8261452c565b915061532882856141a6565b915061533382614256565b915061533f82846141a6565b915061534a82614778565b915081905095945050505050565b600061536482866141a6565b915061536f826146d2565b915061537b82856141d7565b915061538682614faa565b915061539282846141d7565b915061539d82614dde565b9150819050949350505050565b60006153b682846141d7565b915081905092915050565b60006153cc8261443a565b91506153d882846141a6565b91506153e3826148ea565b915081905092915050565b60006153f982614f04565b915061540582846141a6565b915061541082614fea565b915081905092915050565b600061542682615090565b915061543282846141a6565b915081905092915050565b600061544882615136565b915061545482846141a6565b915081905092915050565b600061546a8261521c565b915061547682866141a6565b915061548182614296565b915061548d82856141a6565b91506154988261456c565b91506154a482846141a6565b91506154af82614e5e565b9150819050949350505050565b60006154c8828961527a565b6020820191506154d8828861527a565b6020820191506154e8828761527a565b6020820191506154f882866140b0565b601482019150615508828561527a565b602082019150615518828461527a565b602082019150819050979650505050505050565b600060208201905061554160008301846140a1565b92915050565b600060808201905061555c60008301876140a1565b61556960208301866140a1565b615576604083018561526b565b81810360608301526155888184614134565b905095945050505050565b60006040820190506155a860008301856140a1565b6155b5602083018461526b565b9392505050565b600060208201905081810360008301526155d681846140c7565b905092915050565b60006020820190506155f36000830184614125565b92915050565b60006020820190508181036000830152615613818461416d565b905092915050565b60006080820190508181036000830152615635818761416d565b90508181036020830152615649818661416d565b9050818103604083015261565d818561416d565b905061566c606083018461526b565b95945050505050565b6000602082019050818103600083015261568e8161436e565b9050919050565b600060208201905081810360008301526156ae816143d4565b9050919050565b600060208201905081810360008301526156ce816144ec565b9050919050565b600060208201905081810360008301526156ee8161462c565b9050919050565b6000602082019050818103600083015261570e81614692565b9050919050565b6000602082019050818103600083015261572e81614712565b9050919050565b6000602082019050818103600083015261574e816147b8565b9050919050565b6000602082019050818103600083015261576e8161481e565b9050919050565b6000602082019050818103600083015261578e81614884565b9050919050565b600060208201905081810360008301526157ae81614e1e565b9050919050565b600060208201905081810360008301526157ce81614e9e565b9050919050565b600060208201905081810360008301526157ee81614f44565b9050919050565b6000602082019050818103600083015261580e8161502a565b9050919050565b6000602082019050818103600083015261582e816150d0565b9050919050565b6000602082019050818103600083015261584e81615176565b9050919050565b6000602082019050818103600083015261586e816151b6565b9050919050565b600060208201905061588a600083018461526b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156158b7576158b6615e9a565b5b8060405250919050565b600067ffffffffffffffff8211156158dc576158db615e9a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561590857615907615e9a565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561593857615937615e9a565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006159e982615c57565b91506159f483615c57565b92508261ffff03821115615a0b57615a0a615e0d565b5b828201905092915050565b6000615a2182615c85565b9150615a2c83615c85565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615a6157615a60615e0d565b5b828201905092915050565b6000615a7782615c8f565b9150615a8283615c8f565b92508260ff03821115615a9857615a97615e0d565b5b828201905092915050565b6000615aae82615c85565b9150615ab983615c85565b925082615ac957615ac8615e3c565b5b828204905092915050565b6000615adf82615c57565b9150615aea83615c57565b92508161ffff0483118215151615615b0557615b04615e0d565b5b828202905092915050565b6000615b1b82615c85565b9150615b2683615c85565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615b5f57615b5e615e0d565b5b828202905092915050565b6000615b7582615c8f565b9150615b8083615c8f565b92508160ff0483118215151615615b9a57615b99615e0d565b5b828202905092915050565b6000615bb082615c85565b9150615bbb83615c85565b925082821015615bce57615bcd615e0d565b5b828203905092915050565b6000615be482615c8f565b9150615bef83615c8f565b925082821015615c0257615c01615e0d565b5b828203905092915050565b6000615c1882615c65565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615cc9578082015181840152602081019050615cae565b83811115615cd8576000848401525b50505050565b60006002820490506001821680615cf657607f821691505b60208210811415615d0a57615d09615e6b565b5b50919050565b6000615d1b82615c57565b915061ffff821415615d3057615d2f615e0d565b5b600182019050919050565b6000615d4682615c85565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615d7957615d78615e0d565b5b600182019050919050565b6000615d8f82615c8f565b915060ff821415615da357615da2615e0d565b5b600182019050919050565b6000615db982615dc0565b9050919050565b6000615dcb82615eda565b9050919050565b6000819050919050565b6000615de782615c85565b9150615df283615c85565b925082615e0257615e01615e3c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b615ef081615c0d565b8114615efb57600080fd5b50565b615f0781615c1f565b8114615f1257600080fd5b50565b615f1e81615c2b565b8114615f2957600080fd5b50565b615f3581615c85565b8114615f4057600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122085b251d88372d1b8b5902e4ec923a693658af6a89471f3a642350b5cfb99afc264736f6c63430008000033

Deployed Bytecode Sourcemap

47070:18281:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61967:552;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33676:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20798:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22357:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21880:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34316:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23247:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33984:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47380:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;51595:596;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53822:145;;;;;;;;;;;;;:::i;:::-;;23657:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62687:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34506:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20492:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59458:899;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20222:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53230:187;;;;;;;;;;;;;:::i;:::-;;55260:4133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64871:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52905:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20967:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47303:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22650:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52755:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23913:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53520:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60512:1321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64280:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23016:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65081:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61967:552;62057:13;62088:23;62114:13;:23;62128:8;62114:23;;;;;;;;;;;62088:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62238:42;62217:63;;:17;62225:8;62217:7;:17::i;:::-;:63;;;62213:270;;;62399:38;62421:9;62432:1;62435;62399:21;:38::i;:::-;62334:122;;;;;;;;:::i;:::-;;;;;;;;;;;;;62297:174;;62213:270;62502:9;62495:16;;;61967:552;;;:::o;33676:224::-;33778:4;33817:35;33802:50;;;:11;:50;;;;:90;;;;33856:36;33880:11;33856:23;:36::i;:::-;33802:90;33795:97;;33676:224;;;:::o;20798:100::-;20852:13;20885:5;20878:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20798:100;:::o;22357:221::-;22433:7;22461:16;22469:7;22461;:16::i;:::-;22453:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22546:15;:24;22562:7;22546:24;;;;;;;;;;;;;;;;;;;;;22539:31;;22357:221;;;:::o;21880:411::-;21961:13;21977:23;21992:7;21977:14;:23::i;:::-;21961:39;;22025:5;22019:11;;:2;:11;;;;22011:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22119:5;22103:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22128:37;22145:5;22152:12;:10;:12::i;:::-;22128:16;:37::i;:::-;22103:62;22081:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22262:21;22271:2;22275:7;22262:8;:21::i;:::-;21880:411;;;:::o;34316:113::-;34377:7;34404:10;:17;;;;34397:24;;34316:113;:::o;23247:339::-;23442:41;23461:12;:10;:12::i;:::-;23475:7;23442:18;:41::i;:::-;23434:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23550:28;23560:4;23566:2;23570:7;23550:9;:28::i;:::-;23247:339;;;:::o;33984:256::-;34081:7;34117:23;34134:5;34117:16;:23::i;:::-;34109:5;:31;34101:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34206:12;:19;34219:5;34206:19;;;;;;;;;;;;;;;:26;34226:5;34206:26;;;;;;;;;;;;34199:33;;33984:256;;;;:::o;47380:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51595:596::-;51644:7;51664:20;51687:13;:11;:13::i;:::-;51664:36;;51733:4;51717:12;:20;51713:52;;51746:19;51739:26;;;;;51713:52;51795:4;51780:12;:19;:43;;;;;51819:4;51803:12;:20;;51780:43;51776:88;;;51845:19;51838:26;;;;;51776:88;51894:4;51879:12;:19;:43;;;;;51918:4;51902:12;:20;;51879:43;51875:88;;;51944:19;51937:26;;;;;51875:88;51993:4;51978:12;:19;:43;;;;;52017:4;52001:12;:20;;51978:43;51974:88;;;52043:19;52036:26;;;;;51974:88;52092:4;52077:12;:19;:44;;;;;52116:5;52100:12;:21;;52077:44;52073:89;;;52143:19;52136:26;;;;;52073:89;52175:8;;;51595:596;;:::o;53822:145::-;65317:10;65307:20;;:6;;;;;;;;;;;:20;;;65299:29;;;;;;53870:15:::1;53888:21;53870:39;;53930:10;53922:28;;:37;53951:7;53922:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65339:1;53822:145::o:0;23657:185::-;23795:39;23812:4;23818:2;23822:7;23795:39;;;;;;;;;;;;:16;:39::i;:::-;23657:185;;;:::o;62687:380::-;62775:16;62809:18;62830;62840:7;62830:9;:18::i;:::-;62809:39;;62861:25;62903:10;62889:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62861:53;;62930:9;62925:109;62945:10;62941:1;:14;62925:109;;;62991:31;63011:7;63020:1;62991:19;:31::i;:::-;62977:8;62986:1;62977:11;;;;;;;;;;;;;;;;;;;;;:45;;;;;62957:3;;;;;:::i;:::-;;;;62925:109;;;;63051:8;63044:15;;;;62687:380;;;:::o;34506:233::-;34581:7;34617:30;:28;:30::i;:::-;34609:5;:38;34601:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34714:10;34725:5;34714:17;;;;;;;;;;;;;;;;;;;;;;;;34707:24;;34506:233;;;:::o;20492:239::-;20564:7;20584:13;20600:7;:16;20608:7;20600:16;;;;;;;;;;;;;;;;;;;;;20584:32;;20652:1;20635:19;;:5;:19;;;;20627:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20718:5;20711:12;;;20492:239;;;:::o;59458:899::-;59551:13;59582:28;59628:7;59623:657;59645:1;59641;:5;;;59623:657;;;59672:20;59695:92;59734:38;59756:5;59763:1;59734:38;;59770:1;59766;:5;;;;:::i;:::-;59734:38;;:21;:38::i;:::-;59695:20;:92::i;:::-;59672:115;;59885:14;59962:10;:13;59973:1;59962:13;;;;;;;;;;;;;59976:14;59962:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;:39;;60060:10;:13;60071:1;60060:13;;;;;;;;;;;;;60074:14;60060:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;:39;;59846:299;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59804:356;;60186:1;60181;:6;;;60177:91;;60247:14;60230:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;60206:62;;60177:91;59623:657;59648:3;;;;;:::i;:::-;;;;59623:657;;;;60328:14;60306:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;60292:57;;;59458:899;;;:::o;20222:208::-;20294:7;20339:1;20322:19;;:5;:19;;;;20314:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20406:9;:16;20416:5;20406:16;;;;;;;;;;;;;;;;20399:23;;20222:208;;;:::o;53230:187::-;53323:12;;;;;;;;;;;53316:29;;;53346:10;53358:18;:16;:18::i;:::-;53316:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53395:14;:12;:14::i;:::-;53230:187::o;55260:4133::-;55348:13;55379:23;55413:32;;:::i;:::-;55463:7;55458:1339;55480:1;55476;:5;;;55458:1339;;;55504:20;55527:92;55566:38;55588:5;55595:1;55566:38;;55602:1;55598;:5;;;;:::i;:::-;55566:38;;:21;:38::i;:::-;55527:20;:92::i;:::-;55504:115;;55659:8;55636:1150;55694:10;:13;55705:1;55694:13;;;;;;;;;;;;;55708:14;55694:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;55690:1;:44;;;55636:1150;;;55796:23;55822:159;55866:10;:13;55877:1;55866:13;;;;;;;;;;;;;55880:14;55866:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;55822:159;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55929:1;55925;:5;;;;:::i;:::-;55822:159;;55961:1;55957;55953;:5;;;;:::i;:::-;:9;;;;:::i;:::-;55822:159;;:21;:159::i;:::-;55796:185;;56002:7;56012:94;56049:38;56071:9;56082:1;56085;56049:21;:38::i;:::-;56012:14;:94::i;:::-;56002:104;;56125:7;56135:94;56172:38;56194:9;56205:1;56208;56172:21;:38::i;:::-;56135:14;:94::i;:::-;56125:104;;56254:12;56267:1;56254:15;;;;;;;;;;;;;;;;;;;;;56270:1;56254:18;;;;;;;;;;;;;;;;;;;;;56250:32;;;56274:8;;;;;56250:32;56387:9;56466:38;56488:9;56499:1;56502;56466:21;:38::i;:::-;56565:12;:1;:10;;;:12::i;:::-;56638;:1;:10;;;:12::i;:::-;56344:361;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56303:421;;56766:4;56745:12;56758:1;56745:15;;;;;;;;;;;;;;;;;;;;;56761:1;56745:18;;;;;;;;;;;;;;;;;;;;:25;;;;;;;;;;;55636:1150;;;;55758:3;;;;;:::i;:::-;;;;55636:1150;;;;55458:1339;55483:3;;;;;:::i;:::-;;;;55458:1339;;;;57002:9;56842:2503;;;;;;;;:::i;:::-;;;;;;;;;;;;;56809:2547;;59376:9;59369:16;;;;55260:4133;;;:::o;64871:112::-;65317:10;65307:20;;:6;;;;;;;;;;;:20;;;65299:29;;;;;;64962:13:::1;64947:12;;:28;;;;;;;;;;;;;;;;;;64871:112:::0;:::o;52905:273::-;52983:1;52974:6;:10;:26;;;;;52998:2;52988:6;:12;;52974:26;52973:61;;;;;53028:5;;53019:6;:14;;;;:::i;:::-;53006:9;:27;52973:61;:97;;;;;53055:14;;53039:13;:11;:13::i;:::-;:30;52973:97;52965:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;53101:9;53097:74;53117:6;53114:1;:9;53097:74;;;53145:14;:12;:14::i;:::-;53125:3;;;;;:::i;:::-;;;;53097:74;;;;52905:273;:::o;20967:104::-;21023:13;21056:7;21049:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20967:104;:::o;47303:40::-;;;;:::o;22650:295::-;22765:12;:10;:12::i;:::-;22753:24;;:8;:24;;;;22745:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22865:8;22820:18;:32;22839:12;:10;:12::i;:::-;22820:32;;;;;;;;;;;;;;;:42;22853:8;22820:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22918:8;22889:48;;22904:12;:10;:12::i;:::-;22889:48;;;22928:8;22889:48;;;;;;:::i;:::-;;;;;;;;22650:295;;:::o;52755:93::-;65317:10;65307:20;;:6;;;;;;;;;;;:20;;;65299:29;;;;;;52831:9:::1;52823:5;:17;;;;52755:93:::0;:::o;23913:328::-;24088:41;24107:12;:10;:12::i;:::-;24121:7;24088:18;:41::i;:::-;24080:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24194:39;24208:4;24214:2;24218:7;24227:5;24194:13;:39::i;:::-;23913:328;;;;:::o;53520:292::-;53606:10;53585:31;;:17;53593:8;53585:7;:17::i;:::-;:31;;;53577:40;;;;;;53652:125;53676:10;53701:42;53758:8;53652:9;:125::i;:::-;53790:14;:12;:14::i;:::-;53520:292;:::o;60512:1321::-;60614:13;60653:17;60661:8;60653:7;:17::i;:::-;60645:26;;;;;;60684:23;60710:24;60725:8;60710:14;:24::i;:::-;60684:50;;60885:906;61122:30;61143:8;61122:20;:30::i;:::-;61386:127;61453:20;61463:9;61453;:20::i;:::-;61386:18;:127::i;:::-;61608:25;61623:9;61608:14;:25::i;:::-;61007:703;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60885:18;:906::i;:::-;60792:1018;;;;;;;;:::i;:::-;;;;;;;;;;;;;60747:1078;;;60512:1321;;;:::o;64280:474::-;65317:10;65307:20;;:6;;;;;;;;;;;:20;;;65299:29;;;;;;64406:9:::1;64401:327;64425:6;:13;64421:1;:17;64401:327;;;64460:10;:27;64471:15;64460:27;;;;;;;;;;;64511:190;;;;;;;;64539:6;64546:1;64539:9;;;;;;;;;;;;;;;;;;;;;;:19;;;64511:190;;;;64581:6;64588:1;64581:9;;;;;;;;;;;;;;;;;;;;;;:19;;;64511:190;;;;64623:6;64630:1;64623:9;;;;;;;;;;;;;;;;;;;;;;:16;;;64511:190;;;;64662:6;64669:1;64662:9;;;;;;;;;;;;;;;;;;;;;;:20;;;64511:190;;::::0;64460:256:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;64440:3;;;;;:::i;:::-;;;;64401:327;;;;64280:474:::0;;:::o;23016:164::-;23113:4;23137:18;:25;23156:5;23137:25;;;;;;;;;;;;;;;:35;23163:8;23137:35;;;;;;;;;;;;;;;;;;;;;;;;;23130:42;;23016:164;;;;:::o;65081:100::-;65317:10;65307:20;;:6;;;;;;;;;;;:20;;;65299:29;;;;;;65164:9:::1;65155:6;;:18;;;;;;;;;;;;;;;;;;65081:100:::0;:::o;46244:419::-;46377:13;46403:21;46433:3;46403:34;;46448:19;46491:10;46480:8;:21;;;;:::i;:::-;46470:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46448:54;;46518:9;46530:10;46518:22;;46513:111;46546:8;46542:1;:12;46513:111;;;46601:8;46610:1;46601:11;;;;;;;;;;;;;;;;;;;;;;;;46576:6;46587:10;46583:1;:14;;;;:::i;:::-;46576:22;;;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;46556:3;;;;;:::i;:::-;;;;46513:111;;;;46648:6;46634:21;;;;46244:419;;;;;:::o;19853:305::-;19955:4;20007:25;19992:40;;;:11;:40;;;;:105;;;;20064:33;20049:48;;;:11;:48;;;;19992:105;:158;;;;20114:36;20138:11;20114:23;:36::i;:::-;19992:158;19972:178;;19853:305;;;:::o;25751:127::-;25816:4;25868:1;25840:30;;:7;:16;25848:7;25840:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25833:37;;25751:127;;;:::o;15550:98::-;15603:7;15630:10;15623:17;;15550:98;:::o;29733:174::-;29835:2;29808:15;:24;29824:7;29808:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29891:7;29887:2;29853:46;;29862:23;29877:7;29862:14;:23::i;:::-;29853:46;;;;;;;;;;;;29733:174;;:::o;26045:348::-;26138:4;26163:16;26171:7;26163;:16::i;:::-;26155:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26239:13;26255:23;26270:7;26255:14;:23::i;:::-;26239:39;;26308:5;26297:16;;:7;:16;;;:51;;;;26341:7;26317:31;;:20;26329:7;26317:11;:20::i;:::-;:31;;;26297:51;:87;;;;26352:32;26369:5;26376:7;26352:16;:32::i;:::-;26297:87;26289:96;;;26045:348;;;;:::o;29037:578::-;29196:4;29169:31;;:23;29184:7;29169:14;:23::i;:::-;:31;;;29161:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29279:1;29265:16;;:2;:16;;;;29257:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29335:39;29356:4;29362:2;29366:7;29335:20;:39::i;:::-;29439:29;29456:1;29460:7;29439:8;:29::i;:::-;29500:1;29481:9;:15;29491:4;29481:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29529:1;29512:9;:13;29522:2;29512:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29560:2;29541:7;:16;29549:7;29541:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29599:7;29595:2;29580:27;;29589:4;29580:27;;;;;;;;;;;;29037:578;;;:::o;45733:503::-;45819:16;45853:20;45882:2;45853:32;;45896:10;45926:7;45921:286;45943:7;:14;45939:1;:18;;;45921:286;;;46030:2;46014:7;46022:1;46014:10;;;;;;;;;;;;;;;;;;;;;;;;;;46008:17;;46002:30;;;;46001:85;;;;;46083:2;46067:7;46075:1;46067:10;;;;;;;;;;;;;;;;;;;;;;;;;;46061:17;;46055:30;;;;46001:85;45979:217;;;46129:2;46121:10;;;;;:::i;:::-;;;46178:2;46164:7;46172:1;46164:10;;;;;;;;;;;;;;;;;;;;;;;;;;46158:17;;:22;;;;:::i;:::-;46150:30;;;;;:::i;:::-;;;45979:217;45959:3;;;;;:::i;:::-;;;;45921:286;;;;46224:4;46217:11;;;;45733:503;;;:::o;52280:412::-;52324:20;52347:13;:11;:13::i;:::-;52324:36;;52394:10;;52379:12;:25;52371:34;;;;;;52425;52448:10;52425:22;:34::i;:::-;52424:35;52416:44;;;;;;52473:19;52495:12;52473:34;;52549:32;52554:11;52567:10;52579:1;52549:4;:32::i;:::-;52520:13;:26;52534:11;52520:26;;;;;;;;;;;:61;;;;;;;;;;;;:::i;:::-;;52637:4;52594:12;52607:13;:26;52621:11;52607:26;;;;;;;;;;;52594:40;;;;;;:::i;:::-;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;52654:30;52660:10;52672:11;52654:5;:30::i;:::-;52280:412;;:::o;54822:378::-;54924:5;54952:7;54962:1;54952:11;;54947:227;54969:7;:14;;;;54965:1;:18;;;54947:227;;;55117:12;55099:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;55089:43;;;;;;55055:7;55063:1;55055:10;;;;;;;;;;;;;;;;;;;;;;;;;55037:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;55027:41;;;;;;:105;55005:157;;;55160:1;55156;:5;;;;:::i;:::-;55148:14;;;;;55005:157;54985:3;;;;;:::i;:::-;;;;54947:227;;;;55184:8;;;54822:378;;;;:::o;45193:532::-;45249:13;45288:1;45279:5;:10;45275:53;;;45306:10;;;;;;;;;;;;;;;;;;;;;45275:53;45338:12;45353:5;45338:20;;45369:14;45394:78;45409:1;45401:4;:9;45394:78;;45427:8;;;;;:::i;:::-;;;;45458:2;45450:10;;;;;:::i;:::-;;;45394:78;;;45482:19;45514:6;45504:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45482:39;;45532:154;45548:1;45539:5;:10;45532:154;;45576:1;45566:11;;;;;:::i;:::-;;;45643:2;45635:5;:10;;;;:::i;:::-;45622:2;:24;;;;:::i;:::-;45609:39;;45592:6;45599;45592:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;45672:2;45663:11;;;;;:::i;:::-;;;45532:154;;;45710:6;45696:21;;;;;45193:532;;;;:::o;25123:315::-;25280:28;25290:4;25296:2;25300:7;25280:9;:28::i;:::-;25327:48;25350:4;25356:2;25360:7;25369:5;25327:22;:48::i;:::-;25319:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25123:315;;;;:::o;42831:2256::-;42889:13;42934:1;42919:4;:11;:16;42915:31;;;42937:9;;;;;;;;;;;;;;;;42915:31;42998:19;43020:5;;;;;;;;;;;;;;;;;42998:27;;43077:18;43123:1;43118;43104:4;:11;:15;;;;:::i;:::-;43103:21;;;;:::i;:::-;43098:1;:27;;;;:::i;:::-;43077:48;;43208:20;43255:2;43242:10;:15;;;;:::i;:::-;43231:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43208:50;;43355:10;43347:6;43340:26;43450:1;43443:5;43439:13;43509:4;43560;43554:11;43545:7;43541:25;43656:2;43648:6;43644:15;43729:1045;43764:6;43755:7;43752:19;43729:1045;;;43834:1;43825:7;43821:15;43810:26;;43908:7;43902:14;44085:4;44077:5;44073:2;44069:14;44065:25;44055:8;44051:40;44045:47;44040:3;44036:57;44004:9;43975:137;44158:1;44147:9;44143:17;44130:30;;44288:4;44280:5;44276:2;44272:14;44268:25;44258:8;44254:40;44248:47;44243:3;44239:57;44207:9;44178:137;44361:1;44350:9;44346:17;44333:30;;44490:4;44482:5;44479:1;44475:13;44471:24;44461:8;44457:39;44451:46;44446:3;44442:56;44410:9;44381:136;44563:1;44552:9;44548:17;44535:30;;44684:4;44677:5;44673:16;44663:8;44659:31;44653:38;44648:3;44644:48;44612:9;44583:128;44757:1;44746:9;44742:17;44729:30;;43791:983;43729:1045;;;44847:1;44840:4;44834:11;44830:19;44868:1;44863:84;;;;44966:1;44961:82;;;;44823:220;;44863:84;44924:6;44919:3;44915:16;44911:1;44900:9;44896:17;44889:43;44863:84;;44961:82;45022:4;45017:3;45013:14;45009:1;44998:9;44994:17;44987:41;44823:220;;43280:1774;;;;45073:6;45066:13;;;;;42831:2256;;;;:::o;18457:157::-;18542:4;18581:25;18566:40;;;:11;:40;;;;18559:47;;18457:157;;;:::o;35352:589::-;35496:45;35523:4;35529:2;35533:7;35496:26;:45::i;:::-;35574:1;35558:18;;:4;:18;;;35554:187;;;35593:40;35625:7;35593:31;:40::i;:::-;35554:187;;;35663:2;35655:10;;:4;:10;;;35651:90;;35682:47;35715:4;35721:7;35682:32;:47::i;:::-;35651:90;35554:187;35769:1;35755:16;;:2;:16;;;35751:183;;;35788:45;35825:7;35788:36;:45::i;:::-;35751:183;;;35861:4;35855:10;;:2;:10;;;35851:83;;35882:40;35910:2;35914:7;35882:27;:40::i;:::-;35851:83;35751:183;35352:589;;;:::o;46671:387::-;46731:4;46939:12;47006:7;46994:20;46986:28;;47049:1;47042:4;:8;47035:15;;;46671:387;;;:::o;50399:1117::-;50501:13;50540:2;50535;:7;50527:16;;;;;;50701:25;:31;;;;;;;;;;;;;;;;;;;50750:7;50745:662;50767:1;50763;:5;;;50745:662;;;50790:10;;:12;;;;;;;;;:::i;:::-;;;;;;50817:17;51249:5;50975:15;51021:16;51068:2;51101;51134;51167:10;;50928:276;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50892:335;;;;;;50862:384;;:392;;;;:::i;:::-;50817:452;;51342:11;51355:24;51365:10;51355:24;;51377:1;51355:9;:24::i;:::-;51325:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51286:109;;50745:662;50770:3;;;;;:::i;:::-;;;;50745:662;;;;51423:12;51436:11;51423:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;51419:58;;;51457:20;51462:2;51466;51475:1;51470:2;:6;;;;:::i;:::-;51457:4;:20::i;:::-;51450:27;;;;;51419:58;51497:11;51490:18;;;50399:1117;;;;;;:::o;27729:382::-;27823:1;27809:16;;:2;:16;;;;27801:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27882:16;27890:7;27882;:16::i;:::-;27881:17;27873:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27944:45;27973:1;27977:2;27981:7;27944:20;:45::i;:::-;28019:1;28002:9;:13;28012:2;28002:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28050:2;28031:7;:16;28039:7;28031:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28095:7;28091:2;28070:33;;28087:1;28070:33;;;;;;;;;;;;27729:382;;:::o;30472:799::-;30627:4;30648:15;:2;:13;;;:15::i;:::-;30644:620;;;30700:2;30684:36;;;30721:12;:10;:12::i;:::-;30735:4;30741:7;30750:5;30684:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30680:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30943:1;30926:6;:13;:18;30922:272;;;30969:60;;;;;;;;;;:::i;:::-;;;;;;;;30922:272;31144:6;31138:13;31129:6;31125:2;31121:15;31114:38;30680:529;30817:41;;;30807:51;;;:6;:51;;;;30800:58;;;;;30644:620;31248:4;31241:11;;30472:799;;;;;;;:::o;31843:126::-;;;;:::o;36664:164::-;36768:10;:17;;;;36741:15;:24;36757:7;36741:24;;;;;;;;;;;:44;;;;36796:10;36812:7;36796:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36664:164;:::o;37455:988::-;37721:22;37771:1;37746:22;37763:4;37746:16;:22::i;:::-;:26;;;;:::i;:::-;37721:51;;37783:18;37804:17;:26;37822:7;37804:26;;;;;;;;;;;;37783:47;;37951:14;37937:10;:28;37933:328;;37982:19;38004:12;:18;38017:4;38004:18;;;;;;;;;;;;;;;:34;38023:14;38004:34;;;;;;;;;;;;37982:56;;38088:11;38055:12;:18;38068:4;38055:18;;;;;;;;;;;;;;;:30;38074:10;38055:30;;;;;;;;;;;:44;;;;38205:10;38172:17;:30;38190:11;38172:30;;;;;;;;;;;:43;;;;37933:328;;38357:17;:26;38375:7;38357:26;;;;;;;;;;;38350:33;;;38401:12;:18;38414:4;38401:18;;;;;;;;;;;;;;;:34;38420:14;38401:34;;;;;;;;;;;38394:41;;;37455:988;;;;:::o;38738:1079::-;38991:22;39036:1;39016:10;:17;;;;:21;;;;:::i;:::-;38991:46;;39048:18;39069:15;:24;39085:7;39069:24;;;;;;;;;;;;39048:45;;39420:19;39442:10;39453:14;39442:26;;;;;;;;;;;;;;;;;;;;;;;;39420:48;;39506:11;39481:10;39492;39481:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;39617:10;39586:15;:28;39602:11;39586:28;;;;;;;;;;;:41;;;;39758:15;:24;39774:7;39758:24;;;;;;;;;;;39751:31;;;39793:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38738:1079;;;;:::o;36242:221::-;36327:14;36344:20;36361:2;36344:16;:20::i;:::-;36327:37;;36402:7;36375:12;:16;36388:2;36375:16;;;;;;;;;;;;;;;:24;36392:6;36375:24;;;;;;;;;;;:34;;;;36449:6;36420:17;:26;36438:7;36420:26;;;;;;;;;;;:35;;;;36242:221;;;:::o;49539:572::-;49647:13;49678:24;49722:7;49717:366;49739:5;49745:11;49739:18;;;;;;;;;;;;;;;;;;:25;;;;49735:1;:29;;;49717:366;;;49786:21;49810:5;49816:11;49810:18;;;;;;;;;;;;;;;;;;49829:1;49810:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49786:45;;49882:17;49868:31;;:10;:31;;:99;;;;;49953:14;49933:17;:34;;;;:::i;:::-;49920:47;;:10;:47;49868:99;49846:156;;;49990:12;:1;:10;;;:12::i;:::-;49983:19;;;;;;;49846:156;50057:14;50037:17;:34;;;;:::i;:::-;50017:54;;49717:366;49766:3;;;;;:::i;:::-;;;;49717:366;;;;50095:8;;;49539:572;;;;;:::o;7674:387::-;7734:4;7942:12;8009:7;7997:20;7989:28;;8052:1;8045:4;:8;8038:15;;;7674:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;34:654:1:-;;178:103;193:87;273:6;193:87;:::i;:::-;178:103;:::i;:::-;169:112;;301:5;329:6;322:5;315:21;355:4;348:5;344:16;337:23;;380:6;411:1;396:286;421:6;418:1;415:13;396:286;;;513:3;500:17;492:6;488:30;543:60;599:3;587:10;543:60;:::i;:::-;538:3;531:73;633:4;628:3;624:14;617:21;;667:4;662:3;658:14;651:21;;456:226;443:1;440;436:9;431:14;;396:286;;;400:14;159:529;;;;;;;:::o;694:342::-;;796:64;811:48;852:6;811:48;:::i;:::-;796:64;:::i;:::-;787:73;;883:6;876:5;869:21;921:4;914:5;910:16;959:3;950:6;945:3;941:16;938:25;935:2;;;976:1;973;966:12;935:2;989:41;1023:6;1018:3;1013;989:41;:::i;:::-;777:259;;;;;;:::o;1042:344::-;;1145:65;1160:49;1202:6;1160:49;:::i;:::-;1145:65;:::i;:::-;1136:74;;1233:6;1226:5;1219:21;1271:4;1264:5;1260:16;1309:3;1300:6;1295:3;1291:16;1288:25;1285:2;;;1326:1;1323;1316:12;1285:2;1339:41;1373:6;1368:3;1363;1339:41;:::i;:::-;1126:260;;;;;;:::o;1392:139::-;;1476:6;1463:20;1454:29;;1492:33;1519:5;1492:33;:::i;:::-;1444:87;;;;:::o;1564:349::-;;1707:3;1700:4;1692:6;1688:17;1684:27;1674:2;;1725:1;1722;1715:12;1674:2;1765:6;1752:20;1790:117;1903:3;1895:6;1888:4;1880:6;1876:17;1790:117;:::i;:::-;1781:126;;1664:249;;;;;:::o;1919:133::-;;2000:6;1987:20;1978:29;;2016:30;2040:5;2016:30;:::i;:::-;1968:84;;;;:::o;2058:137::-;;2141:6;2128:20;2119:29;;2157:32;2183:5;2157:32;:::i;:::-;2109:86;;;;:::o;2201:141::-;;2288:6;2282:13;2273:22;;2304:32;2330:5;2304:32;:::i;:::-;2263:79;;;;:::o;2361:271::-;;2465:3;2458:4;2450:6;2446:17;2442:27;2432:2;;2483:1;2480;2473:12;2432:2;2523:6;2510:20;2548:78;2622:3;2614:6;2607:4;2599:6;2595:17;2548:78;:::i;:::-;2539:87;;2422:210;;;;;:::o;2652:273::-;;2757:3;2750:4;2742:6;2738:17;2734:27;2724:2;;2775:1;2772;2765:12;2724:2;2815:6;2802:20;2840:79;2915:3;2907:6;2900:4;2892:6;2888:17;2840:79;:::i;:::-;2831:88;;2714:211;;;;;:::o;2956:1153::-;;3072:4;3060:9;3055:3;3051:19;3047:30;3044:2;;;3090:1;3087;3080:12;3044:2;3112:20;3127:4;3112:20;:::i;:::-;3103:29;;3224:1;3213:9;3209:17;3196:31;3254:18;3246:6;3243:30;3240:2;;;3286:1;3283;3276:12;3240:2;3329:59;3384:3;3375:6;3364:9;3360:22;3329:59;:::i;:::-;3322:4;3315:5;3311:16;3304:85;3142:258;3492:2;3481:9;3477:18;3464:32;3523:18;3515:6;3512:30;3509:2;;;3555:1;3552;3545:12;3509:2;3598:59;3653:3;3644:6;3633:9;3629:22;3598:59;:::i;:::-;3591:4;3584:5;3580:16;3573:85;3410:259;3758:2;3747:9;3743:18;3730:32;3789:18;3781:6;3778:30;3775:2;;;3821:1;3818;3811:12;3775:2;3864:59;3919:3;3910:6;3899:9;3895:22;3864:59;:::i;:::-;3857:4;3850:5;3846:16;3839:85;3679:256;4000:2;4041:49;4086:3;4077:6;4066:9;4062:22;4041:49;:::i;:::-;4034:4;4027:5;4023:16;4016:75;3945:157;3034:1075;;;;:::o;4115:139::-;;4199:6;4186:20;4177:29;;4215:33;4242:5;4215:33;:::i;:::-;4167:87;;;;:::o;4260:262::-;;4368:2;4356:9;4347:7;4343:23;4339:32;4336:2;;;4384:1;4381;4374:12;4336:2;4427:1;4452:53;4497:7;4488:6;4477:9;4473:22;4452:53;:::i;:::-;4442:63;;4398:117;4326:196;;;;:::o;4528:407::-;;;4653:2;4641:9;4632:7;4628:23;4624:32;4621:2;;;4669:1;4666;4659:12;4621:2;4712:1;4737:53;4782:7;4773:6;4762:9;4758:22;4737:53;:::i;:::-;4727:63;;4683:117;4839:2;4865:53;4910:7;4901:6;4890:9;4886:22;4865:53;:::i;:::-;4855:63;;4810:118;4611:324;;;;;:::o;4941:552::-;;;;5083:2;5071:9;5062:7;5058:23;5054:32;5051:2;;;5099:1;5096;5089:12;5051:2;5142:1;5167:53;5212:7;5203:6;5192:9;5188:22;5167:53;:::i;:::-;5157:63;;5113:117;5269:2;5295:53;5340:7;5331:6;5320:9;5316:22;5295:53;:::i;:::-;5285:63;;5240:118;5397:2;5423:53;5468:7;5459:6;5448:9;5444:22;5423:53;:::i;:::-;5413:63;;5368:118;5041:452;;;;;:::o;5499:809::-;;;;;5667:3;5655:9;5646:7;5642:23;5638:33;5635:2;;;5684:1;5681;5674:12;5635:2;5727:1;5752:53;5797:7;5788:6;5777:9;5773:22;5752:53;:::i;:::-;5742:63;;5698:117;5854:2;5880:53;5925:7;5916:6;5905:9;5901:22;5880:53;:::i;:::-;5870:63;;5825:118;5982:2;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5953:118;6138:2;6127:9;6123:18;6110:32;6169:18;6161:6;6158:30;6155:2;;;6201:1;6198;6191:12;6155:2;6229:62;6283:7;6274:6;6263:9;6259:22;6229:62;:::i;:::-;6219:72;;6081:220;5625:683;;;;;;;:::o;6314:401::-;;;6436:2;6424:9;6415:7;6411:23;6407:32;6404:2;;;6452:1;6449;6442:12;6404:2;6495:1;6520:53;6565:7;6556:6;6545:9;6541:22;6520:53;:::i;:::-;6510:63;;6466:117;6622:2;6648:50;6690:7;6681:6;6670:9;6666:22;6648:50;:::i;:::-;6638:60;;6593:115;6394:321;;;;;:::o;6721:407::-;;;6846:2;6834:9;6825:7;6821:23;6817:32;6814:2;;;6862:1;6859;6852:12;6814:2;6905:1;6930:53;6975:7;6966:6;6955:9;6951:22;6930:53;:::i;:::-;6920:63;;6876:117;7032:2;7058:53;7103:7;7094:6;7083:9;7079:22;7058:53;:::i;:::-;7048:63;;7003:118;6804:324;;;;;:::o;7134:260::-;;7241:2;7229:9;7220:7;7216:23;7212:32;7209:2;;;7257:1;7254;7247:12;7209:2;7300:1;7325:52;7369:7;7360:6;7349:9;7345:22;7325:52;:::i;:::-;7315:62;;7271:116;7199:195;;;;:::o;7400:282::-;;7518:2;7506:9;7497:7;7493:23;7489:32;7486:2;;;7534:1;7531;7524:12;7486:2;7577:1;7602:63;7657:7;7648:6;7637:9;7633:22;7602:63;:::i;:::-;7592:73;;7548:127;7476:206;;;;:::o;7688:375::-;;7806:2;7794:9;7785:7;7781:23;7777:32;7774:2;;;7822:1;7819;7812:12;7774:2;7893:1;7882:9;7878:17;7865:31;7923:18;7915:6;7912:30;7909:2;;;7955:1;7952;7945:12;7909:2;7983:63;8038:7;8029:6;8018:9;8014:22;7983:63;:::i;:::-;7973:73;;7836:220;7764:299;;;;:::o;8069:262::-;;8177:2;8165:9;8156:7;8152:23;8148:32;8145:2;;;8193:1;8190;8183:12;8145:2;8236:1;8261:53;8306:7;8297:6;8286:9;8282:22;8261:53;:::i;:::-;8251:63;;8207:117;8135:196;;;;:::o;8337:596::-;;;8510:2;8498:9;8489:7;8485:23;8481:32;8478:2;;;8526:1;8523;8516:12;8478:2;8569:1;8594:53;8639:7;8630:6;8619:9;8615:22;8594:53;:::i;:::-;8584:63;;8540:117;8724:2;8713:9;8709:18;8696:32;8755:18;8747:6;8744:30;8741:2;;;8787:1;8784;8777:12;8741:2;8815:101;8908:7;8899:6;8888:9;8884:22;8815:101;:::i;:::-;8805:111;;8667:259;8468:465;;;;;:::o;8939:407::-;;;9064:2;9052:9;9043:7;9039:23;9035:32;9032:2;;;9080:1;9077;9070:12;9032:2;9123:1;9148:53;9193:7;9184:6;9173:9;9169:22;9148:53;:::i;:::-;9138:63;;9094:117;9250:2;9276:53;9321:7;9312:6;9301:9;9297:22;9276:53;:::i;:::-;9266:63;;9221:118;9022:324;;;;;:::o;9352:179::-;;9442:46;9484:3;9476:6;9442:46;:::i;:::-;9520:4;9515:3;9511:14;9497:28;;9432:99;;;;:::o;9537:118::-;9624:24;9642:5;9624:24;:::i;:::-;9619:3;9612:37;9602:53;;:::o;9661:157::-;9766:45;9786:24;9804:5;9786:24;:::i;:::-;9766:45;:::i;:::-;9761:3;9754:58;9744:74;;:::o;9854:732::-;;10002:54;10050:5;10002:54;:::i;:::-;10072:86;10151:6;10146:3;10072:86;:::i;:::-;10065:93;;10182:56;10232:5;10182:56;:::i;:::-;10261:7;10292:1;10277:284;10302:6;10299:1;10296:13;10277:284;;;10378:6;10372:13;10405:63;10464:3;10449:13;10405:63;:::i;:::-;10398:70;;10491:60;10544:6;10491:60;:::i;:::-;10481:70;;10337:224;10324:1;10321;10317:9;10312:14;;10277:284;;;10281:14;10577:3;10570:10;;9978:608;;;;;;;:::o;10592:109::-;10673:21;10688:5;10673:21;:::i;:::-;10668:3;10661:34;10651:50;;:::o;10707:360::-;;10821:38;10853:5;10821:38;:::i;:::-;10875:70;10938:6;10933:3;10875:70;:::i;:::-;10868:77;;10954:52;10999:6;10994:3;10987:4;10980:5;10976:16;10954:52;:::i;:::-;11031:29;11053:6;11031:29;:::i;:::-;11026:3;11022:39;11015:46;;10797:270;;;;;:::o;11073:364::-;;11189:39;11222:5;11189:39;:::i;:::-;11244:71;11308:6;11303:3;11244:71;:::i;:::-;11237:78;;11324:52;11369:6;11364:3;11357:4;11350:5;11346:16;11324:52;:::i;:::-;11401:29;11423:6;11401:29;:::i;:::-;11396:3;11392:39;11385:46;;11165:272;;;;;:::o;11443:377::-;;11577:39;11610:5;11577:39;:::i;:::-;11632:89;11714:6;11709:3;11632:89;:::i;:::-;11625:96;;11730:52;11775:6;11770:3;11763:4;11756:5;11752:16;11730:52;:::i;:::-;11807:6;11802:3;11798:16;11791:23;;11553:267;;;;;:::o;11850:845::-;;11990:5;11984:12;12019:36;12045:9;12019:36;:::i;:::-;12071:89;12153:6;12148:3;12071:89;:::i;:::-;12064:96;;12191:1;12180:9;12176:17;12207:1;12202:137;;;;12353:1;12348:341;;;;12169:520;;12202:137;12286:4;12282:9;12271;12267:25;12262:3;12255:38;12322:6;12317:3;12313:16;12306:23;;12202:137;;12348:341;12415:38;12447:5;12415:38;:::i;:::-;12475:1;12489:154;12503:6;12500:1;12497:13;12489:154;;;12577:7;12571:14;12567:1;12562:3;12558:11;12551:35;12627:1;12618:7;12614:15;12603:26;;12525:4;12522:1;12518:12;12513:17;;12489:154;;;12672:6;12667:3;12663:16;12656:23;;12355:334;;12169:520;;11957:738;;;;;;:::o;12701:337::-;;12882:84;12964:1;12959:3;12882:84;:::i;:::-;12875:91;;12996:7;12992:1;12987:3;12983:11;12976:28;13030:1;13025:3;13021:11;13014:18;;12865:173;;;:::o;13044:691::-;;13225:86;13307:3;13302;13225:86;:::i;:::-;13218:93;;13341:66;13337:1;13332:3;13328:11;13321:87;13439:34;13434:2;13429:3;13425:12;13418:56;13505:34;13500:2;13495:3;13491:12;13484:56;13571:66;13566:2;13561:3;13557:12;13550:88;13670:28;13664:3;13659;13655:13;13648:51;13725:3;13720;13716:13;13709:20;;13208:527;;;:::o;13741:375::-;;13904:67;13968:2;13963:3;13904:67;:::i;:::-;13897:74;;14001:34;13997:1;13992:3;13988:11;13981:55;14067:13;14062:2;14057:3;14053:12;14046:35;14107:2;14102:3;14098:12;14091:19;;13887:229;;;:::o;14122:382::-;;14285:67;14349:2;14344:3;14285:67;:::i;:::-;14278:74;;14382:34;14378:1;14373:3;14369:11;14362:55;14448:20;14443:2;14438:3;14434:12;14427:42;14495:2;14490:3;14486:12;14479:19;;14268:236;;;:::o;14510:694::-;;14691:86;14773:3;14768;14691:86;:::i;:::-;14684:93;;14807:66;14803:1;14798:3;14794:11;14787:87;14905:66;14900:2;14895:3;14891:12;14884:88;15003:66;14998:2;14993:3;14989:12;14982:88;15101:66;15096:2;15091:3;15087:12;15080:88;15194:3;15189;15185:13;15178:20;;14674:530;;;:::o;15210:326::-;;15373:67;15437:2;15432:3;15373:67;:::i;:::-;15366:74;;15470:30;15466:1;15461:3;15457:11;15450:51;15527:2;15522:3;15518:12;15511:19;;15356:180;;;:::o;15542:337::-;;15723:84;15805:1;15800:3;15723:84;:::i;:::-;15716:91;;15837:7;15833:1;15828:3;15824:11;15817:28;15871:1;15866:3;15862:11;15855:18;;15706:173;;;:::o;15885:398::-;;16066:85;16148:2;16143:3;16066:85;:::i;:::-;16059:92;;16181:66;16177:1;16172:3;16168:11;16161:87;16274:2;16269:3;16265:12;16258:19;;16049:234;;;:::o;16289:333::-;;16470:84;16552:1;16547:3;16470:84;:::i;:::-;16463:91;;16584:3;16580:1;16575:3;16571:11;16564:24;16614:1;16609:3;16605:11;16598:18;;16453:169;;;:::o;16628:348::-;;16809:85;16891:2;16886:3;16809:85;:::i;:::-;16802:92;;16924:16;16920:1;16915:3;16911:11;16904:37;16967:2;16962:3;16958:12;16951:19;;16792:184;;;:::o;16982:368::-;;17145:67;17209:2;17204:3;17145:67;:::i;:::-;17138:74;;17242:34;17238:1;17233:3;17229:11;17222:55;17308:6;17303:2;17298:3;17294:12;17287:28;17341:2;17336:3;17332:12;17325:19;;17128:222;;;:::o;17356:323::-;;17519:67;17583:2;17578:3;17519:67;:::i;:::-;17512:74;;17616:27;17612:1;17607:3;17603:11;17596:48;17670:2;17665:3;17661:12;17654:19;;17502:177;;;:::o;17685:398::-;;17866:85;17948:2;17943:3;17866:85;:::i;:::-;17859:92;;17981:66;17977:1;17972:3;17968:11;17961:87;18074:2;18069:3;18065:12;18058:19;;17849:234;;;:::o;18089:376::-;;18252:67;18316:2;18311:3;18252:67;:::i;:::-;18245:74;;18349:34;18345:1;18340:3;18336:11;18329:55;18415:14;18410:2;18405:3;18401:12;18394:36;18456:2;18451:3;18447:12;18440:19;;18235:230;;;:::o;18471:335::-;;18652:84;18734:1;18729:3;18652:84;:::i;:::-;18645:91;;18766:5;18762:1;18757:3;18753:11;18746:26;18798:1;18793:3;18789:11;18782:18;;18635:171;;;:::o;18812:388::-;;18975:67;19039:2;19034:3;18975:67;:::i;:::-;18968:74;;19072:34;19068:1;19063:3;19059:11;19052:55;19138:26;19133:2;19128:3;19124:12;19117:48;19191:2;19186:3;19182:12;19175:19;;18958:242;;;:::o;19206:374::-;;19369:67;19433:2;19428:3;19369:67;:::i;:::-;19362:74;;19466:34;19462:1;19457:3;19453:11;19446:55;19532:12;19527:2;19522:3;19518:12;19511:34;19571:2;19566:3;19562:12;19555:19;;19352:228;;;:::o;19586:373::-;;19749:67;19813:2;19808:3;19749:67;:::i;:::-;19742:74;;19846:34;19842:1;19837:3;19833:11;19826:55;19912:11;19907:2;19902:3;19898:12;19891:33;19950:2;19945:3;19941:12;19934:19;;19732:227;;;:::o;19965:2496::-;;20146:87;20228:4;20223:3;20146:87;:::i;:::-;20139:94;;20263:34;20259:1;20254:3;20250:11;20243:55;20333:34;20328:2;20323:3;20319:12;20312:56;20403:34;20398:2;20393:3;20389:12;20382:56;20473:34;20468:2;20463:3;20459:12;20452:56;20540:34;20534:3;20529;20525:13;20518:57;20607:34;20601:3;20596;20592:13;20585:57;20674:34;20668:3;20663;20659:13;20652:57;20745:34;20739:3;20734;20730:13;20723:57;20816:34;20810:3;20805;20801:13;20794:57;20883:34;20877:3;20872;20868:13;20861:57;20950:34;20944:3;20939;20935:13;20928:57;21021:34;21015:3;21010;21006:13;20999:57;21092:34;21086:3;21081;21077:13;21070:57;21159:34;21153:3;21148;21144:13;21137:57;21226:34;21220:3;21215;21211:13;21204:57;21293:34;21287:3;21282;21278:13;21271:57;21364:34;21358:3;21353;21349:13;21342:57;21435:34;21429:3;21424;21420:13;21413:57;21502:34;21496:3;21491;21487:13;21480:57;21569:34;21563:3;21558;21554:13;21547:57;21640:34;21634:3;21629;21625:13;21618:57;21711:34;21705:3;21700;21696:13;21689:57;21778:34;21772:3;21767;21763:13;21756:57;21845:34;21839:3;21834;21830:13;21823:57;21912:34;21906:3;21901;21897:13;21890:57;21983:34;21977:3;21972;21968:13;21961:57;22054:34;22048:3;22043;22039:13;22032:57;22121:34;22115:3;22110;22106:13;22099:57;22188:34;22182:3;22177;22173:13;22166:57;22259:34;22253:3;22248;22244:13;22237:57;22330:34;22324:3;22319;22315:13;22308:57;22397:26;22391:3;22386;22382:13;22375:49;22450:4;22445:3;22441:14;22434:21;;20129:2332;;;:::o;22467:396::-;;22648:84;22730:1;22725:3;22648:84;:::i;:::-;22641:91;;22762:66;22758:1;22753:3;22749:11;22742:87;22855:1;22850:3;22846:11;22839:18;;22631:232;;;:::o;22869:330::-;;23032:67;23096:2;23091:3;23032:67;:::i;:::-;23025:74;;23129:34;23125:1;23120:3;23116:11;23109:55;23190:2;23185:3;23181:12;23174:19;;23015:184;;;:::o;23205:321::-;;23386:84;23468:1;23463:3;23386:84;:::i;:::-;23379:91;;23496:3;23492:1;23487:3;23483:11;23476:24;23522:1;23517:3;23513:11;23506:18;;23369:157;;;:::o;23528:356::-;;23687:67;23751:2;23746:3;23687:67;:::i;:::-;23680:74;;23780:34;23776:1;23771:3;23767:11;23760:55;23842:14;23837:2;23832:3;23828:12;23821:36;23879:2;23874:3;23870:12;23863:19;;23674:210;;;:::o;23886:317::-;;24063:84;24145:1;24140:3;24063:84;:::i;:::-;24056:91;;24173:3;24169:1;24164:3;24160:11;24153:24;24199:1;24194:3;24190:11;24183:18;;24050:153;;;:::o;24205:353::-;;24364:67;24428:2;24423:3;24364:67;:::i;:::-;24357:74;;24457:34;24453:1;24448:3;24444:11;24437:55;24519:11;24514:2;24509:3;24505:12;24498:33;24553:2;24548:3;24544:12;24537:19;;24351:207;;;:::o;24560:382::-;;24737:85;24819:2;24814:3;24737:85;:::i;:::-;24730:92;;24848:66;24844:1;24839:3;24835:11;24828:87;24937:2;24932:3;24928:12;24921:19;;24724:218;;;:::o;24944:317::-;;25121:84;25203:1;25198:3;25121:84;:::i;:::-;25114:91;;25231:3;25227:1;25222:3;25218:11;25211:24;25257:1;25252:3;25248:11;25241:18;;25108:153;;;:::o;25263:345::-;;25422:67;25486:2;25481:3;25422:67;:::i;:::-;25415:74;;25515:34;25511:1;25506:3;25502:11;25495:55;25577:3;25572:2;25567:3;25563:12;25556:25;25603:2;25598:3;25594:12;25587:19;;25409:199;;;:::o;25610:347::-;;25787:85;25869:2;25864:3;25787:85;:::i;:::-;25780:92;;25898:31;25894:1;25889:3;25885:11;25878:52;25952:2;25947:3;25943:12;25936:19;;25774:183;;;:::o;25959:361::-;;26118:67;26182:2;26177:3;26118:67;:::i;:::-;26111:74;;26211:34;26207:1;26202:3;26198:11;26191:55;26273:19;26268:2;26263:3;26259:12;26252:41;26315:2;26310:3;26306:12;26299:19;;26105:215;;;:::o;26322:317::-;;26499:84;26581:1;26576:3;26499:84;:::i;:::-;26492:91;;26609:3;26605:1;26600:3;26596:11;26589:24;26635:1;26630:3;26626:11;26619:18;;26486:153;;;:::o;26641:282::-;;26800:66;26864:1;26859:3;26800:66;:::i;:::-;26793:73;;26892:3;26888:1;26883:3;26879:11;26872:24;26918:2;26913:3;26909:12;26902:19;;26787:136;;;:::o;26925:356::-;;27084:67;27148:2;27143:3;27084:67;:::i;:::-;27077:74;;27177:34;27173:1;27168:3;27164:11;27157:55;27239:14;27234:2;27229:3;27225:12;27218:36;27276:2;27271:3;27267:12;27260:19;;27071:210;;;:::o;27283:382::-;;27460:85;27542:2;27537:3;27460:85;:::i;:::-;27453:92;;27571:66;27567:1;27562:3;27558:11;27551:87;27660:2;27655:3;27651:12;27644:19;;27447:218;;;:::o;27667:100::-;27740:24;27758:5;27740:24;:::i;:::-;27735:3;27728:37;27722:45;;:::o;27769:110::-;27852:24;27870:5;27852:24;:::i;:::-;27847:3;27840:37;27834:45;;:::o;27881:149::-;27982:45;28002:24;28020:5;28002:24;:::i;:::-;27982:45;:::i;:::-;27977:3;27970:58;27964:66;;:::o;28032:263::-;;28182:95;28273:3;28264:6;28182:95;:::i;:::-;28175:102;;28290:3;28283:10;;28168:127;;;;:::o;28297:419::-;;28495:95;28586:3;28577:6;28495:95;:::i;:::-;28488:102;;28603:95;28694:3;28685:6;28603:95;:::i;:::-;28596:102;;28711:3;28704:10;;28481:235;;;;;:::o;28718:525::-;;28969:95;29060:3;29051:6;28969:95;:::i;:::-;28962:102;;29077:148;29221:3;29077:148;:::i;:::-;29070:155;;29238:3;29231:10;;28955:288;;;;:::o;29245:1779::-;;29943:95;30034:3;30025:6;29943:95;:::i;:::-;29936:102;;30051:148;30195:3;30051:148;:::i;:::-;30044:155;;30212:95;30303:3;30294:6;30212:95;:::i;:::-;30205:102;;30320:148;30464:3;30320:148;:::i;:::-;30313:155;;30481:95;30572:3;30563:6;30481:95;:::i;:::-;30474:102;;30589:148;30733:3;30589:148;:::i;:::-;30582:155;;30750:95;30841:3;30832:6;30750:95;:::i;:::-;30743:102;;30858:148;31002:3;30858:148;:::i;:::-;30851:155;;31019:3;31012:10;;29929:1095;;;;;;;:::o;31026:1349::-;;31569:95;31660:3;31651:6;31569:95;:::i;:::-;31562:102;;31677:148;31821:3;31677:148;:::i;:::-;31670:155;;31838:92;31926:3;31917:6;31838:92;:::i;:::-;31831:99;;31943:148;32087:3;31943:148;:::i;:::-;31936:155;;32104:92;32192:3;32183:6;32104:92;:::i;:::-;32097:99;;32209:148;32353:3;32209:148;:::i;:::-;32202:155;;32370:3;32363:10;;31555:820;;;;;;:::o;32377:257::-;;32524:92;32612:3;32603:6;32524:92;:::i;:::-;32517:99;;32629:3;32622:10;;32510:124;;;;:::o;32636:787::-;;32988:148;33132:3;32988:148;:::i;:::-;32981:155;;33149:95;33240:3;33231:6;33149:95;:::i;:::-;33142:102;;33257:148;33401:3;33257:148;:::i;:::-;33250:155;;33418:3;33411:10;;32974:449;;;;:::o;33425:787::-;;33777:148;33921:3;33777:148;:::i;:::-;33770:155;;33938:95;34029:3;34020:6;33938:95;:::i;:::-;33931:102;;34046:148;34190:3;34046:148;:::i;:::-;34039:155;;34207:3;34200:10;;33763:449;;;;:::o;34214:525::-;;34465:148;34609:3;34465:148;:::i;:::-;34458:155;;34626:95;34717:3;34708:6;34626:95;:::i;:::-;34619:102;;34734:3;34727:10;;34451:288;;;;:::o;34741:525::-;;34992:148;35136:3;34992:148;:::i;:::-;34985:155;;35153:95;35244:3;35235:6;35153:95;:::i;:::-;35146:102;;35261:3;35254:10;;34978:288;;;;:::o;35268:1623::-;;35918:148;36062:3;35918:148;:::i;:::-;35911:155;;36079:95;36170:3;36161:6;36079:95;:::i;:::-;36072:102;;36187:148;36331:3;36187:148;:::i;:::-;36180:155;;36348:95;36439:3;36430:6;36348:95;:::i;:::-;36341:102;;36456:148;36600:3;36456:148;:::i;:::-;36449:155;;36617:95;36708:3;36699:6;36617:95;:::i;:::-;36610:102;;36725:148;36869:3;36725:148;:::i;:::-;36718:155;;36886:3;36879:10;;35904:987;;;;;;:::o;36893:905::-;;37156:75;37227:3;37218:6;37156:75;:::i;:::-;37252:2;37247:3;37243:12;37236:19;;37261:75;37332:3;37323:6;37261:75;:::i;:::-;37357:2;37352:3;37348:12;37341:19;;37366:75;37437:3;37428:6;37366:75;:::i;:::-;37462:2;37457:3;37453:12;37446:19;;37471:75;37542:3;37533:6;37471:75;:::i;:::-;37567:2;37562:3;37558:12;37551:19;;37576:75;37647:3;37638:6;37576:75;:::i;:::-;37672:2;37667:3;37663:12;37656:19;;37681:75;37752:3;37743:6;37681:75;:::i;:::-;37777:2;37772:3;37768:12;37761:19;;37793:3;37786:10;;37149:649;;;;;;;;;:::o;37800:210::-;;37927:2;37916:9;37912:18;37904:26;;37936:71;38004:1;37993:9;37989:17;37980:6;37936:71;:::i;:::-;37898:112;;;;:::o;38012:612::-;;38241:3;38230:9;38226:19;38218:27;;38251:71;38319:1;38308:9;38304:17;38295:6;38251:71;:::i;:::-;38328:72;38396:2;38385:9;38381:18;38372:6;38328:72;:::i;:::-;38406;38474:2;38463:9;38459:18;38450:6;38406:72;:::i;:::-;38521:9;38515:4;38511:20;38506:2;38495:9;38491:18;38484:48;38545:76;38616:4;38607:6;38545:76;:::i;:::-;38537:84;;38212:412;;;;;;;:::o;38626:316::-;;38781:2;38770:9;38766:18;38758:26;;38790:71;38858:1;38847:9;38843:17;38834:6;38790:71;:::i;:::-;38867:72;38935:2;38924:9;38920:18;38911:6;38867:72;:::i;:::-;38752:190;;;;;:::o;38944:357::-;;39121:2;39110:9;39106:18;39098:26;;39166:9;39160:4;39156:20;39152:1;39141:9;39137:17;39130:47;39190:108;39293:4;39284:6;39190:108;:::i;:::-;39182:116;;39092:209;;;;:::o;39303:198::-;;39424:2;39413:9;39409:18;39401:26;;39433:65;39495:1;39484:9;39480:17;39471:6;39433:65;:::i;:::-;39395:106;;;;:::o;39503:297::-;;39650:2;39639:9;39635:18;39627:26;;39695:9;39689:4;39685:20;39681:1;39670:9;39666:17;39659:47;39719:78;39792:4;39783:6;39719:78;:::i;:::-;39711:86;;39621:179;;;;:::o;39802:790::-;;40073:3;40062:9;40058:19;40050:27;;40119:9;40113:4;40109:20;40105:1;40094:9;40090:17;40083:47;40143:78;40216:4;40207:6;40143:78;:::i;:::-;40135:86;;40264:9;40258:4;40254:20;40249:2;40238:9;40234:18;40227:48;40288:78;40361:4;40352:6;40288:78;:::i;:::-;40280:86;;40409:9;40403:4;40399:20;40394:2;40383:9;40379:18;40372:48;40433:78;40506:4;40497:6;40433:78;:::i;:::-;40425:86;;40517:72;40585:2;40574:9;40570:18;40561:6;40517:72;:::i;:::-;40044:548;;;;;;;:::o;40594:403::-;;40794:2;40783:9;40779:18;40771:26;;40839:9;40833:4;40829:20;40825:1;40814:9;40810:17;40803:47;40863:131;40989:4;40863:131;:::i;:::-;40855:139;;40765:232;;;:::o;40999:403::-;;41199:2;41188:9;41184:18;41176:26;;41244:9;41238:4;41234:20;41230:1;41219:9;41215:17;41208:47;41268:131;41394:4;41268:131;:::i;:::-;41260:139;;41170:232;;;:::o;41404:403::-;;41604:2;41593:9;41589:18;41581:26;;41649:9;41643:4;41639:20;41635:1;41624:9;41620:17;41613:47;41673:131;41799:4;41673:131;:::i;:::-;41665:139;;41575:232;;;:::o;41809:403::-;;42009:2;41998:9;41994:18;41986:26;;42054:9;42048:4;42044:20;42040:1;42029:9;42025:17;42018:47;42078:131;42204:4;42078:131;:::i;:::-;42070:139;;41980:232;;;:::o;42214:403::-;;42414:2;42403:9;42399:18;42391:26;;42459:9;42453:4;42449:20;42445:1;42434:9;42430:17;42423:47;42483:131;42609:4;42483:131;:::i;:::-;42475:139;;42385:232;;;:::o;42619:403::-;;42819:2;42808:9;42804:18;42796:26;;42864:9;42858:4;42854:20;42850:1;42839:9;42835:17;42828:47;42888:131;43014:4;42888:131;:::i;:::-;42880:139;;42790:232;;;:::o;43024:403::-;;43224:2;43213:9;43209:18;43201:26;;43269:9;43263:4;43259:20;43255:1;43244:9;43240:17;43233:47;43293:131;43419:4;43293:131;:::i;:::-;43285:139;;43195:232;;;:::o;43429:403::-;;43629:2;43618:9;43614:18;43606:26;;43674:9;43668:4;43664:20;43660:1;43649:9;43645:17;43638:47;43698:131;43824:4;43698:131;:::i;:::-;43690:139;;43600:232;;;:::o;43834:403::-;;44034:2;44023:9;44019:18;44011:26;;44079:9;44073:4;44069:20;44065:1;44054:9;44050:17;44043:47;44103:131;44229:4;44103:131;:::i;:::-;44095:139;;44005:232;;;:::o;44239:403::-;;44439:2;44428:9;44424:18;44416:26;;44484:9;44478:4;44474:20;44470:1;44459:9;44455:17;44448:47;44508:131;44634:4;44508:131;:::i;:::-;44500:139;;44410:232;;;:::o;44644:403::-;;44844:2;44833:9;44829:18;44821:26;;44889:9;44883:4;44879:20;44875:1;44864:9;44860:17;44853:47;44913:131;45039:4;44913:131;:::i;:::-;44905:139;;44815:232;;;:::o;45049:403::-;;45249:2;45238:9;45234:18;45226:26;;45294:9;45288:4;45284:20;45280:1;45269:9;45265:17;45258:47;45318:131;45444:4;45318:131;:::i;:::-;45310:139;;45220:232;;;:::o;45454:403::-;;45654:2;45643:9;45639:18;45631:26;;45699:9;45693:4;45689:20;45685:1;45674:9;45670:17;45663:47;45723:131;45849:4;45723:131;:::i;:::-;45715:139;;45625:232;;;:::o;45859:403::-;;46059:2;46048:9;46044:18;46036:26;;46104:9;46098:4;46094:20;46090:1;46079:9;46075:17;46068:47;46128:131;46254:4;46128:131;:::i;:::-;46120:139;;46030:232;;;:::o;46264:403::-;;46464:2;46453:9;46449:18;46441:26;;46509:9;46503:4;46499:20;46495:1;46484:9;46480:17;46473:47;46533:131;46659:4;46533:131;:::i;:::-;46525:139;;46435:232;;;:::o;46669:403::-;;46869:2;46858:9;46854:18;46846:26;;46914:9;46908:4;46904:20;46900:1;46889:9;46885:17;46878:47;46938:131;47064:4;46938:131;:::i;:::-;46930:139;;46840:232;;;:::o;47074:210::-;;47201:2;47190:9;47186:18;47178:26;;47210:71;47278:1;47267:9;47263:17;47254:6;47210:71;:::i;:::-;47172:112;;;;:::o;47286:259::-;;47348:2;47342:9;47332:19;;47386:4;47378:6;47374:17;47485:6;47473:10;47470:22;47449:18;47437:10;47434:34;47431:62;47428:2;;;47496:18;;:::i;:::-;47428:2;47532:10;47528:2;47521:22;47326:219;;;;:::o;47547:310::-;;47729:18;47721:6;47718:30;47715:2;;;47751:18;;:::i;:::-;47715:2;47797:4;47789:6;47785:17;47777:25;;47849:4;47843;47839:15;47831:23;;47652:205;;;:::o;47859:303::-;;48002:18;47994:6;47991:30;47988:2;;;48024:18;;:::i;:::-;47988:2;48101:4;48097:9;48090:4;48082:6;48078:17;48074:33;48066:41;;48154:4;48148;48144:15;48136:23;;47925:237;;;:::o;48164:304::-;;48308:18;48300:6;48297:30;48294:2;;;48330:18;;:::i;:::-;48294:2;48407:4;48403:9;48396:4;48388:6;48384:17;48380:33;48372:41;;48460:4;48454;48450:15;48442:23;;48231:237;;;:::o;48470:120::-;;48556:3;48548:11;;48582:4;48577:3;48573:14;48565:22;;48542:48;;;:::o;48592:125::-;;48660:3;48652:11;;48679:3;48676:1;48669:14;48709:4;48706:1;48696:18;48688:26;;48646:71;;;:::o;48719:106::-;;48816:5;48810:12;48800:22;;48793:32;;;:::o;48827:90::-;;48908:5;48902:12;48892:22;;48885:32;;;:::o;48919:91::-;;49001:5;48995:12;48985:22;;48978:32;;;:::o;49012:105::-;;49110:4;49105:3;49101:14;49093:22;;49087:30;;;:::o;49119:172::-;;49248:6;49243:3;49236:19;49284:4;49279:3;49275:14;49260:29;;49230:61;;;;:::o;49293:156::-;;49406:6;49401:3;49394:19;49442:4;49437:3;49433:14;49418:29;;49388:61;;;;:::o;49451:157::-;;49565:6;49560:3;49553:19;49601:4;49596:3;49592:14;49577:29;;49547:61;;;;:::o;49610:140::-;;49745:3;49730:18;;49724:26;;;;:::o;49752:218::-;;49806:19;49823:1;49806:19;:::i;:::-;49801:24;;49835:19;49852:1;49835:19;:::i;:::-;49830:24;;49920:1;49912:6;49908:14;49905:1;49902:21;49899:2;;;49926:18;;:::i;:::-;49899:2;49966:1;49963;49959:9;49952:16;;49795:175;;;;:::o;49972:281::-;;50027:20;50045:1;50027:20;:::i;:::-;50022:25;;50057:20;50075:1;50057:20;:::i;:::-;50052:25;;50203:1;50135:66;50131:74;50128:1;50125:81;50122:2;;;50209:18;;:::i;:::-;50122:2;50249:1;50246;50242:9;50235:16;;50016:237;;;;:::o;50255:213::-;;50308:18;50324:1;50308:18;:::i;:::-;50303:23;;50336:18;50352:1;50336:18;:::i;:::-;50331:23;;50418:1;50412:4;50408:12;50405:1;50402:19;50399:2;;;50424:18;;:::i;:::-;50399:2;50464:1;50461;50457:9;50450:16;;50297:171;;;;:::o;50470:165::-;;50523:20;50541:1;50523:20;:::i;:::-;50518:25;;50553:20;50571:1;50553:20;:::i;:::-;50548:25;;50588:1;50578:2;;50593:18;;:::i;:::-;50578:2;50631:1;50628;50624:9;50619:14;;50512:123;;;;:::o;50637:261::-;;50695:19;50712:1;50695:19;:::i;:::-;50690:24;;50724:19;50741:1;50724:19;:::i;:::-;50719:24;;50843:1;50835:6;50831:14;50828:1;50825:21;50820:1;50813:9;50806:17;50802:45;50799:2;;;50850:18;;:::i;:::-;50799:2;50894:1;50891;50887:9;50876:20;;50684:214;;;;:::o;50900:324::-;;50959:20;50977:1;50959:20;:::i;:::-;50954:25;;50989:20;51007:1;50989:20;:::i;:::-;50984:25;;51169:1;51101:66;51097:74;51094:1;51091:81;51086:1;51079:9;51072:17;51068:105;51065:2;;;51176:18;;:::i;:::-;51065:2;51220:1;51217;51213:9;51202:20;;50948:276;;;;:::o;51226:256::-;;51283:18;51299:1;51283:18;:::i;:::-;51278:23;;51311:18;51327:1;51311:18;:::i;:::-;51306:23;;51427:1;51421:4;51417:12;51414:1;51411:19;51406:1;51399:9;51392:17;51388:43;51385:2;;;51434:18;;:::i;:::-;51385:2;51478:1;51475;51471:9;51460:20;;51272:210;;;;:::o;51484:171::-;;51540:20;51558:1;51540:20;:::i;:::-;51535:25;;51570:20;51588:1;51570:20;:::i;:::-;51565:25;;51605:1;51602;51599:8;51596:2;;;51610:18;;:::i;:::-;51596:2;51651:1;51648;51644:9;51636:17;;51529:126;;;;:::o;51657:165::-;;51711:18;51727:1;51711:18;:::i;:::-;51706:23;;51739:18;51755:1;51739:18;:::i;:::-;51734:23;;51772:1;51769;51766:8;51763:2;;;51777:18;;:::i;:::-;51763:2;51818:1;51815;51811:9;51803:17;;51700:122;;;;:::o;51824:88::-;;51886:24;51904:5;51886:24;:::i;:::-;51875:35;;51869:43;;;:::o;51914:82::-;;51987:5;51980:13;51973:21;51962:32;;51956:40;;;:::o;51998:141::-;;52070:66;52063:5;52059:78;52048:89;;52042:97;;;:::o;52141:81::-;;52213:6;52206:5;52202:18;52191:29;;52185:37;;;:::o;52224:118::-;;52297:42;52290:5;52286:54;52275:65;;52269:73;;;:::o;52344:69::-;;52406:5;52395:16;;52389:24;;;:::o;52415:78::-;;52486:4;52479:5;52475:16;52464:27;;52458:35;;;:::o;52495:138::-;52575:6;52570:3;52565;52552:30;52629:1;52620:6;52615:3;52611:16;52604:27;52546:87;;;:::o;52635:263::-;52699:1;52705:101;52719:6;52716:1;52713:13;52705:101;;;52796:1;52791:3;52787:11;52781:18;52777:1;52772:3;52768:11;52761:39;52741:2;52738:1;52734:10;52729:15;;52705:101;;;52820:6;52817:1;52814:13;52811:2;;;52888:1;52879:6;52874:3;52870:16;52863:27;52811:2;52684:214;;;;:::o;52900:284::-;;52977:1;52971:4;52967:12;52957:22;;53020:1;53014:4;53010:12;53037:18;53027:2;;53089:4;53081:6;53077:17;53067:27;;53027:2;53143;53135:6;53132:14;53112:18;53109:38;53106:2;;;53158:18;;:::i;:::-;53106:2;52951:233;;;;:::o;53186:155::-;;53243:23;53260:5;53243:23;:::i;:::-;53234:32;;53284:6;53277:5;53274:17;53271:2;;;53294:18;;:::i;:::-;53271:2;53337:1;53330:5;53326:13;53319:20;;53228:113;;;:::o;53343:217::-;;53401:24;53419:5;53401:24;:::i;:::-;53392:33;;53443:66;53436:5;53433:77;53430:2;;;53513:18;;:::i;:::-;53430:2;53556:1;53549:5;53545:13;53538:20;;53386:174;;;:::o;53562:151::-;;53618:22;53634:5;53618:22;:::i;:::-;53609:31;;53658:4;53651:5;53648:15;53645:2;;;53666:18;;:::i;:::-;53645:2;53709:1;53702:5;53698:13;53691:20;;53603:110;;;:::o;53715:92::-;;53779:26;53799:5;53779:26;:::i;:::-;53768:37;;53762:45;;;:::o;53809:86::-;;53873:20;53887:5;53873:20;:::i;:::-;53862:31;;53856:39;;;:::o;53897:71::-;;53961:5;53950:16;;53944:24;;;:::o;53970:156::-;;54015:20;54033:1;54015:20;:::i;:::-;54010:25;;54045:20;54063:1;54045:20;:::i;:::-;54040:25;;54080:1;54070:2;;54085:18;;:::i;:::-;54070:2;54122:1;54119;54115:9;54110:14;;54004:122;;;;:::o;54128:164::-;54172:77;54169:1;54162:88;54265:4;54262:1;54255:15;54285:4;54282:1;54275:15;54294:164;54338:77;54335:1;54328:88;54431:4;54428:1;54421:15;54451:4;54448:1;54441:15;54460:164;54504:77;54501:1;54494:88;54597:4;54594:1;54587:15;54617:4;54614:1;54607:15;54626:164;54670:77;54667:1;54660:88;54763:4;54760:1;54753:15;54783:4;54780:1;54773:15;54792:94;;54880:2;54876:7;54871:2;54864:5;54860:14;54856:28;54846:38;;54840:46;;;:::o;54888:82::-;;54961:5;54957:2;54953:14;54936:31;;54930:40;;;:::o;54972:114::-;55041:24;55059:5;55041:24;:::i;:::-;55034:5;55031:35;55021:2;;55080:1;55077;55070:12;55021:2;55015:71;:::o;55088:108::-;55154:21;55169:5;55154:21;:::i;:::-;55147:5;55144:32;55134:2;;55190:1;55187;55180:12;55134:2;55128:68;:::o;55198:112::-;55266:23;55283:5;55266:23;:::i;:::-;55259:5;55256:34;55246:2;;55304:1;55301;55294:12;55246:2;55240:70;:::o;55312:114::-;55381:24;55399:5;55381:24;:::i;:::-;55374:5;55371:35;55361:2;;55420:1;55417;55410:12;55361:2;55355:71;:::o

Swarm Source

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