ETH Price: $2,681.50 (-2.32%)

Token

Squarez (SQRZ)
 

Overview

Max Total Supply

111 SQRZ

Holders

66

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 SQRZ
0x63b7148d2eb24bcb63405faa6e1a643638f00963
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Squarez

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-22
*/

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

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


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: wdy.sol


pragma solidity ^0.8.0;





contract Squarez is Ownable, ERC721A, ReentrancyGuard {
    uint256 public collectionSize=4200;
    uint256 public maxPerAddressDuringMint=5;
    uint256 public price = 0.0069 ether;
    mapping (address => uint) public lastChangeTime;
    string begin="<svg baseProfile='full' width='320' height='320' viewBox='0 0 320 320' xmlns='http://www.w3.org/2000/svg' onclick='if ( this.paused != true ) { this.pauseAnimations(); this.paused = true; } else { this.unpauseAnimations(); this.paused = false; }'>";
    string end="</svg>";
    string black = "#000000";
    string [5] faceColor = ["#23C873", "url(#wave1)", "url(#wave2)", "#EBD9D9", "#DBB17F"];
    string [5] faceProperty = ["Kevin", "Alien", "Gold", "Pale", "White"];

    string [6] noseColor = ["#DDEE0C", "red", "blue", "#363636", "deepskyblue", "mistyrose"];
    string [6] noseProperty = ["Yellow", "Red", "Blue", "Gray", "DeepSkyBlue", "MistyRose"];

    string [7] eyesColor = ["#533205", "#9D77CC", "#6E4644", "khaki", "cyan", "tomato", "moccasin"];
    string [7] eyesProperty = ["DarkBrown", "Purple", "LightBrown", "Khaki", "Cyan", "Tomato", "Moccasin"];

    string [8] mouthColor = ["#2F754F", "deeppink", black, "#C9C9C9", "pink", "darkolivegreen", "mediumspringgreen", "orange"];
    string [8] mouthProperty = ["DarkGreen", "DeepPink", "Black", "Silver", "pink", "DarkOliveGreen", "SpringGreen", "Orange"];

    struct SquareObject {
        uint colorSeed;
        uint balance;
        uint holdTime;
        string prop;
        string result;
    }
  function randomSquare(uint tokenId) internal view returns (SquareObject memory){
      SquareObject memory square;
      address owner = _ownershipOf(tokenId).addr;
      square.colorSeed = uint(keccak256(abi.encodePacked(Strings.toString(tokenId))));
      square.balance = owner.balance;
      square.holdTime = block.timestamp - lastChangeTime[owner];
      square.prop = "";
      square.result = "";
      return square;
  }
  function rect(string memory x, string memory y, string memory width, string memory height, string memory color)internal pure returns(string memory){
      return string(abi.encodePacked("<rect x='", x,
                                     "' y='", y,
                                     "' width='", width,
                                     "' height='", height,
                                     "' fill='", color,
                                     "'/>")
      );
  }
  function f(SquareObject memory square) internal view returns (string memory){ // face
      uint s = square.colorSeed % 40;
      uint num = 0;
      if (s < 2) num = 0;
      else if (s < 6) num = 1;
      else if (s < 10) num = 2;
      else if (s < 25) num = 3;
      else num = 4;
      square.prop = string(abi.encodePacked('[{"trait_type":"Face","value":"', faceProperty[num], '"},'));
      return rect("0", "0", "320", "320", faceColor[num]);
  }
  function n(SquareObject memory square) internal view returns (string memory){ // nose
      string memory nose_type;
      string memory res = "";
      uint num = 0;
      uint s = square.colorSeed % 41;
      if (s < 3) num = 0;
      else if (s < 10) num = 1;
      else if (s < 20) num = 2;
      else if (s < 28) num = 3;
      else if (s < 35) num = 4;
      else num = 5;
      if (s % 5 == 0){
          nose_type = "Long";
          res = rect("120", "160", "20", "10", noseColor[num]);
      }
      else{
          nose_type = "Normal";
      }

      square.prop = string(abi.encodePacked(square.prop, '{"trait_type":"Nose","value":"', noseProperty[num], '"},'));
      square.prop = string(abi.encodePacked(square.prop, '{"trait_type":"Nose type","value":"', nose_type, '"},'));
      return string(abi.encodePacked(res, rect("140", "150", "20", "20", noseColor[num]),
      rect("150", "170", "10", "10", noseColor[num])));
  }
  function e(SquareObject memory square) internal view returns (string memory){ // eyes
      if (square.colorSeed % 19 < 2){
          square.prop = string(abi.encodePacked(square.prop, '{"trait_type":"Eyes","value":"Kevin"},'));
          return string(abi.encodePacked(rect("60", "90", "40", "40", "#FFFFFF"),
          rect("200", "90", "40", "40", "#FFFFFF"),
          rect("60", "110", "20", "20", black),
          rect("220", "90", "20", "20", black)));
      }
      uint num = 0;
      uint s = square.colorSeed % 83;
      if (s < 3) num = 0;
      else if (s < 10) num = 1;
      else if (s < 20) num = 2;
      else if (s < 28) num = 3;
      else if (s < 35) num = 4;
      else if (s < 50) num = 5;
      else num = 6;
      square.prop = string(abi.encodePacked(square.prop, '{"trait_type":"Eyes","value":"', eyesProperty[num], '"},'));
      return string(abi.encodePacked(rect("60", "90", "40", "40", eyesColor[num]),
      rect("200", "90", "40", "40", eyesColor[num])));
  }
  function m(SquareObject memory square) internal view returns (string memory){ // mouth
      if (square.colorSeed % 33 > 0 && square.colorSeed % 33 < 3){
          square.prop = string(abi.encodePacked(square.prop, '{"trait_type":"Mouth","value":"Kevin"},'));
          return string(abi.encodePacked(rect("130", "200", "40", "20", black),
          rect("130", "200", "20", "10", "#ECCB51"),
          rect("140", "210", "20", "10", "#ECCB51"),
          rect("160", "200", "10", "10", "#ECCB51")));
      }
      square.prop = string(abi.encodePacked(square.prop, '{"trait_type":"Mouth","value":"', mouthProperty[square.colorSeed % 8], '"},'));
      return rect("130", "200", "40", "20", mouthColor[square.colorSeed % 8]);
  }
  function rn(SquareObject memory square) internal view returns (string memory){ // running nose
      // Get some money, you are getting cold.
      if (square.balance < 1 ether) {
          square.prop = string(abi.encodePacked(square.prop, '{"trait_type":"Running nose","value":"yes"},'));
          return "<rect x='140' y='170' width='10' height='10' fill='#C6FDFC'><animate attributeName='y' to='330' dur='1s' repeatCount='indefinite' /></rect>";
      }
      else {
          square.prop = string(abi.encodePacked(square.prop, '{"trait_type":"Running nose","value":"no"},'));
          return "";
      }
  }
  function le(SquareObject memory square) internal view returns (string memory){ // laser eyes
      string memory color = "";
      if (square.balance > 10 ether) {color = "red";}
      else if (square.holdTime > 4 weeks ) {color = "lime";}
      else if (square.balance < 0.1 ether) {color = "aqua";}
      else if (square.balance < 1 ether) {color = "violet";}
      else if (square.balance < 5 ether) {color = "turquoise";}
      else {color = "azure";}
      square.prop = string(abi.encodePacked(square.prop, '{"trait_type":"Laser eyes","value":"', color, '"}]'));
      return string(abi.encodePacked("<line x1='70' y1='100' x2='400' y2='430' opacity='0.2' stroke-linecap='round' style='stroke:",
      color,
      ";stroke-width:20'> <animateTransform attributeName='transform' type='rotate' from='0 80 110' to='360 80 110' begin='0s' dur='5s' repeatCount='indefinite' />",
      "</line><line x1='210' y1='100' x2='550' y2='440' opacity='0.2' stroke-linecap='round' style='stroke:",
      color,
      ";stroke-width:20'> <animateTransform attributeName='transform' type='rotate' from='0 220 110' to='360 220 110' begin='0s' dur='5s' repeatCount='indefinite' />",
      "</line>"));
  }
  function generateImage(SquareObject memory square) internal view{
      square.result = begin;
      square.result = string(abi.encodePacked(square.result,
                                       "<defs><linearGradient id='wave1' x1='0' y1='0' x2='0' y2='320' gradientUnits='userSpaceOnUse'><stop offset='0' style='stop-color:#40A49A;stop-opacity:1'>",
                                       "<animate attributeName='offset' values='0;1;0' begin='0s' dur='5s' repeatCount='indefinite'/></stop><stop offset='320' style='stop-color:#E46844;stop-opacity:1'></stop>",
                                       "</linearGradient><linearGradient id='wave2' x1='0' y1='0' x2='0' y2='320' gradientUnits='userSpaceOnUse'><stop offset='0' style='stop-color:#F6E649;stop-opacity:1'>",
                                       "<animate attributeName='offset' values='0;0.5;0' begin='0s' dur='5s' repeatCount='indefinite'/></stop><stop offset='320' style='stop-color:#E5B338;stop-opacity:1'>",
                                       "<animate attributeName='offset' values='1;0.5;1' begin='2.5s' dur='5s' repeatCount='indefinite'/> </stop></linearGradient></defs>"
      ));
      square.result = string(abi.encodePacked(square.result,
      f(square),
      n(square),
      e(square),
      m(square),
      rn(square),
      le(square),
      end
      ));
  }

  function svgToImageURI(string memory _source) internal pure returns (string memory){
      string memory baseURL = "data:image/svg+xml;base64,";
      string memory svgBase64Encoded = Base64.encode(bytes(_source));
      return string(abi.encodePacked(baseURL, svgBase64Encoded));
  }

  function tokenURI(uint256 tokenId) public view override returns (string memory){
      string memory _name = string(abi.encodePacked("Squares! #", Strings.toString(tokenId)));
      string memory _description = "Squares - A fully on-chain animated dynamic pixelized ugly NFT as a tool pass.";
      SquareObject memory square = randomSquare(tokenId);
      generateImage(square);
      string memory _properties = square.prop;
      string memory _imageURI = svgToImageURI(square.result);
      return string(
          abi.encodePacked(
              "data:application/json;base64,",
              Base64.encode(
                  bytes(
                      abi.encodePacked(
                          '{"name":"', _name,
                          '", "description": "', _description, '"',
                          ', "attributes": ', _properties,
                          ', "image":"', _imageURI, '"}'
                      )
                  )
              )
          )
      );
  }

  constructor() ERC721A("Squarez", "SQRZ") {
  }

  // Mint/Transfer
  function mint(uint256 quantity)
    external
    payable
  {
    require(totalSupply() + quantity <= collectionSize, "reached max supply");
    require(
      numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint,
      "can not mint this many"
    );
    _safeMint(msg.sender, quantity);
    require(msg.value >= price * quantity, "Need more ETH.");
    if (msg.value > price * quantity) {
      payable(msg.sender).transfer(msg.value - price * quantity);
    }
  }

  function _afterTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity)
    internal override
  {
      lastChangeTime[to] = block.timestamp;
  }

  // Dev
  function withdrawMoney() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }
  function setPrice(uint price_) public onlyOwner{
      price = price_;
  }
  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }
}

library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

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

        uint256 encodedLen = 4 * ((len + 2) / 3);

        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"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":[{"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":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"address","name":"","type":"address"}],"name":"lastChangeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

