ETH Price: $2,929.51 (-4.50%)
Gas: 2 Gwei

Token

TheSadCats (TheSadCats)
 

Overview

Max Total Supply

6,954 TheSadCats

Holders

2,336

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 TheSadCats
0x3bC2f1c8867Cad3C0B30AC1bd988aCA1A2B4B22e
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:
TheSadCats

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-21
*/

pragma solidity 0.8.10;

// SPDX-License-Identifier: MIT

// @title: The Sad Cats
// @website: https://sadgirlsbar.io/sad-cats
// @twitter: https://twitter.com/sad_girls_bar
// @discord: https://discord.com/invite/aA467bQRDj
// @opensea: https://opensea.io/collection/thesadcats
//
//
//               :+++/-`                                        ``
//              -d- `.:o/.                                   .:++o+
//              d+/    `-o+.      -`                 `    `:oo/` -m
//             :M-:  `:.  -o+`   --                 `-  `/oo/.  ::d
//             /N.:   `:/`  :s:` /                  -` -s//.    +/m
//             /N.:     `+:  -+o/- `` `  `    `.:   : -h-/`     :/N`
//             :N`/     `:/- :``s--sdy+/sy++++hd/-. //+//.-     :-m-
//             `N:+`    `/o- .- /.+:oo+.:-.  `..-o+::..+:-:-    :.y+
//              yh./      ::  / --   -             /  / .oy-    ``+s
//              -N--/`   `-  `/` /   /            -. :` /--       +s
//               ys .o  //`  :.: +  :`            .   `/` `-    / +s
//               h+  s`..    `-+`-- :                 `        +- oo
//               ys  `         `- `                         -./+  d-
//               `ys       :-.`                   `..`       //  :h
//               .d/      /N/-/s:.            `-+:`+Nd.         .d.
//              /h/       -dy-:Nmo-         `:sNM/ oMm-         o/
//             +h.         `:::-.    `.`    ```:+o+s/.  ```..-..:s
//            /ms                 -``::: `         ``.--..```````s+`
//            omo....-.-..```     d+:`.::s.      `----.-:::::--..-y:`
//             +m-   ````.::/-``  .:hmdo/s`     .//::::--.....```-my
//            `.+o---------.```` `  `m/`    ` ` .  ....`     ``..:do
//            `  y` .-..-:-. ```   .ohhhs/`     ` --::::-.`      mm-
//               +o.`.--. ` `     od:  `:yd.  .``   .-   `----. `h-`
//           `... h:-. ---`      sm`      :m-       +:::::`   `.s:
//         ...  `-.y: -:`-  :`   h-        :o     `:     `-::.yh+
//        .`  `-`  `s+:      `-                 - +         `++:`
//                 `.`+o-                       . `        `++ `--`
//                     `+o-o:`                          `:/+.    `.
//                       ./ohdho/:--....``....-----::///:-`
//                          .--``..--::::::---.-....``
//
//

// OpenZeppelin

// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)


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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

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


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

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


// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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


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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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


// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

contract SadGirlsBarClient {
  function balanceOf(address owner) public view virtual returns (uint256) {}
}



















