ETH Price: $3,471.96 (+2.39%)
Gas: 7 Gwei

Token

TINY83 (TINY83)
 

Overview

Max Total Supply

968 TINY83

Holders

588

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TINY83
0x1238d545fe712ac792213604b0ab169257706417
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

5,555 graphing calculator friends who can draw any function, 100% on chain. This project is the implementation of an idea shared by dom, Vine co-founder.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TINY83

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-29
*/

// SPDX-License-Identifier: Unlicense

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




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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

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





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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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














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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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 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(to).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();
    }
}

contract TINY83 is ERC721Enumerable, Ownable {

    uint256 public price = 40000000000000000; //0.04 Eth
    uint256 public MAX_SUPPLY = 5555;
    bool public saleIsActive = true;

    string constant header = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 500 500"> <rect x="0" y="0" width="500" height="500" style="fill:#';

    string constant face = '" /> <rect x="200" y="50" width="110" height="10" style="fill:#000" /> <rect x="300" y="50" width="10" height="20" style="fill:#000" /> <rect x="200" y="50" width="10" height="60" style="fill:#000" /> <rect x="190" y="100" width="30" height="40" style="fill:#000" /> <rect x="250" y="100" width="20" height="30" style="fill:#fff" /> <rect x="280" y="100" width="20" height="30" style="fill:#fff" /> <rect x="260" y="110" width="10" height="20" style="fill:#000" /> <rect x="290" y="110" width="10" height="20" style="fill:#000" /> <rect x="270" y="140" width="10" height="10" style="fill:#e74c3c" /> <rect x="210" y="170" width="80" height="20" style="fill:#000" /> <rect x="135" y="185" width="230" height="150" style="fill:#';

    struct Calculator {
        uint8 bg;
        uint8 head;
        uint8 screen;
        uint8 legs;
    }

    string[] private bg = ["ac8", "ebf", "9de", "df9", "dda", "ed9", "999", "89c"];
    string[] private head = ["70d", "653", "90f", "2b7", "22d", "22d", "fd1", "b91", "22d", "b91", "22d", "b91", "70d", "f80", "f80", "653", "22d", "f80", "70d", "22d", "653", "f80", "fd1", "70d", "653", "b91", "22d", "f80", "90f", "f80", "f80", "90f", "653", "22d", "653", "b91"];
    string[] private screen = ["f48", "ff0", "90f", "d00", "f48", "d60", "f48", "0f0", "90f", "d00", "90f", "00d", "ddd", "0f0", "90f", "0f0", "ddd", "0f0", "90f", "ff0", "d00", "d00", "d60", "0f0", "ff0", "d00", "ff0", "ff0", "d00", "0f0", "d60", "0f0", "90f", "90f", "d60", "0f0"];
    string[] private pixels = ["661b36", "666600", "3d0066", "580000", "661b36", "582800", "661b36", "006600", "3d0066", "580000", "3d0066", "000058", "585858", "006600", "3d0066", "006600", "585858", "006600", "3d0066", "666600", "580000", "580000", "582800", "006600", "666600", "580000", "666600", "666600", "580000", "006600", "582800", "006600", "3d0066", "3d0066", "582800", "006600"];
    string[] private legs = ["00f", "f48", "d0d", "f00", "d0d", "d0d", "f80", "ff0", "f48", "f0f", "00f", "f80", "90f", "f0f", "f48", "f48", "f80", "d0d", "f0f", "f00", "f00", "00f", "00f", "f48", "f0f", "f80", "f80", "f80", "00f", "f80", "f80", "f48", "ff0", "f0f", "f0f", "f48"];

    struct Curve {
        uint160 leftPart;
        uint160 rightPart;
    }

    mapping (uint256 => Curve) public curves;

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function random(bytes memory input, uint256 range) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input))) % range;
    }

    function getCalculator(uint256 tokenId) internal pure returns (Calculator memory) {
        Calculator memory calc;

        calc.bg = uint8(random(abi.encodePacked("BACKGROUND", toString(tokenId)), 8));
        calc.head = uint8(random(abi.encodePacked("HEAD", toString(tokenId)), 36));
        calc.screen = uint8(random(abi.encodePacked("SCREEN", toString(tokenId)), 36));
        calc.legs = uint8(random(abi.encodePacked("LEGS", toString(tokenId)), 36));

        return calc;
    }

    function getBoolean(uint256 _packedBools, uint256 _boolNumber) internal pure returns(bool) {
        uint256 flag = (_packedBools >> _boolNumber) & uint256(1);
        return (flag == 1 ? true : false);
    }

    function updateScreen(uint160 leftPart, uint160 rightPart, uint256 tokenId) public {
        require(ownerOf(tokenId) == _msgSender(), "Not the owner of this token");
        Curve memory curve;
        curve.leftPart = leftPart;
        curve.rightPart = rightPart;
        curves[tokenId] = curve;
    }

    function draw(Calculator memory calc, Curve memory curve) internal view returns (string memory) {
        string[8] memory parts;

        parts[0] = '"/> <rect x="190" y="70" width="120" height="100" style="fill:#';
        parts[1] = '" /> <rect x="180" y="80" width="140" height="80" style="fill:#';
        parts[2] = ';stroke-width:10;stroke:#000" /> <rect x="130" y="330" width="20" height="40" style="fill:#000" /> <rect x="350" y="330" width="20" height="40" style="fill:#000" /> <rect x="130" y="370" width="20" height="20" style="fill:#';
        parts[3] = '" /> <rect x="350" y="370" width="20" height="20" style="fill:#';
        parts[4] = '" /> <rect x="180" y="330" width="140" height="40" style="fill:#000" /> <rect x="180" y="370" width="140" height="60" style="fill:#';
        parts[5] = '" /> <rect x="210" y="390" width="80" height="40" style="fill:#';
        parts[6] = '" /> <rect x="180" y="430" width="160" height="10" style="fill:#000" /> <rect x="180" y="440" width="160" height="10" style="fill:#fff" /> <rect x="230" y="420" width="60" height="40" style="fill:#';
        parts[7] = '" />';

        string memory output = string(abi.encodePacked(bg[calc.bg], parts[0], head[calc.head], parts[1], head[calc.head], face, screen[calc.screen], parts[2], screen[calc.screen]));
        output = string(abi.encodePacked(output, parts[3], screen[calc.screen], parts[4], legs[calc.legs], parts[5], bg[calc.bg], parts[6], bg[calc.bg], parts[7]));

        for (uint256 i = 0; i < 154; i++) {
            if (getBoolean(curve.leftPart, i)) {
                output = string(abi.encodePacked(output, '<rect x="', toString(140+(i/14)*10), '" y="', toString(190+(i%14)*10), '" width="10" height="10" style="fill:#', pixels[calc.screen],'" />'));
            }

            if (getBoolean(curve.rightPart, i)) {
                output = string(abi.encodePacked(output, '<rect x="', toString(250+(i/14)*10), '" y="', toString(190+(i%14)*10), '" width="10" height="10" style="fill:#', pixels[calc.screen],'" />'));
            }
        }

        output = string(abi.encodePacked(output, '</svg>'));
        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        Calculator memory calc = getCalculator(tokenId);

        string memory output;
        output = header;

        string memory ds = draw(calc, curves[tokenId]);
        output = string(abi.encodePacked(output, ds));

        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Calculator #', toString(tokenId), '", "description": "5555 graphing calculator friends who can draw any function, 100% on chain. This project is the implementation of an idea shared by dom, Vine co-founder.", "attributes": [{"trait_type": "Background", "value": "#', bg[calc.bg], '"}, {"trait_type": "Head", "value": "#', head[calc.head], '"}, {"trait_type": "Screen", "value": "#', screen[calc.screen], '"}, {"trait_type": "Legs", "value": "#', legs[calc.legs], '"}], "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));

        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function mint(uint160 leftPart, uint160 rightPart) public payable {
        require(saleIsActive, "Sale must be active to mint");
        require(totalSupply() < MAX_SUPPLY, "Mint would exceed max supply");
        require(price <= msg.value, "Ether value sent is not correct");

        Curve memory curve;
        curve.leftPart = leftPart;
        curve.rightPart = rightPart;
        curves[totalSupply()] = curve;

        _safeMint(_msgSender(), totalSupply());
    }

    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }

    constructor() ERC721("TINY83", "TINY83") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"curves","outputs":[{"internalType":"uint160","name":"leftPart","type":"uint160"},{"internalType":"uint160","name":"rightPart","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint160","name":"leftPart","type":"uint160"},{"internalType":"uint160","name":"rightPart","type":"uint160"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"leftPart","type":"uint160"},{"internalType":"uint160","name":"rightPart","type":"uint160"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"updateScreen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052668e1bc9bf040000600b556115b3600c556001600d60006101000a81548160ff0219169083151502179055506040518061010001604052806040518060400160405280600381526020017f616338000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f656266000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f396465000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646639000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646461000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f656439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3839630000000000000000000000000000000000000000000000000000000000815250815250600e906008620002249291906200256b565b506040518061048001604052806040518060400160405280600381526020017f373064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f326237000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f623931000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f623931000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f623931000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f623931000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6239310000000000000000000000000000000000000000000000000000000000815250815250600f90602462000a8d929190620025d2565b506040518061048001604052806040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f30663000000000000000000000000000000000000000000000000000000000008152508152506010906024620012f6929190620025d2565b506040518061048001604052806040518060400160405280600681526020017f363631623336000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f363636363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f336430303636000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353830303030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f363631623336000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353832383030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f363631623336000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f303036363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f336430303636000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353830303030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f336430303636000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f303030303538000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353835383538000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f303036363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f336430303636000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f303036363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353835383538000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f303036363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f336430303636000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f363636363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353830303030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353830303030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353832383030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f303036363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f363636363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353830303030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f363636363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f363636363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353830303030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f303036363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353832383030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f303036363030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f336430303636000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f336430303636000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f353832383030000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f3030363630300000000000000000000000000000000000000000000000000000815250815250601190602462001b5f929190620025d2565b506040518061048001604052806040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f66343800000000000000000000000000000000000000000000000000000000008152508152506012906024620023c8929190620025d2565b50348015620023d657600080fd5b506040518060400160405280600681526020017f54494e59383300000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f54494e593833000000000000000000000000000000000000000000000000000081525081600090805190602001906200245b92919062002639565b5080600190805190602001906200247492919062002639565b505050620024976200248b6200249d60201b60201c565b620024a560201b60201c565b620027bc565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054828255906000526020600020908101928215620025bf579160200282015b82811115620025be578251829080519060200190620025ad92919062002639565b50916020019190600101906200258c565b5b509050620025ce9190620026ca565b5090565b82805482825590600052602060002090810192821562002626579160200282015b82811115620026255782518290805190602001906200261492919062002639565b5091602001919060010190620025f3565b5b509050620026359190620026ca565b5090565b828054620026479062002757565b90600052602060002090601f0160209004810192826200266b5760008555620026b7565b82601f106200268657805160ff1916838001178555620026b7565b82800160010185558215620026b7579182015b82811115620026b657825182559160200191906001019062002699565b5b509050620026c69190620026f2565b5090565b5b80821115620026ee5760008181620026e4919062002711565b50600101620026cb565b5090565b5b808211156200270d576000816000905550600101620026f3565b5090565b5080546200271f9062002757565b6000825580601f1062002733575062002754565b601f016020900490600052602060002090810190620027539190620026f2565b5b50565b600060028204905060018216806200277057607f821691505b602082108114156200278757620027866200278d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615f2280620027cc6000396000f3fe60806040526004361061019c5760003560e01c80636352211e116100ec578063a22cb4651161008a578063e11ca5c711610064578063e11ca5c7146105ba578063e985e9c5146105e3578063eb8d244414610620578063f2fde38b1461064b5761019c565b8063a22cb4651461052b578063b88d4fde14610554578063c87b56dd1461057d5761019c565b80638b097663116100c65780638b0976631461048e5780638da5cb5b146104aa57806395d89b41146104d5578063a035b1fe146105005761019c565b80636352211e146103fd57806370a082311461043a578063715018a6146104775761019c565b806323b872dd1161015957806334918dfd1161013357806334918dfd146103695780633ccfd60b1461038057806342842e0e146103975780634f6ccce7146103c05761019c565b806323b872dd146102d85780632f745c591461030157806332cb6b0c1461033e5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f5780631bf7d7491461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190613b3b565b610674565b6040516101d5919061468a565b60405180910390f35b3480156101ea57600080fd5b506101f36106ee565b60405161020091906146a5565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190613c18565b610780565b60405161023d9190614623565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190613aff565b610805565b005b34801561027b57600080fd5b5061028461091d565b6040516102919190614990565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190613c18565b61092a565b6040516102cf929190614967565b60405180910390f35b3480156102e457600080fd5b506102ff60048036038101906102fa91906139f9565b61098e565b005b34801561030d57600080fd5b5061032860048036038101906103239190613aff565b6109ee565b6040516103359190614990565b60405180910390f35b34801561034a57600080fd5b50610353610a93565b6040516103609190614990565b60405180910390f35b34801561037557600080fd5b5061037e610a99565b005b34801561038c57600080fd5b50610395610b41565b005b3480156103a357600080fd5b506103be60048036038101906103b991906139f9565b610c0c565b005b3480156103cc57600080fd5b506103e760048036038101906103e29190613c18565b610c2c565b6040516103f49190614990565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190613c18565b610cc3565b6040516104319190614623565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613994565b610d75565b60405161046e9190614990565b60405180910390f35b34801561048357600080fd5b5061048c610e2d565b005b6104a860048036038101906104a39190613b8d565b610eb5565b005b3480156104b657600080fd5b506104bf6110d5565b6040516104cc9190614623565b60405180910390f35b3480156104e157600080fd5b506104ea6110ff565b6040516104f791906146a5565b60405180910390f35b34801561050c57600080fd5b50610515611191565b6040516105229190614990565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d9190613ac3565b611197565b005b34801561056057600080fd5b5061057b60048036038101906105769190613a48565b611318565b005b34801561058957600080fd5b506105a4600480360381019061059f9190613c18565b61137a565b6040516105b191906146a5565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190613bc9565b61163d565b005b3480156105ef57600080fd5b5061060a600480360381019061060591906139bd565b6117dd565b604051610617919061468a565b60405180910390f35b34801561062c57600080fd5b50610635611871565b604051610642919061468a565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d9190613994565b611884565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106e757506106e68261197c565b5b9050919050565b6060600080546106fd90614c2f565b80601f016020809104026020016040519081016040528092919081815260200182805461072990614c2f565b80156107765780601f1061074b57610100808354040283529160200191610776565b820191906000526020600020905b81548152906001019060200180831161075957829003601f168201915b5050505050905090565b600061078b82611a5e565b6107ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c1906148a7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081082610cc3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890614907565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108a0611aca565b73ffffffffffffffffffffffffffffffffffffffff1614806108cf57506108ce816108c9611aca565b6117dd565b5b61090e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090590614827565b60405180910390fd5b6109188383611ad2565b505050565b6000600880549050905090565b60136020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b61099f610999611aca565b82611b8b565b6109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d590614927565b60405180910390fd5b6109e9838383611c69565b505050565b60006109f983610d75565b8210610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a31906146e7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b610aa1611aca565b73ffffffffffffffffffffffffffffffffffffffff16610abf6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c906148c7565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610b49611aca565b73ffffffffffffffffffffffffffffffffffffffff16610b676110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb4906148c7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c08573d6000803e3d6000fd5b5050565b610c2783838360405180602001604052806000815250611318565b505050565b6000610c3661091d565b8210610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90614947565b60405180910390fd5b60088281548110610cb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390614867565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90614847565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e35611aca565b73ffffffffffffffffffffffffffffffffffffffff16610e536110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea0906148c7565b60405180910390fd5b610eb36000611ec5565b565b600d60009054906101000a900460ff16610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb906147e7565b60405180910390fd5b600c54610f0f61091d565b10610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f46906146c7565b60405180910390fd5b34600b541115610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b906147c7565b60405180910390fd5b610f9c61380c565b82816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050806013600061101961091d565b815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506110d06110c3611aca565b6110cb61091d565b611f8b565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110e90614c2f565b80601f016020809104026020016040519081016040528092919081815260200182805461113a90614c2f565b80156111875780601f1061115c57610100808354040283529160200191611187565b820191906000526020600020905b81548152906001019060200180831161116a57829003601f168201915b5050505050905090565b600b5481565b61119f611aca565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611204906147a7565b60405180910390fd5b806005600061121a611aca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112c7611aca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161130c919061468a565b60405180910390a35050565b611329611323611aca565b83611b8b565b611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90614927565b60405180910390fd5b61137484848484611fa9565b50505050565b6060600061138783612005565b905060606040518060c00160405280609b815260200161591a609b91399050600061147b83601360008881526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505061212a565b90508181604051602001611490929190614319565b6040516020818303038152906040529150600061160d6114af87612b6d565b600e866000015160ff16815481106114f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600f876020015160ff168154811061153b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016010886040015160ff1681548110611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016012896060015160ff16815481106115d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016115e489612d1a565b6040516020016115f9969594939291906144f6565b604051602081830303815290604052612d1a565b90508060405160200161162091906145bd565b604051602081830303815290604052925082945050505050919050565b611645611aca565b73ffffffffffffffffffffffffffffffffffffffff1661166482610cc3565b73ffffffffffffffffffffffffffffffffffffffff16146116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190614767565b60405180910390fd5b6116c261380c565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050806013600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b61188c611aca565b73ffffffffffffffffffffffffffffffffffffffff166118aa6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f7906148c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196790614727565b60405180910390fd5b61197981611ec5565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a4757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a575750611a5682612ed8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b4583610cc3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b9682611a5e565b611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc90614807565b60405180910390fd5b6000611be083610cc3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c4f57508373ffffffffffffffffffffffffffffffffffffffff16611c3784610780565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c605750611c5f81856117dd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c8982610cc3565b73ffffffffffffffffffffffffffffffffffffffff1614611cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd6906148e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4690614787565b60405180910390fd5b611d5a838383612f42565b611d65600082611ad2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611db59190614b45565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0c9190614a64565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fa5828260405180602001604052806000815250613056565b5050565b611fb4848484611c69565b611fc0848484846130b1565b611fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff690614707565b60405180910390fd5b50505050565b61200d613852565b612015613852565b61204761202184612b6d565b6040516020016120319190614601565b6040516020818303038152906040526008613248565b816000019060ff16908160ff168152505061208a61206484612b6d565b60405160200161207491906144d4565b6040516020818303038152906040526024613248565b816020019060ff16908160ff16815250506120cd6120a784612b6d565b6040516020016120b791906145df565b6040516020818303038152906040526024613248565b816040019060ff16908160ff16815250506121106120ea84612b6d565b6040516020016120fa919061459b565b6040516020818303038152906040526024613248565b816060019060ff16908160ff168152505080915050919050565b6060612134613886565b6040518060600160405280603f8152602001615819603f913981600060088110612187577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280603f81526020016158db603f9139816001600881106121e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180610100016040528060df8152602001615dcf60df91398160026008811061223e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280603f81526020016159b5603f913981600360088110612299577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060c001604052806083815260200161585860839139816004600881106122f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280603f8152602001615eae603f91398160056008811061234f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180610100016040528060c58152602001615a3460c59139816006600881106123ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600481526020017f22202f3e0000000000000000000000000000000000000000000000000000000081525081600760088110612423577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000600e856000015160ff168154811061246e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001826000600881106124b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600f876020015160ff16815481106124f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018460016008811061253c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600f896020015160ff1681548110612582577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040518061030001604052806102d68152602001615af96102d6913960108b6040015160ff16815481106125e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018860026008811061262d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160108d6040015160ff1681548110612673577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160405160200161269599989796959493929190614455565b604051602081830303815290604052905080826003600881106126e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516010876040015160ff1681548110612727577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018460046008811061276b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516012896060015160ff16815481106127b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001866005600881106127f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600e8b6000015160ff168154811061283b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018860066008811061287f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600e8d6000015160ff16815481106128c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018a600760088110612909577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516040516020016129279a9998979695949392919061433d565b604051602081830303815290604052905060005b609a811015612b3f57612968856000015173ffffffffffffffffffffffffffffffffffffffff1682613287565b15612a38578161299b600a600e846129809190614aba565b61298a9190614aeb565b608c6129969190614a64565b612b6d565b6129c8600a600e856129ad9190614cdb565b6129b79190614aeb565b60be6129c39190614a64565b612b6d565b6011896040015160ff1681548110612a09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001604051602001612a2694939291906143c9565b60405160208183030381529060405291505b612a5c856020015173ffffffffffffffffffffffffffffffffffffffff1682613287565b15612b2c5781612a8f600a600e84612a749190614aba565b612a7e9190614aeb565b60fa612a8a9190614a64565b612b6d565b612abc600a600e85612aa19190614cdb565b612aab9190614aeb565b60be612ab79190614a64565b612b6d565b6011896040015160ff1681548110612afd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001604051602001612b1a94939291906143c9565b60405160208183030381529060405291505b8080612b3790614c92565b91505061293b565b5080604051602001612b519190614433565b6040516020818303038152906040529050809250505092915050565b60606000821415612bb5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d15565b600082905060005b60008214612be7578080612bd090614c92565b915050600a82612be09190614aba565b9150612bbd565b60008167ffffffffffffffff811115612c29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c5b5781602001600182028036833780820191505090505b5090505b60008514612d0e57600182612c749190614b45565b9150600a85612c839190614cdb565b6030612c8f9190614a64565b60f81b818381518110612ccb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d079190614aba565b9450612c5f565b8093505050505b919050565b60606000825190506000811415612d435760405180602001604052806000815250915050612ed3565b60006003600283612d549190614a64565b612d5e9190614aba565b6004612d6a9190614aeb565b90506000602082612d7b9190614a64565b67ffffffffffffffff811115612dba577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dec5781602001600182028036833780820191505090505b50905060006040518060600160405280604081526020016159f4604091399050600181016020830160005b86811015612e905760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612e17565b506003860660018114612eaa5760028114612eba57612ec5565b613d3d60f01b6002830352612ec5565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f4d8383836132ae565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f9057612f8b816132b3565b612fcf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fce57612fcd83826132fc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130125761300d81613469565b613051565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130505761304f82826135ac565b5b5b505050565b613060838361362b565b61306d60008484846130b1565b6130ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a390614707565b60405180910390fd5b505050565b60006130d28473ffffffffffffffffffffffffffffffffffffffff166137f9565b1561323b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130fb611aca565b8786866040518563ffffffff1660e01b815260040161311d949392919061463e565b602060405180830381600087803b15801561313757600080fd5b505af192505050801561316857506040513d601f19601f820116820180604052508101906131659190613b64565b60015b6131eb573d8060008114613198576040519150601f19603f3d011682016040523d82523d6000602084013e61319d565b606091505b506000815114156131e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131da90614707565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613240565b600190505b949350505050565b6000818360405160200161325c9190614302565b6040516020818303038152906040528051906020012060001c61327f9190614cdb565b905092915050565b60008060018385901c169050600181146132a25760006132a5565b60015b91505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161330984610d75565b6133139190614b45565b90506000600760008481526020019081526020016000205490508181146133f8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061347d9190614b45565b90506000600960008481526020019081526020016000205490506000600883815481106134d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061351b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613590577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135b783610d75565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561369b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369290614887565b60405180910390fd5b6136a481611a5e565b156136e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136db90614747565b60405180910390fd5b6136f060008383612f42565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137409190614a64565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6040518061010001604052806008905b60608152602001906001900390816138965790505090565b60006138c16138bc846149d0565b6149ab565b9050828152602081018484840111156138d957600080fd5b6138e4848285614bed565b509392505050565b6000813590506138fb816157a5565b92915050565b600081359050613910816157bc565b92915050565b600081359050613925816157d3565b92915050565b60008151905061393a816157d3565b92915050565b600082601f83011261395157600080fd5b81356139618482602086016138ae565b91505092915050565b600081359050613979816157ea565b92915050565b60008135905061398e81615801565b92915050565b6000602082840312156139a657600080fd5b60006139b4848285016138ec565b91505092915050565b600080604083850312156139d057600080fd5b60006139de858286016138ec565b92505060206139ef858286016138ec565b9150509250929050565b600080600060608486031215613a0e57600080fd5b6000613a1c868287016138ec565b9350506020613a2d868287016138ec565b9250506040613a3e8682870161397f565b9150509250925092565b60008060008060808587031215613a5e57600080fd5b6000613a6c878288016138ec565b9450506020613a7d878288016138ec565b9350506040613a8e8782880161397f565b925050606085013567ffffffffffffffff811115613aab57600080fd5b613ab787828801613940565b91505092959194509250565b60008060408385031215613ad657600080fd5b6000613ae4858286016138ec565b9250506020613af585828601613901565b9150509250929050565b60008060408385031215613b1257600080fd5b6000613b20858286016138ec565b9250506020613b318582860161397f565b9150509250929050565b600060208284031215613b4d57600080fd5b6000613b5b84828501613916565b91505092915050565b600060208284031215613b7657600080fd5b6000613b848482850161392b565b91505092915050565b60008060408385031215613ba057600080fd5b6000613bae8582860161396a565b9250506020613bbf8582860161396a565b9150509250929050565b600080600060608486031215613bde57600080fd5b6000613bec8682870161396a565b9350506020613bfd8682870161396a565b9250506040613c0e8682870161397f565b9150509250925092565b600060208284031215613c2a57600080fd5b6000613c388482850161397f565b91505092915050565b613c4a81614b79565b82525050565b613c5981614b8b565b82525050565b6000613c6a82614a16565b613c748185614a2c565b9350613c84818560208601614bfc565b613c8d81614dc8565b840191505092915050565b6000613ca382614a16565b613cad8185614a3d565b9350613cbd818560208601614bfc565b80840191505092915050565b6000613cd482614a21565b613cde8185614a48565b9350613cee818560208601614bfc565b613cf781614dc8565b840191505092915050565b6000613d0d82614a21565b613d178185614a59565b9350613d27818560208601614bfc565b80840191505092915050565b60008154613d4081614c2f565b613d4a8186614a59565b94506001821660008114613d655760018114613d7657613da9565b60ff19831686528186019350613da9565b613d7f85614a01565b60005b83811015613da157815481890152600182019150602081019050613d82565b838801955050505b50505092915050565b6000613dbf601c83614a48565b9150613dca82614dd9565b602082019050919050565b6000613de260e583614a59565b9150613ded82614e02565b60e582019050919050565b6000613e05602683614a59565b9150613e1082614f35565b602682019050919050565b6000613e28600483614a59565b9150613e3382614f84565b600482019050919050565b6000613e4b602b83614a48565b9150613e5682614fad565b604082019050919050565b6000613e6e603283614a48565b9150613e7982614ffc565b604082019050919050565b6000613e91602683614a48565b9150613e9c8261504b565b604082019050919050565b6000613eb4601c83614a48565b9150613ebf8261509a565b602082019050919050565b6000613ed7601b83614a48565b9150613ee2826150c3565b602082019050919050565b6000613efa601683614a59565b9150613f05826150ec565b601682019050919050565b6000613f1d602683614a59565b9150613f2882615115565b602682019050919050565b6000613f40602483614a48565b9150613f4b82615164565b604082019050919050565b6000613f63601983614a48565b9150613f6e826151b3565b602082019050919050565b6000613f86601f83614a48565b9150613f91826151dc565b602082019050919050565b6000613fa9601b83614a48565b9150613fb482615205565b602082019050919050565b6000613fcc602c83614a48565b9150613fd78261522e565b604082019050919050565b6000613fef602983614a59565b9150613ffa8261527d565b602982019050919050565b6000614012602683614a59565b915061401d826152cc565b602682019050919050565b6000614035603883614a48565b91506140408261531b565b604082019050919050565b6000614058600483614a59565b91506140638261536a565b600482019050919050565b600061407b602a83614a48565b915061408682615393565b604082019050919050565b600061409e602983614a48565b91506140a9826153e2565b604082019050919050565b60006140c1600283614a59565b91506140cc82615431565b600282019050919050565b60006140e4602083614a48565b91506140ef8261545a565b602082019050919050565b6000614107602c83614a48565b915061411282615483565b604082019050919050565b600061412a602083614a48565b9150614135826154d2565b602082019050919050565b600061414d602983614a48565b9150614158826154fb565b604082019050919050565b6000614170600483614a59565b915061417b8261554a565b600482019050919050565b6000614193602183614a48565b915061419e82615573565b604082019050919050565b60006141b6601d83614a59565b91506141c1826155c2565b601d82019050919050565b60006141d9600583614a59565b91506141e4826155eb565b600582019050919050565b60006141fc603183614a48565b915061420782615614565b604082019050919050565b600061421f600683614a59565b915061422a82615663565b600682019050919050565b6000614242602883614a59565b915061424d8261568c565b602882019050919050565b6000614265602c83614a48565b9150614270826156db565b604082019050919050565b6000614288600983614a59565b91506142938261572a565b600982019050919050565b60006142ab600a83614a59565b91506142b682615753565b600a82019050919050565b60006142ce600683614a59565b91506142d98261577c565b600682019050919050565b6142ed81614bc3565b82525050565b6142fc81614be3565b82525050565b600061430e8284613c98565b915081905092915050565b60006143258285613d02565b91506143318284613d02565b91508190509392505050565b6000614349828d613d02565b9150614355828c613d02565b9150614361828b613d33565b915061436d828a613d02565b91506143798289613d33565b91506143858288613d02565b91506143918287613d33565b915061439d8286613d02565b91506143a98285613d33565b91506143b58284613d02565b91508190509b9a5050505050505050505050565b60006143d58287613d02565b91506143e08261427b565b91506143ec8286613d02565b91506143f7826141cc565b91506144038285613d02565b915061440e82613f10565b915061441a8284613d33565b91506144258261404b565b915081905095945050505050565b600061443f8284613d02565b915061444a826142c1565b915081905092915050565b6000614461828c613d33565b915061446d828b613d02565b9150614479828a613d33565b91506144858289613d02565b91506144918288613d33565b915061449d8287613d02565b91506144a98286613d33565b91506144b58285613d02565b91506144c18284613d33565b91508190509a9950505050505050505050565b60006144df82613e1b565b91506144eb8284613d02565b915081905092915050565b600061450182613eed565b915061450d8289613d02565b915061451882613dd5565b91506145248288613d33565b915061452f82613df8565b915061453b8287613d33565b915061454682614235565b91506145528286613d33565b915061455d82614005565b91506145698285613d33565b915061457482613fe2565b91506145808284613d02565b915061458b826140b4565b9150819050979650505050505050565b60006145a682614163565b91506145b28284613d02565b915081905092915050565b60006145c8826141a9565b91506145d48284613d02565b915081905092915050565b60006145ea82614212565b91506145f68284613d02565b915081905092915050565b600061460c8261429e565b91506146188284613d02565b915081905092915050565b60006020820190506146386000830184613c41565b92915050565b60006080820190506146536000830187613c41565b6146606020830186613c41565b61466d60408301856142f3565b818103606083015261467f8184613c5f565b905095945050505050565b600060208201905061469f6000830184613c50565b92915050565b600060208201905081810360008301526146bf8184613cc9565b905092915050565b600060208201905081810360008301526146e081613db2565b9050919050565b6000602082019050818103600083015261470081613e3e565b9050919050565b6000602082019050818103600083015261472081613e61565b9050919050565b6000602082019050818103600083015261474081613e84565b9050919050565b6000602082019050818103600083015261476081613ea7565b9050919050565b6000602082019050818103600083015261478081613eca565b9050919050565b600060208201905081810360008301526147a081613f33565b9050919050565b600060208201905081810360008301526147c081613f56565b9050919050565b600060208201905081810360008301526147e081613f79565b9050919050565b6000602082019050818103600083015261480081613f9c565b9050919050565b6000602082019050818103600083015261482081613fbf565b9050919050565b6000602082019050818103600083015261484081614028565b9050919050565b600060208201905081810360008301526148608161406e565b9050919050565b6000602082019050818103600083015261488081614091565b9050919050565b600060208201905081810360008301526148a0816140d7565b9050919050565b600060208201905081810360008301526148c0816140fa565b9050919050565b600060208201905081810360008301526148e08161411d565b9050919050565b6000602082019050818103600083015261490081614140565b9050919050565b6000602082019050818103600083015261492081614186565b9050919050565b60006020820190508181036000830152614940816141ef565b9050919050565b6000602082019050818103600083015261496081614258565b9050919050565b600060408201905061497c60008301856142e4565b61498960208301846142e4565b9392505050565b60006020820190506149a560008301846142f3565b92915050565b60006149b56149c6565b90506149c18282614c61565b919050565b6000604051905090565b600067ffffffffffffffff8211156149eb576149ea614d99565b5b6149f482614dc8565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a6f82614be3565b9150614a7a83614be3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aaf57614aae614d0c565b5b828201905092915050565b6000614ac582614be3565b9150614ad083614be3565b925082614ae057614adf614d3b565b5b828204905092915050565b6000614af682614be3565b9150614b0183614be3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b3a57614b39614d0c565b5b828202905092915050565b6000614b5082614be3565b9150614b5b83614be3565b925082821015614b6e57614b6d614d0c565b5b828203905092915050565b6000614b8482614bc3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c1a578082015181840152602081019050614bff565b83811115614c29576000848401525b50505050565b60006002820490506001821680614c4757607f821691505b60208210811415614c5b57614c5a614d6a565b5b50919050565b614c6a82614dc8565b810181811067ffffffffffffffff82111715614c8957614c88614d99565b5b80604052505050565b6000614c9d82614be3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cd057614ccf614d0c565b5b600182019050919050565b6000614ce682614be3565b9150614cf183614be3565b925082614d0157614d00614d3b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4d696e7420776f756c6420657863656564206d617820737570706c7900000000600082015250565b7f222c20226465736372697074696f6e223a202235353535206772617068696e6760008201527f2063616c63756c61746f7220667269656e64732077686f2063616e206472617760208201527f20616e792066756e6374696f6e2c2031303025206f6e20636861696e2e20546860408201527f69732070726f6a6563742069732074686520696d706c656d656e746174696f6e60608201527f206f6620616e20696465612073686172656420627920646f6d2c2056696e652060808201527f636f2d666f756e6465722e222c202261747472696275746573223a205b7b227460a08201527f726169745f74797065223a20224261636b67726f756e64222c202276616c756560c08201527f223a20222300000000000000000000000000000000000000000000000000000060e082015250565b7f227d2c207b2274726169745f74797065223a202248656164222c202276616c7560008201527f65223a2022230000000000000000000000000000000000000000000000000000602082015250565b7f4845414400000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420746865206f776e6572206f66207468697320746f6b656e0000000000600082015250565b7f7b226e616d65223a202243616c63756c61746f72202300000000000000000000600082015250565b7f222077696474683d22313022206865696768743d22313022207374796c653d2260008201527f66696c6c3a230000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f227d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d60008201527f6c3b6261736536342c0000000000000000000000000000000000000000000000602082015250565b7f227d2c207b2274726169745f74797065223a20224c656773222c202276616c7560008201527f65223a2022230000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f22202f3e00000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4c45475300000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f2220793d22000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53435245454e0000000000000000000000000000000000000000000000000000600082015250565b7f227d2c207b2274726169745f74797065223a202253637265656e222c2022766160008201527f6c7565223a202223000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3c7265637420783d220000000000000000000000000000000000000000000000600082015250565b7f4241434b47524f554e4400000000000000000000000000000000000000000000600082015250565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b6157ae81614b79565b81146157b957600080fd5b50565b6157c581614b8b565b81146157d057600080fd5b50565b6157dc81614b97565b81146157e757600080fd5b50565b6157f381614bc3565b81146157fe57600080fd5b50565b61580a81614be3565b811461581557600080fd5b5056fe222f3e203c7265637420783d223139302220793d223730222077696474683d2231323022206865696768743d2231303022207374796c653d2266696c6c3a2322202f3e203c7265637420783d223138302220793d22333330222077696474683d2231343022206865696768743d22343022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223138302220793d22333730222077696474683d2231343022206865696768743d22363022207374796c653d2266696c6c3a2322202f3e203c7265637420783d223138302220793d223830222077696474683d2231343022206865696768743d22383022207374796c653d2266696c6c3a233c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302035303020353030223e203c7265637420783d22302220793d2230222077696474683d2235303022206865696768743d2235303022207374796c653d2266696c6c3a2322202f3e203c7265637420783d223335302220793d22333730222077696474683d22323022206865696768743d22323022207374796c653d2266696c6c3a234142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f22202f3e203c7265637420783d223138302220793d22343330222077696474683d2231363022206865696768743d22313022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223138302220793d22343430222077696474683d2231363022206865696768743d22313022207374796c653d2266696c6c3a2366666622202f3e203c7265637420783d223233302220793d22343230222077696474683d22363022206865696768743d22343022207374796c653d2266696c6c3a2322202f3e203c7265637420783d223230302220793d223530222077696474683d2231313022206865696768743d22313022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223330302220793d223530222077696474683d22313022206865696768743d22323022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223230302220793d223530222077696474683d22313022206865696768743d22363022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223139302220793d22313030222077696474683d22333022206865696768743d22343022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223235302220793d22313030222077696474683d22323022206865696768743d22333022207374796c653d2266696c6c3a2366666622202f3e203c7265637420783d223238302220793d22313030222077696474683d22323022206865696768743d22333022207374796c653d2266696c6c3a2366666622202f3e203c7265637420783d223236302220793d22313130222077696474683d22313022206865696768743d22323022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223239302220793d22313130222077696474683d22313022206865696768743d22323022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223237302220793d22313430222077696474683d22313022206865696768743d22313022207374796c653d2266696c6c3a2365373463336322202f3e203c7265637420783d223231302220793d22313730222077696474683d22383022206865696768743d22323022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223133352220793d22313835222077696474683d2232333022206865696768743d2231353022207374796c653d2266696c6c3a233b7374726f6b652d77696474683a31303b7374726f6b653a2330303022202f3e203c7265637420783d223133302220793d22333330222077696474683d22323022206865696768743d22343022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223335302220793d22333330222077696474683d22323022206865696768743d22343022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223133302220793d22333730222077696474683d22323022206865696768743d22323022207374796c653d2266696c6c3a2322202f3e203c7265637420783d223231302220793d22333930222077696474683d22383022206865696768743d22343022207374796c653d2266696c6c3a23a264697066735822122040418d64dc23a0984e7cfad0b3fc79d9e59b76ec5d82fd06e794f081537e87a264736f6c63430008040033

Deployed Bytecode

0x60806040526004361061019c5760003560e01c80636352211e116100ec578063a22cb4651161008a578063e11ca5c711610064578063e11ca5c7146105ba578063e985e9c5146105e3578063eb8d244414610620578063f2fde38b1461064b5761019c565b8063a22cb4651461052b578063b88d4fde14610554578063c87b56dd1461057d5761019c565b80638b097663116100c65780638b0976631461048e5780638da5cb5b146104aa57806395d89b41146104d5578063a035b1fe146105005761019c565b80636352211e146103fd57806370a082311461043a578063715018a6146104775761019c565b806323b872dd1161015957806334918dfd1161013357806334918dfd146103695780633ccfd60b1461038057806342842e0e146103975780634f6ccce7146103c05761019c565b806323b872dd146102d85780632f745c591461030157806332cb6b0c1461033e5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f5780631bf7d7491461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190613b3b565b610674565b6040516101d5919061468a565b60405180910390f35b3480156101ea57600080fd5b506101f36106ee565b60405161020091906146a5565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190613c18565b610780565b60405161023d9190614623565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190613aff565b610805565b005b34801561027b57600080fd5b5061028461091d565b6040516102919190614990565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190613c18565b61092a565b6040516102cf929190614967565b60405180910390f35b3480156102e457600080fd5b506102ff60048036038101906102fa91906139f9565b61098e565b005b34801561030d57600080fd5b5061032860048036038101906103239190613aff565b6109ee565b6040516103359190614990565b60405180910390f35b34801561034a57600080fd5b50610353610a93565b6040516103609190614990565b60405180910390f35b34801561037557600080fd5b5061037e610a99565b005b34801561038c57600080fd5b50610395610b41565b005b3480156103a357600080fd5b506103be60048036038101906103b991906139f9565b610c0c565b005b3480156103cc57600080fd5b506103e760048036038101906103e29190613c18565b610c2c565b6040516103f49190614990565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190613c18565b610cc3565b6040516104319190614623565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613994565b610d75565b60405161046e9190614990565b60405180910390f35b34801561048357600080fd5b5061048c610e2d565b005b6104a860048036038101906104a39190613b8d565b610eb5565b005b3480156104b657600080fd5b506104bf6110d5565b6040516104cc9190614623565b60405180910390f35b3480156104e157600080fd5b506104ea6110ff565b6040516104f791906146a5565b60405180910390f35b34801561050c57600080fd5b50610515611191565b6040516105229190614990565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d9190613ac3565b611197565b005b34801561056057600080fd5b5061057b60048036038101906105769190613a48565b611318565b005b34801561058957600080fd5b506105a4600480360381019061059f9190613c18565b61137a565b6040516105b191906146a5565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190613bc9565b61163d565b005b3480156105ef57600080fd5b5061060a600480360381019061060591906139bd565b6117dd565b604051610617919061468a565b60405180910390f35b34801561062c57600080fd5b50610635611871565b604051610642919061468a565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d9190613994565b611884565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106e757506106e68261197c565b5b9050919050565b6060600080546106fd90614c2f565b80601f016020809104026020016040519081016040528092919081815260200182805461072990614c2f565b80156107765780601f1061074b57610100808354040283529160200191610776565b820191906000526020600020905b81548152906001019060200180831161075957829003601f168201915b5050505050905090565b600061078b82611a5e565b6107ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c1906148a7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081082610cc3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890614907565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108a0611aca565b73ffffffffffffffffffffffffffffffffffffffff1614806108cf57506108ce816108c9611aca565b6117dd565b5b61090e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090590614827565b60405180910390fd5b6109188383611ad2565b505050565b6000600880549050905090565b60136020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b61099f610999611aca565b82611b8b565b6109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d590614927565b60405180910390fd5b6109e9838383611c69565b505050565b60006109f983610d75565b8210610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a31906146e7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b610aa1611aca565b73ffffffffffffffffffffffffffffffffffffffff16610abf6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c906148c7565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610b49611aca565b73ffffffffffffffffffffffffffffffffffffffff16610b676110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb4906148c7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c08573d6000803e3d6000fd5b5050565b610c2783838360405180602001604052806000815250611318565b505050565b6000610c3661091d565b8210610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90614947565b60405180910390fd5b60088281548110610cb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390614867565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90614847565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e35611aca565b73ffffffffffffffffffffffffffffffffffffffff16610e536110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea0906148c7565b60405180910390fd5b610eb36000611ec5565b565b600d60009054906101000a900460ff16610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb906147e7565b60405180910390fd5b600c54610f0f61091d565b10610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f46906146c7565b60405180910390fd5b34600b541115610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b906147c7565b60405180910390fd5b610f9c61380c565b82816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050806013600061101961091d565b815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506110d06110c3611aca565b6110cb61091d565b611f8b565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110e90614c2f565b80601f016020809104026020016040519081016040528092919081815260200182805461113a90614c2f565b80156111875780601f1061115c57610100808354040283529160200191611187565b820191906000526020600020905b81548152906001019060200180831161116a57829003601f168201915b5050505050905090565b600b5481565b61119f611aca565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611204906147a7565b60405180910390fd5b806005600061121a611aca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112c7611aca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161130c919061468a565b60405180910390a35050565b611329611323611aca565b83611b8b565b611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90614927565b60405180910390fd5b61137484848484611fa9565b50505050565b6060600061138783612005565b905060606040518060c00160405280609b815260200161591a609b91399050600061147b83601360008881526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505061212a565b90508181604051602001611490929190614319565b6040516020818303038152906040529150600061160d6114af87612b6d565b600e866000015160ff16815481106114f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600f876020015160ff168154811061153b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016010886040015160ff1681548110611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016012896060015160ff16815481106115d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016115e489612d1a565b6040516020016115f9969594939291906144f6565b604051602081830303815290604052612d1a565b90508060405160200161162091906145bd565b604051602081830303815290604052925082945050505050919050565b611645611aca565b73ffffffffffffffffffffffffffffffffffffffff1661166482610cc3565b73ffffffffffffffffffffffffffffffffffffffff16146116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190614767565b60405180910390fd5b6116c261380c565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050806013600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b61188c611aca565b73ffffffffffffffffffffffffffffffffffffffff166118aa6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f7906148c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196790614727565b60405180910390fd5b61197981611ec5565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a4757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a575750611a5682612ed8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b4583610cc3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b9682611a5e565b611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc90614807565b60405180910390fd5b6000611be083610cc3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c4f57508373ffffffffffffffffffffffffffffffffffffffff16611c3784610780565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c605750611c5f81856117dd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c8982610cc3565b73ffffffffffffffffffffffffffffffffffffffff1614611cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd6906148e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4690614787565b60405180910390fd5b611d5a838383612f42565b611d65600082611ad2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611db59190614b45565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0c9190614a64565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fa5828260405180602001604052806000815250613056565b5050565b611fb4848484611c69565b611fc0848484846130b1565b611fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff690614707565b60405180910390fd5b50505050565b61200d613852565b612015613852565b61204761202184612b6d565b6040516020016120319190614601565b6040516020818303038152906040526008613248565b816000019060ff16908160ff168152505061208a61206484612b6d565b60405160200161207491906144d4565b6040516020818303038152906040526024613248565b816020019060ff16908160ff16815250506120cd6120a784612b6d565b6040516020016120b791906145df565b6040516020818303038152906040526024613248565b816040019060ff16908160ff16815250506121106120ea84612b6d565b6040516020016120fa919061459b565b6040516020818303038152906040526024613248565b816060019060ff16908160ff168152505080915050919050565b6060612134613886565b6040518060600160405280603f8152602001615819603f913981600060088110612187577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280603f81526020016158db603f9139816001600881106121e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180610100016040528060df8152602001615dcf60df91398160026008811061223e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280603f81526020016159b5603f913981600360088110612299577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060c001604052806083815260200161585860839139816004600881106122f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280603f8152602001615eae603f91398160056008811061234f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180610100016040528060c58152602001615a3460c59139816006600881106123ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600481526020017f22202f3e0000000000000000000000000000000000000000000000000000000081525081600760088110612423577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000600e856000015160ff168154811061246e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001826000600881106124b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600f876020015160ff16815481106124f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018460016008811061253c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600f896020015160ff1681548110612582577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040518061030001604052806102d68152602001615af96102d6913960108b6040015160ff16815481106125e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018860026008811061262d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160108d6040015160ff1681548110612673577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160405160200161269599989796959493929190614455565b604051602081830303815290604052905080826003600881106126e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516010876040015160ff1681548110612727577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018460046008811061276b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516012896060015160ff16815481106127b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001866005600881106127f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600e8b6000015160ff168154811061283b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018860066008811061287f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600e8d6000015160ff16815481106128c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018a600760088110612909577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516040516020016129279a9998979695949392919061433d565b604051602081830303815290604052905060005b609a811015612b3f57612968856000015173ffffffffffffffffffffffffffffffffffffffff1682613287565b15612a38578161299b600a600e846129809190614aba565b61298a9190614aeb565b608c6129969190614a64565b612b6d565b6129c8600a600e856129ad9190614cdb565b6129b79190614aeb565b60be6129c39190614a64565b612b6d565b6011896040015160ff1681548110612a09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001604051602001612a2694939291906143c9565b60405160208183030381529060405291505b612a5c856020015173ffffffffffffffffffffffffffffffffffffffff1682613287565b15612b2c5781612a8f600a600e84612a749190614aba565b612a7e9190614aeb565b60fa612a8a9190614a64565b612b6d565b612abc600a600e85612aa19190614cdb565b612aab9190614aeb565b60be612ab79190614a64565b612b6d565b6011896040015160ff1681548110612afd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001604051602001612b1a94939291906143c9565b60405160208183030381529060405291505b8080612b3790614c92565b91505061293b565b5080604051602001612b519190614433565b6040516020818303038152906040529050809250505092915050565b60606000821415612bb5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d15565b600082905060005b60008214612be7578080612bd090614c92565b915050600a82612be09190614aba565b9150612bbd565b60008167ffffffffffffffff811115612c29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c5b5781602001600182028036833780820191505090505b5090505b60008514612d0e57600182612c749190614b45565b9150600a85612c839190614cdb565b6030612c8f9190614a64565b60f81b818381518110612ccb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d079190614aba565b9450612c5f565b8093505050505b919050565b60606000825190506000811415612d435760405180602001604052806000815250915050612ed3565b60006003600283612d549190614a64565b612d5e9190614aba565b6004612d6a9190614aeb565b90506000602082612d7b9190614a64565b67ffffffffffffffff811115612dba577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dec5781602001600182028036833780820191505090505b50905060006040518060600160405280604081526020016159f4604091399050600181016020830160005b86811015612e905760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612e17565b506003860660018114612eaa5760028114612eba57612ec5565b613d3d60f01b6002830352612ec5565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f4d8383836132ae565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f9057612f8b816132b3565b612fcf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fce57612fcd83826132fc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130125761300d81613469565b613051565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130505761304f82826135ac565b5b5b505050565b613060838361362b565b61306d60008484846130b1565b6130ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a390614707565b60405180910390fd5b505050565b60006130d28473ffffffffffffffffffffffffffffffffffffffff166137f9565b1561323b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130fb611aca565b8786866040518563ffffffff1660e01b815260040161311d949392919061463e565b602060405180830381600087803b15801561313757600080fd5b505af192505050801561316857506040513d601f19601f820116820180604052508101906131659190613b64565b60015b6131eb573d8060008114613198576040519150601f19603f3d011682016040523d82523d6000602084013e61319d565b606091505b506000815114156131e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131da90614707565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613240565b600190505b949350505050565b6000818360405160200161325c9190614302565b6040516020818303038152906040528051906020012060001c61327f9190614cdb565b905092915050565b60008060018385901c169050600181146132a25760006132a5565b60015b91505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161330984610d75565b6133139190614b45565b90506000600760008481526020019081526020016000205490508181146133f8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061347d9190614b45565b90506000600960008481526020019081526020016000205490506000600883815481106134d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061351b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613590577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135b783610d75565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561369b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369290614887565b60405180910390fd5b6136a481611a5e565b156136e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136db90614747565b60405180910390fd5b6136f060008383612f42565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137409190614a64565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6040518061010001604052806008905b60608152602001906001900390816138965790505090565b60006138c16138bc846149d0565b6149ab565b9050828152602081018484840111156138d957600080fd5b6138e4848285614bed565b509392505050565b6000813590506138fb816157a5565b92915050565b600081359050613910816157bc565b92915050565b600081359050613925816157d3565b92915050565b60008151905061393a816157d3565b92915050565b600082601f83011261395157600080fd5b81356139618482602086016138ae565b91505092915050565b600081359050613979816157ea565b92915050565b60008135905061398e81615801565b92915050565b6000602082840312156139a657600080fd5b60006139b4848285016138ec565b91505092915050565b600080604083850312156139d057600080fd5b60006139de858286016138ec565b92505060206139ef858286016138ec565b9150509250929050565b600080600060608486031215613a0e57600080fd5b6000613a1c868287016138ec565b9350506020613a2d868287016138ec565b9250506040613a3e8682870161397f565b9150509250925092565b60008060008060808587031215613a5e57600080fd5b6000613a6c878288016138ec565b9450506020613a7d878288016138ec565b9350506040613a8e8782880161397f565b925050606085013567ffffffffffffffff811115613aab57600080fd5b613ab787828801613940565b91505092959194509250565b60008060408385031215613ad657600080fd5b6000613ae4858286016138ec565b9250506020613af585828601613901565b9150509250929050565b60008060408385031215613b1257600080fd5b6000613b20858286016138ec565b9250506020613b318582860161397f565b9150509250929050565b600060208284031215613b4d57600080fd5b6000613b5b84828501613916565b91505092915050565b600060208284031215613b7657600080fd5b6000613b848482850161392b565b91505092915050565b60008060408385031215613ba057600080fd5b6000613bae8582860161396a565b9250506020613bbf8582860161396a565b9150509250929050565b600080600060608486031215613bde57600080fd5b6000613bec8682870161396a565b9350506020613bfd8682870161396a565b9250506040613c0e8682870161397f565b9150509250925092565b600060208284031215613c2a57600080fd5b6000613c388482850161397f565b91505092915050565b613c4a81614b79565b82525050565b613c5981614b8b565b82525050565b6000613c6a82614a16565b613c748185614a2c565b9350613c84818560208601614bfc565b613c8d81614dc8565b840191505092915050565b6000613ca382614a16565b613cad8185614a3d565b9350613cbd818560208601614bfc565b80840191505092915050565b6000613cd482614a21565b613cde8185614a48565b9350613cee818560208601614bfc565b613cf781614dc8565b840191505092915050565b6000613d0d82614a21565b613d178185614a59565b9350613d27818560208601614bfc565b80840191505092915050565b60008154613d4081614c2f565b613d4a8186614a59565b94506001821660008114613d655760018114613d7657613da9565b60ff19831686528186019350613da9565b613d7f85614a01565b60005b83811015613da157815481890152600182019150602081019050613d82565b838801955050505b50505092915050565b6000613dbf601c83614a48565b9150613dca82614dd9565b602082019050919050565b6000613de260e583614a59565b9150613ded82614e02565b60e582019050919050565b6000613e05602683614a59565b9150613e1082614f35565b602682019050919050565b6000613e28600483614a59565b9150613e3382614f84565b600482019050919050565b6000613e4b602b83614a48565b9150613e5682614fad565b604082019050919050565b6000613e6e603283614a48565b9150613e7982614ffc565b604082019050919050565b6000613e91602683614a48565b9150613e9c8261504b565b604082019050919050565b6000613eb4601c83614a48565b9150613ebf8261509a565b602082019050919050565b6000613ed7601b83614a48565b9150613ee2826150c3565b602082019050919050565b6000613efa601683614a59565b9150613f05826150ec565b601682019050919050565b6000613f1d602683614a59565b9150613f2882615115565b602682019050919050565b6000613f40602483614a48565b9150613f4b82615164565b604082019050919050565b6000613f63601983614a48565b9150613f6e826151b3565b602082019050919050565b6000613f86601f83614a48565b9150613f91826151dc565b602082019050919050565b6000613fa9601b83614a48565b9150613fb482615205565b602082019050919050565b6000613fcc602c83614a48565b9150613fd78261522e565b604082019050919050565b6000613fef602983614a59565b9150613ffa8261527d565b602982019050919050565b6000614012602683614a59565b915061401d826152cc565b602682019050919050565b6000614035603883614a48565b91506140408261531b565b604082019050919050565b6000614058600483614a59565b91506140638261536a565b600482019050919050565b600061407b602a83614a48565b915061408682615393565b604082019050919050565b600061409e602983614a48565b91506140a9826153e2565b604082019050919050565b60006140c1600283614a59565b91506140cc82615431565b600282019050919050565b60006140e4602083614a48565b91506140ef8261545a565b602082019050919050565b6000614107602c83614a48565b915061411282615483565b604082019050919050565b600061412a602083614a48565b9150614135826154d2565b602082019050919050565b600061414d602983614a48565b9150614158826154fb565b604082019050919050565b6000614170600483614a59565b915061417b8261554a565b600482019050919050565b6000614193602183614a48565b915061419e82615573565b604082019050919050565b60006141b6601d83614a59565b91506141c1826155c2565b601d82019050919050565b60006141d9600583614a59565b91506141e4826155eb565b600582019050919050565b60006141fc603183614a48565b915061420782615614565b604082019050919050565b600061421f600683614a59565b915061422a82615663565b600682019050919050565b6000614242602883614a59565b915061424d8261568c565b602882019050919050565b6000614265602c83614a48565b9150614270826156db565b604082019050919050565b6000614288600983614a59565b91506142938261572a565b600982019050919050565b60006142ab600a83614a59565b91506142b682615753565b600a82019050919050565b60006142ce600683614a59565b91506142d98261577c565b600682019050919050565b6142ed81614bc3565b82525050565b6142fc81614be3565b82525050565b600061430e8284613c98565b915081905092915050565b60006143258285613d02565b91506143318284613d02565b91508190509392505050565b6000614349828d613d02565b9150614355828c613d02565b9150614361828b613d33565b915061436d828a613d02565b91506143798289613d33565b91506143858288613d02565b91506143918287613d33565b915061439d8286613d02565b91506143a98285613d33565b91506143b58284613d02565b91508190509b9a5050505050505050505050565b60006143d58287613d02565b91506143e08261427b565b91506143ec8286613d02565b91506143f7826141cc565b91506144038285613d02565b915061440e82613f10565b915061441a8284613d33565b91506144258261404b565b915081905095945050505050565b600061443f8284613d02565b915061444a826142c1565b915081905092915050565b6000614461828c613d33565b915061446d828b613d02565b9150614479828a613d33565b91506144858289613d02565b91506144918288613d33565b915061449d8287613d02565b91506144a98286613d33565b91506144b58285613d02565b91506144c18284613d33565b91508190509a9950505050505050505050565b60006144df82613e1b565b91506144eb8284613d02565b915081905092915050565b600061450182613eed565b915061450d8289613d02565b915061451882613dd5565b91506145248288613d33565b915061452f82613df8565b915061453b8287613d33565b915061454682614235565b91506145528286613d33565b915061455d82614005565b91506145698285613d33565b915061457482613fe2565b91506145808284613d02565b915061458b826140b4565b9150819050979650505050505050565b60006145a682614163565b91506145b28284613d02565b915081905092915050565b60006145c8826141a9565b91506145d48284613d02565b915081905092915050565b60006145ea82614212565b91506145f68284613d02565b915081905092915050565b600061460c8261429e565b91506146188284613d02565b915081905092915050565b60006020820190506146386000830184613c41565b92915050565b60006080820190506146536000830187613c41565b6146606020830186613c41565b61466d60408301856142f3565b818103606083015261467f8184613c5f565b905095945050505050565b600060208201905061469f6000830184613c50565b92915050565b600060208201905081810360008301526146bf8184613cc9565b905092915050565b600060208201905081810360008301526146e081613db2565b9050919050565b6000602082019050818103600083015261470081613e3e565b9050919050565b6000602082019050818103600083015261472081613e61565b9050919050565b6000602082019050818103600083015261474081613e84565b9050919050565b6000602082019050818103600083015261476081613ea7565b9050919050565b6000602082019050818103600083015261478081613eca565b9050919050565b600060208201905081810360008301526147a081613f33565b9050919050565b600060208201905081810360008301526147c081613f56565b9050919050565b600060208201905081810360008301526147e081613f79565b9050919050565b6000602082019050818103600083015261480081613f9c565b9050919050565b6000602082019050818103600083015261482081613fbf565b9050919050565b6000602082019050818103600083015261484081614028565b9050919050565b600060208201905081810360008301526148608161406e565b9050919050565b6000602082019050818103600083015261488081614091565b9050919050565b600060208201905081810360008301526148a0816140d7565b9050919050565b600060208201905081810360008301526148c0816140fa565b9050919050565b600060208201905081810360008301526148e08161411d565b9050919050565b6000602082019050818103600083015261490081614140565b9050919050565b6000602082019050818103600083015261492081614186565b9050919050565b60006020820190508181036000830152614940816141ef565b9050919050565b6000602082019050818103600083015261496081614258565b9050919050565b600060408201905061497c60008301856142e4565b61498960208301846142e4565b9392505050565b60006020820190506149a560008301846142f3565b92915050565b60006149b56149c6565b90506149c18282614c61565b919050565b6000604051905090565b600067ffffffffffffffff8211156149eb576149ea614d99565b5b6149f482614dc8565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a6f82614be3565b9150614a7a83614be3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aaf57614aae614d0c565b5b828201905092915050565b6000614ac582614be3565b9150614ad083614be3565b925082614ae057614adf614d3b565b5b828204905092915050565b6000614af682614be3565b9150614b0183614be3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b3a57614b39614d0c565b5b828202905092915050565b6000614b5082614be3565b9150614b5b83614be3565b925082821015614b6e57614b6d614d0c565b5b828203905092915050565b6000614b8482614bc3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c1a578082015181840152602081019050614bff565b83811115614c29576000848401525b50505050565b60006002820490506001821680614c4757607f821691505b60208210811415614c5b57614c5a614d6a565b5b50919050565b614c6a82614dc8565b810181811067ffffffffffffffff82111715614c8957614c88614d99565b5b80604052505050565b6000614c9d82614be3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cd057614ccf614d0c565b5b600182019050919050565b6000614ce682614be3565b9150614cf183614be3565b925082614d0157614d00614d3b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4d696e7420776f756c6420657863656564206d617820737570706c7900000000600082015250565b7f222c20226465736372697074696f6e223a202235353535206772617068696e6760008201527f2063616c63756c61746f7220667269656e64732077686f2063616e206472617760208201527f20616e792066756e6374696f6e2c2031303025206f6e20636861696e2e20546860408201527f69732070726f6a6563742069732074686520696d706c656d656e746174696f6e60608201527f206f6620616e20696465612073686172656420627920646f6d2c2056696e652060808201527f636f2d666f756e6465722e222c202261747472696275746573223a205b7b227460a08201527f726169745f74797065223a20224261636b67726f756e64222c202276616c756560c08201527f223a20222300000000000000000000000000000000000000000000000000000060e082015250565b7f227d2c207b2274726169745f74797065223a202248656164222c202276616c7560008201527f65223a2022230000000000000000000000000000000000000000000000000000602082015250565b7f4845414400000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420746865206f776e6572206f66207468697320746f6b656e0000000000600082015250565b7f7b226e616d65223a202243616c63756c61746f72202300000000000000000000600082015250565b7f222077696474683d22313022206865696768743d22313022207374796c653d2260008201527f66696c6c3a230000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f227d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d60008201527f6c3b6261736536342c0000000000000000000000000000000000000000000000602082015250565b7f227d2c207b2274726169745f74797065223a20224c656773222c202276616c7560008201527f65223a2022230000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f22202f3e00000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4c45475300000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f2220793d22000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53435245454e0000000000000000000000000000000000000000000000000000600082015250565b7f227d2c207b2274726169745f74797065223a202253637265656e222c2022766160008201527f6c7565223a202223000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3c7265637420783d220000000000000000000000000000000000000000000000600082015250565b7f4241434b47524f554e4400000000000000000000000000000000000000000000600082015250565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b6157ae81614b79565b81146157b957600080fd5b50565b6157c581614b8b565b81146157d057600080fd5b50565b6157dc81614b97565b81146157e757600080fd5b50565b6157f381614bc3565b81146157fe57600080fd5b50565b61580a81614be3565b811461581557600080fd5b5056fe222f3e203c7265637420783d223139302220793d223730222077696474683d2231323022206865696768743d2231303022207374796c653d2266696c6c3a2322202f3e203c7265637420783d223138302220793d22333330222077696474683d2231343022206865696768743d22343022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223138302220793d22333730222077696474683d2231343022206865696768743d22363022207374796c653d2266696c6c3a2322202f3e203c7265637420783d223138302220793d223830222077696474683d2231343022206865696768743d22383022207374796c653d2266696c6c3a233c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302035303020353030223e203c7265637420783d22302220793d2230222077696474683d2235303022206865696768743d2235303022207374796c653d2266696c6c3a2322202f3e203c7265637420783d223335302220793d22333730222077696474683d22323022206865696768743d22323022207374796c653d2266696c6c3a234142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f22202f3e203c7265637420783d223138302220793d22343330222077696474683d2231363022206865696768743d22313022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223138302220793d22343430222077696474683d2231363022206865696768743d22313022207374796c653d2266696c6c3a2366666622202f3e203c7265637420783d223233302220793d22343230222077696474683d22363022206865696768743d22343022207374796c653d2266696c6c3a2322202f3e203c7265637420783d223230302220793d223530222077696474683d2231313022206865696768743d22313022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223330302220793d223530222077696474683d22313022206865696768743d22323022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223230302220793d223530222077696474683d22313022206865696768743d22363022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223139302220793d22313030222077696474683d22333022206865696768743d22343022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223235302220793d22313030222077696474683d22323022206865696768743d22333022207374796c653d2266696c6c3a2366666622202f3e203c7265637420783d223238302220793d22313030222077696474683d22323022206865696768743d22333022207374796c653d2266696c6c3a2366666622202f3e203c7265637420783d223236302220793d22313130222077696474683d22313022206865696768743d22323022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223239302220793d22313130222077696474683d22313022206865696768743d22323022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223237302220793d22313430222077696474683d22313022206865696768743d22313022207374796c653d2266696c6c3a2365373463336322202f3e203c7265637420783d223231302220793d22313730222077696474683d22383022206865696768743d22323022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223133352220793d22313835222077696474683d2232333022206865696768743d2231353022207374796c653d2266696c6c3a233b7374726f6b652d77696474683a31303b7374726f6b653a2330303022202f3e203c7265637420783d223133302220793d22333330222077696474683d22323022206865696768743d22343022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223335302220793d22333330222077696474683d22323022206865696768743d22343022207374796c653d2266696c6c3a2330303022202f3e203c7265637420783d223133302220793d22333730222077696474683d22323022206865696768743d22323022207374796c653d2266696c6c3a2322202f3e203c7265637420783d223231302220793d22333930222077696474683d22383022206865696768743d22343022207374796c653d2266696c6c3a23a264697066735822122040418d64dc23a0984e7cfad0b3fc79d9e59b76ec5d82fd06e794f081537e87a264736f6c63430008040033

Deployed Bytecode Sourcemap

44494:8704:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38346:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25460:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27019:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26542:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38986:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47169:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;27909:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38654:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44606:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47366:89;;;;;;;;;;;;;:::i;:::-;;47218:140;;;;;;;;;;;;;:::i;:::-;;28319:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39176:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25154:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24884:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9852:94;;;;;;;;;;;;;:::i;:::-;;51927:484;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9201:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25629:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44548:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27312:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28575:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50853:1066;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48354:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27678:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44645:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10101:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38346:224;38448:4;38487:35;38472:50;;;:11;:50;;;;:90;;;;38526:36;38550:11;38526:23;:36::i;:::-;38472:90;38465:97;;38346:224;;;:::o;25460:100::-;25514:13;25547:5;25540:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25460:100;:::o;27019:221::-;27095:7;27123:16;27131:7;27123;:16::i;:::-;27115:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27208:15;:24;27224:7;27208:24;;;;;;;;;;;;;;;;;;;;;27201:31;;27019:221;;;:::o;26542:411::-;26623:13;26639:23;26654:7;26639:14;:23::i;:::-;26623:39;;26687:5;26681:11;;:2;:11;;;;26673:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26781:5;26765:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26790:37;26807:5;26814:12;:10;:12::i;:::-;26790:16;:37::i;:::-;26765:62;26743:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26924:21;26933:2;26937:7;26924:8;:21::i;:::-;26542:411;;;:::o;38986:113::-;39047:7;39074:10;:17;;;;39067:24;;38986:113;:::o;47169:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27909:339::-;28104:41;28123:12;:10;:12::i;:::-;28137:7;28104:18;:41::i;:::-;28096:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28212:28;28222:4;28228:2;28232:7;28212:9;:28::i;:::-;27909:339;;;:::o;38654:256::-;38751:7;38787:23;38804:5;38787:16;:23::i;:::-;38779:5;:31;38771:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38876:12;:19;38889:5;38876:19;;;;;;;;;;;;;;;:26;38896:5;38876:26;;;;;;;;;;;;38869:33;;38654:256;;;;:::o;44606:32::-;;;;:::o;47366:89::-;9432:12;:10;:12::i;:::-;9421:23;;:7;:5;:7::i;:::-;:23;;;9413:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47435:12:::1;;;;;;;;;;;47434:13;47419:12;;:28;;;;;;;;;;;;;;;;;;47366:89::o:0;47218:140::-;9432:12;:10;:12::i;:::-;9421:23;;:7;:5;:7::i;:::-;:23;;;9413:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47266:12:::1;47281:21;47266:36;;47321:10;47313:28;;:37;47342:7;47313:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;9492:1;47218:140::o:0;28319:185::-;28457:39;28474:4;28480:2;28484:7;28457:39;;;;;;;;;;;;:16;:39::i;:::-;28319:185;;;:::o;39176:233::-;39251:7;39287:30;:28;:30::i;:::-;39279:5;:38;39271:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39384:10;39395:5;39384:17;;;;;;;;;;;;;;;;;;;;;;;;39377:24;;39176:233;;;:::o;25154:239::-;25226:7;25246:13;25262:7;:16;25270:7;25262:16;;;;;;;;;;;;;;;;;;;;;25246:32;;25314:1;25297:19;;:5;:19;;;;25289:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25380:5;25373:12;;;25154:239;;;:::o;24884:208::-;24956:7;25001:1;24984:19;;:5;:19;;;;24976:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25068:9;:16;25078:5;25068:16;;;;;;;;;;;;;;;;25061:23;;24884:208;;;:::o;9852:94::-;9432:12;:10;:12::i;:::-;9421:23;;:7;:5;:7::i;:::-;:23;;;9413:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9917:21:::1;9935:1;9917:9;:21::i;:::-;9852:94::o:0;51927:484::-;52012:12;;;;;;;;;;;52004:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52091:10;;52075:13;:11;:13::i;:::-;:26;52067:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52162:9;52153:5;;:18;;52145:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52220:18;;:::i;:::-;52266:8;52249:5;:14;;:25;;;;;;;;;;;52303:9;52285:5;:15;;:27;;;;;;;;;;;52347:5;52323:6;:21;52330:13;:11;:13::i;:::-;52323:21;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52365:38;52375:12;:10;:12::i;:::-;52389:13;:11;:13::i;:::-;52365:9;:38::i;:::-;51927:484;;;:::o;9201:87::-;9247:7;9274:6;;;;;;;;;;;9267:13;;9201:87;:::o;25629:104::-;25685:13;25718:7;25711:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25629:104;:::o;44548:40::-;;;;:::o;27312:295::-;27427:12;:10;:12::i;:::-;27415:24;;:8;:24;;;;27407:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27527:8;27482:18;:32;27501:12;:10;:12::i;:::-;27482:32;;;;;;;;;;;;;;;:42;27515:8;27482:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27580:8;27551:48;;27566:12;:10;:12::i;:::-;27551:48;;;27590:8;27551:48;;;;;;:::i;:::-;;;;;;;;27312:295;;:::o;28575:328::-;28750:41;28769:12;:10;:12::i;:::-;28783:7;28750:18;:41::i;:::-;28742:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28856:39;28870:4;28876:2;28880:7;28889:5;28856:13;:39::i;:::-;28575:328;;;;:::o;50853:1066::-;50918:13;50944:22;50969;50983:7;50969:13;:22::i;:::-;50944:47;;51004:20;51044:6;;;;;;;;;;;;;;;;;51035:15;;51063:16;51082:27;51087:4;51093:6;:15;51100:7;51093:15;;;;;;;;;;;51082:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:27::i;:::-;51063:46;;51153:6;51161:2;51136:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51120:45;;51178:18;51199:601;51269:17;51278:7;51269:8;:17::i;:::-;51521:2;51524:4;:7;;;51521:11;;;;;;;;;;;;;;;;;;;;;;;;;51576:4;51581;:9;;;51576:15;;;;;;;;;;;;;;;;;;;;;;;;;51637:6;51644:4;:11;;;51637:19;;;;;;;;;;;;;;;;;;;;;;;;;51700:4;51705;:9;;;51700:15;;;;;;;;;;;;;;;;;;;;;;;;;51762:28;51782:6;51762:13;:28::i;:::-;51226:571;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51199:13;:601::i;:::-;51178:622;;51879:4;51829:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;51813:72;;51905:6;51898:13;;;;;;50853:1066;;;:::o;48354:311::-;48476:12;:10;:12::i;:::-;48456:32;;:16;48464:7;48456;:16::i;:::-;:32;;;48448:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48531:18;;:::i;:::-;48577:8;48560:5;:14;;:25;;;;;;;;;;;48614:9;48596:5;:15;;:27;;;;;;;;;;;48652:5;48634:6;:15;48641:7;48634:15;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48354:311;;;;:::o;27678:164::-;27775:4;27799:18;:25;27818:5;27799:25;;;;;;;;;;;;;;;:35;27825:8;27799:35;;;;;;;;;;;;;;;;;;;;;;;;;27792:42;;27678:164;;;;:::o;44645:31::-;;;;;;;;;;;;;:::o;10101:192::-;9432:12;:10;:12::i;:::-;9421:23;;:7;:5;:7::i;:::-;:23;;;9413:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10210:1:::1;10190:22;;:8;:22;;;;10182:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10266:19;10276:8;10266:9;:19::i;:::-;10101:192:::0;:::o;24515:305::-;24617:4;24669:25;24654:40;;;:11;:40;;;;:105;;;;24726:33;24711:48;;;:11;:48;;;;24654:105;:158;;;;24776:36;24800:11;24776:23;:36::i;:::-;24654:158;24634:178;;24515:305;;;:::o;30413:127::-;30478:4;30530:1;30502:30;;:7;:16;30510:7;30502:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30495:37;;30413:127;;;:::o;8061:98::-;8114:7;8141:10;8134:17;;8061:98;:::o;34395:174::-;34497:2;34470:15;:24;34486:7;34470:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34553:7;34549:2;34515:46;;34524:23;34539:7;34524:14;:23::i;:::-;34515:46;;;;;;;;;;;;34395:174;;:::o;30707:348::-;30800:4;30825:16;30833:7;30825;:16::i;:::-;30817:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30901:13;30917:23;30932:7;30917:14;:23::i;:::-;30901:39;;30970:5;30959:16;;:7;:16;;;:51;;;;31003:7;30979:31;;:20;30991:7;30979:11;:20::i;:::-;:31;;;30959:51;:87;;;;31014:32;31031:5;31038:7;31014:16;:32::i;:::-;30959:87;30951:96;;;30707:348;;;;:::o;33699:578::-;33858:4;33831:31;;:23;33846:7;33831:14;:23::i;:::-;:31;;;33823:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33941:1;33927:16;;:2;:16;;;;33919:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33997:39;34018:4;34024:2;34028:7;33997:20;:39::i;:::-;34101:29;34118:1;34122:7;34101:8;:29::i;:::-;34162:1;34143:9;:15;34153:4;34143:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34191:1;34174:9;:13;34184:2;34174:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34222:2;34203:7;:16;34211:7;34203:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34261:7;34257:2;34242:27;;34251:4;34242:27;;;;;;;;;;;;33699:578;;;:::o;10301:173::-;10357:16;10376:6;;;;;;;;;;;10357:25;;10402:8;10393:6;;:17;;;;;;;;;;;;;;;;;;10457:8;10426:40;;10447:8;10426:40;;;;;;;;;;;;10301:173;;:::o;31397:110::-;31473:26;31483:2;31487:7;31473:26;;;;;;;;;;;;:9;:26::i;:::-;31397:110;;:::o;29785:315::-;29942:28;29952:4;29958:2;29962:7;29942:9;:28::i;:::-;29989:48;30012:4;30018:2;30022:7;30031:5;29989:22;:48::i;:::-;29981:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29785:315;;;;:::o;47631:496::-;47694:17;;:::i;:::-;47724:22;;:::i;:::-;47775:60;47813:17;47822:7;47813:8;:17::i;:::-;47782:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;47833:1;47775:6;:60::i;:::-;47759:4;:7;;:77;;;;;;;;;;;47865:55;47897:17;47906:7;47897:8;:17::i;:::-;47872:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;47917:2;47865:6;:55::i;:::-;47847:4;:9;;:74;;;;;;;;;;;47952:57;47986:17;47995:7;47986:8;:17::i;:::-;47959:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;48006:2;47952:6;:57::i;:::-;47932:4;:11;;:78;;;;;;;;;;;48039:55;48071:17;48080:7;48071:8;:17::i;:::-;48046:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;48091:2;48039:6;:55::i;:::-;48021:4;:9;;:74;;;;;;;;;;;48115:4;48108:11;;;47631:496;;;:::o;48673:2172::-;48754:13;48780:22;;:::i;:::-;48815:76;;;;;;;;;;;;;;;;;:5;48821:1;48815:8;;;;;;;;;;;;;;;;;;:76;;;;48902;;;;;;;;;;;;;;;;;:5;48908:1;48902:8;;;;;;;;;;;;;;;;;;:76;;;;48989:236;;;;;;;;;;;;;;;;;:5;48995:1;48989:8;;;;;;;;;;;;;;;;;;:236;;;;49236:76;;;;;;;;;;;;;;;;;:5;49242:1;49236:8;;;;;;;;;;;;;;;;;;:76;;;;49323:144;;;;;;;;;;;;;;;;;:5;49329:1;49323:8;;;;;;;;;;;;;;;;;;:144;;;;49478:76;;;;;;;;;;;;;;;;;:5;49484:1;49478:8;;;;;;;;;;;;;;;;;;:76;;;;49565:210;;;;;;;;;;;;;;;;;:5;49571:1;49565:8;;;;;;;;;;;;;;;;;;:210;;;;49786:17;;;;;;;;;;;;;;;;;:5;49792:1;49786:8;;;;;;;;;;;;;;;;;;:17;;;;49816:20;49863:2;49866:4;:7;;;49863:11;;;;;;;;;;;;;;;;;;;;;;;;;49876:5;49882:1;49876:8;;;;;;;;;;;;;;;;;;;49886:4;49891;:9;;;49886:15;;;;;;;;;;;;;;;;;;;;;;;;;49903:5;49909:1;49903:8;;;;;;;;;;;;;;;;;;;49913:4;49918;:9;;;49913:15;;;;;;;;;;;;;;;;;;;;;;;;;49930:4;;;;;;;;;;;;;;;;;49936:6;49943:4;:11;;;49936:19;;;;;;;;;;;;;;;;;;;;;;;;;49957:5;49963:1;49957:8;;;;;;;;;;;;;;;;;;;49967:6;49974:4;:11;;;49967:19;;;;;;;;;;;;;;;;;;;;;;;;;49846:141;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49816:172;;50032:6;50040:5;50046:1;50040:8;;;;;;;;;;;;;;;;;;;50050:6;50057:4;:11;;;50050:19;;;;;;;;;;;;;;;;;;;;;;;;;50071:5;50077:1;50071:8;;;;;;;;;;;;;;;;;;;50081:4;50086;:9;;;50081:15;;;;;;;;;;;;;;;;;;;;;;;;;50098:5;50104:1;50098:8;;;;;;;;;;;;;;;;;;;50108:2;50111:4;:7;;;50108:11;;;;;;;;;;;;;;;;;;;;;;;;;50121:5;50127:1;50121:8;;;;;;;;;;;;;;;;;;;50131:2;50134:4;:7;;;50131:11;;;;;;;;;;;;;;;;;;;;;;;;;50144:5;50150:1;50144:8;;;;;;;;;;;;;;;;;;;50015:138;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49999:155;;50172:9;50167:583;50191:3;50187:1;:7;50167:583;;;50220:29;50231:5;:14;;;50220:29;;50247:1;50220:10;:29::i;:::-;50216:253;;;50303:6;50324:23;50344:2;50340;50338:1;:4;;;;:::i;:::-;50337:9;;;;:::i;:::-;50333:3;:13;;;;:::i;:::-;50324:8;:23::i;:::-;50358;50378:2;50374;50372:1;:4;;;;:::i;:::-;50371:9;;;;:::i;:::-;50367:3;:13;;;;:::i;:::-;50358:8;:23::i;:::-;50425:6;50432:4;:11;;;50425:19;;;;;;;;;;;;;;;;;;;;;;;;;50286:166;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50270:183;;50216:253;50489:30;50500:5;:15;;;50489:30;;50517:1;50489:10;:30::i;:::-;50485:254;;;50573:6;50594:23;50614:2;50610;50608:1;:4;;;;:::i;:::-;50607:9;;;;:::i;:::-;50603:3;:13;;;;:::i;:::-;50594:8;:23::i;:::-;50628;50648:2;50644;50642:1;:4;;;;:::i;:::-;50641:9;;;;:::i;:::-;50637:3;:13;;;;:::i;:::-;50628:8;:23::i;:::-;50695:6;50702:4;:11;;;50695:19;;;;;;;;;;;;;;;;;;;;;;;;;50556:166;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50540:183;;50485:254;50196:3;;;;;:::i;:::-;;;;50167:583;;;;50795:6;50778:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;50762:51;;50831:6;50824:13;;;;48673:2172;;;;:::o;52419:715::-;52475:13;52697:1;52688:5;:10;52684:53;;;52715:10;;;;;;;;;;;;;;;;;;;;;52684:53;52747:12;52762:5;52747:20;;52778:14;52803:78;52818:1;52810:4;:9;52803:78;;52836:8;;;;;:::i;:::-;;;;52867:2;52859:10;;;;;:::i;:::-;;;52803:78;;;52891:19;52923:6;52913:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52891:39;;52941:154;52957:1;52948:5;:10;52941:154;;52985:1;52975:11;;;;;:::i;:::-;;;53052:2;53044:5;:10;;;;:::i;:::-;53031:2;:24;;;;:::i;:::-;53018:39;;53001:6;53008;53001:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;53081:2;53072:11;;;;;:::i;:::-;;;52941:154;;;53119:6;53105:21;;;;;52419:715;;;;:::o;53549:1607::-;53607:13;53633:11;53647:4;:11;53633:25;;53680:1;53673:3;:8;53669:23;;;53683:9;;;;;;;;;;;;;;;;;53669:23;53744:18;53782:1;53777;53771:3;:7;;;;:::i;:::-;53770:13;;;;:::i;:::-;53765:1;:19;;;;:::i;:::-;53744:40;;53842:19;53887:2;53874:10;:15;;;;:::i;:::-;53864:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53842:48;;53903:18;53924:5;;;;;;;;;;;;;;;;;53903:26;;53993:1;53986:5;53982:13;54038:2;54030:6;54026:15;54089:1;54057:777;54112:3;54109:1;54106:10;54057:777;;;54167:1;54164;54160:9;54155:14;;54225:8;54220:1;54214:4;54210:12;54204:19;54200:34;54305:4;54297:5;54293:2;54289:14;54285:25;54275:8;54271:40;54265:47;54344:3;54341:1;54337:11;54330:18;;54435:4;54426;54418:5;54414:2;54410:14;54406:25;54396:8;54392:40;54386:47;54382:58;54377:3;54373:68;54366:75;;54473:3;54470:1;54466:11;54459:18;;54563:4;54554;54546:5;54543:1;54539:13;54535:24;54525:8;54521:39;54515:46;54511:57;54506:3;54502:67;54495:74;;54601:3;54598:1;54594:11;54587:18;;54683:4;54674;54667:5;54663:16;54653:8;54649:31;54643:38;54639:49;54634:3;54630:59;54623:66;;54723:3;54718;54714:13;54707:20;;54765:3;54754:9;54747:22;54817:1;54806:9;54802:17;54789:30;;54136:698;;54057:777;;;54061:44;54866:1;54861:3;54857:11;54887:1;54882:84;;;;54985:1;54980:82;;;;54850:212;;54882:84;54943:6;54938:3;54934:16;54930:1;54919:9;54915:17;54908:43;54882:84;;54980:82;55041:4;55036:3;55032:14;55028:1;55017:9;55013:17;55006:41;54850:212;;55093:10;55085:6;55078:26;53951:1164;;55141:6;55127:21;;;;;;53549:1607;;;;:::o;23122:157::-;23207:4;23246:25;23231:40;;;:11;:40;;;;23224:47;;23122:157;;;:::o;40022:589::-;40166:45;40193:4;40199:2;40203:7;40166:26;:45::i;:::-;40244:1;40228:18;;:4;:18;;;40224:187;;;40263:40;40295:7;40263:31;:40::i;:::-;40224:187;;;40333:2;40325:10;;:4;:10;;;40321:90;;40352:47;40385:4;40391:7;40352:32;:47::i;:::-;40321:90;40224:187;40439:1;40425:16;;:2;:16;;;40421:183;;;40458:45;40495:7;40458:36;:45::i;:::-;40421:183;;;40531:4;40525:10;;:2;:10;;;40521:83;;40552:40;40580:2;40584:7;40552:27;:40::i;:::-;40521:83;40421:183;40022:589;;;:::o;31734:321::-;31864:18;31870:2;31874:7;31864:5;:18::i;:::-;31915:54;31946:1;31950:2;31954:7;31963:5;31915:22;:54::i;:::-;31893:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31734:321;;;:::o;35134:803::-;35289:4;35310:15;:2;:13;;;:15::i;:::-;35306:624;;;35362:2;35346:36;;;35383:12;:10;:12::i;:::-;35397:4;35403:7;35412:5;35346:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35342:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35609:1;35592:6;:13;:18;35588:272;;;35635:60;;;;;;;;;;:::i;:::-;;;;;;;;35588:272;35810:6;35804:13;35795:6;35791:2;35787:15;35780:38;35342:533;35479:45;;;35469:55;;;:6;:55;;;;35462:62;;;;;35306:624;35914:4;35907:11;;35134:803;;;;;;;:::o;47463:160::-;47537:7;47610:5;47599;47582:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;47572:34;;;;;;47564:43;;:51;;;;:::i;:::-;47557:58;;47463:160;;;;:::o;48135:211::-;48220:4;48237:12;48292:1;48269:11;48253:12;:27;;48252:42;48237:57;;48321:1;48313:4;:9;:24;;48332:5;48313:24;;;48325:4;48313:24;48305:33;;;48135:211;;;;:::o;36509:126::-;;;;:::o;41334:164::-;41438:10;:17;;;;41411:15;:24;41427:7;41411:24;;;;;;;;;;;:44;;;;41466:10;41482:7;41466:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41334:164;:::o;42125:988::-;42391:22;42441:1;42416:22;42433:4;42416:16;:22::i;:::-;:26;;;;:::i;:::-;42391:51;;42453:18;42474:17;:26;42492:7;42474:26;;;;;;;;;;;;42453:47;;42621:14;42607:10;:28;42603:328;;42652:19;42674:12;:18;42687:4;42674:18;;;;;;;;;;;;;;;:34;42693:14;42674:34;;;;;;;;;;;;42652:56;;42758:11;42725:12;:18;42738:4;42725:18;;;;;;;;;;;;;;;:30;42744:10;42725:30;;;;;;;;;;;:44;;;;42875:10;42842:17;:30;42860:11;42842:30;;;;;;;;;;;:43;;;;42603:328;;43027:17;:26;43045:7;43027:26;;;;;;;;;;;43020:33;;;43071:12;:18;43084:4;43071:18;;;;;;;;;;;;;;;:34;43090:14;43071:34;;;;;;;;;;;43064:41;;;42125:988;;;;:::o;43408:1079::-;43661:22;43706:1;43686:10;:17;;;;:21;;;;:::i;:::-;43661:46;;43718:18;43739:15;:24;43755:7;43739:24;;;;;;;;;;;;43718:45;;44090:19;44112:10;44123:14;44112:26;;;;;;;;;;;;;;;;;;;;;;;;44090:48;;44176:11;44151:10;44162;44151:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44287:10;44256:15;:28;44272:11;44256:28;;;;;;;;;;;:41;;;;44428:15;:24;44444:7;44428:24;;;;;;;;;;;44421:31;;;44463:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43408:1079;;;;:::o;40912:221::-;40997:14;41014:20;41031:2;41014:16;:20::i;:::-;40997:37;;41072:7;41045:12;:16;41058:2;41045:16;;;;;;;;;;;;;;;:24;41062:6;41045:24;;;;;;;;;;;:34;;;;41119:6;41090:17;:26;41108:7;41090:26;;;;;;;;;;;:35;;;;40912:221;;;:::o;32391:382::-;32485:1;32471:16;;:2;:16;;;;32463:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32544:16;32552:7;32544;:16::i;:::-;32543:17;32535:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32606:45;32635:1;32639:2;32643:7;32606:20;:45::i;:::-;32681:1;32664:9;:13;32674:2;32664:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32712:2;32693:7;:16;32701:7;32693:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32757:7;32753:2;32732:33;;32749:1;32732:33;;;;;;;;;;;;32391:382;;:::o;15294:387::-;15354:4;15562:12;15629:7;15617:20;15609:28;;15672:1;15665:4;:8;15658:15;;;15294:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1220:139::-;1266:5;1304:6;1291:20;1282:29;;1320:33;1347:5;1320:33;:::i;:::-;1272:87;;;;:::o;1365:139::-;1411:5;1449:6;1436:20;1427:29;;1465:33;1492:5;1465:33;:::i;:::-;1417:87;;;;:::o;1510:262::-;1569:6;1618:2;1606:9;1597:7;1593:23;1589:32;1586:2;;;1634:1;1631;1624:12;1586:2;1677:1;1702:53;1747:7;1738:6;1727:9;1723:22;1702:53;:::i;:::-;1692:63;;1648:117;1576:196;;;;:::o;1778:407::-;1846:6;1854;1903:2;1891:9;1882:7;1878:23;1874:32;1871:2;;;1919:1;1916;1909:12;1871:2;1962:1;1987:53;2032:7;2023:6;2012:9;2008:22;1987:53;:::i;:::-;1977:63;;1933:117;2089:2;2115:53;2160:7;2151:6;2140:9;2136:22;2115:53;:::i;:::-;2105:63;;2060:118;1861:324;;;;;:::o;2191:552::-;2268:6;2276;2284;2333:2;2321:9;2312:7;2308:23;2304:32;2301:2;;;2349:1;2346;2339:12;2301:2;2392:1;2417:53;2462:7;2453:6;2442:9;2438:22;2417:53;:::i;:::-;2407:63;;2363:117;2519:2;2545:53;2590:7;2581:6;2570:9;2566:22;2545:53;:::i;:::-;2535:63;;2490:118;2647:2;2673:53;2718:7;2709:6;2698:9;2694:22;2673:53;:::i;:::-;2663:63;;2618:118;2291:452;;;;;:::o;2749:809::-;2844:6;2852;2860;2868;2917:3;2905:9;2896:7;2892:23;2888:33;2885:2;;;2934:1;2931;2924:12;2885:2;2977:1;3002:53;3047:7;3038:6;3027:9;3023:22;3002:53;:::i;:::-;2992:63;;2948:117;3104:2;3130:53;3175:7;3166:6;3155:9;3151:22;3130:53;:::i;:::-;3120:63;;3075:118;3232:2;3258:53;3303:7;3294:6;3283:9;3279:22;3258:53;:::i;:::-;3248:63;;3203:118;3388:2;3377:9;3373:18;3360:32;3419:18;3411:6;3408:30;3405:2;;;3451:1;3448;3441:12;3405:2;3479:62;3533:7;3524:6;3513:9;3509:22;3479:62;:::i;:::-;3469:72;;3331:220;2875:683;;;;;;;:::o;3564:401::-;3629:6;3637;3686:2;3674:9;3665:7;3661:23;3657:32;3654:2;;;3702:1;3699;3692:12;3654:2;3745:1;3770:53;3815:7;3806:6;3795:9;3791:22;3770:53;:::i;:::-;3760:63;;3716:117;3872:2;3898:50;3940:7;3931:6;3920:9;3916:22;3898:50;:::i;:::-;3888:60;;3843:115;3644:321;;;;;:::o;3971:407::-;4039:6;4047;4096:2;4084:9;4075:7;4071:23;4067:32;4064:2;;;4112:1;4109;4102:12;4064:2;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4054:324;;;;;:::o;4384:260::-;4442:6;4491:2;4479:9;4470:7;4466:23;4462:32;4459:2;;;4507:1;4504;4497:12;4459:2;4550:1;4575:52;4619:7;4610:6;4599:9;4595:22;4575:52;:::i;:::-;4565:62;;4521:116;4449:195;;;;:::o;4650:282::-;4719:6;4768:2;4756:9;4747:7;4743:23;4739:32;4736:2;;;4784:1;4781;4774:12;4736:2;4827:1;4852:63;4907:7;4898:6;4887:9;4883:22;4852:63;:::i;:::-;4842:73;;4798:127;4726:206;;;;:::o;4938:407::-;5006:6;5014;5063:2;5051:9;5042:7;5038:23;5034:32;5031:2;;;5079:1;5076;5069:12;5031:2;5122:1;5147:53;5192:7;5183:6;5172:9;5168:22;5147:53;:::i;:::-;5137:63;;5093:117;5249:2;5275:53;5320:7;5311:6;5300:9;5296:22;5275:53;:::i;:::-;5265:63;;5220:118;5021:324;;;;;:::o;5351:552::-;5428:6;5436;5444;5493:2;5481:9;5472:7;5468:23;5464:32;5461:2;;;5509:1;5506;5499:12;5461:2;5552:1;5577:53;5622:7;5613:6;5602:9;5598:22;5577:53;:::i;:::-;5567:63;;5523:117;5679:2;5705:53;5750:7;5741:6;5730:9;5726:22;5705:53;:::i;:::-;5695:63;;5650:118;5807:2;5833:53;5878:7;5869:6;5858:9;5854:22;5833:53;:::i;:::-;5823:63;;5778:118;5451:452;;;;;:::o;5909:262::-;5968:6;6017:2;6005:9;5996:7;5992:23;5988:32;5985:2;;;6033:1;6030;6023:12;5985:2;6076:1;6101:53;6146:7;6137:6;6126:9;6122:22;6101:53;:::i;:::-;6091:63;;6047:117;5975:196;;;;:::o;6177:118::-;6264:24;6282:5;6264:24;:::i;:::-;6259:3;6252:37;6242:53;;:::o;6301:109::-;6382:21;6397:5;6382:21;:::i;:::-;6377:3;6370:34;6360:50;;:::o;6416:360::-;6502:3;6530:38;6562:5;6530:38;:::i;:::-;6584:70;6647:6;6642:3;6584:70;:::i;:::-;6577:77;;6663:52;6708:6;6703:3;6696:4;6689:5;6685:16;6663:52;:::i;:::-;6740:29;6762:6;6740:29;:::i;:::-;6735:3;6731:39;6724:46;;6506:270;;;;;:::o;6782:373::-;6886:3;6914:38;6946:5;6914:38;:::i;:::-;6968:88;7049:6;7044:3;6968:88;:::i;:::-;6961:95;;7065:52;7110:6;7105:3;7098:4;7091:5;7087:16;7065:52;:::i;:::-;7142:6;7137:3;7133:16;7126:23;;6890:265;;;;;:::o;7161:364::-;7249:3;7277:39;7310:5;7277:39;:::i;:::-;7332:71;7396:6;7391:3;7332:71;:::i;:::-;7325:78;;7412:52;7457:6;7452:3;7445:4;7438:5;7434:16;7412:52;:::i;:::-;7489:29;7511:6;7489:29;:::i;:::-;7484:3;7480:39;7473:46;;7253:272;;;;;:::o;7531:377::-;7637:3;7665:39;7698:5;7665:39;:::i;:::-;7720:89;7802:6;7797:3;7720:89;:::i;:::-;7713:96;;7818:52;7863:6;7858:3;7851:4;7844:5;7840:16;7818:52;:::i;:::-;7895:6;7890:3;7886:16;7879:23;;7641:267;;;;;:::o;7938:845::-;8041:3;8078:5;8072:12;8107:36;8133:9;8107:36;:::i;:::-;8159:89;8241:6;8236:3;8159:89;:::i;:::-;8152:96;;8279:1;8268:9;8264:17;8295:1;8290:137;;;;8441:1;8436:341;;;;8257:520;;8290:137;8374:4;8370:9;8359;8355:25;8350:3;8343:38;8410:6;8405:3;8401:16;8394:23;;8290:137;;8436:341;8503:38;8535:5;8503:38;:::i;:::-;8563:1;8577:154;8591:6;8588:1;8585:13;8577:154;;;8665:7;8659:14;8655:1;8650:3;8646:11;8639:35;8715:1;8706:7;8702:15;8691:26;;8613:4;8610:1;8606:12;8601:17;;8577:154;;;8760:6;8755:3;8751:16;8744:23;;8443:334;;8257:520;;8045:738;;;;;;:::o;8789:366::-;8931:3;8952:67;9016:2;9011:3;8952:67;:::i;:::-;8945:74;;9028:93;9117:3;9028:93;:::i;:::-;9146:2;9141:3;9137:12;9130:19;;8935:220;;;:::o;9161:404::-;9321:3;9342:86;9424:3;9419;9342:86;:::i;:::-;9335:93;;9437;9526:3;9437:93;:::i;:::-;9555:3;9550;9546:13;9539:20;;9325:240;;;:::o;9571:402::-;9731:3;9752:85;9834:2;9829:3;9752:85;:::i;:::-;9745:92;;9846:93;9935:3;9846:93;:::i;:::-;9964:2;9959:3;9955:12;9948:19;;9735:238;;;:::o;9979:400::-;10139:3;10160:84;10242:1;10237:3;10160:84;:::i;:::-;10153:91;;10253:93;10342:3;10253:93;:::i;:::-;10371:1;10366:3;10362:11;10355:18;;10143:236;;;:::o;10385:366::-;10527:3;10548:67;10612:2;10607:3;10548:67;:::i;:::-;10541:74;;10624:93;10713:3;10624:93;:::i;:::-;10742:2;10737:3;10733:12;10726:19;;10531:220;;;:::o;10757:366::-;10899:3;10920:67;10984:2;10979:3;10920:67;:::i;:::-;10913:74;;10996:93;11085:3;10996:93;:::i;:::-;11114:2;11109:3;11105:12;11098:19;;10903:220;;;:::o;11129:366::-;11271:3;11292:67;11356:2;11351:3;11292:67;:::i;:::-;11285:74;;11368:93;11457:3;11368:93;:::i;:::-;11486:2;11481:3;11477:12;11470:19;;11275:220;;;:::o;11501:366::-;11643:3;11664:67;11728:2;11723:3;11664:67;:::i;:::-;11657:74;;11740:93;11829:3;11740:93;:::i;:::-;11858:2;11853:3;11849:12;11842:19;;11647:220;;;:::o;11873:366::-;12015:3;12036:67;12100:2;12095:3;12036:67;:::i;:::-;12029:74;;12112:93;12201:3;12112:93;:::i;:::-;12230:2;12225:3;12221:12;12214:19;;12019:220;;;:::o;12245:402::-;12405:3;12426:85;12508:2;12503:3;12426:85;:::i;:::-;12419:92;;12520:93;12609:3;12520:93;:::i;:::-;12638:2;12633:3;12629:12;12622:19;;12409:238;;;:::o;12653:402::-;12813:3;12834:85;12916:2;12911:3;12834:85;:::i;:::-;12827:92;;12928:93;13017:3;12928:93;:::i;:::-;13046:2;13041:3;13037:12;13030:19;;12817:238;;;:::o;13061:366::-;13203:3;13224:67;13288:2;13283:3;13224:67;:::i;:::-;13217:74;;13300:93;13389:3;13300:93;:::i;:::-;13418:2;13413:3;13409:12;13402:19;;13207:220;;;:::o;13433:366::-;13575:3;13596:67;13660:2;13655:3;13596:67;:::i;:::-;13589:74;;13672:93;13761:3;13672:93;:::i;:::-;13790:2;13785:3;13781:12;13774:19;;13579:220;;;:::o;13805:366::-;13947:3;13968:67;14032:2;14027:3;13968:67;:::i;:::-;13961:74;;14044:93;14133:3;14044:93;:::i;:::-;14162:2;14157:3;14153:12;14146:19;;13951:220;;;:::o;14177:366::-;14319:3;14340:67;14404:2;14399:3;14340:67;:::i;:::-;14333:74;;14416:93;14505:3;14416:93;:::i;:::-;14534:2;14529:3;14525:12;14518:19;;14323:220;;;:::o;14549:366::-;14691:3;14712:67;14776:2;14771:3;14712:67;:::i;:::-;14705:74;;14788:93;14877:3;14788:93;:::i;:::-;14906:2;14901:3;14897:12;14890:19;;14695:220;;;:::o;14921:402::-;15081:3;15102:85;15184:2;15179:3;15102:85;:::i;:::-;15095:92;;15196:93;15285:3;15196:93;:::i;:::-;15314:2;15309:3;15305:12;15298:19;;15085:238;;;:::o;15329:402::-;15489:3;15510:85;15592:2;15587:3;15510:85;:::i;:::-;15503:92;;15604:93;15693:3;15604:93;:::i;:::-;15722:2;15717:3;15713:12;15706:19;;15493:238;;;:::o;15737:366::-;15879:3;15900:67;15964:2;15959:3;15900:67;:::i;:::-;15893:74;;15976:93;16065:3;15976:93;:::i;:::-;16094:2;16089:3;16085:12;16078:19;;15883:220;;;:::o;16109:400::-;16269:3;16290:84;16372:1;16367:3;16290:84;:::i;:::-;16283:91;;16383:93;16472:3;16383:93;:::i;:::-;16501:1;16496:3;16492:11;16485:18;;16273:236;;;:::o;16515:366::-;16657:3;16678:67;16742:2;16737:3;16678:67;:::i;:::-;16671:74;;16754:93;16843:3;16754:93;:::i;:::-;16872:2;16867:3;16863:12;16856:19;;16661:220;;;:::o;16887:366::-;17029:3;17050:67;17114:2;17109:3;17050:67;:::i;:::-;17043:74;;17126:93;17215:3;17126:93;:::i;:::-;17244:2;17239:3;17235:12;17228:19;;17033:220;;;:::o;17259:400::-;17419:3;17440:84;17522:1;17517:3;17440:84;:::i;:::-;17433:91;;17533:93;17622:3;17533:93;:::i;:::-;17651:1;17646:3;17642:11;17635:18;;17423:236;;;:::o;17665:366::-;17807:3;17828:67;17892:2;17887:3;17828:67;:::i;:::-;17821:74;;17904:93;17993:3;17904:93;:::i;:::-;18022:2;18017:3;18013:12;18006:19;;17811:220;;;:::o;18037:366::-;18179:3;18200:67;18264:2;18259:3;18200:67;:::i;:::-;18193:74;;18276:93;18365:3;18276:93;:::i;:::-;18394:2;18389:3;18385:12;18378:19;;18183:220;;;:::o;18409:366::-;18551:3;18572:67;18636:2;18631:3;18572:67;:::i;:::-;18565:74;;18648:93;18737:3;18648:93;:::i;:::-;18766:2;18761:3;18757:12;18750:19;;18555:220;;;:::o;18781:366::-;18923:3;18944:67;19008:2;19003:3;18944:67;:::i;:::-;18937:74;;19020:93;19109:3;19020:93;:::i;:::-;19138:2;19133:3;19129:12;19122:19;;18927:220;;;:::o;19153:400::-;19313:3;19334:84;19416:1;19411:3;19334:84;:::i;:::-;19327:91;;19427:93;19516:3;19427:93;:::i;:::-;19545:1;19540:3;19536:11;19529:18;;19317:236;;;:::o;19559:366::-;19701:3;19722:67;19786:2;19781:3;19722:67;:::i;:::-;19715:74;;19798:93;19887:3;19798:93;:::i;:::-;19916:2;19911:3;19907:12;19900:19;;19705:220;;;:::o;19931:402::-;20091:3;20112:85;20194:2;20189:3;20112:85;:::i;:::-;20105:92;;20206:93;20295:3;20206:93;:::i;:::-;20324:2;20319:3;20315:12;20308:19;;20095:238;;;:::o;20339:400::-;20499:3;20520:84;20602:1;20597:3;20520:84;:::i;:::-;20513:91;;20613:93;20702:3;20613:93;:::i;:::-;20731:1;20726:3;20722:11;20715:18;;20503:236;;;:::o;20745:366::-;20887:3;20908:67;20972:2;20967:3;20908:67;:::i;:::-;20901:74;;20984:93;21073:3;20984:93;:::i;:::-;21102:2;21097:3;21093:12;21086:19;;20891:220;;;:::o;21117:400::-;21277:3;21298:84;21380:1;21375:3;21298:84;:::i;:::-;21291:91;;21391:93;21480:3;21391:93;:::i;:::-;21509:1;21504:3;21500:11;21493:18;;21281:236;;;:::o;21523:402::-;21683:3;21704:85;21786:2;21781:3;21704:85;:::i;:::-;21697:92;;21798:93;21887:3;21798:93;:::i;:::-;21916:2;21911:3;21907:12;21900:19;;21687:238;;;:::o;21931:366::-;22073:3;22094:67;22158:2;22153:3;22094:67;:::i;:::-;22087:74;;22170:93;22259:3;22170:93;:::i;:::-;22288:2;22283:3;22279:12;22272:19;;22077:220;;;:::o;22303:400::-;22463:3;22484:84;22566:1;22561:3;22484:84;:::i;:::-;22477:91;;22577:93;22666:3;22577:93;:::i;:::-;22695:1;22690:3;22686:11;22679:18;;22467:236;;;:::o;22709:402::-;22869:3;22890:85;22972:2;22967:3;22890:85;:::i;:::-;22883:92;;22984:93;23073:3;22984:93;:::i;:::-;23102:2;23097:3;23093:12;23086:19;;22873:238;;;:::o;23117:400::-;23277:3;23298:84;23380:1;23375:3;23298:84;:::i;:::-;23291:91;;23391:93;23480:3;23391:93;:::i;:::-;23509:1;23504:3;23500:11;23493:18;;23281:236;;;:::o;23523:118::-;23610:24;23628:5;23610:24;:::i;:::-;23605:3;23598:37;23588:53;;:::o;23647:118::-;23734:24;23752:5;23734:24;:::i;:::-;23729:3;23722:37;23712:53;;:::o;23771:271::-;23901:3;23923:93;24012:3;24003:6;23923:93;:::i;:::-;23916:100;;24033:3;24026:10;;23905:137;;;;:::o;24048:435::-;24228:3;24250:95;24341:3;24332:6;24250:95;:::i;:::-;24243:102;;24362:95;24453:3;24444:6;24362:95;:::i;:::-;24355:102;;24474:3;24467:10;;24232:251;;;;;:::o;24489:1691::-;25041:3;25063:95;25154:3;25145:6;25063:95;:::i;:::-;25056:102;;25175:95;25266:3;25257:6;25175:95;:::i;:::-;25168:102;;25287:92;25375:3;25366:6;25287:92;:::i;:::-;25280:99;;25396:95;25487:3;25478:6;25396:95;:::i;:::-;25389:102;;25508:92;25596:3;25587:6;25508:92;:::i;:::-;25501:99;;25617:95;25708:3;25699:6;25617:95;:::i;:::-;25610:102;;25729:92;25817:3;25808:6;25729:92;:::i;:::-;25722:99;;25838:95;25929:3;25920:6;25838:95;:::i;:::-;25831:102;;25950:92;26038:3;26029:6;25950:92;:::i;:::-;25943:99;;26059:95;26150:3;26141:6;26059:95;:::i;:::-;26052:102;;26171:3;26164:10;;25045:1135;;;;;;;;;;;;;:::o;26186:1813::-;26863:3;26885:95;26976:3;26967:6;26885:95;:::i;:::-;26878:102;;26997:148;27141:3;26997:148;:::i;:::-;26990:155;;27162:95;27253:3;27244:6;27162:95;:::i;:::-;27155:102;;27274:148;27418:3;27274:148;:::i;:::-;27267:155;;27439:95;27530:3;27521:6;27439:95;:::i;:::-;27432:102;;27551:148;27695:3;27551:148;:::i;:::-;27544:155;;27716:92;27804:3;27795:6;27716:92;:::i;:::-;27709:99;;27825:148;27969:3;27825:148;:::i;:::-;27818:155;;27990:3;27983:10;;26867:1132;;;;;;;:::o;28005:541::-;28238:3;28260:95;28351:3;28342:6;28260:95;:::i;:::-;28253:102;;28372:148;28516:3;28372:148;:::i;:::-;28365:155;;28537:3;28530:10;;28242:304;;;;:::o;28552:1525::-;29053:3;29075:92;29163:3;29154:6;29075:92;:::i;:::-;29068:99;;29184:95;29275:3;29266:6;29184:95;:::i;:::-;29177:102;;29296:92;29384:3;29375:6;29296:92;:::i;:::-;29289:99;;29405:95;29496:3;29487:6;29405:95;:::i;:::-;29398:102;;29517:92;29605:3;29596:6;29517:92;:::i;:::-;29510:99;;29626:95;29717:3;29708:6;29626:95;:::i;:::-;29619:102;;29738:92;29826:3;29817:6;29738:92;:::i;:::-;29731:99;;29847:95;29938:3;29929:6;29847:95;:::i;:::-;29840:102;;29959:92;30047:3;30038:6;29959:92;:::i;:::-;29952:99;;30068:3;30061:10;;29057:1020;;;;;;;;;;;;:::o;30083:541::-;30316:3;30338:148;30482:3;30338:148;:::i;:::-;30331:155;;30503:95;30594:3;30585:6;30503:95;:::i;:::-;30496:102;;30615:3;30608:10;;30320:304;;;;:::o;30630:2913::-;31697:3;31719:148;31863:3;31719:148;:::i;:::-;31712:155;;31884:95;31975:3;31966:6;31884:95;:::i;:::-;31877:102;;31996:148;32140:3;31996:148;:::i;:::-;31989:155;;32161:92;32249:3;32240:6;32161:92;:::i;:::-;32154:99;;32270:148;32414:3;32270:148;:::i;:::-;32263:155;;32435:92;32523:3;32514:6;32435:92;:::i;:::-;32428:99;;32544:148;32688:3;32544:148;:::i;:::-;32537:155;;32709:92;32797:3;32788:6;32709:92;:::i;:::-;32702:99;;32818:148;32962:3;32818:148;:::i;:::-;32811:155;;32983:92;33071:3;33062:6;32983:92;:::i;:::-;32976:99;;33092:148;33236:3;33092:148;:::i;:::-;33085:155;;33257:95;33348:3;33339:6;33257:95;:::i;:::-;33250:102;;33369:148;33513:3;33369:148;:::i;:::-;33362:155;;33534:3;33527:10;;31701:1842;;;;;;;;;:::o;33549:541::-;33782:3;33804:148;33948:3;33804:148;:::i;:::-;33797:155;;33969:95;34060:3;34051:6;33969:95;:::i;:::-;33962:102;;34081:3;34074:10;;33786:304;;;;:::o;34096:541::-;34329:3;34351:148;34495:3;34351:148;:::i;:::-;34344:155;;34516:95;34607:3;34598:6;34516:95;:::i;:::-;34509:102;;34628:3;34621:10;;34333:304;;;;:::o;34643:541::-;34876:3;34898:148;35042:3;34898:148;:::i;:::-;34891:155;;35063:95;35154:3;35145:6;35063:95;:::i;:::-;35056:102;;35175:3;35168:10;;34880:304;;;;:::o;35190:541::-;35423:3;35445:148;35589:3;35445:148;:::i;:::-;35438:155;;35610:95;35701:3;35692:6;35610:95;:::i;:::-;35603:102;;35722:3;35715:10;;35427:304;;;;:::o;35737:222::-;35830:4;35868:2;35857:9;35853:18;35845:26;;35881:71;35949:1;35938:9;35934:17;35925:6;35881:71;:::i;:::-;35835:124;;;;:::o;35965:640::-;36160:4;36198:3;36187:9;36183:19;36175:27;;36212:71;36280:1;36269:9;36265:17;36256:6;36212:71;:::i;:::-;36293:72;36361:2;36350:9;36346:18;36337:6;36293:72;:::i;:::-;36375;36443:2;36432:9;36428:18;36419:6;36375:72;:::i;:::-;36494:9;36488:4;36484:20;36479:2;36468:9;36464:18;36457:48;36522:76;36593:4;36584:6;36522:76;:::i;:::-;36514:84;;36165:440;;;;;;;:::o;36611:210::-;36698:4;36736:2;36725:9;36721:18;36713:26;;36749:65;36811:1;36800:9;36796:17;36787:6;36749:65;:::i;:::-;36703:118;;;;:::o;36827:313::-;36940:4;36978:2;36967:9;36963:18;36955:26;;37027:9;37021:4;37017:20;37013:1;37002:9;36998:17;36991:47;37055:78;37128:4;37119:6;37055:78;:::i;:::-;37047:86;;36945:195;;;;:::o;37146:419::-;37312:4;37350:2;37339:9;37335:18;37327:26;;37399:9;37393:4;37389:20;37385:1;37374:9;37370:17;37363:47;37427:131;37553:4;37427:131;:::i;:::-;37419:139;;37317:248;;;:::o;37571:419::-;37737:4;37775:2;37764:9;37760:18;37752:26;;37824:9;37818:4;37814:20;37810:1;37799:9;37795:17;37788:47;37852:131;37978:4;37852:131;:::i;:::-;37844:139;;37742:248;;;:::o;37996:419::-;38162:4;38200:2;38189:9;38185:18;38177:26;;38249:9;38243:4;38239:20;38235:1;38224:9;38220:17;38213:47;38277:131;38403:4;38277:131;:::i;:::-;38269:139;;38167:248;;;:::o;38421:419::-;38587:4;38625:2;38614:9;38610:18;38602:26;;38674:9;38668:4;38664:20;38660:1;38649:9;38645:17;38638:47;38702:131;38828:4;38702:131;:::i;:::-;38694:139;;38592:248;;;:::o;38846:419::-;39012:4;39050:2;39039:9;39035:18;39027:26;;39099:9;39093:4;39089:20;39085:1;39074:9;39070:17;39063:47;39127:131;39253:4;39127:131;:::i;:::-;39119:139;;39017:248;;;:::o;39271:419::-;39437:4;39475:2;39464:9;39460:18;39452:26;;39524:9;39518:4;39514:20;39510:1;39499:9;39495:17;39488:47;39552:131;39678:4;39552:131;:::i;:::-;39544:139;;39442:248;;;:::o;39696:419::-;39862:4;39900:2;39889:9;39885:18;39877:26;;39949:9;39943:4;39939:20;39935:1;39924:9;39920:17;39913:47;39977:131;40103:4;39977:131;:::i;:::-;39969:139;;39867:248;;;:::o;40121:419::-;40287:4;40325:2;40314:9;40310:18;40302:26;;40374:9;40368:4;40364:20;40360:1;40349:9;40345:17;40338:47;40402:131;40528:4;40402:131;:::i;:::-;40394:139;;40292:248;;;:::o;40546:419::-;40712:4;40750:2;40739:9;40735:18;40727:26;;40799:9;40793:4;40789:20;40785:1;40774:9;40770:17;40763:47;40827:131;40953:4;40827:131;:::i;:::-;40819:139;;40717:248;;;:::o;40971:419::-;41137:4;41175:2;41164:9;41160:18;41152:26;;41224:9;41218:4;41214:20;41210:1;41199:9;41195:17;41188:47;41252:131;41378:4;41252:131;:::i;:::-;41244:139;;41142:248;;;:::o;41396:419::-;41562:4;41600:2;41589:9;41585:18;41577:26;;41649:9;41643:4;41639:20;41635:1;41624:9;41620:17;41613:47;41677:131;41803:4;41677:131;:::i;:::-;41669:139;;41567:248;;;:::o;41821:419::-;41987:4;42025:2;42014:9;42010:18;42002:26;;42074:9;42068:4;42064:20;42060:1;42049:9;42045:17;42038:47;42102:131;42228:4;42102:131;:::i;:::-;42094:139;;41992:248;;;:::o;42246:419::-;42412:4;42450:2;42439:9;42435:18;42427:26;;42499:9;42493:4;42489:20;42485:1;42474:9;42470:17;42463:47;42527:131;42653:4;42527:131;:::i;:::-;42519:139;;42417:248;;;:::o;42671:419::-;42837:4;42875:2;42864:9;42860:18;42852:26;;42924:9;42918:4;42914:20;42910:1;42899:9;42895:17;42888:47;42952:131;43078:4;42952:131;:::i;:::-;42944:139;;42842:248;;;:::o;43096:419::-;43262:4;43300:2;43289:9;43285:18;43277:26;;43349:9;43343:4;43339:20;43335:1;43324:9;43320:17;43313:47;43377:131;43503:4;43377:131;:::i;:::-;43369:139;;43267:248;;;:::o;43521:419::-;43687:4;43725:2;43714:9;43710:18;43702:26;;43774:9;43768:4;43764:20;43760:1;43749:9;43745:17;43738:47;43802:131;43928:4;43802:131;:::i;:::-;43794:139;;43692:248;;;:::o;43946:419::-;44112:4;44150:2;44139:9;44135:18;44127:26;;44199:9;44193:4;44189:20;44185:1;44174:9;44170:17;44163:47;44227:131;44353:4;44227:131;:::i;:::-;44219:139;;44117:248;;;:::o;44371:419::-;44537:4;44575:2;44564:9;44560:18;44552:26;;44624:9;44618:4;44614:20;44610:1;44599:9;44595:17;44588:47;44652:131;44778:4;44652:131;:::i;:::-;44644:139;;44542:248;;;:::o;44796:419::-;44962:4;45000:2;44989:9;44985:18;44977:26;;45049:9;45043:4;45039:20;45035:1;45024:9;45020:17;45013:47;45077:131;45203:4;45077:131;:::i;:::-;45069:139;;44967:248;;;:::o;45221:419::-;45387:4;45425:2;45414:9;45410:18;45402:26;;45474:9;45468:4;45464:20;45460:1;45449:9;45445:17;45438:47;45502:131;45628:4;45502:131;:::i;:::-;45494:139;;45392:248;;;:::o;45646:419::-;45812:4;45850:2;45839:9;45835:18;45827:26;;45899:9;45893:4;45889:20;45885:1;45874:9;45870:17;45863:47;45927:131;46053:4;45927:131;:::i;:::-;45919:139;;45817:248;;;:::o;46071:332::-;46192:4;46230:2;46219:9;46215:18;46207:26;;46243:71;46311:1;46300:9;46296:17;46287:6;46243:71;:::i;:::-;46324:72;46392:2;46381:9;46377:18;46368:6;46324:72;:::i;:::-;46197:206;;;;;:::o;46409:222::-;46502:4;46540:2;46529:9;46525:18;46517:26;;46553:71;46621:1;46610:9;46606:17;46597:6;46553:71;:::i;:::-;46507:124;;;;:::o;46637:129::-;46671:6;46698:20;;:::i;:::-;46688:30;;46727:33;46755:4;46747:6;46727:33;:::i;:::-;46678:88;;;:::o;46772:75::-;46805:6;46838:2;46832:9;46822:19;;46812:35;:::o;46853:307::-;46914:4;47004:18;46996:6;46993:30;46990:2;;;47026:18;;:::i;:::-;46990:2;47064:29;47086:6;47064:29;:::i;:::-;47056:37;;47148:4;47142;47138:15;47130:23;;46919:241;;;:::o;47166:141::-;47215:4;47238:3;47230:11;;47261:3;47258:1;47251:14;47295:4;47292:1;47282:18;47274:26;;47220:87;;;:::o;47313:98::-;47364:6;47398:5;47392:12;47382:22;;47371:40;;;:::o;47417:99::-;47469:6;47503:5;47497:12;47487:22;;47476:40;;;:::o;47522:168::-;47605:11;47639:6;47634:3;47627:19;47679:4;47674:3;47670:14;47655:29;;47617:73;;;;:::o;47696:147::-;47797:11;47834:3;47819:18;;47809:34;;;;:::o;47849:169::-;47933:11;47967:6;47962:3;47955:19;48007:4;48002:3;47998:14;47983:29;;47945:73;;;;:::o;48024:148::-;48126:11;48163:3;48148:18;;48138:34;;;;:::o;48178:305::-;48218:3;48237:20;48255:1;48237:20;:::i;:::-;48232:25;;48271:20;48289:1;48271:20;:::i;:::-;48266:25;;48425:1;48357:66;48353:74;48350:1;48347:81;48344:2;;;48431:18;;:::i;:::-;48344:2;48475:1;48472;48468:9;48461:16;;48222:261;;;;:::o;48489:185::-;48529:1;48546:20;48564:1;48546:20;:::i;:::-;48541:25;;48580:20;48598:1;48580:20;:::i;:::-;48575:25;;48619:1;48609:2;;48624:18;;:::i;:::-;48609:2;48666:1;48663;48659:9;48654:14;;48531:143;;;;:::o;48680:348::-;48720:7;48743:20;48761:1;48743:20;:::i;:::-;48738:25;;48777:20;48795:1;48777:20;:::i;:::-;48772:25;;48965:1;48897:66;48893:74;48890:1;48887:81;48882:1;48875:9;48868:17;48864:105;48861:2;;;48972:18;;:::i;:::-;48861:2;49020:1;49017;49013:9;49002:20;;48728:300;;;;:::o;49034:191::-;49074:4;49094:20;49112:1;49094:20;:::i;:::-;49089:25;;49128:20;49146:1;49128:20;:::i;:::-;49123:25;;49167:1;49164;49161:8;49158:2;;;49172:18;;:::i;:::-;49158:2;49217:1;49214;49210:9;49202:17;;49079:146;;;;:::o;49231:96::-;49268:7;49297:24;49315:5;49297:24;:::i;:::-;49286:35;;49276:51;;;:::o;49333:90::-;49367:7;49410:5;49403:13;49396:21;49385:32;;49375:48;;;:::o;49429:149::-;49465:7;49505:66;49498:5;49494:78;49483:89;;49473:105;;;:::o;49584:126::-;49621:7;49661:42;49654:5;49650:54;49639:65;;49629:81;;;:::o;49716:77::-;49753:7;49782:5;49771:16;;49761:32;;;:::o;49799:154::-;49883:6;49878:3;49873;49860:30;49945:1;49936:6;49931:3;49927:16;49920:27;49850:103;;;:::o;49959:307::-;50027:1;50037:113;50051:6;50048:1;50045:13;50037:113;;;50136:1;50131:3;50127:11;50121:18;50117:1;50112:3;50108:11;50101:39;50073:2;50070:1;50066:10;50061:15;;50037:113;;;50168:6;50165:1;50162:13;50159:2;;;50248:1;50239:6;50234:3;50230:16;50223:27;50159:2;50008:258;;;;:::o;50272:320::-;50316:6;50353:1;50347:4;50343:12;50333:22;;50400:1;50394:4;50390:12;50421:18;50411:2;;50477:4;50469:6;50465:17;50455:27;;50411:2;50539;50531:6;50528:14;50508:18;50505:38;50502:2;;;50558:18;;:::i;:::-;50502:2;50323:269;;;;:::o;50598:281::-;50681:27;50703:4;50681:27;:::i;:::-;50673:6;50669:40;50811:6;50799:10;50796:22;50775:18;50763:10;50760:34;50757:62;50754:2;;;50822:18;;:::i;:::-;50754:2;50862:10;50858:2;50851:22;50641:238;;;:::o;50885:233::-;50924:3;50947:24;50965:5;50947:24;:::i;:::-;50938:33;;50993:66;50986:5;50983:77;50980:2;;;51063:18;;:::i;:::-;50980:2;51110:1;51103:5;51099:13;51092:20;;50928:190;;;:::o;51124:176::-;51156:1;51173:20;51191:1;51173:20;:::i;:::-;51168:25;;51207:20;51225:1;51207:20;:::i;:::-;51202:25;;51246:1;51236:2;;51251:18;;:::i;:::-;51236:2;51292:1;51289;51285:9;51280:14;;51158:142;;;;:::o;51306:180::-;51354:77;51351:1;51344:88;51451:4;51448:1;51441:15;51475:4;51472:1;51465:15;51492:180;51540:77;51537:1;51530:88;51637:4;51634:1;51627:15;51661:4;51658:1;51651:15;51678:180;51726:77;51723:1;51716:88;51823:4;51820:1;51813:15;51847:4;51844:1;51837:15;51864:180;51912:77;51909:1;51902:88;52009:4;52006:1;51999:15;52033:4;52030:1;52023:15;52050:102;52091:6;52142:2;52138:7;52133:2;52126:5;52122:14;52118:28;52108:38;;52098:54;;;:::o;52158:178::-;52298:30;52294:1;52286:6;52282:14;52275:54;52264:72;:::o;52342:797::-;52482:66;52478:1;52470:6;52466:14;52459:90;52583:34;52578:2;52570:6;52566:15;52559:59;52652:34;52647:2;52639:6;52635:15;52628:59;52721:34;52716:2;52708:6;52704:15;52697:59;52791:34;52785:3;52777:6;52773:16;52766:60;52861:66;52855:3;52847:6;52843:16;52836:92;52963:66;52957:3;52949:6;52945:16;52938:92;53065:66;53059:3;53051:6;53047:16;53040:92;52448:691;:::o;53145:315::-;53285:66;53281:1;53273:6;53269:14;53262:90;53386:66;53381:2;53373:6;53369:15;53362:91;53251:209;:::o;53466:154::-;53606:6;53602:1;53594:6;53590:14;53583:30;53572:48;:::o;53626:230::-;53766:34;53762:1;53754:6;53750:14;53743:58;53835:13;53830:2;53822:6;53818:15;53811:38;53732:124;:::o;53862:237::-;54002:34;53998:1;53990:6;53986:14;53979:58;54071:20;54066:2;54058:6;54054:15;54047:45;53968:131;:::o;54105:225::-;54245:34;54241:1;54233:6;54229:14;54222:58;54314:8;54309:2;54301:6;54297:15;54290:33;54211:119;:::o;54336:178::-;54476:30;54472:1;54464:6;54460:14;54453:54;54442:72;:::o;54520:177::-;54660:29;54656:1;54648:6;54644:14;54637:53;54626:71;:::o;54703:214::-;54843:66;54839:1;54831:6;54827:14;54820:90;54809:108;:::o;54923:257::-;55063:66;55059:1;55051:6;55047:14;55040:90;55164:8;55159:2;55151:6;55147:15;55140:33;55029:151;:::o;55186:223::-;55326:34;55322:1;55314:6;55310:14;55303:58;55395:6;55390:2;55382:6;55378:15;55371:31;55292:117;:::o;55415:175::-;55555:27;55551:1;55543:6;55539:14;55532:51;55521:69;:::o;55596:181::-;55736:33;55732:1;55724:6;55720:14;55713:57;55702:75;:::o;55783:177::-;55923:29;55919:1;55911:6;55907:14;55900:53;55889:71;:::o;55966:231::-;56106:34;56102:1;56094:6;56090:14;56083:58;56175:14;56170:2;56162:6;56158:15;56151:39;56072:125;:::o;56203:260::-;56343:66;56339:1;56331:6;56327:14;56320:90;56444:11;56439:2;56431:6;56427:15;56420:36;56309:154;:::o;56469:315::-;56609:66;56605:1;56597:6;56593:14;56586:90;56710:66;56705:2;56697:6;56693:15;56686:91;56575:209;:::o;56790:243::-;56930:34;56926:1;56918:6;56914:14;56907:58;56999:26;56994:2;56986:6;56982:15;56975:51;56896:137;:::o;57039:214::-;57179:66;57175:1;57167:6;57163:14;57156:90;57145:108;:::o;57259:229::-;57399:34;57395:1;57387:6;57383:14;57376:58;57468:12;57463:2;57455:6;57451:15;57444:37;57365:123;:::o;57494:228::-;57634:34;57630:1;57622:6;57618:14;57611:58;57703:11;57698:2;57690:6;57686:15;57679:36;57600:122;:::o;57728:214::-;57868:66;57864:1;57856:6;57852:14;57845:90;57834:108;:::o;57948:182::-;58088:34;58084:1;58076:6;58072:14;58065:58;58054:76;:::o;58136:231::-;58276:34;58272:1;58264:6;58260:14;58253:58;58345:14;58340:2;58332:6;58328:15;58321:39;58242:125;:::o;58373:182::-;58513:34;58509:1;58501:6;58497:14;58490:58;58479:76;:::o;58561:228::-;58701:34;58697:1;58689:6;58685:14;58678:58;58770:11;58765:2;58757:6;58753:15;58746:36;58667:122;:::o;58795:154::-;58935:6;58931:1;58923:6;58919:14;58912:30;58901:48;:::o;58955:220::-;59095:34;59091:1;59083:6;59079:14;59072:58;59164:3;59159:2;59151:6;59147:15;59140:28;59061:114;:::o;59181:179::-;59321:31;59317:1;59309:6;59305:14;59298:55;59287:73;:::o;59366:214::-;59506:66;59502:1;59494:6;59490:14;59483:90;59472:108;:::o;59586:236::-;59726:34;59722:1;59714:6;59710:14;59703:58;59795:19;59790:2;59782:6;59778:15;59771:44;59692:130;:::o;59828:156::-;59968:8;59964:1;59956:6;59952:14;59945:32;59934:50;:::o;59990:315::-;60130:66;60126:1;60118:6;60114:14;60107:90;60231:66;60226:2;60218:6;60214:15;60207:91;60096:209;:::o;60311:231::-;60451:34;60447:1;60439:6;60435:14;60428:58;60520:14;60515:2;60507:6;60503:15;60496:39;60417:125;:::o;60548:214::-;60688:66;60684:1;60676:6;60672:14;60665:90;60654:108;:::o;60768:160::-;60908:12;60904:1;60896:6;60892:14;60885:36;60874:54;:::o;60934:156::-;61074:8;61070:1;61062:6;61058:14;61051:32;61040:50;:::o;61096:122::-;61169:24;61187:5;61169:24;:::i;:::-;61162:5;61159:35;61149:2;;61208:1;61205;61198:12;61149:2;61139:79;:::o;61224:116::-;61294:21;61309:5;61294:21;:::i;:::-;61287:5;61284:32;61274:2;;61330:1;61327;61320:12;61274:2;61264:76;:::o;61346:120::-;61418:23;61435:5;61418:23;:::i;:::-;61411:5;61408:34;61398:2;;61456:1;61453;61446:12;61398:2;61388:78;:::o;61472:122::-;61545:24;61563:5;61545:24;:::i;:::-;61538:5;61535:35;61525:2;;61584:1;61581;61574:12;61525:2;61515:79;:::o;61600:122::-;61673:24;61691:5;61673:24;:::i;:::-;61666:5;61663:35;61653:2;;61712:1;61709;61702:12;61653:2;61643:79;:::o

Swarm Source

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