611068600a556005600b556618838370f34000600c556101a060405260f76080818152906200476760a03980516200004091600e9160209091019062000981565b50604080518082019091526006808252651e17b9bb339f60d11b60209092019182526200007091600f9162000981565b50604080518082019091526007808252660233030303030360cc1b6020909201918252620000a19160109162000981565b506040805160e081018252600760a08201818152662332334338373360c81b60c0840152825282518084018452600b8082526a75726c282377617665312960a81b60208381019190915280850192909252845180860186529081526a75726c282377617665322960a81b818301528385015283518085018552828152662345424439443960c81b81830152606084015283518085019094529083526611a22121189ba360c91b9083015260808101919091526200016390601190600562000a10565b506040805160e081018252600560a082018181526425b2bb34b760d91b60c08401528252825180840184528181526420b634b2b760d91b602082810191909152808401919091528351808501855260048082526311dbdb1960e21b8284015284860191909152845180860186529081526350616c6560e01b818301526060840152835180850190945281845264576869746560d81b90840152608082019290925262000213916016919062000a10565b506040805161010081018252600760c08201818152662344444545304360c81b60e084015282528251808401845260038152621c995960ea1b60208281019190915280840191909152835180850185526004815263626c756560e01b8183015283850152835180850185529182526611999b199b199b60c91b82820152606083019190915282518084018452600b81526a64656570736b79626c756560a81b818301526080830152825180840190935260098352686d69737479726f736560b81b9083015260a0810191909152620002f090601b90600662000a63565b506040805161010081018252600660c082018181526559656c6c6f7760d01b60e0840152825282518084018452600381526214995960ea1b6020828101919091528084019190915283518085018552600480825263426c756560e01b828401528486019190915284518086018652908152634772617960e01b81830152606084015283518085018552600b81526a44656570536b79426c756560a81b818301526080840152835180850190945260098452684d69737479526f736560b81b9084015260a0820192909252620003c9916021919062000a63565b506040805161012081018252600760e08201818152662335333332303560c81b610100840152825282518084018452818152662339443737434360c81b60208281019190915280840191909152835180850185528281526608cd914d0d8d0d60ca1b81830152838501528351808501855260058152646b68616b6960d81b81830152606084015283518085018552600481526331bcb0b760e11b818301526080840152835180850185526006815265746f6d61746f60d01b8183015260a08401528351808501909452600884526736b7b1b1b0b9b4b760c11b9084015260c0820192909252620004bd916027919062000aa8565b506040805161012081018252600960e08201908152682230b935a13937bbb760b91b610100830152815281518083018352600680825265507572706c6560d01b6020838101919091528084019290925283518085018552600a8152692634b3b43a213937bbb760b11b81840152838501528351808501855260058152644b68616b6960d81b81840152606084015283518085018552600481526321bcb0b760e11b8184015260808401528351808501855290815265546f6d61746f60d01b8183015260a08301528251808401909352600883526726b7b1b1b0b9b4b760c11b9083015260c0810191909152620005b890602e90600762000aa8565b50604080516101408101825260076101008201908152661199231b9a9a2360c91b61012083015281528151808301835260088152676465657070696e6b60c01b602082810191909152820152601080549192830191620006189062000bac565b80601f0160208091040260200160405190810160405280929190818152602001828054620006469062000bac565b8015620006975780601f106200066b5761010080835404028352916020019162000697565b820191906000526020600020905b8154815290600101906020018083116200067957829003601f168201915b505050918352505060408051808201825260078152662343394339433960c81b6020828101919091528084019190915281518083018352600481526370696e6b60e01b818301528284015281518083018352600e81526d3230b935b7b634bb32b3b932b2b760911b81830152606084015281518083018352601181527036b2b234bab6b9b83934b733b3b932b2b760791b818301526080840152815180830190925260068252656f72616e676560d01b9082015260a0909101526200076190603590600862000aed565b50604080516101408101825260096101008201908152682230b935a3b932b2b760b91b6101208301528152815180830183526008808252674465657050696e6b60c01b60208381019190915280840192909252835180850185526005815264426c61636b60d81b81840152838501528351808501855260068082526529b4b63b32b960d11b82850152606085019190915284518086018652600481526370696e6b60e01b81850152608085015284518086018652600e81526d2230b935a7b634bb32a3b932b2b760911b8185015260a085015284518086018652600b81526a29b83934b733a3b932b2b760a91b8185015260c085015284518086019095528452654f72616e676560d01b9184019190915260e08201929092526200088991603d919062000aed565b503480156200089757600080fd5b506040518060400160405280600781526020016629b8bab0b932bd60c91b8152506040518060400160405280600481526020016329a8a92d60e11b815250620008ef620008e96200092d60201b60201c565b62000931565b81516200090490600390602085019062000981565b5080516200091a90600490602084019062000981565b5050600060019081556009555062000be9565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200098f9062000bac565b90600052602060002090601f016020900481019282620009b35760008555620009fe565b82601f10620009ce57805160ff1916838001178555620009fe565b82800160010185558215620009fe579182015b82811115620009fe578251825591602001919060010190620009e1565b5062000a0c92915062000b32565b5090565b826005810192821562000a55579160200282015b8281111562000a55578251805162000a4491849160209091019062000981565b509160200191906001019062000a24565b5062000a0c92915062000b49565b826006810192821562000a55579160200282015b8281111562000a55578251805162000a9791849160209091019062000981565b509160200191906001019062000a77565b826007810192821562000a55579160200282015b8281111562000a55578251805162000adc91849160209091019062000981565b509160200191906001019062000abc565b826008810192821562000a55579160200282015b8281111562000a55578251805162000b2191849160209091019062000981565b509160200191906001019062000b01565b5b8082111562000a0c576000815560010162000b33565b8082111562000a0c57600062000b60828262000b6a565b5060010162000b49565b50805462000b789062000bac565b6000825580601f1062000b89575050565b601f01602090049060005260206000209081019062000ba9919062000b32565b50565b600181811c9082168062000bc157607f821691505b6020821081141562000be357634e487b7160e01b600052602260045260246000fd5b50919050565b613b6e8062000bf96000396000f3fe6080604052600436106101665760003560e01c80638da5cb5b116100d1578063ac4460021161008a578063d23e83b011610064578063d23e83b0146103f1578063dc33e6811461041e578063e985e9c51461043e578063f2fde38b1461048757600080fd5b8063ac4460021461039c578063b88d4fde146103b1578063c87b56dd146103d157600080fd5b80638da5cb5b1461030057806391b7f5ed1461031e57806395d89b411461033e578063a035b1fe14610353578063a0712d6814610369578063a22cb4651461037c57600080fd5b806342842e0e1161012357806342842e0e1461025f57806345c0f5331461027f5780636352211e1461029557806370a08231146102b5578063715018a6146102d55780638bc35c2f146102ea57600080fd5b806301ffc9a71461016b57806306fdde03146101a0578063081812fc146101c2578063095ea7b3146101fa57806318160ddd1461021c57806323b872dd1461023f575b600080fd5b34801561017757600080fd5b5061018b610186366004612932565b6104a7565b60405190151581526020015b60405180910390f35b3480156101ac57600080fd5b506101b56104f9565b6040516101979190613871565b3480156101ce57600080fd5b506101e26101dd36600461296c565b61058b565b6040516001600160a01b039091168152602001610197565b34801561020657600080fd5b5061021a610215366004612908565b6105cf565b005b34801561022857600080fd5b50600254600154035b604051908152602001610197565b34801561024b57600080fd5b5061021a61025a3660046127b4565b610656565b34801561026b57600080fd5b5061021a61027a3660046127b4565b610661565b34801561028b57600080fd5b50610231600a5481565b3480156102a157600080fd5b506101e26102b036600461296c565b61067c565b3480156102c157600080fd5b506102316102d036600461275f565b61068e565b3480156102e157600080fd5b5061021a6106dd565b3480156102f657600080fd5b50610231600b5481565b34801561030c57600080fd5b506000546001600160a01b03166101e2565b34801561032a57600080fd5b5061021a61033936600461296c565b61071c565b34801561034a57600080fd5b506101b561074b565b34801561035f57600080fd5b50610231600c5481565b61021a61037736600461296c565b61075a565b34801561038857600080fd5b5061021a6103973660046128cc565b6108d5565b3480156103a857600080fd5b5061021a61096b565b3480156103bd57600080fd5b5061021a6103cc3660046127f0565b610a80565b3480156103dd57600080fd5b506101b56103ec36600461296c565b610aca565b3480156103fd57600080fd5b5061023161040c36600461275f565b600d6020526000908152604090205481565b34801561042a57600080fd5b5061023161043936600461275f565b610b98565b34801561044a57600080fd5b5061018b610459366004612781565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561049357600080fd5b5061021a6104a236600461275f565b610bc7565b60006001600160e01b031982166380ac58cd60e01b14806104d857506001600160e01b03198216635b5e139f60e01b145b806104f357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461050890613947565b80601f016020809104026020016040519081016040528092919081815260200182805461053490613947565b80156105815780601f1061055657610100808354040283529160200191610581565b820191906000526020600020905b81548152906001019060200180831161056457829003601f168201915b5050505050905090565b600061059682610c5f565b6105b3576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006105da8261067c565b9050806001600160a01b0316836001600160a01b0316141561060f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610646576106298133610459565b610646576040516367d9dca160e11b815260040160405180910390fd5b610651838383610c8b565b505050565b610651838383610ce7565b61065183838360405180602001604052806000815250610a80565b600061068782610eef565b5192915050565b60006001600160a01b0382166106b7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b031633146107105760405162461bcd60e51b815260040161070790613884565b60405180910390fd5b61071a600061100b565b565b6000546001600160a01b031633146107465760405162461bcd60e51b815260040161070790613884565b600c55565b60606004805461050890613947565b600a548161076b6002546001540390565b61077591906138b9565b11156107b85760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610707565b600b54816107c533610b98565b6107cf91906138b9565b11156108165760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610707565b610820338261105b565b80600c5461082e91906138e5565b34101561086e5760405162461bcd60e51b815260206004820152600e60248201526d2732b2b21036b7b9329022aa241760911b6044820152606401610707565b80600c5461087c91906138e5565b3411156108d257336001600160a01b03166108fc82600c5461089e91906138e5565b6108a89034613904565b6040518115909202916000818181858888f193505050501580156108d0573d6000803e3d6000fd5b505b50565b6001600160a01b0382163314156108ff5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146109955760405162461bcd60e51b815260040161070790613884565b600260095414156109e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610707565b6002600955604051600090339047908381818185875af1925050503d8060008114610a2f576040519150601f19603f3d011682016040523d82523d6000602084013e610a34565b606091505b5050905080610a785760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610707565b506001600955565b610a8b848484610ce7565b6001600160a01b0383163b15610ac457610aa784848484611075565b610ac4576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606000610ad78361116d565b604051602001610ae79190613802565b60408051601f1981840301815260808301909152604e80835290925060009190613aeb602083013990506000610b1c8561126b565b9050610b278161136c565b60608101516080820151600090610b3d9061148c565b9050610b6d85858484604051602001610b5994939291906133e3565b6040516020818303038152906040526114fb565b604051602001610b7d9190613778565b60405160208183030381529060405295505050505050919050565b6001600160a01b038116600090815260066020526040812054600160401b900467ffffffffffffffff166104f3565b6000546001600160a01b03163314610bf15760405162461bcd60e51b815260040161070790613884565b6001600160a01b038116610c565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610707565b6108d28161100b565b6000600154821080156104f3575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610cf282610eef565b9050836001600160a01b031681600001516001600160a01b031614610d295760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610d475750610d478533610459565b80610d62575033610d578461058b565b6001600160a01b0316145b905080610d8257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610da957604051633a954ecd60e21b815260040160405180910390fd5b610db560008487610c8b565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116610e8b576001548214610e8b578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050506001600160a01b03166000908152600d6020526040902042905550565b604080516060810182526000808252602082018190529181019190915281600154811015610ff257600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290610ff05780516001600160a01b031615610f86579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215610feb579392505050565b610f86565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6108d0828260405180602001604052806000815250611661565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906110aa903390899088908890600401613834565b602060405180830381600087803b1580156110c457600080fd5b505af19250505080156110f4575060408051601f3d908101601f191682019092526110f19181019061294f565b60015b61114f573d808015611122576040519150601f19603f3d011682016040523d82523d6000602084013e611127565b606091505b508051611147576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816111915750506040805180820190915260018152600360fc1b602082015290565b8160005b81156111bb57806111a581613982565b91506111b49050600a836138d1565b9150611195565b60008167ffffffffffffffff8111156111d6576111d66139f3565b6040519080825280601f01601f191660200182016040528015611200576020820181803683370190505b5090505b841561116557611215600183613904565b9150611222600a8661399d565b61122d9060306138b9565b60f81b818381518110611242576112426139dd565b60200101906001600160f81b031916908160001a905350611264600a866138d1565b9450611204565b61129d6040518060a0016040528060008152602001600081526020016000815260200160608152602001606081525090565b6112cf6040518060a0016040528060008152602001600081526020016000815260200160608152602001606081525090565b60006112da84610eef565b5190506112e68461116d565b6040516020016112f69190612a67565b60408051601f19818403018152918152815160209283012084526001600160a01b0383168031858401526000908152600d9092529020546113379042613904565b604080840191909152805160208082018352600080835260608601929092528251908101909252815260808301525092915050565b600e805461137990613947565b80601f01602080910402602001604051908101604052809291908181526020018280546113a590613947565b80156113f25780601f106113c7576101008083540402835291602001916113f2565b820191906000526020600020905b8154815290600101906020018083116113d557829003601f168201915b50505050608083018290525060405161140e9190602001612be9565b60408051601f198184030181529190526080820181905261142e82611835565b611437836119e2565b61144084611ce6565b61144985612157565b611452866124db565b61145b8761257d565b600f604051602001611474989796959493929190612b4c565b60408051601f19818403018152919052608090910152565b60408051808201909152601a81527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602082015260609060006114ce846114fb565b905081816040516020016114e3929190612a83565b60405160208183030381529060405292505050919050565b80516060908061151b575050604080516020810190915260008152919050565b6000600361152a8360026138b9565b61153491906138d1565b61153f9060046138e5565b9050600061154e8260206138b9565b67ffffffffffffffff811115611566576115666139f3565b6040519080825280601f01601f191660200182016040528015611590576020820181803683370190505b5090506000604051806060016040528060408152602001613aab604091399050600181016020830160005b8681101561161c576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016115bb565b506003860660018114611636576002811461164757611653565b613d3d60f01b600119830152611653565b603d60f81b6000198301525b505050918152949350505050565b6001546001600160a01b03841661168a57604051622e076360e81b815260040160405180910390fd5b826116a85760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b156117cc575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46117956000878480600101955087611075565b6117b2576040516368d2bf6b60e11b815260040160405180910390fd5b80821061174a5782600154146117c757600080fd5b611811565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106117cd575b506001556001600160a01b0384166000908152600d60205260409020429055610ac4565b606060006028836000015161184a919061399d565b90506000600282101561185f57506000611896565b600682101561187057506001611896565b600a82101561188157506002611896565b601982101561189257506003611896565b5060045b601681600581106118a9576118a96139dd565b016040516020016118ba91906137bd565b6040516020818303038152906040528460600181905250611165604051806040016040528060018152602001600360fc1b815250604051806040016040528060018152602001600360fc1b8152506040518060400160405280600381526020016203332360ec1b8152506040518060400160405280600381526020016203332360ec1b81525060118660058110611953576119536139dd565b01805461195f90613947565b80601f016020809104026020016040519081016040528092919081815260200182805461198b90613947565b80156119d85780601f106119ad576101008083540402835291602001916119d8565b820191906000526020600020905b8154815290600101906020018083116119bb57829003601f168201915b5050505050612713565b606080600060405180602001604052806000815250905060008060298660000151611a0d919061399d565b90506003811015611a215760009150611a6e565b600a811015611a335760019150611a6e565b6014811015611a455760029150611a6e565b601c811015611a575760039150611a6e565b6023811015611a695760049150611a6e565b600591505b611a7960058261399d565b611b2757604051806040016040528060048152602001634c6f6e6760e01b8152509350611b206040518060400160405280600381526020016203132360ec1b8152506040518060400160405280600381526020016203136360ec1b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161031360f41b815250601b8760068110611953576119536139dd565b9250611b49565b60405180604001604052806006815260200165139bdc9b585b60d21b81525093505b856060015160218360068110611b6157611b616139dd565b01604051602001611b7392919061304e565b60408051601f198184030181529181526060880182905251611b9a91908690602001612fd9565b604051602081830303815290604052866060018190525082611c366040518060400160405280600381526020016203134360ec1b8152506040518060400160405280600381526020016203135360ec1b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161032360f41b815250601b8860068110611953576119536139dd565b611cba6040518060400160405280600381526020016203135360ec1b8152506040518060400160405280600381526020016203137360ec1b81525060405180604001604052806002815260200161031360f41b81525060405180604001604052806002815260200161031360f41b815250601b8960068110611953576119536139dd565b604051602001611ccc93929190612ab2565b604051602081830303815290604052945050505050919050565b6060600260138360000151611cfb919061399d565b1015611f79578160600151604051602001611d1691906130fe565b6040516020818303038152906040528260600181905250611dc160405180604001604052806002815260200161036360f41b81525060405180604001604052806002815260200161039360f41b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161034360f41b8152506040518060400160405280600781526020016611a3232323232360c91b815250612713565b611e566040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161039360f41b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161034360f41b8152506040518060400160405280600781526020016611a3232323232360c91b815250612713565b611ed360405180604001604052806002815260200161036360f41b8152506040518060400160405280600381526020016203131360ec1b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161032360f41b8152506010805461195f90613947565b611f506040518060400160405280600381526020016203232360ec1b81525060405180604001604052806002815260200161039360f41b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161032360f41b8152506010805461195f90613947565b604051602001611f639493929190612af5565b6040516020818303038152906040529050919050565b60008060538460000151611f8d919061399d565b90506003811015611fa15760009150612000565b600a811015611fb35760019150612000565b6014811015611fc55760029150612000565b601c811015611fd75760039150612000565b6023811015611fe95760049150612000565b6032811015611ffb5760059150612000565b600691505b8360600151602e8360078110612018576120186139dd565b0160405160200161202a9291906132b1565b60405160208183030381529060405284606001819052506120c360405180604001604052806002815260200161036360f41b81525060405180604001604052806002815260200161039360f41b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161034360f41b81525060278760078110611953576119536139dd565b6121466040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161039360f41b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161034360f41b81525060278860078110611953576119536139dd565b6040516020016114e3929190612a83565b606060006021836000015161216c919061399d565b118015612187575081516003906121859060219061399d565b105b156123f85781606001516040516020016121a1919061320a565b60405160208183030381529060405282606001819052506122366040518060400160405280600381526020016203133360ec1b8152506040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161032360f41b8152506010805461195f90613947565b6122cc6040518060400160405280600381526020016203133360ec1b8152506040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161031360f41b815250604051806040016040528060078152602001662345434342353160c81b815250612713565b6123626040518060400160405280600381526020016203134360ec1b8152506040518060400160405280600381526020016203231360ec1b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161031360f41b815250604051806040016040528060078152602001662345434342353160c81b815250612713565b611f506040518060400160405280600381526020016203136360ec1b8152506040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161031360f41b81525060405180604001604052806002815260200161031360f41b815250604051806040016040528060078152602001662345434342353160c81b815250612713565b60608201518251603d9061240e9060089061399d565b6008811061241e5761241e6139dd565b016040516020016124309291906131c4565b60405160208183030381529060405282606001819052506104f36040518060400160405280600381526020016203133360ec1b8152506040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161032360f41b8152506035600888600001516124cb919061399d565b60088110611953576119536139dd565b6060670de0b6b3a76400008260200151101561253c578160600151604051602001612506919061325b565b60405160208183030381529060405282606001819052506040518060c00160405280608b8152602001613a20608b913992915050565b816060015160405160200161255191906130a9565b60408051601f19818403018152918152606090930152508051602081019091526000815290565b919050565b60606000604051806020016040528060008152509050678ac7230489e80000836020015111156125c757506040805180820190915260038152621c995960ea1b60208201526126bb565b6224ea00836040015111156125f757506040805180820190915260048152636c696d6560e01b60208201526126bb565b67016345785d8a00008360200151101561262c57506040805180820190915260048152636171756160e01b60208201526126bb565b670de0b6b3a76400008360200151101561266357506040805180820190915260068152651d9a5bdb195d60d21b60208201526126bb565b674563918244f400008360200151101561269d575060408051808201909152600981526874757271756f69736560b81b60208201526126bb565b50604080518082019091526005815264617a75726560d81b60208201525b8260600151816040516020016126d292919061314e565b604051602081830303815290604052836060018190525080816040516020016126fc9291906134bf565b604051602081830303815290604052915050919050565b6060858585858560405160200161272e9594939291906132f7565b604051602081830303815290604052905095945050505050565b80356001600160a01b038116811461257857600080fd5b60006020828403121561277157600080fd5b61277a82612748565b9392505050565b6000806040838503121561279457600080fd5b61279d83612748565b91506127ab60208401612748565b90509250929050565b6000806000606084860312156127c957600080fd5b6127d284612748565b92506127e060208501612748565b9150604084013590509250925092565b6000806000806080858703121561280657600080fd5b61280f85612748565b935061281d60208601612748565b925060408501359150606085013567ffffffffffffffff8082111561284157600080fd5b818701915087601f83011261285557600080fd5b813581811115612867576128676139f3565b604051601f8201601f19908116603f0116810190838211818310171561288f5761288f6139f3565b816040528281528a60208487010111156128a857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156128df57600080fd5b6128e883612748565b9150602083013580151581146128fd57600080fd5b809150509250929050565b6000806040838503121561291b57600080fd5b61292483612748565b946020939093013593505050565b60006020828403121561294457600080fd5b813561277a81613a09565b60006020828403121561296157600080fd5b815161277a81613a09565b60006020828403121561297e57600080fd5b5035919050565b6000815180845261299d81602086016020860161391b565b601f01601f19169290920160200192915050565b600081516129c381856020860161391b565b9290920192915050565b8054600090600181811c90808316806129e757607f831692505b6020808410821415612a0957634e487b7160e01b600052602260045260246000fd5b818015612a1d5760018114612a2e57612a5b565b60ff19861689528489019650612a5b565b60008881526020902060005b86811015612a535781548b820152908501908301612a3a565b505084890196505b50505050505092915050565b60008251612a7981846020870161391b565b9190910192915050565b60008351612a9581846020880161391b565b835190830190612aa981836020880161391b565b01949350505050565b60008451612ac481846020890161391b565b845190830190612ad881836020890161391b565b8451910190612aeb81836020880161391b565b0195945050505050565b60008551612b07818460208a0161391b565b855190830190612b1b818360208a0161391b565b8551910190612b2e81836020890161391b565b8451910190612b4181836020880161391b565b019695505050505050565b600089516020612b5f8285838f0161391b565b8a5191840191612b728184848f0161391b565b8a51920191612b848184848e0161391b565b8951920191612b968184848d0161391b565b8851920191612ba88184848c0161391b565b8751920191612bba8184848b0161391b565b8651920191612bcc8184848a0161391b565b612bd8818401876129cd565b9d9c50505050505050505050505050565b60008251612bfb81846020870161391b565b7f3c646566733e3c6c696e6561724772616469656e742069643d277761766531279083019081527f2078313d2730272079313d2730272078323d2730272079323d2733323027206760208201527f72616469656e74556e6974733d277573657253706163654f6e557365273e3c7360408201527f746f70206f66667365743d273027207374796c653d2773746f702d636f6c6f7260608201527f3a233430413439413b73746f702d6f7061636974793a31273e0000000000000060808201527f3c616e696d617465206174747269627574654e616d653d276f6666736574272060998201527f76616c7565733d27303b313b302720626567696e3d27307327206475723d273560b98201527f732720726570656174436f756e743d27696e646566696e697465272f3e3c2f7360d98201527f746f703e3c73746f70206f66667365743d2733323027207374796c653d27737460f98201527f6f702d636f6c6f723a234534363834343b73746f702d6f7061636974793a3127610119820152671f1e17b9ba37b81f60c11b6101398201527f3c2f6c696e6561724772616469656e743e3c6c696e6561724772616469656e746101418201527f2069643d277761766532272078313d2730272079313d2730272078323d2730276101618201527f2079323d2733323027206772616469656e74556e6974733d27757365725370616101818201527f63654f6e557365273e3c73746f70206f66667365743d273027207374796c653d6101a18201527f2773746f702d636f6c6f723a234636453634393b73746f702d6f7061636974796101c1820152631d18939f60e11b6101e1820152611165612f346101e583017f3c616e696d617465206174747269627574654e616d653d276f6666736574272081527f76616c7565733d27303b302e353b302720626567696e3d27307327206475723d60208201527f2735732720726570656174436f756e743d27696e646566696e697465272f3e3c60408201527f2f73746f703e3c73746f70206f66667365743d2733323027207374796c653d2760608201527f73746f702d636f6c6f723a234535423333383b73746f702d6f7061636974793a60808201526218939f60e91b60a082015260a30190565b7f3c616e696d617465206174747269627574654e616d653d276f6666736574272081527f76616c7565733d27313b302e353b312720626567696e3d27322e35732720647560208201527f723d2735732720726570656174436f756e743d27696e646566696e697465272f60408201527f3e203c2f73746f703e3c2f6c696e6561724772616469656e743e3c2f646566736060820152601f60f91b608082015260810190565b60008351612feb81846020880161391b565b80830190507f7b2274726169745f74797065223a224e6f73652074797065222c2276616c7565815262111d1160e91b6020820152835161303281602384016020880161391b565b62089f4b60ea1b60239290910191820152602601949350505050565b6000835161306081846020880161391b565b7f7b2274726169745f74797065223a224e6f7365222c2276616c7565223a220000908301908152613094601e8201856129cd565b62089f4b60ea1b815260030195945050505050565b600082516130bb81846020870161391b565b7f7b2274726169745f74797065223a2252756e6e696e67206e6f7365222c2276619201918252506a1b1d59488e889b9bc89f4b60aa1b6020820152602b01919050565b6000825161311081846020870161391b565b7f7b2274726169745f74797065223a2245796573222c2276616c7565223a224b65920191825250651d9a5b889f4b60d21b6020820152602601919050565b6000835161316081846020880161391b565b80830190507f7b2274726169745f74797065223a224c617365722065796573222c2276616c7581526332911d1160e11b602082015283516131a881602484016020880161391b565b62227d5d60e81b60249290910191820152602701949350505050565b600083516131d681846020880161391b565b7f7b2274726169745f74797065223a224d6f757468222c2276616c7565223a2200908301908152613094601f8201856129cd565b6000825161321c81846020870161391b565b7f7b2274726169745f74797065223a224d6f757468222c2276616c7565223a224b92019182525066195d9a5b889f4b60ca1b6020820152602701919050565b6000825161326d81846020870161391b565b7f7b2274726169745f74797065223a2252756e6e696e67206e6f7365222c2276619201918252506b1b1d59488e889e595cc89f4b60a21b6020820152602c01919050565b600083516132c381846020880161391b565b7f7b2274726169745f74797065223a2245796573222c2276616c7565223a220000908301908152613094601e8201856129cd565b683c7265637420783d2760b81b81526000865161331b816009850160208b0161391b565b642720793d2760d81b600991840191820152865161334081600e840160208b0161391b565b68272077696474683d2760b81b600e9290910191820152855161336a816017840160208a0161391b565b6927206865696768743d2760b01b60179290910191820152845161339581602184016020890161391b565b67272066696c6c3d2760c01b6021929091019182015283516133be81602984016020880161391b565b6133d66029828401016213979f60e91b815260030190565b9998505050505050505050565b683d913730b6b2911d1160b91b81528451600090613408816009850160208a0161391b565b72111610113232b9b1b934b83a34b7b7111d101160691b600991840191820152855161343b81601c840160208a0161391b565b601160f91b601c92909101918201526f016101130ba3a3934b13aba32b9911d160851b601d820152845161347681602d84016020890161391b565b6a16101134b6b0b3b2911d1160a91b602d929091019182015283516134a281603884016020880161391b565b61227d60f01b60389290910191820152603a019695505050505050565b7f3c6c696e652078313d273730272079313d27313030272078323d27343030272081527f79323d2734333027206f7061636974793d27302e3227207374726f6b652d6c6960208201527f6e656361703d27726f756e6427207374796c653d277374726f6b653a0000000060408201526000835161354381605c85016020880161391b565b7f3b7374726f6b652d77696474683a3230273e203c616e696d6174655472616e73605c918401918201527f666f726d206174747269627574654e616d653d277472616e73666f726d272074607c8201527f7970653d27726f74617465272066726f6d3d2730203830203131302720746f3d609c8201527f27333630203830203131302720626567696e3d27307327206475723d2735732760bc8201527f20726570656174436f756e743d27696e646566696e69746527202f3e0000000060dc8201527f3c2f6c696e653e3c6c696e652078313d27323130272079313d2731303027207860f88201527f323d27353530272079323d2734343027206f7061636974793d27302e322720736101188201527f74726f6b652d6c696e656361703d27726f756e6427207374796c653d277374726101388201526337b5b29d60e11b61015882015261376f61375c61369b61015c8401876129b1565b7f3b7374726f6b652d77696474683a3230273e203c616e696d6174655472616e7381527f666f726d206174747269627574654e616d653d277472616e73666f726d27207460208201527f7970653d27726f74617465272066726f6d3d273020323230203131302720746f60408201527f3d2733363020323230203131302720626567696e3d27307327206475723d273560608201527f732720726570656174436f756e743d27696e646566696e69746527202f3e00006080820152609e0190565b661e17b634b7329f60c91b815260070190565b95945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516137b081601d85016020870161391b565b91909101601d0192915050565b7f5b7b2274726169745f74797065223a2246616365222c2276616c7565223a2200815260006137ef601f8301846129cd565b62089f4b60ea1b81526003019392505050565b695371756172657321202360b01b81526000825161382781600a85016020870161391b565b91909101600a0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061386790830184612985565b9695505050505050565b60208152600061277a6020830184612985565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156138cc576138cc6139b1565b500190565b6000826138e0576138e06139c7565b500490565b60008160001904831182151516156138ff576138ff6139b1565b500290565b600082821015613916576139166139b1565b500390565b60005b8381101561393657818101518382015260200161391e565b83811115610ac45750506000910152565b600181811c9082168061395b57607f821691505b6020821081141561397c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613996576139966139b1565b5060010190565b6000826139ac576139ac6139c7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108d257600080fdfe3c7265637420783d273134302720793d27313730272077696474683d27313027206865696768743d273130272066696c6c3d2723433646444643273e3c616e696d617465206174747269627574654e616d653d27792720746f3d2733333027206475723d2731732720726570656174436f756e743d27696e646566696e69746527202f3e3c2f726563743e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f53717561726573202d20412066756c6c79206f6e2d636861696e20616e696d617465642064796e616d696320706978656c697a65642075676c79204e4654206173206120746f6f6c20706173732ea2646970667358221220a1b92c7c9637e05f64d2b14778b46ebc1226f5a2e55ac6c2c1d80fd592cbbd0364736f6c634300080700333c737667206261736550726f66696c653d2766756c6c272077696474683d2733323027206865696768743d27333230272076696577426f783d2730203020333230203332302720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f73766727206f6e636c69636b3d276966202820746869732e70617573656420213d20747275652029207b20746869732e7061757365416e696d6174696f6e7328293b20746869732e706175736564203d20747275653b207d20656c7365207b20746869732e756e7061757365416e696d6174696f6e7328293b20746869732e706175736564203d2066616c73653b207d273e