contract TheSadCats is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
  using SafeMath for uint8;
  using SafeMath for uint256;
  using Strings for string;

  uint public contractState = 0;
  // 0 - closed
  // 1 - opened only for holders
  // 2 - opened for all

  string public baseTokenURI;
  address public sgbAddress;
  uint256 public _maxBatchSize = 20;
  uint public catPrice = 0.05 ether;
  uint public giveawayLeft = 100;
  uint public targetSupply = 7000;
  uint public lastTokenId = 0;

  /*
   * Set up the basics
   *
   * @dev It will NOT be ready to start sale immediately upon deploy
   */
  constructor(string memory metadataLocation, address sgbContractAddress) ERC721("TheSadCats", "TheSadCats") {
    sgbAddress = sgbContractAddress;
    baseTokenURI = metadataLocation;
  }

  function _setAddr(address addr) public onlyOwner {
    sgbAddress = addr;
  }
  /*
   * Get the tokens owned by _owner
   */
  function tokensOfOwner(address _owner) public view returns(uint256[] memory ) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
      // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 index;
      for (index = 0; index < tokenCount; index++) {
        result[index] = tokenOfOwnerByIndex(_owner, index);
      }
      return result;
    }
  }


  function isSgbHolder(address _owner) public view returns (bool) {
    SadGirlsBarClient sgb = SadGirlsBarClient(sgbAddress);
    return sgb.balanceOf(_owner) > 0;
  }


  /* Minting started here... */
  function mint(uint256 numTokens, address to) external payable nonReentrant {
    // Check we're is online...
    require(contractState > 0, "Sales not started");

    if (contractState == 1) {
      require(isSgbHolder(_msgSender()), "Sales are open to holders only");
    }

    // ...and not exceed limit
    require(totalSupply() < targetSupply, "We've got all");
    // ...and not try to get more tokens than allowed...
    require(numTokens > 0 && numTokens <= _maxBatchSize, "Too much");
    // ...and not try to get more tokens than TOTALLY allowed...
    require(totalSupply().add(numTokens) <= targetSupply.sub(giveawayLeft), "Can't get more than 10000 NFTs");
    // ...and we have enough money for that.
    require(msg.value >= catPrice.mul(numTokens),
      "Not enough ETH for transaction");

    // mint all of these tokens
    uint _lastTokenId = lastTokenId;
    address mintTo = address(0) == to ? _msgSender() : to;

    for (uint i = 0; i < numTokens; i++) {
      _lastTokenId++;
      _safeMint(mintTo, _lastTokenId);
    }
    lastTokenId = _lastTokenId;
  }


  /* Allow to mint tokens for giveaways at any time (but limited count) */
  function mintGiveaway(uint256 numTokens, address to) public onlyOwner {
    require(totalSupply().add(numTokens) <= targetSupply.sub(giveawayLeft), "Only 100 tokens max");
    uint _lastTokenId = lastTokenId;
    for (uint i = 0; i < numTokens; i++) {
      _lastTokenId++;
      _safeMint(to, _lastTokenId);
    }
    giveawayLeft = giveawayLeft.sub(numTokens);
    lastTokenId = _lastTokenId; 
  }


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

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

  function _setBaseURI(string memory baseURI) internal virtual {
    baseTokenURI = baseURI;
  }

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

  function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
    string memory _tokenURI = super.tokenURI(tokenId);
    return bytes(_tokenURI).length > 0 ? string(abi.encodePacked(_tokenURI, ".json")) : "";
  }

  // Administrative zone
  function setBaseURI(string memory baseURI) public onlyOwner {
    _setBaseURI(baseURI);
  }

  function setMaxBatchSize(uint256 maxBatchSize) public onlyOwner {
    _maxBatchSize = maxBatchSize;
  }

  function setPrice(uint256 newPrice) public onlyOwner {
    require(newPrice > 0);
    catPrice = newPrice;
  }

  function setContractState(uint256 newContractState) public onlyOwner {
    require(newContractState >= 0 && newContractState <=2);
    contractState = newContractState;
  }
  
  function reduceSupply(uint256 newSupply) public onlyOwner {
    require(newSupply < targetSupply);
    require(newSupply > lastTokenId.add(giveawayLeft));
    targetSupply = newSupply;
  }

  function withdrawAll() public payable onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
  }


}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"metadataLocation","type":"string"},{"internalType":"address","name":"sgbContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"_setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"catPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractState","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":[],"name":"giveawayLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_owner","type":"address"}],"name":"isSgbHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"reduceSupply","outputs":[],"stateMutability":"nonpayable","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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newContractState","type":"uint256"}],"name":"setContractState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBatchSize","type":"uint256"}],"name":"setMaxBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sgbAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600c556014600f5566b1a2bc2ec500006010556064601155611b5860125560006013553480156200003657600080fd5b50604051620051063803806200510683398181016040528101906200005c919062000506565b6040518060400160405280600a81526020017f54686553616443617473000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f54686553616443617473000000000000000000000000000000000000000000008152508160009080519060200190620000e092919062000254565b508060019080519060200190620000f992919062000254565b5050506200011c620001106200018660201b60201c565b6200018e60201b60201c565b6001600b8190555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d90805190602001906200017d92919062000254565b505050620005d1565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000262906200059b565b90600052602060002090601f016020900481019282620002865760008555620002d2565b82601f10620002a157805160ff1916838001178555620002d2565b82800160010185558215620002d2579182015b82811115620002d1578251825591602001919060010190620002b4565b5b509050620002e19190620002e5565b5090565b5b8082111562000300576000816000905550600101620002e6565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200036d8262000322565b810181811067ffffffffffffffff821117156200038f576200038e62000333565b5b80604052505050565b6000620003a462000304565b9050620003b2828262000362565b919050565b600067ffffffffffffffff821115620003d557620003d462000333565b5b620003e08262000322565b9050602081019050919050565b60005b838110156200040d578082015181840152602081019050620003f0565b838111156200041d576000848401525b50505050565b60006200043a6200043484620003b7565b62000398565b9050828152602081018484840111156200045957620004586200031d565b5b62000466848285620003ed565b509392505050565b600082601f83011262000486576200048562000318565b5b81516200049884826020860162000423565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004ce82620004a1565b9050919050565b620004e081620004c1565b8114620004ec57600080fd5b50565b6000815190506200050081620004d5565b92915050565b6000806040838503121562000520576200051f6200030e565b5b600083015167ffffffffffffffff81111562000541576200054062000313565b5b6200054f858286016200046e565b92505060206200056285828601620004ef565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005b457607f821691505b60208210811415620005cb57620005ca6200056c565b5b50919050565b614b2580620005e16000396000f3fe6080604052600436106102255760003560e01c80637ae94c0311610123578063a22cb465116100ab578063e985e9c51161006f578063e985e9c5146107eb578063f2fde38b14610828578063f4f8ab2014610851578063f84ddf0b1461088e578063fb7265ff146108b957610225565b8063a22cb46514610708578063b88d4fde14610731578063c87b56dd1461075a578063cd76635b14610797578063d547cfb7146107c057610225565b8063853828b6116100f2578063853828b6146106635780638da5cb5b1461066d57806391b7f5ed1461069857806394bf804d146106c157806395d89b41146106dd57610225565b80637ae94c03146105a757806380623444146105d25780638462151c146105fb57806385209ee01461063857610225565b80632f745c59116101b157806355f804b31161017557806355f804b3146104c2578063573c9931146104eb5780636352211e1461051657806370a0823114610553578063715018a61461059057610225565b80632f745c59146103c95780633ad4c3421461040657806342842e0e1461043157806345b678d91461045a5780634f6ccce71461048557610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd146103235780632524a4961461034c5780632a1eafd9146103755780632b26a6bf146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906131e3565b6108e2565b60405161025e919061322b565b60405180910390f35b34801561027357600080fd5b5061027c6108f4565b60405161028991906132df565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613337565b610986565b6040516102c691906133a5565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906133ec565b610a0b565b005b34801561030457600080fd5b5061030d610b23565b60405161031a919061343b565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190613456565b610b30565b005b34801561035857600080fd5b50610373600480360381019061036e91906134a9565b610b90565b005b34801561038157600080fd5b5061038a610ce3565b604051610397919061343b565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190613337565b610ce9565b005b3480156103d557600080fd5b506103f060048036038101906103eb91906133ec565b610d6f565b6040516103fd919061343b565b60405180910390f35b34801561041257600080fd5b5061041b610e14565b604051610428919061343b565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190613456565b610e1a565b005b34801561046657600080fd5b5061046f610e3a565b60405161047c919061343b565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613337565b610e40565b6040516104b9919061343b565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e4919061361e565b610eb1565b005b3480156104f757600080fd5b50610500610f39565b60405161050d919061343b565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190613337565b610f3f565b60405161054a91906133a5565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613667565b610ff1565b604051610587919061343b565b60405180910390f35b34801561059c57600080fd5b506105a56110a9565b005b3480156105b357600080fd5b506105bc611131565b6040516105c991906133a5565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190613337565b611157565b005b34801561060757600080fd5b50610622600480360381019061061d9190613667565b61120d565b60405161062f9190613752565b60405180910390f35b34801561064457600080fd5b5061064d611317565b60405161065a919061343b565b60405180910390f35b61066b61131d565b005b34801561067957600080fd5b506106826113d9565b60405161068f91906133a5565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613337565b611403565b005b6106db60048036038101906106d691906134a9565b611496565b005b3480156106e957600080fd5b506106f2611783565b6040516106ff91906132df565b60405180910390f35b34801561071457600080fd5b5061072f600480360381019061072a91906137a0565b611815565b005b34801561073d57600080fd5b5061075860048036038101906107539190613881565b61182b565b005b34801561076657600080fd5b50610781600480360381019061077c9190613337565b61188d565b60405161078e91906132df565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190613667565b6118e3565b005b3480156107cc57600080fd5b506107d56119a3565b6040516107e291906132df565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613904565b611a31565b60405161081f919061322b565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613667565b611ac5565b005b34801561085d57600080fd5b5061087860048036038101906108739190613667565b611bbd565b604051610885919061322b565b60405180910390f35b34801561089a57600080fd5b506108a3611c6a565b6040516108b0919061343b565b60405180910390f35b3480156108c557600080fd5b506108e060048036038101906108db9190613337565b611c70565b005b60006108ed82611d11565b9050919050565b60606000805461090390613973565b80601f016020809104026020016040519081016040528092919081815260200182805461092f90613973565b801561097c5780601f106109515761010080835404028352916020019161097c565b820191906000526020600020905b81548152906001019060200180831161095f57829003601f168201915b5050505050905090565b600061099182611d8b565b6109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c790613a17565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1682610f3f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e90613aa9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aa6611df7565b73ffffffffffffffffffffffffffffffffffffffff161480610ad55750610ad481610acf611df7565b611a31565b5b610b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0b90613b3b565b60405180910390fd5b610b1e8383611dff565b505050565b6000600880549050905090565b610b41610b3b611df7565b82611eb8565b610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7790613bcd565b60405180910390fd5b610b8b838383611f96565b505050565b610b98611df7565b73ffffffffffffffffffffffffffffffffffffffff16610bb66113d9565b73ffffffffffffffffffffffffffffffffffffffff1614610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390613c39565b60405180910390fd5b610c236011546012546121f290919063ffffffff16565b610c3d83610c2f610b23565b61220890919063ffffffff16565b1115610c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7590613ca5565b60405180910390fd5b6000601354905060005b83811015610cbb578180610c9b90613cf4565b925050610ca8838361221e565b8080610cb390613cf4565b915050610c88565b50610cd1836011546121f290919063ffffffff16565b60118190555080601381905550505050565b60125481565b610cf1611df7565b73ffffffffffffffffffffffffffffffffffffffff16610d0f6113d9565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90613c39565b60405180910390fd5b80600f8190555050565b6000610d7a83610ff1565b8210610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db290613daf565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60105481565b610e358383836040518060200160405280600081525061182b565b505050565b60115481565b6000610e4a610b23565b8210610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290613e41565b60405180910390fd5b60088281548110610e9f57610e9e613e61565b5b90600052602060002001549050919050565b610eb9611df7565b73ffffffffffffffffffffffffffffffffffffffff16610ed76113d9565b73ffffffffffffffffffffffffffffffffffffffff1614610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2490613c39565b60405180910390fd5b610f368161223c565b50565b600f5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf90613f02565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105990613f94565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110b1611df7565b73ffffffffffffffffffffffffffffffffffffffff166110cf6113d9565b73ffffffffffffffffffffffffffffffffffffffff1614611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90613c39565b60405180910390fd5b61112f6000612256565b565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61115f611df7565b73ffffffffffffffffffffffffffffffffffffffff1661117d6113d9565b73ffffffffffffffffffffffffffffffffffffffff16146111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca90613c39565b60405180910390fd5b60125481106111e157600080fd5b6111f860115460135461220890919063ffffffff16565b811161120357600080fd5b8060128190555050565b6060600061121a83610ff1565b9050600081141561127757600067ffffffffffffffff8111156112405761123f6134f3565b5b60405190808252806020026020018201604052801561126e5781602001602082028036833780820191505090505b50915050611312565b60008167ffffffffffffffff811115611293576112926134f3565b5b6040519080825280602002602001820160405280156112c15781602001602082028036833780820191505090505b50905060005b8281101561130b576112d98582610d6f565b8282815181106112ec576112eb613e61565b5b602002602001018181525050808061130390613cf4565b9150506112c7565b8193505050505b919050565b600c5481565b611325611df7565b73ffffffffffffffffffffffffffffffffffffffff166113436113d9565b73ffffffffffffffffffffffffffffffffffffffff1614611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090613c39565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506113d757600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61140b611df7565b73ffffffffffffffffffffffffffffffffffffffff166114296113d9565b73ffffffffffffffffffffffffffffffffffffffff161461147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147690613c39565b60405180910390fd5b6000811161148c57600080fd5b8060108190555050565b6002600b5414156114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390614000565b60405180910390fd5b6002600b819055506000600c5411611529576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115209061406c565b60405180910390fd5b6001600c5414156115845761154461153f611df7565b611bbd565b611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a906140d8565b60405180910390fd5b5b60125461158f610b23565b106115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690614144565b60405180910390fd5b6000821180156115e15750600f548211155b611620576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611617906141b0565b60405180910390fd5b6116376011546012546121f290919063ffffffff16565b61165183611643610b23565b61220890919063ffffffff16565b1115611692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116899061421c565b60405180910390fd5b6116a78260105461231c90919063ffffffff16565b3410156116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e090614288565b60405180910390fd5b6000601354905060008273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161461172c5782611735565b611734611df7565b5b905060005b8481101561176d57828061174d90613cf4565b93505061175a828461221e565b808061176590613cf4565b91505061173a565b508160138190555050506001600b819055505050565b60606001805461179290613973565b80601f01602080910402602001604051908101604052809291908181526020018280546117be90613973565b801561180b5780601f106117e05761010080835404028352916020019161180b565b820191906000526020600020905b8154815290600101906020018083116117ee57829003601f168201915b5050505050905090565b611827611820611df7565b8383612332565b5050565b61183c611836611df7565b83611eb8565b61187b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187290613bcd565b60405180910390fd5b6118878484848461249f565b50505050565b6060600061189a836124fb565b905060008151116118ba57604051806020016040528060008152506118db565b806040516020016118cb9190614330565b6040516020818303038152906040525b915050919050565b6118eb611df7565b73ffffffffffffffffffffffffffffffffffffffff166119096113d9565b73ffffffffffffffffffffffffffffffffffffffff161461195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195690613c39565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d80546119b090613973565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc90613973565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611acd611df7565b73ffffffffffffffffffffffffffffffffffffffff16611aeb6113d9565b73ffffffffffffffffffffffffffffffffffffffff1614611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3890613c39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba8906143c4565b60405180910390fd5b611bba81612256565b50565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611c2091906133a5565b602060405180830381865afa158015611c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6191906143f9565b11915050919050565b60135481565b611c78611df7565b73ffffffffffffffffffffffffffffffffffffffff16611c966113d9565b73ffffffffffffffffffffffffffffffffffffffff1614611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce390613c39565b60405180910390fd5b60008110158015611cfe575060028111155b611d0757600080fd5b80600c8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d845750611d83826125a2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e7283610f3f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ec382611d8b565b611f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef990614498565b60405180910390fd5b6000611f0d83610f3f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f7c57508373ffffffffffffffffffffffffffffffffffffffff16611f6484610986565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f8d5750611f8c8185611a31565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fb682610f3f565b73ffffffffffffffffffffffffffffffffffffffff161461200c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120039061452a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612073906145bc565b60405180910390fd5b612087838383612684565b612092600082611dff565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e291906145dc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121399190614610565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361220091906145dc565b905092915050565b600081836122169190614610565b905092915050565b612238828260405180602001604052806000815250612694565b5050565b80600d90805190602001906122529291906130d4565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361232a9190614666565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123989061470c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612492919061322b565b60405180910390a3505050565b6124aa848484611f96565b6124b6848484846126ef565b6124f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ec9061479e565b60405180910390fd5b50505050565b606061250682611d8b565b612545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253c90614830565b60405180910390fd5b600061254f612877565b9050600081511161256f576040518060200160405280600081525061259a565b8061257984612909565b60405160200161258a929190614850565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061266d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061267d575061267c82612a6a565b5b9050919050565b61268f838383612ad4565b505050565b61269e8383612be8565b6126ab60008484846126ef565b6126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e19061479e565b60405180910390fd5b505050565b60006127108473ffffffffffffffffffffffffffffffffffffffff16612db6565b1561286a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612739611df7565b8786866040518563ffffffff1660e01b815260040161275b94939291906148c9565b6020604051808303816000875af192505050801561279757506040513d601f19601f82011682018060405250810190612794919061492a565b60015b61281a573d80600081146127c7576040519150601f19603f3d011682016040523d82523d6000602084013e6127cc565b606091505b50600081511415612812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128099061479e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061286f565b600190505b949350505050565b6060600d805461288690613973565b80601f01602080910402602001604051908101604052809291908181526020018280546128b290613973565b80156128ff5780601f106128d4576101008083540402835291602001916128ff565b820191906000526020600020905b8154815290600101906020018083116128e257829003601f168201915b5050505050905090565b60606000821415612951576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a65565b600082905060005b6000821461298357808061296c90613cf4565b915050600a8261297c9190614986565b9150612959565b60008167ffffffffffffffff81111561299f5761299e6134f3565b5b6040519080825280601f01601f1916602001820160405280156129d15781602001600182028036833780820191505090505b5090505b60008514612a5e576001826129ea91906145dc565b9150600a856129f991906149b7565b6030612a059190614610565b60f81b818381518110612a1b57612a1a613e61565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a579190614986565b94506129d5565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612adf838383612dc9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b2257612b1d81612dce565b612b61565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b6057612b5f8382612e17565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ba457612b9f81612f84565b612be3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612be257612be18282613055565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4f90614a34565b60405180910390fd5b612c6181611d8b565b15612ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9890614aa0565b60405180910390fd5b612cad60008383612684565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cfd9190614610565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e2484610ff1565b612e2e91906145dc565b9050600060076000848152602001908152602001600020549050818114612f13576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f9891906145dc565b9050600060096000848152602001908152602001600020549050600060088381548110612fc857612fc7613e61565b5b906000526020600020015490508060088381548110612fea57612fe9613e61565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061303957613038614ac0565b5b6001900381819060005260206000200160009055905550505050565b600061306083610ff1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546130e090613973565b90600052602060002090601f0160209004810192826131025760008555613149565b82601f1061311b57805160ff1916838001178555613149565b82800160010185558215613149579182015b8281111561314857825182559160200191906001019061312d565b5b509050613156919061315a565b5090565b5b8082111561317357600081600090555060010161315b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131c08161318b565b81146131cb57600080fd5b50565b6000813590506131dd816131b7565b92915050565b6000602082840312156131f9576131f8613181565b5b6000613207848285016131ce565b91505092915050565b60008115159050919050565b61322581613210565b82525050565b6000602082019050613240600083018461321c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613280578082015181840152602081019050613265565b8381111561328f576000848401525b50505050565b6000601f19601f8301169050919050565b60006132b182613246565b6132bb8185613251565b93506132cb818560208601613262565b6132d481613295565b840191505092915050565b600060208201905081810360008301526132f981846132a6565b905092915050565b6000819050919050565b61331481613301565b811461331f57600080fd5b50565b6000813590506133318161330b565b92915050565b60006020828403121561334d5761334c613181565b5b600061335b84828501613322565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061338f82613364565b9050919050565b61339f81613384565b82525050565b60006020820190506133ba6000830184613396565b92915050565b6133c981613384565b81146133d457600080fd5b50565b6000813590506133e6816133c0565b92915050565b6000806040838503121561340357613402613181565b5b6000613411858286016133d7565b925050602061342285828601613322565b9150509250929050565b61343581613301565b82525050565b6000602082019050613450600083018461342c565b92915050565b60008060006060848603121561346f5761346e613181565b5b600061347d868287016133d7565b935050602061348e868287016133d7565b925050604061349f86828701613322565b9150509250925092565b600080604083850312156134c0576134bf613181565b5b60006134ce85828601613322565b92505060206134df858286016133d7565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61352b82613295565b810181811067ffffffffffffffff8211171561354a576135496134f3565b5b80604052505050565b600061355d613177565b90506135698282613522565b919050565b600067ffffffffffffffff821115613589576135886134f3565b5b61359282613295565b9050602081019050919050565b82818337600083830152505050565b60006135c16135bc8461356e565b613553565b9050828152602081018484840111156135dd576135dc6134ee565b5b6135e884828561359f565b509392505050565b600082601f830112613605576136046134e9565b5b81356136158482602086016135ae565b91505092915050565b60006020828403121561363457613633613181565b5b600082013567ffffffffffffffff81111561365257613651613186565b5b61365e848285016135f0565b91505092915050565b60006020828403121561367d5761367c613181565b5b600061368b848285016133d7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136c981613301565b82525050565b60006136db83836136c0565b60208301905092915050565b6000602082019050919050565b60006136ff82613694565b613709818561369f565b9350613714836136b0565b8060005b8381101561374557815161372c88826136cf565b9750613737836136e7565b925050600181019050613718565b5085935050505092915050565b6000602082019050818103600083015261376c81846136f4565b905092915050565b61377d81613210565b811461378857600080fd5b50565b60008135905061379a81613774565b92915050565b600080604083850312156137b7576137b6613181565b5b60006137c5858286016133d7565b92505060206137d68582860161378b565b9150509250929050565b600067ffffffffffffffff8211156137fb576137fa6134f3565b5b61380482613295565b9050602081019050919050565b600061382461381f846137e0565b613553565b9050828152602081018484840111156138405761383f6134ee565b5b61384b84828561359f565b509392505050565b600082601f830112613868576138676134e9565b5b8135613878848260208601613811565b91505092915050565b6000806000806080858703121561389b5761389a613181565b5b60006138a9878288016133d7565b94505060206138ba878288016133d7565b93505060406138cb87828801613322565b925050606085013567ffffffffffffffff8111156138ec576138eb613186565b5b6138f887828801613853565b91505092959194509250565b6000806040838503121561391b5761391a613181565b5b6000613929858286016133d7565b925050602061393a858286016133d7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061398b57607f821691505b6020821081141561399f5761399e613944565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613a01602c83613251565b9150613a0c826139a5565b604082019050919050565b60006020820190508181036000830152613a30816139f4565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a93602183613251565b9150613a9e82613a37565b604082019050919050565b60006020820190508181036000830152613ac281613a86565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613b25603883613251565b9150613b3082613ac9565b604082019050919050565b60006020820190508181036000830152613b5481613b18565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613bb7603183613251565b9150613bc282613b5b565b604082019050919050565b60006020820190508181036000830152613be681613baa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c23602083613251565b9150613c2e82613bed565b602082019050919050565b60006020820190508181036000830152613c5281613c16565b9050919050565b7f4f6e6c792031303020746f6b656e73206d617800000000000000000000000000600082015250565b6000613c8f601383613251565b9150613c9a82613c59565b602082019050919050565b60006020820190508181036000830152613cbe81613c82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613cff82613301565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d3257613d31613cc5565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613d99602b83613251565b9150613da482613d3d565b604082019050919050565b60006020820190508181036000830152613dc881613d8c565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613e2b602c83613251565b9150613e3682613dcf565b604082019050919050565b60006020820190508181036000830152613e5a81613e1e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613eec602983613251565b9150613ef782613e90565b604082019050919050565b60006020820190508181036000830152613f1b81613edf565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613f7e602a83613251565b9150613f8982613f22565b604082019050919050565b60006020820190508181036000830152613fad81613f71565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613fea601f83613251565b9150613ff582613fb4565b602082019050919050565b6000602082019050818103600083015261401981613fdd565b9050919050565b7f53616c6573206e6f742073746172746564000000000000000000000000000000600082015250565b6000614056601183613251565b915061406182614020565b602082019050919050565b6000602082019050818103600083015261408581614049565b9050919050565b7f53616c657320617265206f70656e20746f20686f6c64657273206f6e6c790000600082015250565b60006140c2601e83613251565b91506140cd8261408c565b602082019050919050565b600060208201905081810360008301526140f1816140b5565b9050919050565b7f576527766520676f7420616c6c00000000000000000000000000000000000000600082015250565b600061412e600d83613251565b9150614139826140f8565b602082019050919050565b6000602082019050818103600083015261415d81614121565b9050919050565b7f546f6f206d756368000000000000000000000000000000000000000000000000600082015250565b600061419a600883613251565b91506141a582614164565b602082019050919050565b600060208201905081810360008301526141c98161418d565b9050919050565b7f43616e277420676574206d6f7265207468616e203130303030204e4654730000600082015250565b6000614206601e83613251565b9150614211826141d0565b602082019050919050565b60006020820190508181036000830152614235816141f9565b9050919050565b7f4e6f7420656e6f7567682045544820666f72207472616e73616374696f6e0000600082015250565b6000614272601e83613251565b915061427d8261423c565b602082019050919050565b600060208201905081810360008301526142a181614265565b9050919050565b600081905092915050565b60006142be82613246565b6142c881856142a8565b93506142d8818560208601613262565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061431a6005836142a8565b9150614325826142e4565b600582019050919050565b600061433c82846142b3565b91506143478261430d565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143ae602683613251565b91506143b982614352565b604082019050919050565b600060208201905081810360008301526143dd816143a1565b9050919050565b6000815190506143f38161330b565b92915050565b60006020828403121561440f5761440e613181565b5b600061441d848285016143e4565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614482602c83613251565b915061448d82614426565b604082019050919050565b600060208201905081810360008301526144b181614475565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614514602983613251565b915061451f826144b8565b604082019050919050565b6000602082019050818103600083015261454381614507565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145a6602483613251565b91506145b18261454a565b604082019050919050565b600060208201905081810360008301526145d581614599565b9050919050565b60006145e782613301565b91506145f283613301565b92508282101561460557614604613cc5565b5b828203905092915050565b600061461b82613301565b915061462683613301565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561465b5761465a613cc5565b5b828201905092915050565b600061467182613301565b915061467c83613301565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146b5576146b4613cc5565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006146f6601983613251565b9150614701826146c0565b602082019050919050565b60006020820190508181036000830152614725816146e9565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614788603283613251565b91506147938261472c565b604082019050919050565b600060208201905081810360008301526147b78161477b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061481a602f83613251565b9150614825826147be565b604082019050919050565b600060208201905081810360008301526148498161480d565b9050919050565b600061485c82856142b3565b915061486882846142b3565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061489b82614874565b6148a5818561487f565b93506148b5818560208601613262565b6148be81613295565b840191505092915050565b60006080820190506148de6000830187613396565b6148eb6020830186613396565b6148f8604083018561342c565b818103606083015261490a8184614890565b905095945050505050565b600081519050614924816131b7565b92915050565b6000602082840312156149405761493f613181565b5b600061494e84828501614915565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061499182613301565b915061499c83613301565b9250826149ac576149ab614957565b5b828204905092915050565b60006149c282613301565b91506149cd83613301565b9250826149dd576149dc614957565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a1e602083613251565b9150614a29826149e8565b602082019050919050565b60006020820190508181036000830152614a4d81614a11565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a8a601c83613251565b9150614a9582614a54565b602082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122025dedef18ec159c534dd01cf9c2208f3b7e22d7920ca4ec04ccec13acffa395b64736f6c634300080a00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000335eeef8e93a7a757d9e7912044d9cd264e2b2d8000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f6d6574612e7361646769726c736261722e696f2f636174732f00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c80637ae94c0311610123578063a22cb465116100ab578063e985e9c51161006f578063e985e9c5146107eb578063f2fde38b14610828578063f4f8ab2014610851578063f84ddf0b1461088e578063fb7265ff146108b957610225565b8063a22cb46514610708578063b88d4fde14610731578063c87b56dd1461075a578063cd76635b14610797578063d547cfb7146107c057610225565b8063853828b6116100f2578063853828b6146106635780638da5cb5b1461066d57806391b7f5ed1461069857806394bf804d146106c157806395d89b41146106dd57610225565b80637ae94c03146105a757806380623444146105d25780638462151c146105fb57806385209ee01461063857610225565b80632f745c59116101b157806355f804b31161017557806355f804b3146104c2578063573c9931146104eb5780636352211e1461051657806370a0823114610553578063715018a61461059057610225565b80632f745c59146103c95780633ad4c3421461040657806342842e0e1461043157806345b678d91461045a5780634f6ccce71461048557610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd146103235780632524a4961461034c5780632a1eafd9146103755780632b26a6bf146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906131e3565b6108e2565b60405161025e919061322b565b60405180910390f35b34801561027357600080fd5b5061027c6108f4565b60405161028991906132df565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613337565b610986565b6040516102c691906133a5565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906133ec565b610a0b565b005b34801561030457600080fd5b5061030d610b23565b60405161031a919061343b565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190613456565b610b30565b005b34801561035857600080fd5b50610373600480360381019061036e91906134a9565b610b90565b005b34801561038157600080fd5b5061038a610ce3565b604051610397919061343b565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190613337565b610ce9565b005b3480156103d557600080fd5b506103f060048036038101906103eb91906133ec565b610d6f565b6040516103fd919061343b565b60405180910390f35b34801561041257600080fd5b5061041b610e14565b604051610428919061343b565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190613456565b610e1a565b005b34801561046657600080fd5b5061046f610e3a565b60405161047c919061343b565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613337565b610e40565b6040516104b9919061343b565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e4919061361e565b610eb1565b005b3480156104f757600080fd5b50610500610f39565b60405161050d919061343b565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190613337565b610f3f565b60405161054a91906133a5565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613667565b610ff1565b604051610587919061343b565b60405180910390f35b34801561059c57600080fd5b506105a56110a9565b005b3480156105b357600080fd5b506105bc611131565b6040516105c991906133a5565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190613337565b611157565b005b34801561060757600080fd5b50610622600480360381019061061d9190613667565b61120d565b60405161062f9190613752565b60405180910390f35b34801561064457600080fd5b5061064d611317565b60405161065a919061343b565b60405180910390f35b61066b61131d565b005b34801561067957600080fd5b506106826113d9565b60405161068f91906133a5565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613337565b611403565b005b6106db60048036038101906106d691906134a9565b611496565b005b3480156106e957600080fd5b506106f2611783565b6040516106ff91906132df565b60405180910390f35b34801561071457600080fd5b5061072f600480360381019061072a91906137a0565b611815565b005b34801561073d57600080fd5b5061075860048036038101906107539190613881565b61182b565b005b34801561076657600080fd5b50610781600480360381019061077c9190613337565b61188d565b60405161078e91906132df565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190613667565b6118e3565b005b3480156107cc57600080fd5b506107d56119a3565b6040516107e291906132df565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613904565b611a31565b60405161081f919061322b565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613667565b611ac5565b005b34801561085d57600080fd5b5061087860048036038101906108739190613667565b611bbd565b604051610885919061322b565b60405180910390f35b34801561089a57600080fd5b506108a3611c6a565b6040516108b0919061343b565b60405180910390f35b3480156108c557600080fd5b506108e060048036038101906108db9190613337565b611c70565b005b60006108ed82611d11565b9050919050565b60606000805461090390613973565b80601f016020809104026020016040519081016040528092919081815260200182805461092f90613973565b801561097c5780601f106109515761010080835404028352916020019161097c565b820191906000526020600020905b81548152906001019060200180831161095f57829003601f168201915b5050505050905090565b600061099182611d8b565b6109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c790613a17565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1682610f3f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e90613aa9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aa6611df7565b73ffffffffffffffffffffffffffffffffffffffff161480610ad55750610ad481610acf611df7565b611a31565b5b610b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0b90613b3b565b60405180910390fd5b610b1e8383611dff565b505050565b6000600880549050905090565b610b41610b3b611df7565b82611eb8565b610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7790613bcd565b60405180910390fd5b610b8b838383611f96565b505050565b610b98611df7565b73ffffffffffffffffffffffffffffffffffffffff16610bb66113d9565b73ffffffffffffffffffffffffffffffffffffffff1614610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390613c39565b60405180910390fd5b610c236011546012546121f290919063ffffffff16565b610c3d83610c2f610b23565b61220890919063ffffffff16565b1115610c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7590613ca5565b60405180910390fd5b6000601354905060005b83811015610cbb578180610c9b90613cf4565b925050610ca8838361221e565b8080610cb390613cf4565b915050610c88565b50610cd1836011546121f290919063ffffffff16565b60118190555080601381905550505050565b60125481565b610cf1611df7565b73ffffffffffffffffffffffffffffffffffffffff16610d0f6113d9565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90613c39565b60405180910390fd5b80600f8190555050565b6000610d7a83610ff1565b8210610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db290613daf565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60105481565b610e358383836040518060200160405280600081525061182b565b505050565b60115481565b6000610e4a610b23565b8210610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290613e41565b60405180910390fd5b60088281548110610e9f57610e9e613e61565b5b90600052602060002001549050919050565b610eb9611df7565b73ffffffffffffffffffffffffffffffffffffffff16610ed76113d9565b73ffffffffffffffffffffffffffffffffffffffff1614610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2490613c39565b60405180910390fd5b610f368161223c565b50565b600f5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf90613f02565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105990613f94565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110b1611df7565b73ffffffffffffffffffffffffffffffffffffffff166110cf6113d9565b73ffffffffffffffffffffffffffffffffffffffff1614611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90613c39565b60405180910390fd5b61112f6000612256565b565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61115f611df7565b73ffffffffffffffffffffffffffffffffffffffff1661117d6113d9565b73ffffffffffffffffffffffffffffffffffffffff16146111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca90613c39565b60405180910390fd5b60125481106111e157600080fd5b6111f860115460135461220890919063ffffffff16565b811161120357600080fd5b8060128190555050565b6060600061121a83610ff1565b9050600081141561127757600067ffffffffffffffff8111156112405761123f6134f3565b5b60405190808252806020026020018201604052801561126e5781602001602082028036833780820191505090505b50915050611312565b60008167ffffffffffffffff811115611293576112926134f3565b5b6040519080825280602002602001820160405280156112c15781602001602082028036833780820191505090505b50905060005b8281101561130b576112d98582610d6f565b8282815181106112ec576112eb613e61565b5b602002602001018181525050808061130390613cf4565b9150506112c7565b8193505050505b919050565b600c5481565b611325611df7565b73ffffffffffffffffffffffffffffffffffffffff166113436113d9565b73ffffffffffffffffffffffffffffffffffffffff1614611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090613c39565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506113d757600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61140b611df7565b73ffffffffffffffffffffffffffffffffffffffff166114296113d9565b73ffffffffffffffffffffffffffffffffffffffff161461147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147690613c39565b60405180910390fd5b6000811161148c57600080fd5b8060108190555050565b6002600b5414156114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390614000565b60405180910390fd5b6002600b819055506000600c5411611529576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115209061406c565b60405180910390fd5b6001600c5414156115845761154461153f611df7565b611bbd565b611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a906140d8565b60405180910390fd5b5b60125461158f610b23565b106115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690614144565b60405180910390fd5b6000821180156115e15750600f548211155b611620576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611617906141b0565b60405180910390fd5b6116376011546012546121f290919063ffffffff16565b61165183611643610b23565b61220890919063ffffffff16565b1115611692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116899061421c565b60405180910390fd5b6116a78260105461231c90919063ffffffff16565b3410156116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e090614288565b60405180910390fd5b6000601354905060008273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161461172c5782611735565b611734611df7565b5b905060005b8481101561176d57828061174d90613cf4565b93505061175a828461221e565b808061176590613cf4565b91505061173a565b508160138190555050506001600b819055505050565b60606001805461179290613973565b80601f01602080910402602001604051908101604052809291908181526020018280546117be90613973565b801561180b5780601f106117e05761010080835404028352916020019161180b565b820191906000526020600020905b8154815290600101906020018083116117ee57829003601f168201915b5050505050905090565b611827611820611df7565b8383612332565b5050565b61183c611836611df7565b83611eb8565b61187b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187290613bcd565b60405180910390fd5b6118878484848461249f565b50505050565b6060600061189a836124fb565b905060008151116118ba57604051806020016040528060008152506118db565b806040516020016118cb9190614330565b6040516020818303038152906040525b915050919050565b6118eb611df7565b73ffffffffffffffffffffffffffffffffffffffff166119096113d9565b73ffffffffffffffffffffffffffffffffffffffff161461195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195690613c39565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d80546119b090613973565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc90613973565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611acd611df7565b73ffffffffffffffffffffffffffffffffffffffff16611aeb6113d9565b73ffffffffffffffffffffffffffffffffffffffff1614611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3890613c39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba8906143c4565b60405180910390fd5b611bba81612256565b50565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611c2091906133a5565b602060405180830381865afa158015611c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6191906143f9565b11915050919050565b60135481565b611c78611df7565b73ffffffffffffffffffffffffffffffffffffffff16611c966113d9565b73ffffffffffffffffffffffffffffffffffffffff1614611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce390613c39565b60405180910390fd5b60008110158015611cfe575060028111155b611d0757600080fd5b80600c8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d845750611d83826125a2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e7283610f3f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ec382611d8b565b611f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef990614498565b60405180910390fd5b6000611f0d83610f3f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f7c57508373ffffffffffffffffffffffffffffffffffffffff16611f6484610986565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f8d5750611f8c8185611a31565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fb682610f3f565b73ffffffffffffffffffffffffffffffffffffffff161461200c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120039061452a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612073906145bc565b60405180910390fd5b612087838383612684565b612092600082611dff565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e291906145dc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121399190614610565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361220091906145dc565b905092915050565b600081836122169190614610565b905092915050565b612238828260405180602001604052806000815250612694565b5050565b80600d90805190602001906122529291906130d4565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361232a9190614666565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123989061470c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612492919061322b565b60405180910390a3505050565b6124aa848484611f96565b6124b6848484846126ef565b6124f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ec9061479e565b60405180910390fd5b50505050565b606061250682611d8b565b612545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253c90614830565b60405180910390fd5b600061254f612877565b9050600081511161256f576040518060200160405280600081525061259a565b8061257984612909565b60405160200161258a929190614850565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061266d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061267d575061267c82612a6a565b5b9050919050565b61268f838383612ad4565b505050565b61269e8383612be8565b6126ab60008484846126ef565b6126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e19061479e565b60405180910390fd5b505050565b60006127108473ffffffffffffffffffffffffffffffffffffffff16612db6565b1561286a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612739611df7565b8786866040518563ffffffff1660e01b815260040161275b94939291906148c9565b6020604051808303816000875af192505050801561279757506040513d601f19601f82011682018060405250810190612794919061492a565b60015b61281a573d80600081146127c7576040519150601f19603f3d011682016040523d82523d6000602084013e6127cc565b606091505b50600081511415612812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128099061479e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061286f565b600190505b949350505050565b6060600d805461288690613973565b80601f01602080910402602001604051908101604052809291908181526020018280546128b290613973565b80156128ff5780601f106128d4576101008083540402835291602001916128ff565b820191906000526020600020905b8154815290600101906020018083116128e257829003601f168201915b5050505050905090565b60606000821415612951576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a65565b600082905060005b6000821461298357808061296c90613cf4565b915050600a8261297c9190614986565b9150612959565b60008167ffffffffffffffff81111561299f5761299e6134f3565b5b6040519080825280601f01601f1916602001820160405280156129d15781602001600182028036833780820191505090505b5090505b60008514612a5e576001826129ea91906145dc565b9150600a856129f991906149b7565b6030612a059190614610565b60f81b818381518110612a1b57612a1a613e61565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a579190614986565b94506129d5565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612adf838383612dc9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b2257612b1d81612dce565b612b61565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b6057612b5f8382612e17565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ba457612b9f81612f84565b612be3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612be257612be18282613055565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4f90614a34565b60405180910390fd5b612c6181611d8b565b15612ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9890614aa0565b60405180910390fd5b612cad60008383612684565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cfd9190614610565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e2484610ff1565b612e2e91906145dc565b9050600060076000848152602001908152602001600020549050818114612f13576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f9891906145dc565b9050600060096000848152602001908152602001600020549050600060088381548110612fc857612fc7613e61565b5b906000526020600020015490508060088381548110612fea57612fe9613e61565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061303957613038614ac0565b5b6001900381819060005260206000200160009055905550505050565b600061306083610ff1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546130e090613973565b90600052602060002090601f0160209004810192826131025760008555613149565b82601f1061311b57805160ff1916838001178555613149565b82800160010185558215613149579182015b8281111561314857825182559160200191906001019061312d565b5b509050613156919061315a565b5090565b5b8082111561317357600081600090555060010161315b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131c08161318b565b81146131cb57600080fd5b50565b6000813590506131dd816131b7565b92915050565b6000602082840312156131f9576131f8613181565b5b6000613207848285016131ce565b91505092915050565b60008115159050919050565b61322581613210565b82525050565b6000602082019050613240600083018461321c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613280578082015181840152602081019050613265565b8381111561328f576000848401525b50505050565b6000601f19601f8301169050919050565b60006132b182613246565b6132bb8185613251565b93506132cb818560208601613262565b6132d481613295565b840191505092915050565b600060208201905081810360008301526132f981846132a6565b905092915050565b6000819050919050565b61331481613301565b811461331f57600080fd5b50565b6000813590506133318161330b565b92915050565b60006020828403121561334d5761334c613181565b5b600061335b84828501613322565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061338f82613364565b9050919050565b61339f81613384565b82525050565b60006020820190506133ba6000830184613396565b92915050565b6133c981613384565b81146133d457600080fd5b50565b6000813590506133e6816133c0565b92915050565b6000806040838503121561340357613402613181565b5b6000613411858286016133d7565b925050602061342285828601613322565b9150509250929050565b61343581613301565b82525050565b6000602082019050613450600083018461342c565b92915050565b60008060006060848603121561346f5761346e613181565b5b600061347d868287016133d7565b935050602061348e868287016133d7565b925050604061349f86828701613322565b9150509250925092565b600080604083850312156134c0576134bf613181565b5b60006134ce85828601613322565b92505060206134df858286016133d7565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61352b82613295565b810181811067ffffffffffffffff8211171561354a576135496134f3565b5b80604052505050565b600061355d613177565b90506135698282613522565b919050565b600067ffffffffffffffff821115613589576135886134f3565b5b61359282613295565b9050602081019050919050565b82818337600083830152505050565b60006135c16135bc8461356e565b613553565b9050828152602081018484840111156135dd576135dc6134ee565b5b6135e884828561359f565b509392505050565b600082601f830112613605576136046134e9565b5b81356136158482602086016135ae565b91505092915050565b60006020828403121561363457613633613181565b5b600082013567ffffffffffffffff81111561365257613651613186565b5b61365e848285016135f0565b91505092915050565b60006020828403121561367d5761367c613181565b5b600061368b848285016133d7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136c981613301565b82525050565b60006136db83836136c0565b60208301905092915050565b6000602082019050919050565b60006136ff82613694565b613709818561369f565b9350613714836136b0565b8060005b8381101561374557815161372c88826136cf565b9750613737836136e7565b925050600181019050613718565b5085935050505092915050565b6000602082019050818103600083015261376c81846136f4565b905092915050565b61377d81613210565b811461378857600080fd5b50565b60008135905061379a81613774565b92915050565b600080604083850312156137b7576137b6613181565b5b60006137c5858286016133d7565b92505060206137d68582860161378b565b9150509250929050565b600067ffffffffffffffff8211156137fb576137fa6134f3565b5b61380482613295565b9050602081019050919050565b600061382461381f846137e0565b613553565b9050828152602081018484840111156138405761383f6134ee565b5b61384b84828561359f565b509392505050565b600082601f830112613868576138676134e9565b5b8135613878848260208601613811565b91505092915050565b6000806000806080858703121561389b5761389a613181565b5b60006138a9878288016133d7565b94505060206138ba878288016133d7565b93505060406138cb87828801613322565b925050606085013567ffffffffffffffff8111156138ec576138eb613186565b5b6138f887828801613853565b91505092959194509250565b6000806040838503121561391b5761391a613181565b5b6000613929858286016133d7565b925050602061393a858286016133d7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061398b57607f821691505b6020821081141561399f5761399e613944565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613a01602c83613251565b9150613a0c826139a5565b604082019050919050565b60006020820190508181036000830152613a30816139f4565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a93602183613251565b9150613a9e82613a37565b604082019050919050565b60006020820190508181036000830152613ac281613a86565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613b25603883613251565b9150613b3082613ac9565b604082019050919050565b60006020820190508181036000830152613b5481613b18565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613bb7603183613251565b9150613bc282613b5b565b604082019050919050565b60006020820190508181036000830152613be681613baa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c23602083613251565b9150613c2e82613bed565b602082019050919050565b60006020820190508181036000830152613c5281613c16565b9050919050565b7f4f6e6c792031303020746f6b656e73206d617800000000000000000000000000600082015250565b6000613c8f601383613251565b9150613c9a82613c59565b602082019050919050565b60006020820190508181036000830152613cbe81613c82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613cff82613301565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d3257613d31613cc5565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613d99602b83613251565b9150613da482613d3d565b604082019050919050565b60006020820190508181036000830152613dc881613d8c565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613e2b602c83613251565b9150613e3682613dcf565b604082019050919050565b60006020820190508181036000830152613e5a81613e1e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613eec602983613251565b9150613ef782613e90565b604082019050919050565b60006020820190508181036000830152613f1b81613edf565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613f7e602a83613251565b9150613f8982613f22565b604082019050919050565b60006020820190508181036000830152613fad81613f71565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613fea601f83613251565b9150613ff582613fb4565b602082019050919050565b6000602082019050818103600083015261401981613fdd565b9050919050565b7f53616c6573206e6f742073746172746564000000000000000000000000000000600082015250565b6000614056601183613251565b915061406182614020565b602082019050919050565b6000602082019050818103600083015261408581614049565b9050919050565b7f53616c657320617265206f70656e20746f20686f6c64657273206f6e6c790000600082015250565b60006140c2601e83613251565b91506140cd8261408c565b602082019050919050565b600060208201905081810360008301526140f1816140b5565b9050919050565b7f576527766520676f7420616c6c00000000000000000000000000000000000000600082015250565b600061412e600d83613251565b9150614139826140f8565b602082019050919050565b6000602082019050818103600083015261415d81614121565b9050919050565b7f546f6f206d756368000000000000000000000000000000000000000000000000600082015250565b600061419a600883613251565b91506141a582614164565b602082019050919050565b600060208201905081810360008301526141c98161418d565b9050919050565b7f43616e277420676574206d6f7265207468616e203130303030204e4654730000600082015250565b6000614206601e83613251565b9150614211826141d0565b602082019050919050565b60006020820190508181036000830152614235816141f9565b9050919050565b7f4e6f7420656e6f7567682045544820666f72207472616e73616374696f6e0000600082015250565b6000614272601e83613251565b915061427d8261423c565b602082019050919050565b600060208201905081810360008301526142a181614265565b9050919050565b600081905092915050565b60006142be82613246565b6142c881856142a8565b93506142d8818560208601613262565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061431a6005836142a8565b9150614325826142e4565b600582019050919050565b600061433c82846142b3565b91506143478261430d565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143ae602683613251565b91506143b982614352565b604082019050919050565b600060208201905081810360008301526143dd816143a1565b9050919050565b6000815190506143f38161330b565b92915050565b60006020828403121561440f5761440e613181565b5b600061441d848285016143e4565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614482602c83613251565b915061448d82614426565b604082019050919050565b600060208201905081810360008301526144b181614475565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614514602983613251565b915061451f826144b8565b604082019050919050565b6000602082019050818103600083015261454381614507565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145a6602483613251565b91506145b18261454a565b604082019050919050565b600060208201905081810360008301526145d581614599565b9050919050565b60006145e782613301565b91506145f283613301565b92508282101561460557614604613cc5565b5b828203905092915050565b600061461b82613301565b915061462683613301565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561465b5761465a613cc5565b5b828201905092915050565b600061467182613301565b915061467c83613301565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146b5576146b4613cc5565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006146f6601983613251565b9150614701826146c0565b602082019050919050565b60006020820190508181036000830152614725816146e9565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614788603283613251565b91506147938261472c565b604082019050919050565b600060208201905081810360008301526147b78161477b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061481a602f83613251565b9150614825826147be565b604082019050919050565b600060208201905081810360008301526148498161480d565b9050919050565b600061485c82856142b3565b915061486882846142b3565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061489b82614874565b6148a5818561487f565b93506148b5818560208601613262565b6148be81613295565b840191505092915050565b60006080820190506148de6000830187613396565b6148eb6020830186613396565b6148f8604083018561342c565b818103606083015261490a8184614890565b905095945050505050565b600081519050614924816131b7565b92915050565b6000602082840312156149405761493f613181565b5b600061494e84828501614915565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061499182613301565b915061499c83613301565b9250826149ac576149ab614957565b5b828204905092915050565b60006149c282613301565b91506149cd83613301565b9250826149dd576149dc614957565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a1e602083613251565b9150614a29826149e8565b602082019050919050565b60006020820190508181036000830152614a4d81614a11565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a8a601c83613251565b9150614a9582614a54565b602082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122025dedef18ec159c534dd01cf9c2208f3b7e22d7920ca4ec04ccec13acffa395b64736f6c634300080a0033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000335eeef8e93a7a757d9e7912044d9cd264e2b2d8000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f6d6574612e7361646769726c736261722e696f2f636174732f00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : metadataLocation (string): https://meta.sadgirlsbar.io/cats/
Arg [1] : sgbContractAddress (address): 0x335eEEF8e93A7A757D9e7912044d9cd264e2b2D8

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000335eeef8e93a7a757d9e7912044d9cd264e2b2d8
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [3] : 68747470733a2f2f6d6574612e7361646769726c736261722e696f2f63617473
Arg [4] : 2f00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55412:4953:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58863:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23706:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25265:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24788:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37702:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26015:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58257:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55866:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59630:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37370:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55793:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26425:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55831:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37892:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59531:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55755:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23400:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23130:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44839:103;;;;;;;;;;;;;:::i;:::-;;55725:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60043:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56377:470;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55582:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60241:117;;;:::i;:::-;;44188:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59741:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57065:1108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23875:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25558:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26681:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59256:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56244:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55694:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25784:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45097:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56855:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55902:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59860:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58863:180;58978:4;59001:36;59025:11;59001:23;:36::i;:::-;58994:43;;58863:180;;;:::o;23706:100::-;23760:13;23793:5;23786:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23706:100;:::o;25265:221::-;25341:7;25369:16;25377:7;25369;:16::i;:::-;25361:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25454:15;:24;25470:7;25454:24;;;;;;;;;;;;;;;;;;;;;25447:31;;25265:221;;;:::o;24788:411::-;24869:13;24885:23;24900:7;24885:14;:23::i;:::-;24869:39;;24933:5;24927:11;;:2;:11;;;;24919:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25027:5;25011:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25036:37;25053:5;25060:12;:10;:12::i;:::-;25036:16;:37::i;:::-;25011:62;24989:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25170:21;25179:2;25183:7;25170:8;:21::i;:::-;24858:341;24788:411;;:::o;37702:113::-;37763:7;37790:10;:17;;;;37783:24;;37702:113;:::o;26015:339::-;26210:41;26229:12;:10;:12::i;:::-;26243:7;26210:18;:41::i;:::-;26202:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26318:28;26328:4;26334:2;26338:7;26318:9;:28::i;:::-;26015:339;;;:::o;58257:408::-;44419:12;:10;:12::i;:::-;44408:23;;:7;:5;:7::i;:::-;:23;;;44400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58374:30:::1;58391:12;;58374;;:16;;:30;;;;:::i;:::-;58342:28;58360:9;58342:13;:11;:13::i;:::-;:17;;:28;;;;:::i;:::-;:62;;58334:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;58435:17;58455:11;;58435:31;;58478:6;58473:104;58494:9;58490:1;:13;58473:104;;;58519:14;;;;;:::i;:::-;;;;58542:27;58552:2;58556:12;58542:9;:27::i;:::-;58505:3;;;;;:::i;:::-;;;;58473:104;;;;58598:27;58615:9;58598:12;;:16;;:27;;;;:::i;:::-;58583:12;:42;;;;58646:12;58632:11;:26;;;;58327:338;58257:408:::0;;:::o;55866:31::-;;;;:::o;59630:105::-;44419:12;:10;:12::i;:::-;44408:23;;:7;:5;:7::i;:::-;:23;;;44400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59717:12:::1;59701:13;:28;;;;59630:105:::0;:::o;37370:256::-;37467:7;37503:23;37520:5;37503:16;:23::i;:::-;37495:5;:31;37487:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37592:12;:19;37605:5;37592:19;;;;;;;;;;;;;;;:26;37612:5;37592:26;;;;;;;;;;;;37585:33;;37370:256;;;;:::o;55793:33::-;;;;:::o;26425:185::-;26563:39;26580:4;26586:2;26590:7;26563:39;;;;;;;;;;;;:16;:39::i;:::-;26425:185;;;:::o;55831:30::-;;;;:::o;37892:233::-;37967:7;38003:30;:28;:30::i;:::-;37995:5;:38;37987:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38100:10;38111:5;38100:17;;;;;;;;:::i;:::-;;;;;;;;;;38093:24;;37892:233;;;:::o;59531:93::-;44419:12;:10;:12::i;:::-;44408:23;;:7;:5;:7::i;:::-;:23;;;44400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59598:20:::1;59610:7;59598:11;:20::i;:::-;59531:93:::0;:::o;55755:33::-;;;;:::o;23400:239::-;23472:7;23492:13;23508:7;:16;23516:7;23508:16;;;;;;;;;;;;;;;;;;;;;23492:32;;23560:1;23543:19;;:5;:19;;;;23535:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23626:5;23619:12;;;23400:239;;;:::o;23130:208::-;23202:7;23247:1;23230:19;;:5;:19;;;;23222:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23314:9;:16;23324:5;23314:16;;;;;;;;;;;;;;;;23307:23;;23130:208;;;:::o;44839:103::-;44419:12;:10;:12::i;:::-;44408:23;;:7;:5;:7::i;:::-;:23;;;44400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44904:30:::1;44931:1;44904:18;:30::i;:::-;44839:103::o:0;55725:25::-;;;;;;;;;;;;;:::o;60043:192::-;44419:12;:10;:12::i;:::-;44408:23;;:7;:5;:7::i;:::-;:23;;;44400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60128:12:::1;;60116:9;:24;60108:33;;;::::0;::::1;;60168:29;60184:12;;60168:11;;:15;;:29;;;;:::i;:::-;60156:9;:41;60148:50;;;::::0;::::1;;60220:9;60205:12;:24;;;;60043:192:::0;:::o;56377:470::-;56436:16;56462:18;56483:17;56493:6;56483:9;:17::i;:::-;56462:38;;56525:1;56511:10;:15;56507:335;;;56590:1;56576:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56569:23;;;;;56507:335;56615:23;56655:10;56641:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56615:51;;56675:13;56697:116;56721:10;56713:5;:18;56697:116;;;56769:34;56789:6;56797:5;56769:19;:34::i;:::-;56753:6;56760:5;56753:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;56733:7;;;;;:::i;:::-;;;;56697:116;;;56828:6;56821:13;;;;;56377:470;;;;:::o;55582:29::-;;;;:::o;60241:117::-;44419:12;:10;:12::i;:::-;44408:23;;:7;:5;:7::i;:::-;:23;;;44400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60312:10:::1;60304:24;;:47;60329:21;60304:47;;;;;;;;;;;;;;;;;;;;;;;60296:56;;;::::0;::::1;;60241:117::o:0;44188:87::-;44234:7;44261:6;;;;;;;;;;;44254:13;;44188:87;:::o;59741:113::-;44419:12;:10;:12::i;:::-;44408:23;;:7;:5;:7::i;:::-;:23;;;44400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59820:1:::1;59809:8;:12;59801:21;;;::::0;::::1;;59840:8;59829;:19;;;;59741:113:::0;:::o;57065:1108::-;47376:1;47974:7;;:19;;47966:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47376:1;48107:7;:18;;;;57204:1:::1;57188:13;;:17;57180:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;57257:1;57240:13;;:18;57236:109;;;57277:25;57289:12;:10;:12::i;:::-;57277:11;:25::i;:::-;57269:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57236:109;57409:12;;57393:13;:11;:13::i;:::-;:28;57385:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;57524:1;57512:9;:13;:43;;;;;57542:13;;57529:9;:26;;57512:43;57504:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57681:30;57698:12;;57681;;:16;;:30;;;;:::i;:::-;57649:28;57667:9;57649:13;:11;:13::i;:::-;:17;;:28;;;;:::i;:::-;:62;;57641:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;57820:23;57833:9;57820:8;;:12;;:23;;;;:::i;:::-;57807:9;:36;;57799:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;57927:17;57947:11;;57927:31;;57965:14;57996:2;57982:16;;57990:1;57982:16;;;:36;;58016:2;57982:36;;;58001:12;:10;:12::i;:::-;57982:36;57965:53;;58032:6;58027:108;58048:9;58044:1;:13;58027:108;;;58073:14;;;;;:::i;:::-;;;;58096:31;58106:6;58114:12;58096:9;:31::i;:::-;58059:3;;;;;:::i;:::-;;;;58027:108;;;;58155:12;58141:11;:26;;;;57140:1033;;47332:1:::0;48286:7;:22;;;;57065:1108;;:::o;23875:104::-;23931:13;23964:7;23957:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23875:104;:::o;25558:155::-;25653:52;25672:12;:10;:12::i;:::-;25686:8;25696;25653:18;:52::i;:::-;25558:155;;:::o;26681:328::-;26856:41;26875:12;:10;:12::i;:::-;26889:7;26856:18;:41::i;:::-;26848:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26962:39;26976:4;26982:2;26986:7;26995:5;26962:13;:39::i;:::-;26681:328;;;;:::o;59256:243::-;59329:13;59351:23;59377;59392:7;59377:14;:23::i;:::-;59351:49;;59440:1;59420:9;59414:23;:27;:79;;;;;;;;;;;;;;;;;59468:9;59451:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;59414:79;59407:86;;;59256:243;;;:::o;56244:79::-;44419:12;:10;:12::i;:::-;44408:23;;:7;:5;:7::i;:::-;:23;;;44400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56313:4:::1;56300:10;;:17;;;;;;;;;;;;;;;;;;56244:79:::0;:::o;55694:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25784:164::-;25881:4;25905:18;:25;25924:5;25905:25;;;;;;;;;;;;;;;:35;25931:8;25905:35;;;;;;;;;;;;;;;;;;;;;;;;;25898:42;;25784:164;;;;:::o;45097:201::-;44419:12;:10;:12::i;:::-;44408:23;;:7;:5;:7::i;:::-;:23;;;44400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45206:1:::1;45186:22;;:8;:22;;;;45178:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45262:28;45281:8;45262:18;:28::i;:::-;45097:201:::0;:::o;56855:169::-;56913:4;56926:21;56968:10;;;;;;;;;;;56926:53;;57017:1;56993:3;:13;;;57007:6;56993:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;56986:32;;;56855:169;;;:::o;55902:27::-;;;;:::o;59860:175::-;44419:12;:10;:12::i;:::-;44408:23;;:7;:5;:7::i;:::-;:23;;;44400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59964:1:::1;59944:16;:21;;:45;;;;;59988:1;59969:16;:20;;59944:45;59936:54;;;::::0;::::1;;60013:16;59997:13;:32;;;;59860:175:::0;:::o;37062:224::-;37164:4;37203:35;37188:50;;;:11;:50;;;;:90;;;;37242:36;37266:11;37242:23;:36::i;:::-;37188:90;37181:97;;37062:224;;;:::o;28519:127::-;28584:4;28636:1;28608:30;;:7;:16;28616:7;28608:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28601:37;;28519:127;;;:::o;18344:98::-;18397:7;18424:10;18417:17;;18344:98;:::o;32501:174::-;32603:2;32576:15;:24;32592:7;32576:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32659:7;32655:2;32621:46;;32630:23;32645:7;32630:14;:23::i;:::-;32621:46;;;;;;;;;;;;32501:174;;:::o;28813:348::-;28906:4;28931:16;28939:7;28931;:16::i;:::-;28923:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29007:13;29023:23;29038:7;29023:14;:23::i;:::-;29007:39;;29076:5;29065:16;;:7;:16;;;:51;;;;29109:7;29085:31;;:20;29097:7;29085:11;:20::i;:::-;:31;;;29065:51;:87;;;;29120:32;29137:5;29144:7;29120:16;:32::i;:::-;29065:87;29057:96;;;28813:348;;;;:::o;31805:578::-;31964:4;31937:31;;:23;31952:7;31937:14;:23::i;:::-;:31;;;31929:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32047:1;32033:16;;:2;:16;;;;32025:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32103:39;32124:4;32130:2;32134:7;32103:20;:39::i;:::-;32207:29;32224:1;32228:7;32207:8;:29::i;:::-;32268:1;32249:9;:15;32259:4;32249:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32297:1;32280:9;:13;32290:2;32280:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32328:2;32309:7;:16;32317:7;32309:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32367:7;32363:2;32348:27;;32357:4;32348:27;;;;;;;;;;;;31805:578;;;:::o;51479:98::-;51537:7;51568:1;51564;:5;;;;:::i;:::-;51557:12;;51479:98;;;;:::o;51098:::-;51156:7;51187:1;51183;:5;;;;:::i;:::-;51176:12;;51098:98;;;;:::o;29503:110::-;29579:26;29589:2;29593:7;29579:26;;;;;;;;;;;;:9;:26::i;:::-;29503:110;;:::o;59049:96::-;59132:7;59117:12;:22;;;;;;;;;;;;:::i;:::-;;59049:96;:::o;45458:191::-;45532:16;45551:6;;;;;;;;;;;45532:25;;45577:8;45568:6;;:17;;;;;;;;;;;;;;;;;;45632:8;45601:40;;45622:8;45601:40;;;;;;;;;;;;45521:128;45458:191;:::o;51836:98::-;51894:7;51925:1;51921;:5;;;;:::i;:::-;51914:12;;51836:98;;;;:::o;32817:315::-;32972:8;32963:17;;:5;:17;;;;32955:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33059:8;33021:18;:25;33040:5;33021:25;;;;;;;;;;;;;;;:35;33047:8;33021:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33105:8;33083:41;;33098:5;33083:41;;;33115:8;33083:41;;;;;;:::i;:::-;;;;;;;;32817:315;;;:::o;27891:::-;28048:28;28058:4;28064:2;28068:7;28048:9;:28::i;:::-;28095:48;28118:4;28124:2;28128:7;28137:5;28095:22;:48::i;:::-;28087:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27891:315;;;;:::o;24050:334::-;24123:13;24157:16;24165:7;24157;:16::i;:::-;24149:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24238:21;24262:10;:8;:10::i;:::-;24238:34;;24314:1;24296:7;24290:21;:25;:86;;;;;;;;;;;;;;;;;24342:7;24351:18;:7;:16;:18::i;:::-;24325:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24290:86;24283:93;;;24050:334;;;:::o;22761:305::-;22863:4;22915:25;22900:40;;;:11;:40;;;;:105;;;;22972:33;22957:48;;;:11;:48;;;;22900:105;:158;;;;23022:36;23046:11;23022:23;:36::i;:::-;22900:158;22880:178;;22761:305;;;:::o;58673:184::-;58806:45;58833:4;58839:2;58843:7;58806:26;:45::i;:::-;58673:184;;;:::o;29840:321::-;29970:18;29976:2;29980:7;29970:5;:18::i;:::-;30021:54;30052:1;30056:2;30060:7;30069:5;30021:22;:54::i;:::-;29999:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29840:321;;;:::o;33697:799::-;33852:4;33873:15;:2;:13;;;:15::i;:::-;33869:620;;;33925:2;33909:36;;;33946:12;:10;:12::i;:::-;33960:4;33966:7;33975:5;33909:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33905:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34168:1;34151:6;:13;:18;34147:272;;;34194:60;;;;;;;;;;:::i;:::-;;;;;;;;34147:272;34369:6;34363:13;34354:6;34350:2;34346:15;34339:38;33905:529;34042:41;;;34032:51;;;:6;:51;;;;34025:58;;;;;33869:620;34473:4;34466:11;;33697:799;;;;;;;:::o;59151:99::-;59203:13;59232:12;59225:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59151:99;:::o;18842:723::-;18898:13;19128:1;19119:5;:10;19115:53;;;19146:10;;;;;;;;;;;;;;;;;;;;;19115:53;19178:12;19193:5;19178:20;;19209:14;19234:78;19249:1;19241:4;:9;19234:78;;19267:8;;;;;:::i;:::-;;;;19298:2;19290:10;;;;;:::i;:::-;;;19234:78;;;19322:19;19354:6;19344:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19322:39;;19372:154;19388:1;19379:5;:10;19372:154;;19416:1;19406:11;;;;;:::i;:::-;;;19483:2;19475:5;:10;;;;:::i;:::-;19462:2;:24;;;;:::i;:::-;19449:39;;19432:6;19439;19432:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19512:2;19503:11;;;;;:::i;:::-;;;19372:154;;;19550:6;19536:21;;;;;18842:723;;;;:::o;21370:157::-;21455:4;21494:25;21479:40;;;:11;:40;;;;21472:47;;21370:157;;;:::o;38738:589::-;38882:45;38909:4;38915:2;38919:7;38882:26;:45::i;:::-;38960:1;38944:18;;:4;:18;;;38940:187;;;38979:40;39011:7;38979:31;:40::i;:::-;38940:187;;;39049:2;39041:10;;:4;:10;;;39037:90;;39068:47;39101:4;39107:7;39068:32;:47::i;:::-;39037:90;38940:187;39155:1;39141:16;;:2;:16;;;39137:183;;;39174:45;39211:7;39174:36;:45::i;:::-;39137:183;;;39247:4;39241:10;;:2;:10;;;39237:83;;39268:40;39296:2;39300:7;39268:27;:40::i;:::-;39237:83;39137:183;38738:589;;;:::o;30497:382::-;30591:1;30577:16;;:2;:16;;;;30569:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30650:16;30658:7;30650;:16::i;:::-;30649:17;30641:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30712:45;30741:1;30745:2;30749:7;30712:20;:45::i;:::-;30787:1;30770:9;:13;30780:2;30770:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30818:2;30799:7;:16;30807:7;30799:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30863:7;30859:2;30838:33;;30855:1;30838:33;;;;;;;;;;;;30497:382;;:::o;10415:387::-;10475:4;10683:12;10750:7;10738:20;10730:28;;10793:1;10786:4;:8;10779:15;;;10415:387;;;:::o;35068:126::-;;;;:::o;40050:164::-;40154:10;:17;;;;40127:15;:24;40143:7;40127:24;;;;;;;;;;;:44;;;;40182:10;40198:7;40182:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40050:164;:::o;40841:988::-;41107:22;41157:1;41132:22;41149:4;41132:16;:22::i;:::-;:26;;;;:::i;:::-;41107:51;;41169:18;41190:17;:26;41208:7;41190:26;;;;;;;;;;;;41169:47;;41337:14;41323:10;:28;41319:328;;41368:19;41390:12;:18;41403:4;41390:18;;;;;;;;;;;;;;;:34;41409:14;41390:34;;;;;;;;;;;;41368:56;;41474:11;41441:12;:18;41454:4;41441:18;;;;;;;;;;;;;;;:30;41460:10;41441:30;;;;;;;;;;;:44;;;;41591:10;41558:17;:30;41576:11;41558:30;;;;;;;;;;;:43;;;;41353:294;41319:328;41743:17;:26;41761:7;41743:26;;;;;;;;;;;41736:33;;;41787:12;:18;41800:4;41787:18;;;;;;;;;;;;;;;:34;41806:14;41787:34;;;;;;;;;;;41780:41;;;40922:907;;40841:988;;:::o;42124:1079::-;42377:22;42422:1;42402:10;:17;;;;:21;;;;:::i;:::-;42377:46;;42434:18;42455:15;:24;42471:7;42455:24;;;;;;;;;;;;42434:45;;42806:19;42828:10;42839:14;42828:26;;;;;;;;:::i;:::-;;;;;;;;;;42806:48;;42892:11;42867:10;42878;42867:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43003:10;42972:15;:28;42988:11;42972:28;;;;;;;;;;;:41;;;;43144:15;:24;43160:7;43144:24;;;;;;;;;;;43137:31;;;43179:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42195:1008;;;42124:1079;:::o;39628:221::-;39713:14;39730:20;39747:2;39730:16;:20::i;:::-;39713:37;;39788:7;39761:12;:16;39774:2;39761:16;;;;;;;;;;;;;;;:24;39778:6;39761:24;;;;;;;;;;;:34;;;;39835:6;39806:17;:26;39824:7;39806:26;;;;;;;;;;;:35;;;;39702:147;39628:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:474::-;5983:6;5991;6040:2;6028:9;6019:7;6015:23;6011:32;6008:119;;;6046:79;;:::i;:::-;6008:119;6166:1;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6137:117;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5915:474;;;;;:::o;6395:117::-;6504:1;6501;6494:12;6518:117;6627:1;6624;6617:12;6641:180;6689:77;6686:1;6679:88;6786:4;6783:1;6776:15;6810:4;6807:1;6800:15;6827:281;6910:27;6932:4;6910:27;:::i;:::-;6902:6;6898:40;7040:6;7028:10;7025:22;7004:18;6992:10;6989:34;6986:62;6983:88;;;7051:18;;:::i;:::-;6983:88;7091:10;7087:2;7080:22;6870:238;6827:281;;:::o;7114:129::-;7148:6;7175:20;;:::i;:::-;7165:30;;7204:33;7232:4;7224:6;7204:33;:::i;:::-;7114:129;;;:::o;7249:308::-;7311:4;7401:18;7393:6;7390:30;7387:56;;;7423:18;;:::i;:::-;7387:56;7461:29;7483:6;7461:29;:::i;:::-;7453:37;;7545:4;7539;7535:15;7527:23;;7249:308;;;:::o;7563:154::-;7647:6;7642:3;7637;7624:30;7709:1;7700:6;7695:3;7691:16;7684:27;7563:154;;;:::o;7723:412::-;7801:5;7826:66;7842:49;7884:6;7842:49;:::i;:::-;7826:66;:::i;:::-;7817:75;;7915:6;7908:5;7901:21;7953:4;7946:5;7942:16;7991:3;7982:6;7977:3;7973:16;7970:25;7967:112;;;7998:79;;:::i;:::-;7967:112;8088:41;8122:6;8117:3;8112;8088:41;:::i;:::-;7807:328;7723:412;;;;;:::o;8155:340::-;8211:5;8260:3;8253:4;8245:6;8241:17;8237:27;8227:122;;8268:79;;:::i;:::-;8227:122;8385:6;8372:20;8410:79;8485:3;8477:6;8470:4;8462:6;8458:17;8410:79;:::i;:::-;8401:88;;8217:278;8155:340;;;;:::o;8501:509::-;8570:6;8619:2;8607:9;8598:7;8594:23;8590:32;8587:119;;;8625:79;;:::i;:::-;8587:119;8773:1;8762:9;8758:17;8745:31;8803:18;8795:6;8792:30;8789:117;;;8825:79;;:::i;:::-;8789:117;8930:63;8985:7;8976:6;8965:9;8961:22;8930:63;:::i;:::-;8920:73;;8716:287;8501:509;;;;:::o;9016:329::-;9075:6;9124:2;9112:9;9103:7;9099:23;9095:32;9092:119;;;9130:79;;:::i;:::-;9092:119;9250:1;9275:53;9320:7;9311:6;9300:9;9296:22;9275:53;:::i;:::-;9265:63;;9221:117;9016:329;;;;:::o;9351:114::-;9418:6;9452:5;9446:12;9436:22;;9351:114;;;:::o;9471:184::-;9570:11;9604:6;9599:3;9592:19;9644:4;9639:3;9635:14;9620:29;;9471:184;;;;:::o;9661:132::-;9728:4;9751:3;9743:11;;9781:4;9776:3;9772:14;9764:22;;9661:132;;;:::o;9799:108::-;9876:24;9894:5;9876:24;:::i;:::-;9871:3;9864:37;9799:108;;:::o;9913:179::-;9982:10;10003:46;10045:3;10037:6;10003:46;:::i;:::-;10081:4;10076:3;10072:14;10058:28;;9913:179;;;;:::o;10098:113::-;10168:4;10200;10195:3;10191:14;10183:22;;10098:113;;;:::o;10247:732::-;10366:3;10395:54;10443:5;10395:54;:::i;:::-;10465:86;10544:6;10539:3;10465:86;:::i;:::-;10458:93;;10575:56;10625:5;10575:56;:::i;:::-;10654:7;10685:1;10670:284;10695:6;10692:1;10689:13;10670:284;;;10771:6;10765:13;10798:63;10857:3;10842:13;10798:63;:::i;:::-;10791:70;;10884:60;10937:6;10884:60;:::i;:::-;10874:70;;10730:224;10717:1;10714;10710:9;10705:14;;10670:284;;;10674:14;10970:3;10963:10;;10371:608;;;10247:732;;;;:::o;10985:373::-;11128:4;11166:2;11155:9;11151:18;11143:26;;11215:9;11209:4;11205:20;11201:1;11190:9;11186:17;11179:47;11243:108;11346:4;11337:6;11243:108;:::i;:::-;11235:116;;10985:373;;;;:::o;11364:116::-;11434:21;11449:5;11434:21;:::i;:::-;11427:5;11424:32;11414:60;;11470:1;11467;11460:12;11414:60;11364:116;:::o;11486:133::-;11529:5;11567:6;11554:20;11545:29;;11583:30;11607:5;11583:30;:::i;:::-;11486:133;;;;:::o;11625:468::-;11690:6;11698;11747:2;11735:9;11726:7;11722:23;11718:32;11715:119;;;11753:79;;:::i;:::-;11715:119;11873:1;11898:53;11943:7;11934:6;11923:9;11919:22;11898:53;:::i;:::-;11888:63;;11844:117;12000:2;12026:50;12068:7;12059:6;12048:9;12044:22;12026:50;:::i;:::-;12016:60;;11971:115;11625:468;;;;;:::o;12099:307::-;12160:4;12250:18;12242:6;12239:30;12236:56;;;12272:18;;:::i;:::-;12236:56;12310:29;12332:6;12310:29;:::i;:::-;12302:37;;12394:4;12388;12384:15;12376:23;;12099:307;;;:::o;12412:410::-;12489:5;12514:65;12530:48;12571:6;12530:48;:::i;:::-;12514:65;:::i;:::-;12505:74;;12602:6;12595:5;12588:21;12640:4;12633:5;12629:16;12678:3;12669:6;12664:3;12660:16;12657:25;12654:112;;;12685:79;;:::i;:::-;12654:112;12775:41;12809:6;12804:3;12799;12775:41;:::i;:::-;12495:327;12412:410;;;;;:::o;12841:338::-;12896:5;12945:3;12938:4;12930:6;12926:17;12922:27;12912:122;;12953:79;;:::i;:::-;12912:122;13070:6;13057:20;13095:78;13169:3;13161:6;13154:4;13146:6;13142:17;13095:78;:::i;:::-;13086:87;;12902:277;12841:338;;;;:::o;13185:943::-;13280:6;13288;13296;13304;13353:3;13341:9;13332:7;13328:23;13324:33;13321:120;;;13360:79;;:::i;:::-;13321:120;13480:1;13505:53;13550:7;13541:6;13530:9;13526:22;13505:53;:::i;:::-;13495:63;;13451:117;13607:2;13633:53;13678:7;13669:6;13658:9;13654:22;13633:53;:::i;:::-;13623:63;;13578:118;13735:2;13761:53;13806:7;13797:6;13786:9;13782:22;13761:53;:::i;:::-;13751:63;;13706:118;13891:2;13880:9;13876:18;13863:32;13922:18;13914:6;13911:30;13908:117;;;13944:79;;:::i;:::-;13908:117;14049:62;14103:7;14094:6;14083:9;14079:22;14049:62;:::i;:::-;14039:72;;13834:287;13185:943;;;;;;;:::o;14134:474::-;14202:6;14210;14259:2;14247:9;14238:7;14234:23;14230:32;14227:119;;;14265:79;;:::i;:::-;14227:119;14385:1;14410:53;14455:7;14446:6;14435:9;14431:22;14410:53;:::i;:::-;14400:63;;14356:117;14512:2;14538:53;14583:7;14574:6;14563:9;14559:22;14538:53;:::i;:::-;14528:63;;14483:118;14134:474;;;;;:::o;14614:180::-;14662:77;14659:1;14652:88;14759:4;14756:1;14749:15;14783:4;14780:1;14773:15;14800:320;14844:6;14881:1;14875:4;14871:12;14861:22;;14928:1;14922:4;14918:12;14949:18;14939:81;;15005:4;14997:6;14993:17;14983:27;;14939:81;15067:2;15059:6;15056:14;15036:18;15033:38;15030:84;;;15086:18;;:::i;:::-;15030:84;14851:269;14800:320;;;:::o;15126:231::-;15266:34;15262:1;15254:6;15250:14;15243:58;15335:14;15330:2;15322:6;15318:15;15311:39;15126:231;:::o;15363:366::-;15505:3;15526:67;15590:2;15585:3;15526:67;:::i;:::-;15519:74;;15602:93;15691:3;15602:93;:::i;:::-;15720:2;15715:3;15711:12;15704:19;;15363:366;;;:::o;15735:419::-;15901:4;15939:2;15928:9;15924:18;15916:26;;15988:9;15982:4;15978:20;15974:1;15963:9;15959:17;15952:47;16016:131;16142:4;16016:131;:::i;:::-;16008:139;;15735:419;;;:::o;16160:220::-;16300:34;16296:1;16288:6;16284:14;16277:58;16369:3;16364:2;16356:6;16352:15;16345:28;16160:220;:::o;16386:366::-;16528:3;16549:67;16613:2;16608:3;16549:67;:::i;:::-;16542:74;;16625:93;16714:3;16625:93;:::i;:::-;16743:2;16738:3;16734:12;16727:19;;16386:366;;;:::o;16758:419::-;16924:4;16962:2;16951:9;16947:18;16939:26;;17011:9;17005:4;17001:20;16997:1;16986:9;16982:17;16975:47;17039:131;17165:4;17039:131;:::i;:::-;17031:139;;16758:419;;;:::o;17183:243::-;17323:34;17319:1;17311:6;17307:14;17300:58;17392:26;17387:2;17379:6;17375:15;17368:51;17183:243;:::o;17432:366::-;17574:3;17595:67;17659:2;17654:3;17595:67;:::i;:::-;17588:74;;17671:93;17760:3;17671:93;:::i;:::-;17789:2;17784:3;17780:12;17773:19;;17432:366;;;:::o;17804:419::-;17970:4;18008:2;17997:9;17993:18;17985:26;;18057:9;18051:4;18047:20;18043:1;18032:9;18028:17;18021:47;18085:131;18211:4;18085:131;:::i;:::-;18077:139;;17804:419;;;:::o;18229:236::-;18369:34;18365:1;18357:6;18353:14;18346:58;18438:19;18433:2;18425:6;18421:15;18414:44;18229:236;:::o;18471:366::-;18613:3;18634:67;18698:2;18693:3;18634:67;:::i;:::-;18627:74;;18710:93;18799:3;18710:93;:::i;:::-;18828:2;18823:3;18819:12;18812:19;;18471:366;;;:::o;18843:419::-;19009:4;19047:2;19036:9;19032:18;19024:26;;19096:9;19090:4;19086:20;19082:1;19071:9;19067:17;19060:47;19124:131;19250:4;19124:131;:::i;:::-;19116:139;;18843:419;;;:::o;19268:182::-;19408:34;19404:1;19396:6;19392:14;19385:58;19268:182;:::o;19456:366::-;19598:3;19619:67;19683:2;19678:3;19619:67;:::i;:::-;19612:74;;19695:93;19784:3;19695:93;:::i;:::-;19813:2;19808:3;19804:12;19797:19;;19456:366;;;:::o;19828:419::-;19994:4;20032:2;20021:9;20017:18;20009:26;;20081:9;20075:4;20071:20;20067:1;20056:9;20052:17;20045:47;20109:131;20235:4;20109:131;:::i;:::-;20101:139;;19828:419;;;:::o;20253:169::-;20393:21;20389:1;20381:6;20377:14;20370:45;20253:169;:::o;20428:366::-;20570:3;20591:67;20655:2;20650:3;20591:67;:::i;:::-;20584:74;;20667:93;20756:3;20667:93;:::i;:::-;20785:2;20780:3;20776:12;20769:19;;20428:366;;;:::o;20800:419::-;20966:4;21004:2;20993:9;20989:18;20981:26;;21053:9;21047:4;21043:20;21039:1;21028:9;21024:17;21017:47;21081:131;21207:4;21081:131;:::i;:::-;21073:139;;20800:419;;;:::o;21225:180::-;21273:77;21270:1;21263:88;21370:4;21367:1;21360:15;21394:4;21391:1;21384:15;21411:233;21450:3;21473:24;21491:5;21473:24;:::i;:::-;21464:33;;21519:66;21512:5;21509:77;21506:103;;;21589:18;;:::i;:::-;21506:103;21636:1;21629:5;21625:13;21618:20;;21411:233;;;:::o;21650:230::-;21790:34;21786:1;21778:6;21774:14;21767:58;21859:13;21854:2;21846:6;21842:15;21835:38;21650:230;:::o;21886:366::-;22028:3;22049:67;22113:2;22108:3;22049:67;:::i;:::-;22042:74;;22125:93;22214:3;22125:93;:::i;:::-;22243:2;22238:3;22234:12;22227:19;;21886:366;;;:::o;22258:419::-;22424:4;22462:2;22451:9;22447:18;22439:26;;22511:9;22505:4;22501:20;22497:1;22486:9;22482:17;22475:47;22539:131;22665:4;22539:131;:::i;:::-;22531:139;;22258:419;;;:::o;22683:231::-;22823:34;22819:1;22811:6;22807:14;22800:58;22892:14;22887:2;22879:6;22875:15;22868:39;22683:231;:::o;22920:366::-;23062:3;23083:67;23147:2;23142:3;23083:67;:::i;:::-;23076:74;;23159:93;23248:3;23159:93;:::i;:::-;23277:2;23272:3;23268:12;23261:19;;22920:366;;;:::o;23292:419::-;23458:4;23496:2;23485:9;23481:18;23473:26;;23545:9;23539:4;23535:20;23531:1;23520:9;23516:17;23509:47;23573:131;23699:4;23573:131;:::i;:::-;23565:139;;23292:419;;;:::o;23717:180::-;23765:77;23762:1;23755:88;23862:4;23859:1;23852:15;23886:4;23883:1;23876:15;23903:228;24043:34;24039:1;24031:6;24027:14;24020:58;24112:11;24107:2;24099:6;24095:15;24088:36;23903:228;:::o;24137:366::-;24279:3;24300:67;24364:2;24359:3;24300:67;:::i;:::-;24293:74;;24376:93;24465:3;24376:93;:::i;:::-;24494:2;24489:3;24485:12;24478:19;;24137:366;;;:::o;24509:419::-;24675:4;24713:2;24702:9;24698:18;24690:26;;24762:9;24756:4;24752:20;24748:1;24737:9;24733:17;24726:47;24790:131;24916:4;24790:131;:::i;:::-;24782:139;;24509:419;;;:::o;24934:229::-;25074:34;25070:1;25062:6;25058:14;25051:58;25143:12;25138:2;25130:6;25126:15;25119:37;24934:229;:::o;25169:366::-;25311:3;25332:67;25396:2;25391:3;25332:67;:::i;:::-;25325:74;;25408:93;25497:3;25408:93;:::i;:::-;25526:2;25521:3;25517:12;25510:19;;25169:366;;;:::o;25541:419::-;25707:4;25745:2;25734:9;25730:18;25722:26;;25794:9;25788:4;25784:20;25780:1;25769:9;25765:17;25758:47;25822:131;25948:4;25822:131;:::i;:::-;25814:139;;25541:419;;;:::o;25966:181::-;26106:33;26102:1;26094:6;26090:14;26083:57;25966:181;:::o;26153:366::-;26295:3;26316:67;26380:2;26375:3;26316:67;:::i;:::-;26309:74;;26392:93;26481:3;26392:93;:::i;:::-;26510:2;26505:3;26501:12;26494:19;;26153:366;;;:::o;26525:419::-;26691:4;26729:2;26718:9;26714:18;26706:26;;26778:9;26772:4;26768:20;26764:1;26753:9;26749:17;26742:47;26806:131;26932:4;26806:131;:::i;:::-;26798:139;;26525:419;;;:::o;26950:167::-;27090:19;27086:1;27078:6;27074:14;27067:43;26950:167;:::o;27123:366::-;27265:3;27286:67;27350:2;27345:3;27286:67;:::i;:::-;27279:74;;27362:93;27451:3;27362:93;:::i;:::-;27480:2;27475:3;27471:12;27464:19;;27123:366;;;:::o;27495:419::-;27661:4;27699:2;27688:9;27684:18;27676:26;;27748:9;27742:4;27738:20;27734:1;27723:9;27719:17;27712:47;27776:131;27902:4;27776:131;:::i;:::-;27768:139;;27495:419;;;:::o;27920:180::-;28060:32;28056:1;28048:6;28044:14;28037:56;27920:180;:::o;28106:366::-;28248:3;28269:67;28333:2;28328:3;28269:67;:::i;:::-;28262:74;;28345:93;28434:3;28345:93;:::i;:::-;28463:2;28458:3;28454:12;28447:19;;28106:366;;;:::o;28478:419::-;28644:4;28682:2;28671:9;28667:18;28659:26;;28731:9;28725:4;28721:20;28717:1;28706:9;28702:17;28695:47;28759:131;28885:4;28759:131;:::i;:::-;28751:139;;28478:419;;;:::o;28903:163::-;29043:15;29039:1;29031:6;29027:14;29020:39;28903:163;:::o;29072:366::-;29214:3;29235:67;29299:2;29294:3;29235:67;:::i;:::-;29228:74;;29311:93;29400:3;29311:93;:::i;:::-;29429:2;29424:3;29420:12;29413:19;;29072:366;;;:::o;29444:419::-;29610:4;29648:2;29637:9;29633:18;29625:26;;29697:9;29691:4;29687:20;29683:1;29672:9;29668:17;29661:47;29725:131;29851:4;29725:131;:::i;:::-;29717:139;;29444:419;;;:::o;29869:158::-;30009:10;30005:1;29997:6;29993:14;29986:34;29869:158;:::o;30033:365::-;30175:3;30196:66;30260:1;30255:3;30196:66;:::i;:::-;30189:73;;30271:93;30360:3;30271:93;:::i;:::-;30389:2;30384:3;30380:12;30373:19;;30033:365;;;:::o;30404:419::-;30570:4;30608:2;30597:9;30593:18;30585:26;;30657:9;30651:4;30647:20;30643:1;30632:9;30628:17;30621:47;30685:131;30811:4;30685:131;:::i;:::-;30677:139;;30404:419;;;:::o;30829:180::-;30969:32;30965:1;30957:6;30953:14;30946:56;30829:180;:::o;31015:366::-;31157:3;31178:67;31242:2;31237:3;31178:67;:::i;:::-;31171:74;;31254:93;31343:3;31254:93;:::i;:::-;31372:2;31367:3;31363:12;31356:19;;31015:366;;;:::o;31387:419::-;31553:4;31591:2;31580:9;31576:18;31568:26;;31640:9;31634:4;31630:20;31626:1;31615:9;31611:17;31604:47;31668:131;31794:4;31668:131;:::i;:::-;31660:139;;31387:419;;;:::o;31812:180::-;31952:32;31948:1;31940:6;31936:14;31929:56;31812:180;:::o;31998:366::-;32140:3;32161:67;32225:2;32220:3;32161:67;:::i;:::-;32154:74;;32237:93;32326:3;32237:93;:::i;:::-;32355:2;32350:3;32346:12;32339:19;;31998:366;;;:::o;32370:419::-;32536:4;32574:2;32563:9;32559:18;32551:26;;32623:9;32617:4;32613:20;32609:1;32598:9;32594:17;32587:47;32651:131;32777:4;32651:131;:::i;:::-;32643:139;;32370:419;;;:::o;32795:148::-;32897:11;32934:3;32919:18;;32795:148;;;;:::o;32949:377::-;33055:3;33083:39;33116:5;33083:39;:::i;:::-;33138:89;33220:6;33215:3;33138:89;:::i;:::-;33131:96;;33236:52;33281:6;33276:3;33269:4;33262:5;33258:16;33236:52;:::i;:::-;33313:6;33308:3;33304:16;33297:23;;33059:267;32949:377;;;;:::o;33332:155::-;33472:7;33468:1;33460:6;33456:14;33449:31;33332:155;:::o;33493:400::-;33653:3;33674:84;33756:1;33751:3;33674:84;:::i;:::-;33667:91;;33767:93;33856:3;33767:93;:::i;:::-;33885:1;33880:3;33876:11;33869:18;;33493:400;;;:::o;33899:541::-;34132:3;34154:95;34245:3;34236:6;34154:95;:::i;:::-;34147:102;;34266:148;34410:3;34266:148;:::i;:::-;34259:155;;34431:3;34424:10;;33899:541;;;;:::o;34446:225::-;34586:34;34582:1;34574:6;34570:14;34563:58;34655:8;34650:2;34642:6;34638:15;34631:33;34446:225;:::o;34677:366::-;34819:3;34840:67;34904:2;34899:3;34840:67;:::i;:::-;34833:74;;34916:93;35005:3;34916:93;:::i;:::-;35034:2;35029:3;35025:12;35018:19;;34677:366;;;:::o;35049:419::-;35215:4;35253:2;35242:9;35238:18;35230:26;;35302:9;35296:4;35292:20;35288:1;35277:9;35273:17;35266:47;35330:131;35456:4;35330:131;:::i;:::-;35322:139;;35049:419;;;:::o;35474:143::-;35531:5;35562:6;35556:13;35547:22;;35578:33;35605:5;35578:33;:::i;:::-;35474:143;;;;:::o;35623:351::-;35693:6;35742:2;35730:9;35721:7;35717:23;35713:32;35710:119;;;35748:79;;:::i;:::-;35710:119;35868:1;35893:64;35949:7;35940:6;35929:9;35925:22;35893:64;:::i;:::-;35883:74;;35839:128;35623:351;;;;:::o;35980:231::-;36120:34;36116:1;36108:6;36104:14;36097:58;36189:14;36184:2;36176:6;36172:15;36165:39;35980:231;:::o;36217:366::-;36359:3;36380:67;36444:2;36439:3;36380:67;:::i;:::-;36373:74;;36456:93;36545:3;36456:93;:::i;:::-;36574:2;36569:3;36565:12;36558:19;;36217:366;;;:::o;36589:419::-;36755:4;36793:2;36782:9;36778:18;36770:26;;36842:9;36836:4;36832:20;36828:1;36817:9;36813:17;36806:47;36870:131;36996:4;36870:131;:::i;:::-;36862:139;;36589:419;;;:::o;37014:228::-;37154:34;37150:1;37142:6;37138:14;37131:58;37223:11;37218:2;37210:6;37206:15;37199:36;37014:228;:::o;37248:366::-;37390:3;37411:67;37475:2;37470:3;37411:67;:::i;:::-;37404:74;;37487:93;37576:3;37487:93;:::i;:::-;37605:2;37600:3;37596:12;37589:19;;37248:366;;;:::o;37620:419::-;37786:4;37824:2;37813:9;37809:18;37801:26;;37873:9;37867:4;37863:20;37859:1;37848:9;37844:17;37837:47;37901:131;38027:4;37901:131;:::i;:::-;37893:139;;37620:419;;;:::o;38045:223::-;38185:34;38181:1;38173:6;38169:14;38162:58;38254:6;38249:2;38241:6;38237:15;38230:31;38045:223;:::o;38274:366::-;38416:3;38437:67;38501:2;38496:3;38437:67;:::i;:::-;38430:74;;38513:93;38602:3;38513:93;:::i;:::-;38631:2;38626:3;38622:12;38615:19;;38274:366;;;:::o;38646:419::-;38812:4;38850:2;38839:9;38835:18;38827:26;;38899:9;38893:4;38889:20;38885:1;38874:9;38870:17;38863:47;38927:131;39053:4;38927:131;:::i;:::-;38919:139;;38646:419;;;:::o;39071:191::-;39111:4;39131:20;39149:1;39131:20;:::i;:::-;39126:25;;39165:20;39183:1;39165:20;:::i;:::-;39160:25;;39204:1;39201;39198:8;39195:34;;;39209:18;;:::i;:::-;39195:34;39254:1;39251;39247:9;39239:17;;39071:191;;;;:::o;39268:305::-;39308:3;39327:20;39345:1;39327:20;:::i;:::-;39322:25;;39361:20;39379:1;39361:20;:::i;:::-;39356:25;;39515:1;39447:66;39443:74;39440:1;39437:81;39434:107;;;39521:18;;:::i;:::-;39434:107;39565:1;39562;39558:9;39551:16;;39268:305;;;;:::o;39579:348::-;39619:7;39642:20;39660:1;39642:20;:::i;:::-;39637:25;;39676:20;39694:1;39676:20;:::i;:::-;39671:25;;39864:1;39796:66;39792:74;39789:1;39786:81;39781:1;39774:9;39767:17;39763:105;39760:131;;;39871:18;;:::i;:::-;39760:131;39919:1;39916;39912:9;39901:20;;39579:348;;;;:::o;39933:175::-;40073:27;40069:1;40061:6;40057:14;40050:51;39933:175;:::o;40114:366::-;40256:3;40277:67;40341:2;40336:3;40277:67;:::i;:::-;40270:74;;40353:93;40442:3;40353:93;:::i;:::-;40471:2;40466:3;40462:12;40455:19;;40114:366;;;:::o;40486:419::-;40652:4;40690:2;40679:9;40675:18;40667:26;;40739:9;40733:4;40729:20;40725:1;40714:9;40710:17;40703:47;40767:131;40893:4;40767:131;:::i;:::-;40759:139;;40486:419;;;:::o;40911:237::-;41051:34;41047:1;41039:6;41035:14;41028:58;41120:20;41115:2;41107:6;41103:15;41096:45;40911:237;:::o;41154:366::-;41296:3;41317:67;41381:2;41376:3;41317:67;:::i;:::-;41310:74;;41393:93;41482:3;41393:93;:::i;:::-;41511:2;41506:3;41502:12;41495:19;;41154:366;;;:::o;41526:419::-;41692:4;41730:2;41719:9;41715:18;41707:26;;41779:9;41773:4;41769:20;41765:1;41754:9;41750:17;41743:47;41807:131;41933:4;41807:131;:::i;:::-;41799:139;;41526:419;;;:::o;41951:234::-;42091:34;42087:1;42079:6;42075:14;42068:58;42160:17;42155:2;42147:6;42143:15;42136:42;41951:234;:::o;42191:366::-;42333:3;42354:67;42418:2;42413:3;42354:67;:::i;:::-;42347:74;;42430:93;42519:3;42430:93;:::i;:::-;42548:2;42543:3;42539:12;42532:19;;42191:366;;;:::o;42563:419::-;42729:4;42767:2;42756:9;42752:18;42744:26;;42816:9;42810:4;42806:20;42802:1;42791:9;42787:17;42780:47;42844:131;42970:4;42844:131;:::i;:::-;42836:139;;42563:419;;;:::o;42988:435::-;43168:3;43190:95;43281:3;43272:6;43190:95;:::i;:::-;43183:102;;43302:95;43393:3;43384:6;43302:95;:::i;:::-;43295:102;;43414:3;43407:10;;42988:435;;;;;:::o;43429:98::-;43480:6;43514:5;43508:12;43498:22;;43429:98;;;:::o;43533:168::-;43616:11;43650:6;43645:3;43638:19;43690:4;43685:3;43681:14;43666:29;;43533:168;;;;:::o;43707:360::-;43793:3;43821:38;43853:5;43821:38;:::i;:::-;43875:70;43938:6;43933:3;43875:70;:::i;:::-;43868:77;;43954:52;43999:6;43994:3;43987:4;43980:5;43976:16;43954:52;:::i;:::-;44031:29;44053:6;44031:29;:::i;:::-;44026:3;44022:39;44015:46;;43797:270;43707:360;;;;:::o;44073:640::-;44268:4;44306:3;44295:9;44291:19;44283:27;;44320:71;44388:1;44377:9;44373:17;44364:6;44320:71;:::i;:::-;44401:72;44469:2;44458:9;44454:18;44445:6;44401:72;:::i;:::-;44483;44551:2;44540:9;44536:18;44527:6;44483:72;:::i;:::-;44602:9;44596:4;44592:20;44587:2;44576:9;44572:18;44565:48;44630:76;44701:4;44692:6;44630:76;:::i;:::-;44622:84;;44073:640;;;;;;;:::o;44719:141::-;44775:5;44806:6;44800:13;44791:22;;44822:32;44848:5;44822:32;:::i;:::-;44719:141;;;;:::o;44866:349::-;44935:6;44984:2;44972:9;44963:7;44959:23;44955:32;44952:119;;;44990:79;;:::i;:::-;44952:119;45110:1;45135:63;45190:7;45181:6;45170:9;45166:22;45135:63;:::i;:::-;45125:73;;45081:127;44866:349;;;;:::o;45221:180::-;45269:77;45266:1;45259:88;45366:4;45363:1;45356:15;45390:4;45387:1;45380:15;45407:185;45447:1;45464:20;45482:1;45464:20;:::i;:::-;45459:25;;45498:20;45516:1;45498:20;:::i;:::-;45493:25;;45537:1;45527:35;;45542:18;;:::i;:::-;45527:35;45584:1;45581;45577:9;45572:14;;45407:185;;;;:::o;45598:176::-;45630:1;45647:20;45665:1;45647:20;:::i;:::-;45642:25;;45681:20;45699:1;45681:20;:::i;:::-;45676:25;;45720:1;45710:35;;45725:18;;:::i;:::-;45710:35;45766:1;45763;45759:9;45754:14;;45598:176;;;;:::o;45780:182::-;45920:34;45916:1;45908:6;45904:14;45897:58;45780:182;:::o;45968:366::-;46110:3;46131:67;46195:2;46190:3;46131:67;:::i;:::-;46124:74;;46207:93;46296:3;46207:93;:::i;:::-;46325:2;46320:3;46316:12;46309:19;;45968:366;;;:::o;46340:419::-;46506:4;46544:2;46533:9;46529:18;46521:26;;46593:9;46587:4;46583:20;46579:1;46568:9;46564:17;46557:47;46621:131;46747:4;46621:131;:::i;:::-;46613:139;;46340:419;;;:::o;46765:178::-;46905:30;46901:1;46893:6;46889:14;46882:54;46765:178;:::o;46949:366::-;47091:3;47112:67;47176:2;47171:3;47112:67;:::i;:::-;47105:74;;47188:93;47277:3;47188:93;:::i;:::-;47306:2;47301:3;47297:12;47290:19;;46949:366;;;:::o;47321:419::-;47487:4;47525:2;47514:9;47510:18;47502:26;;47574:9;47568:4;47564:20;47560:1;47549:9;47545:17;47538:47;47602:131;47728:4;47602:131;:::i;:::-;47594:139;;47321:419;;;:::o;47746:180::-;47794:77;47791:1;47784:88;47891:4;47888:1;47881:15;47915:4;47912:1;47905:15

Swarm Source

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