Deployed Bytecode

0x6080604052600436106101665760003560e01c80638da5cb5b116100d1578063ac4460021161008a578063d23e83b011610064578063d23e83b0146103f1578063dc33e6811461041e578063e985e9c51461043e578063f2fde38b1461048757600080fd5b8063ac4460021461039c578063b88d4fde146103b1578063c87b56dd146103d157600080fd5b80638da5cb5b1461030057806391b7f5ed1461031e57806395d89b411461033e578063a035b1fe14610353578063a0712d6814610369578063a22cb4651461037c57600080fd5b806342842e0e1161012357806342842e0e1461025f57806345c0f5331461027f5780636352211e1461029557806370a08231146102b5578063715018a6146102d55780638bc35c2f146102ea57600080fd5b806301ffc9a71461016b57806306fdde03146101a0578063081812fc146101c2578063095ea7b3146101fa57806318160ddd1461021c57806323b872dd1461023f575b600080fd5b34801561017757600080fd5b5061018b610186366004612932565b6104a7565b60405190151581526020015b60405180910390f35b3480156101ac57600080fd5b506101b56104f9565b6040516101979190613871565b3480156101ce57600080fd5b506101e26101dd36600461296c565b61058b565b6040516001600160a01b039091168152602001610197565b34801561020657600080fd5b5061021a610215366004612908565b6105cf565b005b34801561022857600080fd5b50600254600154035b604051908152602001610197565b34801561024b57600080fd5b5061021a61025a3660046127b4565b610656565b34801561026b57600080fd5b5061021a61027a3660046127b4565b610661565b34801561028b57600080fd5b50610231600a5481565b3480156102a157600080fd5b506101e26102b036600461296c565b61067c565b3480156102c157600080fd5b506102316102d036600461275f565b61068e565b3480156102e157600080fd5b5061021a6106dd565b3480156102f657600080fd5b50610231600b5481565b34801561030c57600080fd5b506000546001600160a01b03166101e2565b34801561032a57600080fd5b5061021a61033936600461296c565b61071c565b34801561034a57600080fd5b506101b561074b565b34801561035f57600080fd5b50610231600c5481565b61021a61037736600461296c565b61075a565b34801561038857600080fd5b5061021a6103973660046128cc565b6108d5565b3480156103a857600080fd5b5061021a61096b565b3480156103bd57600080fd5b5061021a6103cc3660046127f0565b610a80565b3480156103dd57600080fd5b506101b56103ec36600461296c565b610aca565b3480156103fd57600080fd5b5061023161040c36600461275f565b600d6020526000908152604090205481565b34801561042a57600080fd5b5061023161043936600461275f565b610b98565b34801561044a57600080fd5b5061018b610459366004612781565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561049357600080fd5b5061021a6104a236600461275f565b610bc7565b60006001600160e01b031982166380ac58cd60e01b14806104d857506001600160e01b03198216635b5e139f60e01b145b806104f357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461050890613947565b80601f016020809104026020016040519081016040528092919081815260200182805461053490613947565b80156105815780601f1061055657610100808354040283529160200191610581565b820191906000526020600020905b81548152906001019060200180831161056457829003601f168201915b5050505050905090565b600061059682610c5f565b6105b3576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006105da8261067c565b9050806001600160a01b0316836001600160a01b0316141561060f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610646576106298133610459565b610646576040516367d9dca160e11b815260040160405180910390fd5b610651838383610c8b565b505050565b610651838383610ce7565b61065183838360405180602001604052806000815250610a80565b600061068782610eef565b5192915050565b60006001600160a01b0382166106b7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b031633146107105760405162461bcd60e51b815260040161070790613884565b60405180910390fd5b61071a600061100b565b565b6000546001600160a01b031633146107465760405162461bcd60e51b815260040161070790613884565b600c55565b60606004805461050890613947565b600a548161076b6002546001540390565b61077591906138b9565b11156107b85760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b6044820152606401610707565b600b54816107c533610b98565b6107cf91906138b9565b11156108165760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610707565b610820338261105b565b80600c5461082e91906138e5565b34101561086e5760405162461bcd60e51b815260206004820152600e60248201526d2732b2b21036b7b9329022aa241760911b6044820152606401610707565b80600c5461087c91906138e5565b3411156108d257336001600160a01b03166108fc82600c5461089e91906138e5565b6108a89034613904565b6040518115909202916000818181858888f193505050501580156108d0573d6000803e3d6000fd5b505b50565b6001600160a01b0382163314156108ff5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146109955760405162461bcd60e51b815260040161070790613884565b600260095414156109e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610707565b6002600955604051600090339047908381818185875af1925050503d8060008114610a2f576040519150601f19603f3d011682016040523d82523d6000602084013e610a34565b606091505b5050905080610a785760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610707565b506001600955565b610a8b848484610ce7565b6001600160a01b0383163b15610ac457610aa784848484611075565b610ac4576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606000610ad78361116d565b604051602001610ae79190613802565b60408051601f1981840301815260808301909152604e80835290925060009190613aeb602083013990506000610b1c8561126b565b9050610b278161136c565b60608101516080820151600090610b3d9061148c565b9050610b6d85858484604051602001610b5994939291906133e3565b6040516020818303038152906040526114fb565b604051602001610b7d9190613778565b60405160208183030381529060405295505050505050919050565b6001600160a01b038116600090815260066020526040812054600160401b900467ffffffffffffffff166104f3565b6000546001600160a01b03163314610bf15760405162461bcd60e51b815260040161070790613884565b6001600160a01b038116610c565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610707565b6108d28161100b565b6000600154821080156104f3575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610cf282610eef565b9050836001600160a01b031681600001516001600160a01b031614610d295760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610d475750610d478533610459565b80610d62575033610d578461058b565b6001600160a01b0316145b905080610d8257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610da957604051633a954ecd60e21b815260040160405180910390fd5b610db560008487610c8b565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116610e8b576001548214610e8b578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050506001600160a01b03166000908152600d6020526040902042905550565b604080516060810182526000808252602082018190529181019190915281600154811015610ff257600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290610ff05780516001600160a01b031615610f86579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215610feb579392505050565b610f86565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6108d0828260405180602001604052806000815250611661565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906110aa903390899088908890600401613834565b602060405180830381600087803b1580156110c457600080fd5b505af19250505080156110f4575060408051601f3d908101601f191682019092526110f19181019061294f565b60015b61114f573d808015611122576040519150601f19603f3d011682016040523d82523d6000602084013e611127565b606091505b508051611147576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816111915750506040805180820190915260018152600360fc1b602082015290565b8160005b81156111bb57806111a581613982565b91506111b49050600a836138d1565b9150611195565b60008167ffffffffffffffff8111156111d6576111d66139f3565b6040519080825280601f01601f191660200182016040528015611200576020820181803683370190505b5090505b841561116557611215600183613904565b9150611222600a8661399d565b61122d9060306138b9565b60f81b818381518110611242576112426139dd565b60200101906001600160f81b031916908160001a905350611264600a866138d1565b9450611204565b61129d6040518060a0016040528060008152602001600081526020016000815260200160608152602001606081525090565b6112cf6040518060a0016040528060008152602001600081526020016000815260200160608152602001606081525090565b60006112da84610eef565b5190506112e68461116d565b6040516020016112f69190612a67565b60408051601f19818403018152918152815160209283012084526001600160a01b0383168031858401526000908152600d9092529020546113379042613904565b604080840191909152805160208082018352600080835260608601929092528251908101909252815260808301525092915050565b600e805461137990613947565b80601f01602080910402602001604051908101604052809291908181526020018280546113a590613947565b80156113f25780601f106113c7576101008083540402835291602001916113f2565b820191906000526020600020905b8154815290600101906020018083116113d557829003601f168201915b50505050608083018290525060405161140e9190602001612be9565b60408051601f198184030181529190526080820181905261142e82611835565b611437836119e2565b61144084611ce6565b61144985612157565b611452866124db565b61145b8761257d565b600f604051602001611474989796959493929190612b4c565b60408051601f19818403018152919052608090910152565b60408051808201909152601a81527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602082015260609060006114ce846114fb565b905081816040516020016114e3929190612a83565b60405160208183030381529060405292505050919050565b80516060908061151b575050604080516020810190915260008152919050565b6000600361152a8360026138b9565b61153491906138d1565b61153f9060046138e5565b9050600061154e8260206138b9565b67ffffffffffffffff811115611566576115666139f3565b6040519080825280601f01601f191660200182016040528015611590576020820181803683370190505b5090506000604051806060016040528060408152602001613aab604091399050600181016020830160005b8681101561161c576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016115bb565b506003860660018114611636576002811461164757611653565b613d3d60f01b600119830152611653565b603d60f81b6000198301525b505050918152949350505050565b6001546001600160a01b03841661168a57604051622e076360e81b815260040160405180910390fd5b826116a85760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b156117cc575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46117956000878480600101955087611075565b6117b2576040516368d2bf6b60e11b815260040160405180910390fd5b80821061174a5782600154146117c757600080fd5b611811565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106117cd575b506001556001600160a01b0384166000908152600d60205260409020429055610ac4565b606060006028836000015161184a919061399d565b90506000600282101561185f57506000611896565b600682101561187057506001611896565b600a82101561188157506002611896565b601982101561189257506003611896565b5060045b601681600581106118a9576118a96139dd565b016040516020016118ba91906137bd565b6040516020818303038152906040528460600181905250611165604051806040016040528060018152602001600360fc1b815250604051806040016040528060018152602001600360fc1b8152506040518060400160405280600381526020016203332360ec1b8152506040518060400160405280600381526020016203332360ec1b81525060118660058110611953576119536139dd565b01805461195f90613947565b80601f016020809104026020016040519081016040528092919081815260200182805461198b90613947565b80156119d85780601f106119ad576101008083540402835291602001916119d8565b820191906000526020600020905b8154815290600101906020018083116119bb57829003601f168201915b5050505050612713565b606080600060405180602001604052806000815250905060008060298660000151611a0d919061399d565b90506003811015611a215760009150611a6e565b600a811015611a335760019150611a6e565b6014811015611a455760029150611a6e565b601c811015611a575760039150611a6e565b6023811015611a695760049150611a6e565b600591505b611a7960058261399d565b611b2757604051806040016040528060048152602001634c6f6e6760e01b8152509350611b206040518060400160405280600381526020016203132360ec1b8152506040518060400160405280600381526020016203136360ec1b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161031360f41b815250601b8760068110611953576119536139dd565b9250611b49565b60405180604001604052806006815260200165139bdc9b585b60d21b81525093505b856060015160218360068110611b6157611b616139dd565b01604051602001611b7392919061304e565b60408051601f198184030181529181526060880182905251611b9a91908690602001612fd9565b604051602081830303815290604052866060018190525082611c366040518060400160405280600381526020016203134360ec1b8152506040518060400160405280600381526020016203135360ec1b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161032360f41b815250601b8860068110611953576119536139dd565b611cba6040518060400160405280600381526020016203135360ec1b8152506040518060400160405280600381526020016203137360ec1b81525060405180604001604052806002815260200161031360f41b81525060405180604001604052806002815260200161031360f41b815250601b8960068110611953576119536139dd565b604051602001611ccc93929190612ab2565b604051602081830303815290604052945050505050919050565b6060600260138360000151611cfb919061399d565b1015611f79578160600151604051602001611d1691906130fe565b6040516020818303038152906040528260600181905250611dc160405180604001604052806002815260200161036360f41b81525060405180604001604052806002815260200161039360f41b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161034360f41b8152506040518060400160405280600781526020016611a3232323232360c91b815250612713565b611e566040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161039360f41b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161034360f41b8152506040518060400160405280600781526020016611a3232323232360c91b815250612713565b611ed360405180604001604052806002815260200161036360f41b8152506040518060400160405280600381526020016203131360ec1b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161032360f41b8152506010805461195f90613947565b611f506040518060400160405280600381526020016203232360ec1b81525060405180604001604052806002815260200161039360f41b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161032360f41b8152506010805461195f90613947565b604051602001611f639493929190612af5565b6040516020818303038152906040529050919050565b60008060538460000151611f8d919061399d565b90506003811015611fa15760009150612000565b600a811015611fb35760019150612000565b6014811015611fc55760029150612000565b601c811015611fd75760039150612000565b6023811015611fe95760049150612000565b6032811015611ffb5760059150612000565b600691505b8360600151602e8360078110612018576120186139dd565b0160405160200161202a9291906132b1565b60405160208183030381529060405284606001819052506120c360405180604001604052806002815260200161036360f41b81525060405180604001604052806002815260200161039360f41b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161034360f41b81525060278760078110611953576119536139dd565b6121466040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161039360f41b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161034360f41b81525060278860078110611953576119536139dd565b6040516020016114e3929190612a83565b606060006021836000015161216c919061399d565b118015612187575081516003906121859060219061399d565b105b156123f85781606001516040516020016121a1919061320a565b60405160208183030381529060405282606001819052506122366040518060400160405280600381526020016203133360ec1b8152506040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161032360f41b8152506010805461195f90613947565b6122cc6040518060400160405280600381526020016203133360ec1b8152506040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161031360f41b815250604051806040016040528060078152602001662345434342353160c81b815250612713565b6123626040518060400160405280600381526020016203134360ec1b8152506040518060400160405280600381526020016203231360ec1b81525060405180604001604052806002815260200161032360f41b81525060405180604001604052806002815260200161031360f41b815250604051806040016040528060078152602001662345434342353160c81b815250612713565b611f506040518060400160405280600381526020016203136360ec1b8152506040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161031360f41b81525060405180604001604052806002815260200161031360f41b815250604051806040016040528060078152602001662345434342353160c81b815250612713565b60608201518251603d9061240e9060089061399d565b6008811061241e5761241e6139dd565b016040516020016124309291906131c4565b60405160208183030381529060405282606001819052506104f36040518060400160405280600381526020016203133360ec1b8152506040518060400160405280600381526020016203230360ec1b81525060405180604001604052806002815260200161034360f41b81525060405180604001604052806002815260200161032360f41b8152506035600888600001516124cb919061399d565b60088110611953576119536139dd565b6060670de0b6b3a76400008260200151101561253c578160600151604051602001612506919061325b565b60405160208183030381529060405282606001819052506040518060c00160405280608b8152602001613a20608b913992915050565b816060015160405160200161255191906130a9565b60408051601f19818403018152918152606090930152508051602081019091526000815290565b919050565b60606000604051806020016040528060008152509050678ac7230489e80000836020015111156125c757506040805180820190915260038152621c995960ea1b60208201526126bb565b6224ea00836040015111156125f757506040805180820190915260048152636c696d6560e01b60208201526126bb565b67016345785d8a00008360200151101561262c57506040805180820190915260048152636171756160e01b60208201526126bb565b670de0b6b3a76400008360200151101561266357506040805180820190915260068152651d9a5bdb195d60d21b60208201526126bb565b674563918244f400008360200151101561269d575060408051808201909152600981526874757271756f69736560b81b60208201526126bb565b50604080518082019091526005815264617a75726560d81b60208201525b8260600151816040516020016126d292919061314e565b604051602081830303815290604052836060018190525080816040516020016126fc9291906134bf565b604051602081830303815290604052915050919050565b6060858585858560405160200161272e9594939291906132f7565b604051602081830303815290604052905095945050505050565b80356001600160a01b038116811461257857600080fd5b60006020828403121561277157600080fd5b61277a82612748565b9392505050565b6000806040838503121561279457600080fd5b61279d83612748565b91506127ab60208401612748565b90509250929050565b6000806000606084860312156127c957600080fd5b6127d284612748565b92506127e060208501612748565b9150604084013590509250925092565b6000806000806080858703121561280657600080fd5b61280f85612748565b935061281d60208601612748565b925060408501359150606085013567ffffffffffffffff8082111561284157600080fd5b818701915087601f83011261285557600080fd5b813581811115612867576128676139f3565b604051601f8201601f19908116603f0116810190838211818310171561288f5761288f6139f3565b816040528281528a60208487010111156128a857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156128df57600080fd5b6128e883612748565b9150602083013580151581146128fd57600080fd5b809150509250929050565b6000806040838503121561291b57600080fd5b61292483612748565b946020939093013593505050565b60006020828403121561294457600080fd5b813561277a81613a09565b60006020828403121561296157600080fd5b815161277a81613a09565b60006020828403121561297e57600080fd5b5035919050565b6000815180845261299d81602086016020860161391b565b601f01601f19169290920160200192915050565b600081516129c381856020860161391b565b9290920192915050565b8054600090600181811c90808316806129e757607f831692505b6020808410821415612a0957634e487b7160e01b600052602260045260246000fd5b818015612a1d5760018114612a2e57612a5b565b60ff19861689528489019650612a5b565b60008881526020902060005b86811015612a535781548b820152908501908301612a3a565b505084890196505b50505050505092915050565b60008251612a7981846020870161391b565b9190910192915050565b60008351612a9581846020880161391b565b835190830190612aa981836020880161391b565b01949350505050565b60008451612ac481846020890161391b565b845190830190612ad881836020890161391b565b8451910190612aeb81836020880161391b565b0195945050505050565b60008551612b07818460208a0161391b565b855190830190612b1b818360208a0161391b565b8551910190612b2e81836020890161391b565b8451910190612b4181836020880161391b565b019695505050505050565b600089516020612b5f8285838f0161391b565b8a5191840191612b728184848f0161391b565b8a51920191612b848184848e0161391b565b8951920191612b968184848d0161391b565b8851920191612ba88184848c0161391b565b8751920191612bba8184848b0161391b565b8651920191612bcc8184848a0161391b565b612bd8818401876129cd565b9d9c50505050505050505050505050565b60008251612bfb81846020870161391b565b7f3c646566733e3c6c696e6561724772616469656e742069643d277761766531279083019081527f2078313d2730272079313d2730272078323d2730272079323d2733323027206760208201527f72616469656e74556e6974733d277573657253706163654f6e557365273e3c7360408201527f746f70206f66667365743d273027207374796c653d2773746f702d636f6c6f7260608201527f3a233430413439413b73746f702d6f7061636974793a31273e0000000000000060808201527f3c616e696d617465206174747269627574654e616d653d276f6666736574272060998201527f76616c7565733d27303b313b302720626567696e3d27307327206475723d273560b98201527f732720726570656174436f756e743d27696e646566696e697465272f3e3c2f7360d98201527f746f703e3c73746f70206f66667365743d2733323027207374796c653d27737460f98201527f6f702d636f6c6f723a234534363834343b73746f702d6f7061636974793a3127610119820152671f1e17b9ba37b81f60c11b6101398201527f3c2f6c696e6561724772616469656e743e3c6c696e6561724772616469656e746101418201527f2069643d277761766532272078313d2730272079313d2730272078323d2730276101618201527f2079323d2733323027206772616469656e74556e6974733d27757365725370616101818201527f63654f6e557365273e3c73746f70206f66667365743d273027207374796c653d6101a18201527f2773746f702d636f6c6f723a234636453634393b73746f702d6f7061636974796101c1820152631d18939f60e11b6101e1820152611165612f346101e583017f3c616e696d617465206174747269627574654e616d653d276f6666736574272081527f76616c7565733d27303b302e353b302720626567696e3d27307327206475723d60208201527f2735732720726570656174436f756e743d27696e646566696e697465272f3e3c60408201527f2f73746f703e3c73746f70206f66667365743d2733323027207374796c653d2760608201527f73746f702d636f6c6f723a234535423333383b73746f702d6f7061636974793a60808201526218939f60e91b60a082015260a30190565b7f3c616e696d617465206174747269627574654e616d653d276f6666736574272081527f76616c7565733d27313b302e353b312720626567696e3d27322e35732720647560208201527f723d2735732720726570656174436f756e743d27696e646566696e697465272f60408201527f3e203c2f73746f703e3c2f6c696e6561724772616469656e743e3c2f646566736060820152601f60f91b608082015260810190565b60008351612feb81846020880161391b565b80830190507f7b2274726169745f74797065223a224e6f73652074797065222c2276616c7565815262111d1160e91b6020820152835161303281602384016020880161391b565b62089f4b60ea1b60239290910191820152602601949350505050565b6000835161306081846020880161391b565b7f7b2274726169745f74797065223a224e6f7365222c2276616c7565223a220000908301908152613094601e8201856129cd565b62089f4b60ea1b815260030195945050505050565b600082516130bb81846020870161391b565b7f7b2274726169745f74797065223a2252756e6e696e67206e6f7365222c2276619201918252506a1b1d59488e889b9bc89f4b60aa1b6020820152602b01919050565b6000825161311081846020870161391b565b7f7b2274726169745f74797065223a2245796573222c2276616c7565223a224b65920191825250651d9a5b889f4b60d21b6020820152602601919050565b6000835161316081846020880161391b565b80830190507f7b2274726169745f74797065223a224c617365722065796573222c2276616c7581526332911d1160e11b602082015283516131a881602484016020880161391b565b62227d5d60e81b60249290910191820152602701949350505050565b600083516131d681846020880161391b565b7f7b2274726169745f74797065223a224d6f757468222c2276616c7565223a2200908301908152613094601f8201856129cd565b6000825161321c81846020870161391b565b7f7b2274726169745f74797065223a224d6f757468222c2276616c7565223a224b92019182525066195d9a5b889f4b60ca1b6020820152602701919050565b6000825161326d81846020870161391b565b7f7b2274726169745f74797065223a2252756e6e696e67206e6f7365222c2276619201918252506b1b1d59488e889e595cc89f4b60a21b6020820152602c01919050565b600083516132c381846020880161391b565b7f7b2274726169745f74797065223a2245796573222c2276616c7565223a220000908301908152613094601e8201856129cd565b683c7265637420783d2760b81b81526000865161331b816009850160208b0161391b565b642720793d2760d81b600991840191820152865161334081600e840160208b0161391b565b68272077696474683d2760b81b600e9290910191820152855161336a816017840160208a0161391b565b6927206865696768743d2760b01b60179290910191820152845161339581602184016020890161391b565b67272066696c6c3d2760c01b6021929091019182015283516133be81602984016020880161391b565b6133d66029828401016213979f60e91b815260030190565b9998505050505050505050565b683d913730b6b2911d1160b91b81528451600090613408816009850160208a0161391b565b72111610113232b9b1b934b83a34b7b7111d101160691b600991840191820152855161343b81601c840160208a0161391b565b601160f91b601c92909101918201526f016101130ba3a3934b13aba32b9911d160851b601d820152845161347681602d84016020890161391b565b6a16101134b6b0b3b2911d1160a91b602d929091019182015283516134a281603884016020880161391b565b61227d60f01b60389290910191820152603a019695505050505050565b7f3c6c696e652078313d273730272079313d27313030272078323d27343030272081527f79323d2734333027206f7061636974793d27302e3227207374726f6b652d6c6960208201527f6e656361703d27726f756e6427207374796c653d277374726f6b653a0000000060408201526000835161354381605c85016020880161391b565b7f3b7374726f6b652d77696474683a3230273e203c616e696d6174655472616e73605c918401918201527f666f726d206174747269627574654e616d653d277472616e73666f726d272074607c8201527f7970653d27726f74617465272066726f6d3d2730203830203131302720746f3d609c8201527f27333630203830203131302720626567696e3d27307327206475723d2735732760bc8201527f20726570656174436f756e743d27696e646566696e69746527202f3e0000000060dc8201527f3c2f6c696e653e3c6c696e652078313d27323130272079313d2731303027207860f88201527f323d27353530272079323d2734343027206f7061636974793d27302e322720736101188201527f74726f6b652d6c696e656361703d27726f756e6427207374796c653d277374726101388201526337b5b29d60e11b61015882015261376f61375c61369b61015c8401876129b1565b7f3b7374726f6b652d77696474683a3230273e203c616e696d6174655472616e7381527f666f726d206174747269627574654e616d653d277472616e73666f726d27207460208201527f7970653d27726f74617465272066726f6d3d273020323230203131302720746f60408201527f3d2733363020323230203131302720626567696e3d27307327206475723d273560608201527f732720726570656174436f756e743d27696e646566696e69746527202f3e00006080820152609e0190565b661e17b634b7329f60c91b815260070190565b95945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516137b081601d85016020870161391b565b91909101601d0192915050565b7f5b7b2274726169745f74797065223a2246616365222c2276616c7565223a2200815260006137ef601f8301846129cd565b62089f4b60ea1b81526003019392505050565b695371756172657321202360b01b81526000825161382781600a85016020870161391b565b91909101600a0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061386790830184612985565b9695505050505050565b60208152600061277a6020830184612985565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156138cc576138cc6139b1565b500190565b6000826138e0576138e06139c7565b500490565b60008160001904831182151516156138ff576138ff6139b1565b500290565b600082821015613916576139166139b1565b500390565b60005b8381101561393657818101518382015260200161391e565b83811115610ac45750506000910152565b600181811c9082168061395b57607f821691505b6020821081141561397c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613996576139966139b1565b5060010190565b6000826139ac576139ac6139c7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108d257600080fdfe3c7265637420783d273134302720793d27313730272077696474683d27313027206865696768743d273130272066696c6c3d2723433646444643273e3c616e696d617465206174747269627574654e616d653d27792720746f3d2733333027206475723d2731732720726570656174436f756e743d27696e646566696e69746527202f3e3c2f726563743e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f53717561726573202d20412066756c6c79206f6e2d636861696e20616e696d617465642064796e616d696320706978656c697a65642075676c79204e4654206173206120746f6f6c20706173732ea2646970667358221220a1b92c7c9637e05f64d2b14778b46ebc1226f5a2e55ac6c2c1d80fd592cbbd0364736f6c63430008070033

Deployed Bytecode Sourcemap

50175:11343:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28774:305;;;;;;;;;;-1:-1:-1;28774:305:0;;;;;:::i;:::-;;:::i;:::-;;;26587:14:1;;26580:22;26562:41;;26550:2;26535:18;28774:305:0;;;;;;;;31889:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33393:204::-;;;;;;;;;;-1:-1:-1;33393:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;25885:32:1;;;25867:51;;25855:2;25840:18;33393:204:0;25721:203:1;32955:372:0;;;;;;;;;;-1:-1:-1;32955:372:0;;;;;:::i;:::-;;:::i;:::-;;28014:312;;;;;;;;;;-1:-1:-1;28277:12:0;;28261:13;;:28;28014:312;;;29498:25:1;;;29486:2;29471:18;28014:312:0;29352:177:1;34258:170:0;;;;;;;;;;-1:-1:-1;34258:170:0;;;;;:::i;:::-;;:::i;34499:185::-;;;;;;;;;;-1:-1:-1;34499:185:0;;;;;:::i;:::-;;:::i;50236:34::-;;;;;;;;;;;;;;;;31697:125;;;;;;;;;;-1:-1:-1;31697:125:0;;;;;:::i;:::-;;:::i;29143:206::-;;;;;;;;;;-1:-1:-1;29143:206:0;;;;;:::i;:::-;;:::i;49301:103::-;;;;;;;;;;;;;:::i;50277:40::-;;;;;;;;;;;;;;;;48650:87;;;;;;;;;;-1:-1:-1;48696:7:0;48723:6;-1:-1:-1;;;;;48723:6:0;48650:87;;61328:76;;;;;;;;;;-1:-1:-1;61328:76:0;;;;;:::i;:::-;;:::i;32058:104::-;;;;;;;;;;;;;:::i;50324:35::-;;;;;;;;;;;;;;;;60459:489;;;;;;:::i;:::-;;:::i;33669:287::-;;;;;;;;;;-1:-1:-1;33669:287:0;;;;;:::i;:::-;;:::i;61143:181::-;;;;;;;;;;;;;:::i;34755:370::-;;;;;;;;;;-1:-1:-1;34755:370:0;;;;;:::i;:::-;;:::i;59365:1015::-;;;;;;;;;;-1:-1:-1;59365:1015:0;;;;;:::i;:::-;;:::i;50366:47::-;;;;;;;;;;-1:-1:-1;50366:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;61408:107;;;;;;;;;;-1:-1:-1;61408:107:0;;;;;:::i;:::-;;:::i;34027:164::-;;;;;;;;;;-1:-1:-1;34027:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34148:25:0;;;34124:4;34148:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34027:164;49559:201;;;;;;;;;;-1:-1:-1;49559:201:0;;;;;:::i;:::-;;:::i;28774:305::-;28876:4;-1:-1:-1;;;;;;28913:40:0;;-1:-1:-1;;;28913:40:0;;:105;;-1:-1:-1;;;;;;;28970:48:0;;-1:-1:-1;;;28970:48:0;28913:105;:158;;;-1:-1:-1;;;;;;;;;;13572:40:0;;;29035:36;28893:178;28774:305;-1:-1:-1;;28774:305:0:o;31889:100::-;31943:13;31976:5;31969:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31889:100;:::o;33393:204::-;33461:7;33486:16;33494:7;33486;:16::i;:::-;33481:64;;33511:34;;-1:-1:-1;;;33511:34:0;;;;;;;;;;;33481:64;-1:-1:-1;33565:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33565:24:0;;33393:204::o;32955:372::-;33028:13;33044:24;33060:7;33044:15;:24::i;:::-;33028:40;;33089:5;-1:-1:-1;;;;;33083:11:0;:2;-1:-1:-1;;;;;33083:11:0;;33079:48;;;33103:24;;-1:-1:-1;;;33103:24:0;;;;;;;;;;;33079:48;25791:10;-1:-1:-1;;;;;33144:21:0;;;33140:139;;33171:37;33188:5;25791:10;34027:164;:::i;33171:37::-;33167:112;;33232:35;;-1:-1:-1;;;33232:35:0;;;;;;;;;;;33167:112;33291:28;33300:2;33304:7;33313:5;33291:8;:28::i;:::-;33017:310;32955:372;;:::o;34258:170::-;34392:28;34402:4;34408:2;34412:7;34392:9;:28::i;34499:185::-;34637:39;34654:4;34660:2;34664:7;34637:39;;;;;;;;;;;;:16;:39::i;31697:125::-;31761:7;31788:21;31801:7;31788:12;:21::i;:::-;:26;;31697:125;-1:-1:-1;;31697:125:0:o;29143:206::-;29207:7;-1:-1:-1;;;;;29231:19:0;;29227:60;;29259:28;;-1:-1:-1;;;29259:28:0;;;;;;;;;;;29227:60;-1:-1:-1;;;;;;29313:19:0;;;;;:12;:19;;;;;:27;;;;29143:206::o;49301:103::-;48696:7;48723:6;-1:-1:-1;;;;;48723:6:0;25791:10;48870:23;48862:68;;;;-1:-1:-1;;;48862:68:0;;;;;;;:::i;:::-;;;;;;;;;49366:30:::1;49393:1;49366:18;:30::i;:::-;49301:103::o:0;61328:76::-;48696:7;48723:6;-1:-1:-1;;;;;48723:6:0;25791:10;48870:23;48862:68;;;;-1:-1:-1;;;48862:68:0;;;;;;;:::i;:::-;61384:5:::1;:14:::0;61328:76::o;32058:104::-;32114:13;32147:7;32140:14;;;;;:::i;60459:489::-;60564:14;;60552:8;60536:13;28277:12;;28261:13;;:28;;28014:312;60536:13;:24;;;;:::i;:::-;:42;;60528:73;;;;-1:-1:-1;;;60528:73:0;;27790:2:1;60528:73:0;;;27772:21:1;27829:2;27809:18;;;27802:30;-1:-1:-1;;;27848:18:1;;;27841:48;27906:18;;60528:73:0;27588:342:1;60528:73:0;60663:23;;60651:8;60624:24;60637:10;60624:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;60608:118;;;;-1:-1:-1;;;60608:118:0;;28843:2:1;60608:118:0;;;28825:21:1;28882:2;28862:18;;;28855:30;-1:-1:-1;;;28901:18:1;;;28894:52;28963:18;;60608:118:0;28641:346:1;60608:118:0;60733:31;60743:10;60755:8;60733:9;:31::i;:::-;60800:8;60792:5;;:16;;;;:::i;:::-;60779:9;:29;;60771:56;;;;-1:-1:-1;;;60771:56:0;;27447:2:1;60771:56:0;;;27429:21:1;27486:2;27466:18;;;27459:30;-1:-1:-1;;;27505:18:1;;;27498:44;27559:18;;60771:56:0;27245:338:1;60771:56:0;60858:8;60850:5;;:16;;;;:::i;:::-;60838:9;:28;60834:109;;;60885:10;-1:-1:-1;;;;;60877:28:0;:58;60926:8;60918:5;;:16;;;;:::i;:::-;60906:28;;:9;:28;:::i;:::-;60877:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60834:109;60459:489;:::o;33669:287::-;-1:-1:-1;;;;;33768:24:0;;25791:10;33768:24;33764:54;;;33801:17;;-1:-1:-1;;;33801:17:0;;;;;;;;;;;33764:54;25791:10;33831:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;33831:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;33831:53:0;;;;;;;;;;33900:48;;26562:41:1;;;33831:42:0;;25791:10;33900:48;;26535:18:1;33900:48:0;;;;;;;33669:287;;:::o;61143:181::-;48696:7;48723:6;-1:-1:-1;;;;;48723:6:0;25791:10;48870:23;48862:68;;;;-1:-1:-1;;;48862:68:0;;;;;;;:::i;:::-;24085:1:::1;24683:7;;:19;;24675:63;;;::::0;-1:-1:-1;;;24675:63:0;;29194:2:1;24675:63:0::1;::::0;::::1;29176:21:1::0;29233:2;29213:18;;;29206:30;29272:33;29252:18;;;29245:61;29323:18;;24675:63:0::1;28992:355:1::0;24675:63:0::1;24085:1;24816:7;:18:::0;61226:49:::2;::::0;61208:12:::2;::::0;61226:10:::2;::::0;61249:21:::2;::::0;61208:12;61226:49;61208:12;61226:49;61249:21;61226:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61207:68;;;61290:7;61282:36;;;::::0;-1:-1:-1;;;61282:36:0;;28498:2:1;61282:36:0::2;::::0;::::2;28480:21:1::0;28537:2;28517:18;;;28510:30;-1:-1:-1;;;28556:18:1;;;28549:46;28612:18;;61282:36:0::2;28296:340:1::0;61282:36:0::2;-1:-1:-1::0;24041:1:0::1;24995:7;:22:::0;61143:181::o;34755:370::-;34922:28;34932:4;34938:2;34942:7;34922:9;:28::i;:::-;-1:-1:-1;;;;;34965:13:0;;3652:19;:23;34961:157;;34986:56;35017:4;35023:2;35027:7;35036:5;34986:30;:56::i;:::-;34982:136;;35066:40;;-1:-1:-1;;;35066:40:0;;;;;;;;;;;34982:136;34755:370;;;;:::o;59365:1015::-;59430:13;59453:19;59513:25;59530:7;59513:16;:25::i;:::-;59482:57;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59482:57:0;;;;;;59549:109;;;;;;;;;;59482:57;;-1:-1:-1;59549:26:0;;59482:57;59549:109;59482:57;59549:109;;;;;59667:26;59696:21;59709:7;59696:12;:21::i;:::-;59667:50;;59726:21;59740:6;59726:13;:21::i;:::-;59784:11;;;;59844:13;;;;59756:25;;59830:28;;:13;:28::i;:::-;59804:54;;59974:378;60096:5;60153:12;60219:11;60274:9;60038:276;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59974:13;:378::i;:::-;59893:472;;;;;;;;:::i;:::-;;;;;;;;;;;;;59867:507;;;;;;;59365:1015;;;:::o;61408:107::-;-1:-1:-1;;;;;29527:19:0;;61466:7;29527:19;;;:12;:19;;;;;:32;-1:-1:-1;;;29527:32:0;;;;61489:20;29431:137;49559:201;48696:7;48723:6;-1:-1:-1;;;;;48723:6:0;25791:10;48870:23;48862:68;;;;-1:-1:-1;;;48862:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49648:22:0;::::1;49640:73;;;::::0;-1:-1:-1;;;49640:73:0;;27040:2:1;49640:73:0::1;::::0;::::1;27022:21:1::0;27079:2;27059:18;;;27052:30;27118:34;27098:18;;;27091:62;-1:-1:-1;;;27169:18:1;;;27162:36;27215:19;;49640:73:0::1;26838:402:1::0;49640:73:0::1;49724:28;49743:8;49724:18;:28::i;35380:174::-:0;35437:4;35501:13;;35491:7;:23;35461:85;;;;-1:-1:-1;;35519:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;35519:27:0;;;;35518:28;;35380:174::o;44602:196::-;44717:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;44717:29:0;-1:-1:-1;;;;;44717:29:0;;;;;;;;;44762:28;;44717:24;;44762:28;;;;;;;44602:196;;;:::o;39550:2130::-;39665:35;39703:21;39716:7;39703:12;:21::i;:::-;39665:59;;39763:4;-1:-1:-1;;;;;39741:26:0;:13;:18;;;-1:-1:-1;;;;;39741:26:0;;39737:67;;39776:28;;-1:-1:-1;;;39776:28:0;;;;;;;;;;;39737:67;39817:22;25791:10;-1:-1:-1;;;;;39843:20:0;;;;:73;;-1:-1:-1;39880:36:0;39897:4;25791:10;34027:164;:::i;39880:36::-;39843:126;;;-1:-1:-1;25791:10:0;39933:20;39945:7;39933:11;:20::i;:::-;-1:-1:-1;;;;;39933:36:0;;39843:126;39817:153;;39988:17;39983:66;;40014:35;;-1:-1:-1;;;40014:35:0;;;;;;;;;;;39983:66;-1:-1:-1;;;;;40064:16:0;;40060:52;;40089:23;;-1:-1:-1;;;40089:23:0;;;;;;;;;;;40060:52;40233:35;40250:1;40254:7;40263:4;40233:8;:35::i;:::-;-1:-1:-1;;;;;40564:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40564:31:0;;;;;;;-1:-1:-1;;40564:31:0;;;;;;;40610:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40610:29:0;;;;;;;;;;;40690:20;;;:11;:20;;;;;;40725:18;;-1:-1:-1;;;;;;40758:49:0;;;;-1:-1:-1;;;40791:15:0;40758:49;;;;;;;;;;41081:11;;41141:24;;;;;41184:13;;40690:20;;41141:24;;41184:13;41180:384;;41394:13;;41379:11;:28;41375:174;;41432:20;;41501:28;;;;41475:54;;-1:-1:-1;;;41475:54:0;-1:-1:-1;;;;;;41475:54:0;;;-1:-1:-1;;;;;41432:20:0;;41475:54;;;;41375:174;40539:1036;;;41611:7;41607:2;-1:-1:-1;;;;;41592:27:0;41601:4;-1:-1:-1;;;;;41592:27:0;;;;;;;;;;;-1:-1:-1;;;;;;;;61085:18:0;;;;;:14;:18;;;;;61106:15;61085:36;;-1:-1:-1;39550:2130:0:o;30524:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;30635:7:0;30720:13;;30713:4;:20;30709:859;;;30754:31;30788:17;;;:11;:17;;;;;;;;;30754:51;;;;;;;;;-1:-1:-1;;;;;30754:51:0;;;;-1:-1:-1;;;30754:51:0;;;;;;;;;;;-1:-1:-1;;;30754:51:0;;;;;;;;;;;;;;30824:729;;30874:14;;-1:-1:-1;;;;;30874:28:0;;30870:101;;30938:9;30524:1111;-1:-1:-1;;;30524:1111:0:o;30870:101::-;-1:-1:-1;;;31313:6:0;31358:17;;;;:11;:17;;;;;;;;;31346:29;;;;;;;;;-1:-1:-1;;;;;31346:29:0;;;;;-1:-1:-1;;;31346:29:0;;;;;;;;;;;-1:-1:-1;;;31346:29:0;;;;;;;;;;;;;31406:28;31402:109;;31474:9;30524:1111;-1:-1:-1;;;30524:1111:0:o;31402:109::-;31273:261;;;30735:833;30709:859;31596:31;;-1:-1:-1;;;31596:31:0;;;;;;;;;;;49920:191;49994:16;50013:6;;-1:-1:-1;;;;;50030:17:0;;;-1:-1:-1;;;;;;50030:17:0;;;;;;50063:40;;50013:6;;;;;;;50063:40;;49994:16;50063:40;49983:128;49920:191;:::o;35638:104::-;35707:27;35717:2;35721:8;35707:27;;;;;;;;;;;;:9;:27::i;45290:667::-;45474:72;;-1:-1:-1;;;45474:72:0;;45453:4;;-1:-1:-1;;;;;45474:36:0;;;;;:72;;25791:10;;45525:4;;45531:7;;45540:5;;45474:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45474:72:0;;;;;;;;-1:-1:-1;;45474:72:0;;;;;;;;;;;;:::i;:::-;;;45470:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45708:13:0;;45704:235;;45754:40;;-1:-1:-1;;;45754:40:0;;;;;;;;;;;45704:235;45897:6;45891:13;45882:6;45878:2;45874:15;45867:38;45470:480;-1:-1:-1;;;;;;45593:55:0;-1:-1:-1;;;45593:55:0;;-1:-1:-1;45470:480:0;45290:667;;;;;;:::o;365:723::-;421:13;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;-1:-1:-1;;;669:10:0;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;955:56:0;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;51731:438;51790:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51790:19:0;51819:26;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51819:26:0;51854:13;51870:21;51883:7;51870:12;:21::i;:::-;:26;;-1:-1:-1;51956:25:0;51973:7;51956:16;:25::i;:::-;51939:43;;;;;;;;:::i;:::-;;;;-1:-1:-1;;51939:43:0;;;;;;;;;51929:54;;51939:43;51929:54;;;;51905:79;;-1:-1:-1;;;;;52010:13:0;;;;51993:14;;;:30;51924:60;52068:21;;;:14;:21;;;;;;52050:39;;:15;:39;:::i;:::-;52032:15;;;;:57;;;;52098:16;;;;;;;;-1:-1:-1;52098:16:0;;;:11;;;:16;;;;52123:18;;;;;;;;;;:13;;;:18;-1:-1:-1;52032:6:0;51731:438;-1:-1:-1;;51731:438:0:o;57702:1363::-;57791:5;57775:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;57775:13:0;;;:21;;;-1:-1:-1;57828:1036:0;;;;57775:21;57828:1036;;;:::i;:::-;;;;-1:-1:-1;;57828:1036:0;;;;;;;;;57805:13;;;:1060;;;58936:9;57805:6;58936:1;:9::i;:::-;58954;58956:6;58954:1;:9::i;:::-;58972;58974:6;58972:1;:9::i;:::-;58990;58992:6;58990:1;:9::i;:::-;59008:10;59011:6;59008:2;:10::i;:::-;59027;59030:6;59027:2;:10::i;:::-;59046:3;58897:161;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58897:161:0;;;;;;;;;58874:13;;;;:185;57702:1363::o;59071:288::-;59163:52;;;;;;;;;;;;;;;;;59140:13;;59163:21;59257:29;59277:7;59257:13;:29::i;:::-;59224:62;;59326:7;59335:16;59309:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59295:58;;;;59071:288;;;:::o;61651:1523::-;61749:11;;61709:13;;61775:8;61771:23;;-1:-1:-1;;61785:9:0;;;;;;;;;-1:-1:-1;61785:9:0;;;61651:1523;-1:-1:-1;61651:1523:0:o;61771:23::-;61807:18;61845:1;61834:7;:3;61840:1;61834:7;:::i;:::-;61833:13;;;;:::i;:::-;61828:19;;:1;:19;:::i;:::-;61807:40;-1:-1:-1;61860:19:0;61892:15;61807:40;61905:2;61892:15;:::i;:::-;61882:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61882:26:0;;61860:48;;61921:18;61942:5;;;;;;;;;;;;;;;;;61921:26;;62011:1;62004:5;62000:13;62056:2;62048:6;62044:15;62107:1;62075:777;62130:3;62127:1;62124:10;62075:777;;;62185:1;62228:12;;;;;62222:19;62323:4;62311:2;62307:14;;;;;62289:40;;62283:47;62432:2;62428:14;;;62424:25;;62410:40;;62404:47;62561:1;62557:13;;;62553:24;;62539:39;;62533:46;62681:16;;;;62667:31;;62661:38;62359:1;62355:11;;;62453:4;62400:58;;;62391:68;62484:11;;62529:57;;;62520:67;;;;62612:11;;62657:49;;62648:59;62736:3;62732:13;62765:22;;62835:1;62820:17;;;;62178:9;62075:777;;;62079:44;62884:1;62879:3;62875:11;62905:1;62900:84;;;;63003:1;62998:82;;;;62868:212;;62900:84;-1:-1:-1;;;;;62933:17:0;;62926:43;62900:84;;62998:82;-1:-1:-1;;;;;63031:17:0;;63024:41;62868:212;-1:-1:-1;;;63096:26:0;;;63103:6;61651:1523;-1:-1:-1;;;;61651:1523:0:o;36115:1749::-;36261:13;;-1:-1:-1;;;;;36289:16:0;;36285:48;;36314:19;;-1:-1:-1;;;36314:19:0;;;;;;;;;;;36285:48;36348:13;36344:44;;36370:18;;-1:-1:-1;;;36370:18:0;;;;;;;;;;;36344:44;-1:-1:-1;;;;;36739:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;36798:49:0;;36739:44;;;;;;;;36798:49;;;-1:-1:-1;;;;;36739:44:0;;;;;;36798:49;;;;;;;;;;;;;;;;36864:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;36914:66:0;;;-1:-1:-1;;;36964:15:0;36914:66;;;;;;;;;;;;;36864:25;;37061:23;;;;3652:19;:23;37101:631;;37141:313;37172:38;;37197:12;;-1:-1:-1;;;;;37172:38:0;;;37189:1;;37172:38;;37189:1;;37172:38;37238:69;37277:1;37281:2;37285:14;;;;;;37301:5;37238:30;:69::i;:::-;37233:174;;37343:40;;-1:-1:-1;;;37343:40:0;;;;;;;;;;;37233:174;37449:3;37434:12;:18;37141:313;;37535:12;37518:13;;:29;37514:43;;37549:8;;;37514:43;37101:631;;;37598:119;37629:40;;37654:14;;;;;-1:-1:-1;;;;;37629:40:0;;;37646:1;;37629:40;;37646:1;;37629:40;37712:3;37697:12;:18;37598:119;;37101:631;-1:-1:-1;37746:13:0;:28;-1:-1:-1;;;;;61085:18:0;;37825:1;61085:18;;;:14;:18;;;;;61106:15;61085:36;;37796:60;60954:173;52664:464;52726:13;52757:6;52785:2;52766:6;:16;;;:21;;;;:::i;:::-;52757:30;;52796:8;52825:1;52821;:5;52817:137;;;-1:-1:-1;52834:1:0;52817:137;;;52857:1;52853;:5;52849:105;;;-1:-1:-1;52866:1:0;52849:105;;;52889:2;52885:1;:6;52881:73;;;-1:-1:-1;52899:1:0;52881:73;;;52922:2;52918:1;:6;52914:40;;;-1:-1:-1;52932:1:0;52914:40;;;-1:-1:-1;52953:1:0;52914:40;53036:12;53049:3;53036:17;;;;;;;:::i;:::-;;52984:77;;;;;;;;:::i;:::-;;;;;;;;;;;;;52963:6;:11;;:99;;;;53078:44;;;;;;;;;;;;;;-1:-1:-1;;;53078:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53078:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53078:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53078:44:0;;;53107:9;53117:3;53107:14;;;;;;;:::i;:::-;;53078:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:44::i;53132:964::-;53194:13;53225:23;53257:17;:22;;;;;;;;;;;;;;53288:8;53309:6;53337:2;53318:6;:16;;;:21;;;;:::i;:::-;53309:30;;53356:1;53352;:5;53348:171;;;53365:1;53359:7;;53348:171;;;53388:2;53384:1;:6;53380:139;;;53398:1;53392:7;;53380:139;;;53421:2;53417:1;:6;53413:106;;;53431:1;53425:7;;53413:106;;;53454:2;53450:1;:6;53446:73;;;53464:1;53458:7;;53446:73;;;53487:2;53483:1;:6;53479:40;;;53497:1;53491:7;;53479:40;;;53518:1;53512:7;;53479:40;53532:5;53536:1;53532;:5;:::i;:::-;53528:176;;53556:18;;;;;;;;;;;;;-1:-1:-1;;;53556:18:0;;;;;53593:46;;;;;;;;;;;;;;-1:-1:-1;;;53593:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53593:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53593:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53593:46:0;;;53624:9;53634:3;53624:14;;;;;;;:::i;53593:46::-;53587:52;;53528:176;;;53674:20;;;;;;;;;;;;;-1:-1:-1;;;53674:20:0;;;;;53528:176;53752:6;:11;;;53799:12;53812:3;53799:17;;;;;;;:::i;:::-;;53735:89;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;53735:89:0;;;;;;;;;53714:11;;;:111;;;53855:86;;;53735:89;53924:9;;53735:89;53855:86;;:::i;:::-;;;;;;;;;;;;;53834:6;:11;;:108;;;;53982:3;53987:46;;;;;;;;;;;;;;-1:-1:-1;;;53987:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53987:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53987:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53987:46:0;;;54018:9;54028:3;54018:14;;;;;;;:::i;53987:46::-;54042;;;;;;;;;;;;;;-1:-1:-1;;;54042:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54042:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54042:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54042:46:0;;;54073:9;54083:3;54073:14;;;;;;;:::i;54042:46::-;53965:124;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53951:139;;;;;;53132:964;;;:::o;54100:1013::-;54162:13;54221:1;54216:2;54197:6;:16;;;:21;;;;:::i;:::-;:25;54193:382;;;54274:6;:11;;;54257:71;;;;;;;;:::i;:::-;;;;;;;;;;;;;54236:6;:11;;:93;;;;54373:39;;;;;;;;;;;;;;-1:-1:-1;;;54373:39:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54373:39:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54373:39:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54373:39:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54373:39:0;;;:4;:39::i;:::-;54425:40;;;;;;;;;;;;;;-1:-1:-1;;;54425:40:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54425:40:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54425:40:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54425:40:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54425:40:0;;;:4;:40::i;:::-;54478:36;;;;;;;;;;;;;;-1:-1:-1;;;54478:36:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54478:36:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54478:36:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54478:36:0;;;54508:5;54478:36;;;;;:::i;:::-;54527;;;;;;;;;;;;;;-1:-1:-1;;;54527:36:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54527:36:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54527:36:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54527:36:0;;;54557:5;54527:36;;;;;:::i;:::-;54356:208;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54342:223;;54100:1013;;;:::o;54193:382::-;54583:8;54604:6;54632:2;54613:6;:16;;;:21;;;;:::i;:::-;54604:30;;54651:1;54647;:5;54643:204;;;54660:1;54654:7;;54643:204;;;54683:2;54679:1;:6;54675:172;;;54693:1;54687:7;;54675:172;;;54716:2;54712:1;:6;54708:139;;;54726:1;54720:7;;54708:139;;;54749:2;54745:1;:6;54741:106;;;54759:1;54753:7;;54741:106;;;54782:2;54778:1;:6;54774:73;;;54792:1;54786:7;;54774:73;;;54815:2;54811:1;:6;54807:40;;;54825:1;54819:7;;54807:40;;;54846:1;54840:7;;54807:40;54894:6;:11;;;54941:12;54954:3;54941:17;;;;;;;:::i;:::-;;54877:89;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54856:6;:11;;:111;;;;55007:44;;;;;;;;;;;;;;-1:-1:-1;;;55007:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55007:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55007:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55007:44:0;;;55036:9;55046:3;55036:14;;;;;;;:::i;55007:44::-;55060:45;;;;;;;;;;;;;;-1:-1:-1;;;55060:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55060:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55060:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55060:45:0;;;55090:9;55100:3;55090:14;;;;;;;:::i;55060:45::-;54990:116;;;;;;;;;:::i;55117:739::-;55179:13;55239:1;55234:2;55215:6;:16;;;:21;;;;:::i;:::-;:25;:54;;;;-1:-1:-1;55244:16:0;;55268:1;;55244:21;;55263:2;;55244:21;:::i;:::-;:25;55215:54;55211:421;;;55321:6;:11;;;55304:72;;;;;;;;:::i;:::-;;;;;;;;;;;;;55283:6;:11;;:94;;;;55421:37;;;;;;;;;;;;;;-1:-1:-1;;;55421:37:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55421:37:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55421:37:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55421:37:0;;;55452:5;55421:37;;;;;:::i;:::-;55471:41;;;;;;;;;;;;;;-1:-1:-1;;;55471:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55471:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55471:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55471:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55471:41:0;;;:4;:41::i;:::-;55525;;;;;;;;;;;;;;-1:-1:-1;;;55525:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55525:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55525:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55525:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55525:41:0;;;:4;:41::i;:::-;55579;;;;;;;;;;;;;;-1:-1:-1;;;55579:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55579:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55579:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55579:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55579:41:0;;;:4;:41::i;55211:421::-;55678:11;;;;55740:16;;55726:13;;55740:20;;55759:1;;55740:20;:::i;:::-;55726:35;;;;;;;:::i;:::-;;55661:108;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55640:6;:11;;:130;;;;55786:64;;;;;;;;;;;;;;-1:-1:-1;;;55786:64:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55786:64:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55786:64:0;;;;;;;;;;;;;;;;-1:-1:-1;;;55786:64:0;;;55817:10;55847:1;55828:6;:16;;;:20;;;;:::i;:::-;55817:32;;;;;;;:::i;55860:624::-;55923:13;56031:7;56014:6;:14;;;:24;56010:469;;;56091:6;:11;;;56074:77;;;;;;;;:::i;:::-;;;;;;;;;;;;;56053:6;:11;;:99;;;;56165:148;;;;;;;;;;;;;;;;;;55860:624;-1:-1:-1;;55860:624:0:o;56010:469::-;56387:6;:11;;;56370:76;;;;;;;;:::i;:::-;;;;-1:-1:-1;;56370:76:0;;;;;;;;;56349:11;;;;:98;-1:-1:-1;56460:9:0;;56370:76;56460:9;;;;;-1:-1:-1;56460:9:0;;;55860:624::o;56010:469::-;55860:624;;;:::o;56488:1210::-;56551:13;56588:19;:24;;;;;;;;;;;;;;56642:8;56625:6;:14;;;:25;56621:329;;;-1:-1:-1;56653:13:0;;;;;;;;;;;;-1:-1:-1;;;56653:13:0;;;;56621:329;;;56703:7;56685:6;:15;;;:25;56681:269;;;-1:-1:-1;56714:14:0;;;;;;;;;;;;-1:-1:-1;;;56714:14:0;;;;56681:269;;;56764:9;56747:6;:14;;;:26;56743:207;;;-1:-1:-1;56776:14:0;;;;;;;;;;;;-1:-1:-1;;;56776:14:0;;;;56743:207;;;56826:7;56809:6;:14;;;:24;56805:145;;;-1:-1:-1;56836:16:0;;;;;;;;;;;;-1:-1:-1;;;56836:16:0;;;;56805:145;;;56888:7;56871:6;:14;;;:24;56867:83;;;-1:-1:-1;56898:19:0;;;;;;;;;;;;-1:-1:-1;;;56898:19:0;;;;56867:83;;;-1:-1:-1;56933:15:0;;;;;;;;;;;;-1:-1:-1;;;56933:15:0;;;;56867:83;56996:6;:11;;;57049:5;56979:83;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56958:6;:11;;:105;;;;57206:5;57498;57086:605;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57072:620;;;56488:1210;;;:::o;52173:487::-;52306:13;52373:1;52423;52477:5;52536:6;52594:5;52343:302;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52329:325;;52173:487;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:186;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3390:23:1;;3239:180;-1:-1:-1;3239:180:1:o;3424:257::-;3465:3;3503:5;3497:12;3530:6;3525:3;3518:19;3546:63;3602:6;3595:4;3590:3;3586:14;3579:4;3572:5;3568:16;3546:63;:::i;:::-;3663:2;3642:15;-1:-1:-1;;3638:29:1;3629:39;;;;3670:4;3625:50;;3424:257;-1:-1:-1;;3424:257:1:o;3686:185::-;3728:3;3766:5;3760:12;3781:52;3826:6;3821:3;3814:4;3807:5;3803:16;3781:52;:::i;:::-;3849:16;;;;;3686:185;-1:-1:-1;;3686:185:1:o;3876:973::-;3961:12;;3926:3;;4016:1;4036:18;;;;4089;;;;4116:61;;4170:4;4162:6;4158:17;4148:27;;4116:61;4196:2;4244;4236:6;4233:14;4213:18;4210:38;4207:161;;;4290:10;4285:3;4281:20;4278:1;4271:31;4325:4;4322:1;4315:15;4353:4;4350:1;4343:15;4207:161;4384:18;4411:104;;;;4529:1;4524:319;;;;4377:466;;4411:104;-1:-1:-1;;4444:24:1;;4432:37;;4489:16;;;;-1:-1:-1;4411:104:1;;4524:319;29607:1;29600:14;;;29644:4;29631:18;;4618:1;4632:165;4646:6;4643:1;4640:13;4632:165;;;4724:14;;4711:11;;;4704:35;4767:16;;;;4661:10;;4632:165;;;4636:3;;4826:6;4821:3;4817:16;4810:23;;4377:466;;;;;;;3876:973;;;;:::o;6789:276::-;6920:3;6958:6;6952:13;6974:53;7020:6;7015:3;7008:4;7000:6;6996:17;6974:53;:::i;:::-;7043:16;;;;;6789:276;-1:-1:-1;;6789:276:1:o;7070:470::-;7249:3;7287:6;7281:13;7303:53;7349:6;7344:3;7337:4;7329:6;7325:17;7303:53;:::i;:::-;7419:13;;7378:16;;;;7441:57;7419:13;7378:16;7475:4;7463:17;;7441:57;:::i;:::-;7514:20;;7070:470;-1:-1:-1;;;;7070:470:1:o;7545:664::-;7772:3;7810:6;7804:13;7826:53;7872:6;7867:3;7860:4;7852:6;7848:17;7826:53;:::i;:::-;7942:13;;7901:16;;;;7964:57;7942:13;7901:16;7998:4;7986:17;;7964:57;:::i;:::-;8088:13;;8043:20;;;8110:57;8088:13;8043:20;8144:4;8132:17;;8110:57;:::i;:::-;8183:20;;7545:664;-1:-1:-1;;;;;7545:664:1:o;8214:858::-;8489:3;8527:6;8521:13;8543:53;8589:6;8584:3;8577:4;8569:6;8565:17;8543:53;:::i;:::-;8659:13;;8618:16;;;;8681:57;8659:13;8618:16;8715:4;8703:17;;8681:57;:::i;:::-;8805:13;;8760:20;;;8827:57;8805:13;8760:20;8861:4;8849:17;;8827:57;:::i;:::-;8951:13;;8906:20;;;8973:57;8951:13;8906:20;9007:4;8995:17;;8973:57;:::i;:::-;9046:20;;8214:858;-1:-1:-1;;;;;;8214:858:1:o;9077:1529::-;9541:3;9579:6;9573:13;9605:4;9618:51;9662:6;9657:3;9652:2;9644:6;9640:15;9618:51;:::i;:::-;9732:13;;9691:16;;;;9754:55;9732:13;9691:16;9776:15;;;9754:55;:::i;:::-;9876:13;;9831:20;;;9898:55;9876:13;9831:20;9920:15;;;9898:55;:::i;:::-;10020:13;;9975:20;;;10042:55;10020:13;9975:20;10064:15;;;10042:55;:::i;:::-;10164:13;;10119:20;;;10186:55;10164:13;10119:20;10208:15;;;10186:55;:::i;:::-;10308:13;;10263:20;;;10330:55;10308:13;10263:20;10352:15;;;10330:55;:::i;:::-;10452:13;;10407:20;;;10474:55;10452:13;10407:20;10496:15;;;10474:55;:::i;:::-;10545;10590:8;10583:5;10579:20;10571:6;10545:55;:::i;:::-;10538:62;9077:1529;-1:-1:-1;;;;;;;;;;;;;9077:1529:1:o;10611:1612::-;11247:3;11285:6;11279:13;11301:53;11347:6;11342:3;11335:4;11327:6;11323:17;11301:53;:::i;:::-;11415:34;11376:16;;;11401:49;;;11484:34;11477:4;11466:16;;11459:60;11551:34;11546:2;11535:14;;11528:58;11618:34;11613:2;11602:14;;11595:58;11686:27;11680:3;11669:15;;11662:52;11747:34;11741:3;11730:15;;11723:59;11815:34;11809:3;11798:15;;11791:59;11883:34;11877:3;11866:15;;11859:59;11951:34;11945:3;11934:15;;11927:59;12019:34;12013:3;12002:15;;11995:59;-1:-1:-1;;;12081:3:1;12070:15;;12063:35;6415:34;12210:3;12199:15;;6403:47;6480:34;6466:12;;;6459:56;6545:34;6531:12;;;6524:56;6610:34;6596:12;;;6589:56;6676:34;6661:13;;;6654:57;-1:-1:-1;;;6727:13:1;;;6720:29;12114:103;12139:77;6765:13;;;5844:34;5832:47;;5909:34;5904:2;5895:12;;5888:56;5974:34;5969:2;5960:12;;5953:56;6039:34;6034:2;6025:12;;6018:56;6105:34;6099:3;6090:13;;6083:57;-1:-1:-1;;;6165:3:1;6156:13;;6149:28;6202:3;6193:13;;5767:445;12139:77;5462:34;5450:47;;5527:34;5522:2;5513:12;;5506:56;5592:34;5587:2;5578:12;;5571:56;5657:34;5652:2;5643:12;;5636:56;-1:-1:-1;;;5717:3:1;5708:13;;5701:26;5752:3;5743:13;;5390:372;12228:899;12609:3;12647:6;12641:13;12663:53;12709:6;12704:3;12697:4;12689:6;12685:17;12663:53;:::i;:::-;12747:6;12742:3;12738:16;12725:29;;12777:66;12770:5;12763:81;12887:7;12882:3;12878:17;12871:4;12864:5;12860:16;12853:43;12927:6;12921:13;12943:66;13000:8;12995:2;12988:5;12984:14;12977:4;12969:6;12965:17;12943:66;:::i;:::-;-1:-1:-1;;;13072:2:1;13028:20;;;;13064:11;;;13057:37;13118:2;13110:11;;12228:899;-1:-1:-1;;;;12228:899:1:o;13132:750::-;13510:3;13548:6;13542:13;13564:53;13610:6;13605:3;13598:4;13590:6;13586:17;13564:53;:::i;:::-;13678:66;13639:16;;;13664:81;;;13764:49;13809:2;13798:14;;13790:6;13764:49;:::i;:::-;-1:-1:-1;;;13822:28:1;;13874:1;13866:10;;13132:750;-1:-1:-1;;;;;13132:750:1:o;13887:572::-;14119:3;14157:6;14151:13;14173:53;14219:6;14214:3;14207:4;14199:6;14195:17;14173:53;:::i;:::-;14287:66;14248:16;;14273:81;;;-1:-1:-1;;;;14381:4:1;14370:16;;14363:60;14450:2;14439:14;;13887:572;-1:-1:-1;13887:572:1:o;14464:562::-;14696:3;14734:6;14728:13;14750:53;14796:6;14791:3;14784:4;14776:6;14772:17;14750:53;:::i;:::-;14864:66;14825:16;;14850:81;;;-1:-1:-1;;;;14958:4:1;14947:16;;14940:50;15017:2;15006:14;;14464:562;-1:-1:-1;14464:562:1:o;15031:903::-;15412:3;15450:6;15444:13;15466:53;15512:6;15507:3;15500:4;15492:6;15488:17;15466:53;:::i;:::-;15550:6;15545:3;15541:16;15528:29;;15580:66;15573:5;15566:81;15690:10;15685:3;15681:20;15674:4;15667:5;15663:16;15656:46;15733:6;15727:13;15749:66;15806:8;15801:2;15794:5;15790:14;15783:4;15775:6;15771:17;15749:66;:::i;:::-;-1:-1:-1;;;15878:2:1;15834:20;;;;15870:11;;;15863:38;15925:2;15917:11;;15031:903;-1:-1:-1;;;;15031:903:1:o;15939:750::-;16317:3;16355:6;16349:13;16371:53;16417:6;16412:3;16405:4;16397:6;16393:17;16371:53;:::i;:::-;16485:66;16446:16;;;16471:81;;;16571:49;16616:2;16605:14;;16597:6;16571:49;:::i;16694:564::-;16926:3;16964:6;16958:13;16980:53;17026:6;17021:3;17014:4;17006:6;17002:17;16980:53;:::i;:::-;17094:66;17055:16;;17080:81;;;-1:-1:-1;;;;17188:4:1;17177:16;;17170:52;17249:2;17238:14;;16694:564;-1:-1:-1;16694:564:1:o;17263:574::-;17495:3;17533:6;17527:13;17549:53;17595:6;17590:3;17583:4;17575:6;17571:17;17549:53;:::i;:::-;17663:66;17624:16;;17649:81;;;-1:-1:-1;;;;17757:4:1;17746:16;;17739:62;17828:2;17817:14;;17263:574;-1:-1:-1;17263:574:1:o;17842:750::-;18220:3;18258:6;18252:13;18274:53;18320:6;18315:3;18308:4;18300:6;18296:17;18274:53;:::i;:::-;18388:66;18349:16;;;18374:81;;;18474:49;18519:2;18508:14;;18500:6;18474:49;:::i;18597:1898::-;-1:-1:-1;;;19551:3:1;19544:24;19526:3;19597:6;19591:13;19613:61;19667:6;19663:1;19658:3;19654:11;19647:4;19639:6;19635:17;19613:61;:::i;:::-;-1:-1:-1;;;19733:1:1;19693:16;;;19725:10;;;19718:27;19770:13;;19792:63;19770:13;19841:2;19833:11;;19826:4;19814:17;;19792:63;:::i;:::-;-1:-1:-1;;;19915:2:1;19874:17;;;;19907:11;;;19900:32;19957:13;;19979:63;19957:13;20028:2;20020:11;;20013:4;20001:17;;19979:63;:::i;:::-;-1:-1:-1;;;20102:2:1;20061:17;;;;20094:11;;;20087:33;20145:13;;20167:63;20145:13;20216:2;20208:11;;20201:4;20189:17;;20167:63;:::i;:::-;-1:-1:-1;;;20290:2:1;20249:17;;;;20282:11;;;20275:31;20331:13;;20353:63;20331:13;20402:2;20394:11;;20387:4;20375:17;;20353:63;:::i;:::-;20432:57;20485:2;20474:8;20470:2;20466:17;20462:26;-1:-1:-1;;;6282:18:1;;6325:1;6316:11;;6217:116;20432:57;20425:64;18597:1898;-1:-1:-1;;;;;;;;;18597:1898:1:o;20500:1857::-;-1:-1:-1;;;21399:43:1;;21465:13;;21381:3;;21487:61;21465:13;21537:1;21528:11;;21521:4;21509:17;;21487:61;:::i;:::-;-1:-1:-1;;;21607:1:1;21567:16;;;21599:10;;;21592:70;21687:13;;21709:63;21687:13;21758:2;21750:11;;21743:4;21731:17;;21709:63;:::i;:::-;-1:-1:-1;;;21832:2:1;21791:17;;;;21824:11;;;21817:33;-1:-1:-1;;;21874:2:1;21866:11;;21859:65;21949:13;;21971:63;21949:13;22020:2;22012:11;;22005:4;21993:17;;21971:63;:::i;:::-;-1:-1:-1;;;22094:2:1;22053:17;;;;22086:11;;;22079:55;22159:13;;22181:63;22159:13;22230:2;22222:11;;22215:4;22203:17;;22181:63;:::i;:::-;-1:-1:-1;;;22304:2:1;22263:17;;;;22296:11;;;22289:35;22348:2;22340:11;;20500:1857;-1:-1:-1;;;;;;20500:1857:1:o;22362:1690::-;23076:34;23071:3;23064:47;23141:34;23136:2;23131:3;23127:12;23120:56;23206:30;23201:2;23196:3;23192:12;23185:52;23046:3;23266:6;23260:13;23282:60;23335:6;23330:2;23325:3;23321:12;23316:2;23308:6;23304:15;23282:60;:::i;:::-;23406:34;23401:2;23361:16;;;23393:11;;;23386:55;23471:34;23465:3;23457:12;;23450:56;23536:34;23530:3;23522:12;;23515:56;23601:34;23595:3;23587:12;;23580:56;23666:30;23660:3;23652:12;;23645:52;23727:34;23721:3;23713:12;;23706:56;23792:34;23786:3;23778:12;;23771:56;23857:34;23851:3;23843:12;;23836:56;-1:-1:-1;;;23916:3:1;23908:12;;23901:28;23945:101;23975:70;24005:39;24039:3;24031:12;;24023:6;24005:39;:::i;:::-;5056:34;5044:47;;5121:34;5116:2;5107:12;;5100:56;5186:34;5181:2;5172:12;;5165:56;5251:34;5246:2;5237:12;;5230:56;5317:32;5311:3;5302:13;;5295:55;5375:3;5366:13;;4979:406;23975:70;-1:-1:-1;;;4919:22:1;;4966:1;4957:11;;4854:120;23945:101;23938:108;22362:1690;-1:-1:-1;;;;;22362:1690:1:o;24057:448::-;24319:31;24314:3;24307:44;24289:3;24380:6;24374:13;24396:62;24451:6;24446:2;24441:3;24437:12;24430:4;24422:6;24418:17;24396:62;:::i;:::-;24478:16;;;;24496:2;24474:25;;24057:448;-1:-1:-1;;24057:448:1:o;24720:562::-;25080:66;25075:3;25068:79;25050:3;25166:47;25209:2;25204:3;25200:12;25192:6;25166:47;:::i;:::-;-1:-1:-1;;;25222:28:1;;25274:1;25266:10;;24720:562;-1:-1:-1;;;24720:562:1:o;25287:429::-;-1:-1:-1;;;25544:3:1;25537:25;25519:3;25591:6;25585:13;25607:62;25662:6;25657:2;25652:3;25648:12;25641:4;25633:6;25629:17;25607:62;:::i;:::-;25689:16;;;;25707:2;25685:25;;25287:429;-1:-1:-1;;25287:429:1:o;25929:488::-;-1:-1:-1;;;;;26198:15:1;;;26180:34;;26250:15;;26245:2;26230:18;;26223:43;26297:2;26282:18;;26275:34;;;26345:3;26340:2;26325:18;;26318:31;;;26123:4;;26366:45;;26391:19;;26383:6;26366:45;:::i;:::-;26358:53;25929:488;-1:-1:-1;;;;;;25929:488:1:o;26614:219::-;26763:2;26752:9;26745:21;26726:4;26783:44;26823:2;26812:9;26808:18;26800:6;26783:44;:::i;27935:356::-;28137:2;28119:21;;;28156:18;;;28149:30;28215:34;28210:2;28195:18;;28188:62;28282:2;28267:18;;27935:356::o;29660:128::-;29700:3;29731:1;29727:6;29724:1;29721:13;29718:39;;;29737:18;;:::i;:::-;-1:-1:-1;29773:9:1;;29660:128::o;29793:120::-;29833:1;29859;29849:35;;29864:18;;:::i;:::-;-1:-1:-1;29898:9:1;;29793:120::o;29918:168::-;29958:7;30024:1;30020;30016:6;30012:14;30009:1;30006:21;30001:1;29994:9;29987:17;29983:45;29980:71;;;30031:18;;:::i;:::-;-1:-1:-1;30071:9:1;;29918:168::o;30091:125::-;30131:4;30159:1;30156;30153:8;30150:34;;;30164:18;;:::i;:::-;-1:-1:-1;30201:9:1;;30091:125::o;30221:258::-;30293:1;30303:113;30317:6;30314:1;30311:13;30303:113;;;30393:11;;;30387:18;30374:11;;;30367:39;30339:2;30332:10;30303:113;;;30434:6;30431:1;30428:13;30425:48;;;-1:-1:-1;;30469:1:1;30451:16;;30444:27;30221:258::o;30484:380::-;30563:1;30559:12;;;;30606;;;30627:61;;30681:4;30673:6;30669:17;30659:27;;30627:61;30734:2;30726:6;30723:14;30703:18;30700:38;30697:161;;;30780:10;30775:3;30771:20;30768:1;30761:31;30815:4;30812:1;30805:15;30843:4;30840:1;30833:15;30697:161;;30484:380;;;:::o;30869:135::-;30908:3;-1:-1:-1;;30929:17:1;;30926:43;;;30949:18;;:::i;:::-;-1:-1:-1;30996:1:1;30985:13;;30869:135::o;31009:112::-;31041:1;31067;31057:35;;31072:18;;:::i;:::-;-1:-1:-1;31106:9:1;;31009:112::o;31126:127::-;31187:10;31182:3;31178:20;31175:1;31168:31;31218:4;31215:1;31208:15;31242:4;31239:1;31232:15;31258:127;31319:10;31314:3;31310:20;31307:1;31300:31;31350:4;31347:1;31340:15;31374:4;31371:1;31364:15;31390:127;31451:10;31446:3;31442:20;31439:1;31432:31;31482:4;31479:1;31472:15;31506:4;31503:1;31496:15;31522:127;31583:10;31578:3;31574:20;31571:1;31564:31;31614:4;31611:1;31604:15;31638:4;31635:1;31628:15;31654:131;-1:-1:-1;;;;;;31728:32:1;;31718:43;;31708:71;;31775:1;31772;31765:12

Swarm Source

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