Token Fantom Wolf Game Revival

Overview ERC-721

Total Supply:
43 BABY

Holders:
5 addresses

Profile Summary

 
Contract:
0x124242a60c20dc93e9a8a753ed251f65ca5f69d40x124242a60C20dc93E9a8A753ed251F65ca5F69D4

Balance
0 BABY
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BreedingGame

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/interfaces/IWoolf.sol



pragma solidity ^0.8.0;

// Reference to external contract
interface IWoolf is IERC721 {
    // struct to store each token's traits
    struct SheepWolf {
        bool isSheep;
        uint8 fur;
        uint8 head;
        uint8 ears;
        uint8 eyes;
        uint8 nose;
        uint8 mouth;
        uint8 neck;
        uint8 feet;
        uint8 alphaIndex;
    }

    function getPaidTokens() external view returns (uint256);

    function getTokenTraits(uint256 tokenId)
        external
        view
        returns (SheepWolf memory);
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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


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

pragma solidity ^0.8.0;


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: contracts/_ERC721PresetMinterPauserAutoId.sol


pragma solidity ^0.8.4;





contract _ERC721PresetMinterPauserAutoId is
    ERC721,
    ERC721Enumerable,
    Pausable,
    AccessControl,
    ERC721Burnable
{
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    constructor(string memory name, string memory symbol) ERC721(name, symbol) {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
    }

    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

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

    // The following functions are overrides required by Solidity.

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

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

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

// File: contracts/utils/Creatures.sol



pragma solidity ^0.8.0;


library Creatures {
    function createURIFrom(
        string[12] memory creatureAttributes,
        string[12] memory creatureImages,
        uint256 tokenId
    ) internal pure returns (string memory) {
        string memory attrJson;
        string memory attrSvg;
        (attrJson, attrSvg) = _jsonSvgFrom(creatureAttributes, creatureImages);
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    Base64.encode(
                        abi.encodePacked(
                            "{",
                            '"name" : "',
                            creatureAttributes[2],
                            " ",
                            creatureAttributes[1],
                            " #",
                            Strings.toString(tokenId),
                            '",',
                            '"description" : '
                            '"Fantom Wolf Game Revival",',
                            '"image" : "',
                            attrSvg,
                            '","attributes" : ',
                            attrJson,
                            "}"
                        )
                    )
                )
            );
    }

    function traitNames() internal pure returns (string[12] memory) {
        string[12] memory names = [
            "Gender",
            "Class",
            "Age",
            "Fur",
            "Head",
            "Ears",
            "Eyes",
            "Nose",
            "Mouth",
            "Neck",
            "Feet",
            "Alpha"
        ];
        return names;
    }

    function _jsonSvgFrom(
        string[12] memory creatureAttributes,
        string[12] memory creatureImages
    ) private pure returns (string memory, string memory) {
        string memory json = string(abi.encodePacked("["));
        string memory svg = string(
            abi.encodePacked(
                '<svg width="100%" height="100%" version="1.1" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">'
            )
        );
        for (uint8 i = 0; i < 12; i++) {
            json = string(
                abi.encodePacked(
                    json,
                    _jsonFor(_nameFor(i), creatureAttributes[i]),
                    i < 12 - 1 ? "," : "]"
                )
            );
            if (
                keccak256(abi.encodePacked(creatureImages[i])) != _emptyString()
            ) {
                svg = string(abi.encodePacked(svg, _tagFor(creatureImages[i])));
            }
        }
        svg = string(
            abi.encodePacked(
                "data:image/svg+xml;base64,",
                Base64.encode(abi.encodePacked(svg, "</svg>"))
            )
        );
        return (json, svg);
    }

    function _jsonFor(string memory trait, string memory value)
        private
        pure
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    '{ "trait_type" : "',
                    trait,
                    '", "value" : "',
                    value,
                    '" }'
                )
            );
    }

    function _nameFor(uint8 trait) private pure returns (string memory) {
        return traitNames()[trait];
    }

    function _tagFor(string memory image) private pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<image x="4" y="4" width="32" height="32" image-rendering="pixelated" preserveAspectRatio="xMidYMid" xlink:href="data:image/png;base64,',
                    image,
                    '"/>'
                )
            );
    }

    function _emptyString() private pure returns (bytes32) {
        string memory empty = "";
        return keccak256(abi.encodePacked(empty));
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: contracts/AbstractMintableCreature.sol



pragma solidity ^0.8.0;



abstract contract AbstractMintableCreature is _ERC721PresetMinterPauserAutoId {
    using Counters for Counters.Counter;

    mapping(uint256 => uint8[12]) private _creatureAttributesMap;
    Counters.Counter private _tokenIdCounter;

    function getCreatureAttributes(uint256 creatureId)
        external
        view
        returns (string[12] memory)
    {
        string[12] memory names;
        (names, ) = _getNamesImagesFor(_creatureAttributesMap[creatureId]);
        return names;
    }

    function _mintCreature(
        uint8[12] memory maleAttributes,
        uint8[12] memory femaleAttributes,
        address to
    ) internal {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _creatureAttributesMap[tokenId] = _generateCreatureAttributes(
            maleAttributes,
            femaleAttributes
        );
        _safeMint(to, tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        string[12] memory names;
        string[12] memory images;
        (names, images) = _getNamesImagesFor(_creatureAttributesMap[tokenId]);
        return Creatures.createURIFrom(names, images, tokenId);
    }

    function _getNamesImagesFor(bool sheep, uint256 trait)
        internal
        view
        virtual
        returns (string[] memory, string[] memory);

    function _generateCreatureAttributes(
        uint8[12] memory maleCreatureAttributes,
        uint8[12] memory femaleCreatureAttributes
    ) internal view virtual returns (uint8[12] memory);

    function _getNamesImagesFor(uint8[12] memory creatureAttributes)
        private
        view
        returns (string[12] memory, string[12] memory)
    {
        string[12] memory attrNames;
        string[12] memory attrImages;
        string[] memory traitNames;
        string[] memory traitImages;
        uint256 traitIndex;
        bool sheep = creatureAttributes[1] == 1 ? true : false;

        for (uint256 i = 0; i < 12; i++) {
            traitIndex = creatureAttributes[i];
            (traitNames, traitImages) = _getNamesImagesFor(sheep, i);

            assert(
                traitNames.length > traitIndex &&
                    traitImages.length > traitIndex
            );
            attrNames[i] = traitNames[traitIndex];
            attrImages[i] = traitImages[traitIndex];
        }
        return (attrNames, attrImages);
    }
}

// File: contracts/BabyCreature.sol



pragma solidity ^0.8.0;

contract BabyCreature is AbstractMintableCreature {
    string[][12] _sheepTraitNames;
    string[][12] _sheepTraitImages;
    string[][12] _wolfTraitNames;
    string[][12] _wolfTraitImages;

    constructor()
        _ERC721PresetMinterPauserAutoId("Fantom Wolf Game Revival", "BABY")
    {}

    function getTraitNames(bool sheep)
        external
        view
        returns (string[][12] memory)
    {
        return sheep ? _sheepTraitNames : _wolfTraitNames;
    }

    function getTraitImages(bool sheep)
        external
        view
        returns (string[][12] memory)
    {
        return sheep ? _sheepTraitImages : _wolfTraitImages;
    }

    function setTrait(
        bool sheep,
        uint256 trait,
        string[] memory names,
        string[] memory images
    ) external {
        if (sheep) {
            _sheepTraitNames[trait] = names;
            _sheepTraitImages[trait] = images;
        } else {
            _wolfTraitNames[trait] = names;
            _wolfTraitImages[trait] = images;
        }
    }

    function _getNamesImagesFor(bool sheep, uint256 trait)
        internal
        view
        override
        returns (string[] memory, string[] memory)
    {
        return
            sheep
                ? (_sheepTraitNames[trait], _sheepTraitImages[trait])
                : (_wolfTraitNames[trait], _wolfTraitImages[trait]);
    }

    function _generateCreatureAttributes(
        uint8[12] memory maleCreatureAttr,
        uint8[12] memory femaleCreatureAttr
    ) internal view override returns (uint8[12] memory) {
        uint256 basis = uint256(uint160(address(block.coinbase))) +
            block.number +
            block.timestamp;
        uint8[12] memory babyCreatureAttr;
        for (uint8 i = 0; i < 12; i++) {
            if (i == 2) {
                babyCreatureAttr[2] = 0;
                continue;
            }
            babyCreatureAttr[i] = _selectCreatureAttr(
                maleCreatureAttr[i],
                femaleCreatureAttr[i],
                uint8(i + 11),
                basis
            );
        }
        if (babyCreatureAttr[1] == 0) {
            babyCreatureAttr[4] = babyCreatureAttr[11];
        }
        return babyCreatureAttr;
    }

    function _selectCreatureAttr(
        uint8 maleCreatureAttr,
        uint8 femaleCreatureAttr,
        uint8 ext,
        uint256 basis
    ) private pure returns (uint8) {
        if (
            basis % (maleCreatureAttr + ext) >
            basis % (femaleCreatureAttr + ext)
        ) {
            return maleCreatureAttr;
        }
        return femaleCreatureAttr;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC721Receiver} interface.
 *
 * Accepts all token transfers.
 * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
 */
contract ERC721Holder is IERC721Receiver {
    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable is IAccessControl {
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {_grantRole} to track enumerable memberships
     */
    function _grantRole(bytes32 role, address account) internal virtual override {
        super._grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {_revokeRole} to track enumerable memberships
     */
    function _revokeRole(bytes32 role, address account) internal virtual override {
        super._revokeRole(role, account);
        _roleMembers[role].remove(account);
    }
}

// File: contracts/BreedingGame.sol



pragma solidity ^0.8.0;






contract BreedingGame is BabyCreature, ERC721Holder {
    IWoolf private _maleCreature;
    IWoolf private _femaleCreature;
    IERC20 private _milk;
    IERC20 private _wool;
    uint256 private _woolBreedPrice;
    uint256 private _milkBreedPrice;
    uint256 private _woolFee;
    uint256 private _milkFee;
    address private _feeAccount;

    constructor(
        uint256 woolBreedPrice,
        uint256 milkBreedPrice,
        uint256 woolFee,
        uint256 milkFee,
        address maleCreature,
        address femaleCreature,
        address wool,
        address milk,
        address feeAccount
    ) {
        _maleCreature = IWoolf(maleCreature);
        _femaleCreature = IWoolf(femaleCreature);
        _milk = IERC20(milk);
        _wool = IERC20(wool);
        _woolBreedPrice = woolBreedPrice;
        _milkBreedPrice = milkBreedPrice;
        _woolFee = woolFee;
        _milkFee = milkFee;
        _feeAccount = feeAccount;
    }

    function breed(uint256 maleToken, uint256 femaleToken)
        external
        whenNotPaused
    {
        require(
            _maleCreature.ownerOf(maleToken) == msg.sender &&
                _femaleCreature.ownerOf(femaleToken) == msg.sender,
            "You're not the owner of the tokens."
        );
        require(
            (_maleCreature.isApprovedForAll(msg.sender, address(this)) ||
                _maleCreature.getApproved(maleToken) == address(this)) &&
                (_femaleCreature.isApprovedForAll(msg.sender, address(this)) ||
                    _femaleCreature.getApproved(femaleToken) == address(this)),
            "Tokens aren't approved for breeding."
        );
        require(
            _wool.allowance(msg.sender, address(this)) >= _woolBreedPrice &&
                _milk.allowance(msg.sender, address(this)) >= _milkBreedPrice,
            "Resources of $milk and $wool aren't approved for breeding."
        );

        uint8[12] memory maleCreatureAttr = _getCreatureAttributes(
            maleToken,
            0
        );
        uint8[12] memory femaleCreatureAttr = _getCreatureAttributes(
            femaleToken,
            1
        );
        require(
            maleCreatureAttr[1] == femaleCreatureAttr[1],
            "The tokens aren't of the same class."
        );

        _maleCreature.safeTransferFrom(msg.sender, address(this), maleToken);
        _femaleCreature.safeTransferFrom(
            msg.sender,
            address(this),
            femaleToken
        );

        _wool.transferFrom(msg.sender, address(this), _woolBreedPrice);
        _milk.transferFrom(msg.sender, address(this), _milkBreedPrice);

        _mintCreature(maleCreatureAttr, femaleCreatureAttr, msg.sender);

        _wool.transfer(_feeAccount, _woolFee);
        _milk.transfer(_feeAccount, _milkFee);
    }

    function setMaleCreature(address maleCreature)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        _maleCreature = IWoolf(maleCreature);
    }

    function getMaleCreature() external view returns (address) {
        return address(_maleCreature);
    }

    function setFemaleCreature(address femaleCreature)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        _femaleCreature = IWoolf(femaleCreature);
    }

    function getFemaleCreature() external view returns (address) {
        return address(_femaleCreature);
    }

    function setWool(address wool) external onlyRole(DEFAULT_ADMIN_ROLE) {
        _wool = IERC20(wool);
    }

    function getWool() external view returns (address) {
        return address(_wool);
    }

    function setMilk(address milk) external onlyRole(DEFAULT_ADMIN_ROLE) {
        _milk = IERC20(milk);
    }

    function getMilk() external view returns (address) {
        return address(_milk);
    }

    function setWoolBreedPrice(uint256 woolBreedPrice)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        _woolBreedPrice = woolBreedPrice;
    }

    function getWoolBreedPrice() external view returns (uint256) {
        return _woolBreedPrice;
    }

    function setMilkBreedPrice(uint256 milkBreedPrice)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        _milkBreedPrice = milkBreedPrice;
    }

    function getMilkBreedPrice() external view returns (uint256) {
        return _milkBreedPrice;
    }

    function setWoolFee(uint256 woolFee) external onlyRole(DEFAULT_ADMIN_ROLE) {
        _woolFee = woolFee;
    }

    function getWoolFee() external view returns (uint256) {
        return _woolFee;
    }

    function setMilkFee(uint256 milkFee) external onlyRole(DEFAULT_ADMIN_ROLE) {
        _milkFee = milkFee;
    }

    function getMilkFee() external view returns (uint256) {
        return _milkFee;
    }

    function setFeeAccount(address feeAccount)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        _feeAccount = feeAccount;
    }

    function getFeeAccount() external view returns (address) {
        return _feeAccount;
    }

    function _getCreatureAttributes(uint256 creatureId, uint8 gender)
        private
        view
        returns (uint8[12] memory)
    {
        IWoolf.SheepWolf memory sheepWolf = (gender == 0)
            ? _maleCreature.getTokenTraits(creatureId)
            : _femaleCreature.getTokenTraits(creatureId);
        uint8[12] memory creatureAttributes;
        creatureAttributes[0] = gender;
        creatureAttributes[1] = sheepWolf.isSheep ? 1 : 0;
        creatureAttributes[2] = 1;
        creatureAttributes[3] = sheepWolf.fur;
        creatureAttributes[4] = sheepWolf.isSheep
            ? sheepWolf.head
            : sheepWolf.alphaIndex;
        creatureAttributes[5] = sheepWolf.ears;
        creatureAttributes[6] = sheepWolf.eyes;
        creatureAttributes[7] = sheepWolf.nose;
        creatureAttributes[8] = sheepWolf.mouth;
        creatureAttributes[9] = sheepWolf.neck;
        creatureAttributes[10] = sheepWolf.feet;
        creatureAttributes[11] = sheepWolf.alphaIndex;
        return creatureAttributes;
    }
}

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"woolBreedPrice","type":"uint256"},{"internalType":"uint256","name":"milkBreedPrice","type":"uint256"},{"internalType":"uint256","name":"woolFee","type":"uint256"},{"internalType":"uint256","name":"milkFee","type":"uint256"},{"internalType":"address","name":"maleCreature","type":"address"},{"internalType":"address","name":"femaleCreature","type":"address"},{"internalType":"address","name":"wool","type":"address"},{"internalType":"address","name":"milk","type":"address"},{"internalType":"address","name":"feeAccount","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maleToken","type":"uint256"},{"internalType":"uint256","name":"femaleToken","type":"uint256"}],"name":"breed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"creatureId","type":"uint256"}],"name":"getCreatureAttributes","outputs":[{"internalType":"string[12]","name":"","type":"string[12]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFemaleCreature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaleCreature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMilk","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMilkBreedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMilkFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"sheep","type":"bool"}],"name":"getTraitImages","outputs":[{"internalType":"string[][12]","name":"","type":"string[][12]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"sheep","type":"bool"}],"name":"getTraitNames","outputs":[{"internalType":"string[][12]","name":"","type":"string[][12]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWoolBreedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWoolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"address","name":"feeAccount","type":"address"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"femaleCreature","type":"address"}],"name":"setFemaleCreature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"maleCreature","type":"address"}],"name":"setMaleCreature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"milk","type":"address"}],"name":"setMilk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"milkBreedPrice","type":"uint256"}],"name":"setMilkBreedPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"milkFee","type":"uint256"}],"name":"setMilkFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"sheep","type":"bool"},{"internalType":"uint256","name":"trait","type":"uint256"},{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"string[]","name":"images","type":"string[]"}],"name":"setTrait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wool","type":"address"}],"name":"setWool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"woolBreedPrice","type":"uint256"}],"name":"setWoolBreedPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"woolFee","type":"uint256"}],"name":"setWoolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162004bb438038062004bb48339810160408190526200003491620002d8565b604080518082018252601881527f46616e746f6d20576f6c662047616d65205265766976616c00000000000000006020808301918252835180850190945260048452634241425960e01b90840152815191929183918391620000999160009162000215565b508051620000af90600190602084019062000215565b5050600a805460ff1916905550620000c960003362000170565b620000f57f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a3362000170565b5050603e80546001600160a01b03199081166001600160a01b0397881617909155603f80548216958716959095179094556040805485169286169290921790915560418054841692851692909217909155604296909655604394909455604492909255604555604680549092169216919091179055620003ac565b6000828152600b602090815260408083206001600160a01b038516845290915290205460ff1662000211576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001d03390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b82805462000223906200036f565b90600052602060002090601f01602090048101928262000247576000855562000292565b82601f106200026257805160ff191683800117855562000292565b8280016001018555821562000292579182015b828111156200029257825182559160200191906001019062000275565b50620002a0929150620002a4565b5090565b5b80821115620002a05760008155600101620002a5565b80516001600160a01b0381168114620002d357600080fd5b919050565b60008060008060008060008060006101208a8c031215620002f857600080fd5b8951985060208a0151975060408a0151965060608a015195506200031f60808b01620002bb565b94506200032f60a08b01620002bb565b93506200033f60c08b01620002bb565b92506200034f60e08b01620002bb565b9150620003606101008b01620002bb565b90509295985092959850929598565b600181811c908216806200038457607f821691505b60208210811415620003a657634e487b7160e01b600052602260045260246000fd5b50919050565b6147f880620003bc6000396000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c80635c975abb1161019d578063a22cb465116100e9578063d547741f116100a2578063e1894f751161007c578063e1894f751461067c578063e19992471461068f578063e63ab1e9146106a2578063e985e9c5146106c957600080fd5b8063d547741f14610645578063d9ecad7b14610658578063e0ae9ae51461066b57600080fd5b8063a22cb465146105d5578063af58aac8146105e8578063b88d4fde146105fb578063c87b56dd1461060e578063cc740dfe14610621578063cdc7076d1461063457600080fd5b80638456cb591161015657806391d148541161013057806391d148541461059f57806395d89b41146105b25780639a0f7559146105ba578063a217fddf146105cd57600080fd5b80638456cb591461058757806384a0a6541461058f5780638788e2051461059757600080fd5b80635c975abb1461052a5780636352211e1461053557806370a08231146105485780637365104d1461055b5780637396f0341461056e5780638019367a1461057657600080fd5b80632f2ff15d1161025c57806342842e0e116102155780634b023cf8116101ef5780634b023cf8146104e05780634f6ccce7146104f357806351e87d651461050657806352e68eea1461051757600080fd5b806342842e0e146104a957806342966c68146104bc5780634614be9f146104cf57600080fd5b80632f2ff15d146104425780632f745c591461045557806330695a1b1461046857806332f8f0a81461047b57806336568abe1461048e5780633f4ba83a146104a157600080fd5b8063150b7a02116102ae578063150b7a021461039857806318160ddd146103c45780631bd19763146103cc578063228cafe3146103ec57806323b872dd1461040c578063248a9ca31461041f57600080fd5b806301ffc9a7146102f657806306fdde031461031e578063081812fc14610333578063095ea7b31461035e578063110a2ded14610373578063117a2a4614610386575b600080fd5b6103096103043660046139c5565b610705565b60405190151581526020015b60405180910390f35b610326610716565b6040516103159190613a3a565b610346610341366004613a4d565b6107a8565b6040516001600160a01b039091168152602001610315565b61037161036c366004613a7b565b610842565b005b610371610381366004613aa7565b610958565b6043545b604051908152602001610315565b6103ab6103a6366004613b8d565b610987565b6040516001600160e01b03199091168152602001610315565b60085461038a565b6103df6103da366004613a4d565b610998565b6040516103159190613c0d565b6103ff6103fa366004613c69565b610a11565b6040516103159190613c86565b61037161041a366004613d17565b610b30565b61038a61042d366004613a4d565b6000908152600b602052604090206001015490565b610371610450366004613d58565b610b62565b61038a610463366004613a7b565b610b88565b6103ff610476366004613c69565b610c1e565b610371610489366004613aa7565b610d32565b61037161049c366004613d58565b610d61565b610371610ddf565b6103716104b7366004613d17565b610e15565b6103716104ca366004613a4d565b610e30565b6046546001600160a01b0316610346565b6103716104ee366004613aa7565b610ea7565b61038a610501366004613a4d565b610ed6565b603e546001600160a01b0316610346565b610371610525366004613a4d565b610f69565b600a5460ff16610309565b610346610543366004613a4d565b610f7b565b61038a610556366004613aa7565b610ff2565b610371610569366004613a4d565b611079565b60445461038a565b6041546001600160a01b0316610346565b61037161108b565b60455461038a565b60425461038a565b6103096105ad366004613d58565b6110be565b6103266110e9565b6103716105c8366004613a4d565b6110f8565b61038a600081565b6103716105e3366004613d88565b61110a565b6103716105f6366004613a4d565b611115565b610371610609366004613b8d565b611127565b61032661061c366004613a4d565b61115f565b61037161062f366004613aa7565b6111c7565b6040546001600160a01b0316610346565b610371610653366004613d58565b6111f6565b610371610666366004613db6565b61121c565b603f546001600160a01b0316610346565b61037161068a366004613e8c565b611a8d565b61037161069d366004613aa7565b611b3b565b61038a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6103096106d7366004613f00565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061071082611b6a565b92915050565b60606000805461072590613f2e565b80601f016020809104026020016040519081016040528092919081815260200182805461075190613f2e565b801561079e5780601f106107735761010080835404028352916020019161079e565b820191906000526020600020905b81548152906001019060200180831161078157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108265760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061084d82610f7b565b9050806001600160a01b0316836001600160a01b031614156108bb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161081d565b336001600160a01b03821614806108d757506108d781336106d7565b6109495760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161081d565b6109538383611b8f565b505050565b60006109648133611bfd565b50604080546001600160a01b0319166001600160a01b0392909216919091179055565b630a85bd0160e11b5b949350505050565b6109a061379c565b6109a861379c565b6000838152600c602081905260408083208151610180810192839052610a099490939192908390855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116109d15790505050505050611c61565b509392505050565b610a1961379c565b81610a25576026610a28565b600e5b60408051610180810190915290600c6000835b82821015610b2557838201805480602002602001604051908101604052809291908181526020016000905b82821015610b12578382906000526020600020018054610a8590613f2e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab190613f2e565b8015610afe5780601f10610ad357610100808354040283529160200191610afe565b820191906000526020600020905b815481529060010190602001808311610ae157829003601f168201915b505050505081526020019060010190610a66565b5050505081526020019060010190610a3b565b505050509050919050565b610b3b335b82611d7e565b610b575760405162461bcd60e51b815260040161081d90613f69565b610953838383611e71565b6000828152600b6020526040902060010154610b7e8133611bfd565b6109538383612018565b6000610b9383610ff2565b8210610bf55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161081d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c2661379c565b81610c32576032610c35565b601a5b60408051610180810190915290600c6000835b82821015610b2557838201805480602002602001604051908101604052809291908181526020016000905b82821015610d1f578382906000526020600020018054610c9290613f2e565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe90613f2e565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b505050505081526020019060010190610c73565b5050505081526020019060010190610c48565b6000610d3e8133611bfd565b50603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381163314610dd15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161081d565b610ddb828261209e565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610e0a8133611bfd565b610e12612105565b50565b61095383838360405180602001604052806000815250611127565b610e3933610b35565b610e9e5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b606482015260840161081d565b610e1281612198565b6000610eb38133611bfd565b50604680546001600160a01b0319166001600160a01b0392909216919091179055565b6000610ee160085490565b8210610f445760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161081d565b60088281548110610f5757610f57613fba565b90600052602060002001549050919050565b6000610f758133611bfd565b50604255565b6000818152600260205260408120546001600160a01b0316806107105760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161081d565b60006001600160a01b03821661105d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161081d565b506001600160a01b031660009081526003602052604090205490565b60006110858133611bfd565b50604455565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6110b68133611bfd565b610e1261223f565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606001805461072590613f2e565b60006111048133611bfd565b50604555565b610ddb338383612297565b60006111218133611bfd565b50604355565b6111313383611d7e565b61114d5760405162461bcd60e51b815260040161081d90613f69565b61115984848484612366565b50505050565b606061116961379c565b61117161379c565b6000848152600c60208181526040928390208351610180810194859052815460ff1681526111b79490939192839060019086018084116109d15790505050505050611c61565b9092509050610990828286612399565b60006111d38133611bfd565b50604180546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600b60205260409020600101546112128133611bfd565b610953838361209e565b600a5460ff161561123f5760405162461bcd60e51b815260040161081d90613fd0565b603e546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e90602401602060405180830381865afa158015611288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ac9190613ffa565b6001600160a01b03161480156113355750603f546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa158015611306573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132a9190613ffa565b6001600160a01b0316145b61138d5760405162461bcd60e51b815260206004820152602360248201527f596f75277265206e6f7420746865206f776e6572206f662074686520746f6b6560448201526237399760e91b606482015260840161081d565b603e5460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190614027565b8061147d5750603e5460405163020604bf60e21b81526004810184905230916001600160a01b03169063081812fc90602401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190613ffa565b6001600160a01b0316145b80156115745750603f5460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa1580156114d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f69190614027565b806115745750603f5460405163020604bf60e21b81526004810183905230916001600160a01b03169063081812fc90602401602060405180830381865afa158015611545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115699190613ffa565b6001600160a01b0316145b6115cc5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e73206172656e277420617070726f76656420666f7220627265656460448201526334b7339760e11b606482015260840161081d565b604254604154604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa15801561161d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116419190614044565b101580156116c25750604354604080549051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa15801561169b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bf9190614044565b10155b6117345760405162461bcd60e51b815260206004820152603a60248201527f5265736f7572636573206f6620246d696c6b20616e642024776f6f6c2061726560448201527f6e277420617070726f76656420666f72206272656564696e672e000000000000606482015260840161081d565b6000611741836000612419565b90506000611750836001612419565b9050806001602002015160ff16826001602002015160ff16146117c15760405162461bcd60e51b8152602060048201526024808201527f54686520746f6b656e73206172656e2774206f66207468652073616d6520636c60448201526330b9b99760e11b606482015260840161081d565b603e54604051632142170760e11b81526001600160a01b03909116906342842e0e906117f59033903090899060040161405d565b600060405180830381600087803b15801561180f57600080fd5b505af1158015611823573d6000803e3d6000fd5b5050603f54604051632142170760e11b81526001600160a01b0390911692506342842e0e915061185b9033903090889060040161405d565b600060405180830381600087803b15801561187557600080fd5b505af1158015611889573d6000803e3d6000fd5b50506041546042546040516323b872dd60e01b81526001600160a01b0390921693506323b872dd92506118c2913391309160040161405d565b6020604051808303816000875af11580156118e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119059190614027565b506040805460435491516323b872dd60e01b81526001600160a01b03909116916323b872dd9161193c91339130919060040161405d565b6020604051808303816000875af115801561195b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197f9190614027565b5061198b8282336125e7565b6041546046546044805460405163a9059cbb60e01b81526001600160a01b0393841660048201526024810191909152919092169163a9059cbb91016020604051808303816000875af11580156119e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a099190614027565b5060408054604654604554925163a9059cbb60e01b81526001600160a01b0391821660048201526024810193909352169063a9059cbb906044016020604051808303816000875af1158015611a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a869190614027565b5050505050565b8315611aea5781600e84600c8110611aa757611aa7613fba565b019080519060200190611abb9291906137c4565b5080601a84600c8110611ad057611ad0613fba565b019080519060200190611ae49291906137c4565b50611159565b81602684600c8110611afe57611afe613fba565b019080519060200190611b129291906137c4565b5080603284600c8110611b2757611b27613fba565b019080519060200190611a869291906137c4565b6000611b478133611bfd565b50603f80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b03198216637965db0b60e01b1480610710575061071082612633565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bc482610f7b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c0782826110be565b610ddb57611c1f816001600160a01b03166014612658565b611c2a836020612658565b604051602001611c3b92919061409d565b60408051601f198184030181529082905262461bcd60e51b825261081d91600401613a3a565b611c6961379c565b611c7161379c565b611c7961379c565b611c8161379c565b606080600080886001602002015160ff16600114611ca0576000611ca3565b60015b905060005b600c811015611d6e578981600c8110611cc357611cc3613fba565b602002015160ff169250611cd782826127fb565b8151919650945083108015611cec5750828451115b611cf857611cf8614112565b848381518110611d0a57611d0a613fba565b60200260200101518782600c8110611d2457611d24613fba565b60200201528351849084908110611d3d57611d3d613fba565b60200260200101518682600c8110611d5757611d57613fba565b602002015280611d668161413e565b915050611ca8565b5094989397509295505050505050565b6000818152600260205260408120546001600160a01b0316611df75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161081d565b6000611e0283610f7b565b9050806001600160a01b0316846001600160a01b03161480611e3d5750836001600160a01b0316611e32846107a8565b6001600160a01b0316145b8061099057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610990565b826001600160a01b0316611e8482610f7b565b6001600160a01b031614611ee85760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161081d565b6001600160a01b038216611f4a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161081d565b611f55838383612a0a565b611f60600082611b8f565b6001600160a01b0383166000908152600360205260408120805460019290611f89908490614159565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fb7908490614170565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61202282826110be565b610ddb576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561205a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6120a882826110be565b15610ddb576000828152600b602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600a5460ff1661214e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161081d565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60006121a382610f7b565b90506121b181600084612a0a565b6121bc600083611b8f565b6001600160a01b03811660009081526003602052604081208054600192906121e5908490614159565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600a5460ff16156122625760405162461bcd60e51b815260040161081d90613fd0565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861217b3390565b816001600160a01b0316836001600160a01b031614156122f95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161081d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612371848484611e71565b61237d84848484612a38565b6111595760405162461bcd60e51b815260040161081d90614188565b60608060606123a88686612b33565b604088015160208901519294509092506123ef916123c587612dbb565b84866040516020016123db9594939291906141da565b604051602081830303815290604052612eb9565b6040516020016123ff91906142f2565b604051602081830303815290604052925050509392505050565b612421613821565b600060ff83161561249f57603f546040516394e5684760e01b8152600481018690526001600160a01b03909116906394e568479060240161014060405180830381865afa158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249a9190614348565b61250d565b603e546040516394e5684760e01b8152600481018690526001600160a01b03909116906394e568479060240161014060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614348565b9050612517613821565b60ff84168152815161252a57600061252d565b60015b60ff90811660208084019190915260016040840152830151166060820152815161255c57816101200151612562565b81604001515b60ff9081166080808401919091526060840151821660a08085019190915290840151821660c08085019190915290840151821660e08085019190915290840151821661010080850191909152908401518216610120808501919091529084015190911661014083015282015181600b5b60ff9290921660209092020152949350505050565b60006125f2600d5490565b9050612602600d80546001019055565b61260c848461300d565b6000828152600c60208190526040909120612628929091613840565b5061115982826130f5565b60006001600160e01b0319821663780e9d6360e01b148061071057506107108261310f565b60606000612667836002614410565b612672906002614170565b67ffffffffffffffff81111561268a5761268a613ac4565b6040519080825280601f01601f1916602001820160405280156126b4576020820181803683370190505b509050600360fc1b816000815181106126cf576126cf613fba565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106126fe576126fe613fba565b60200101906001600160f81b031916908160001a9053506000612722846002614410565b61272d906001614170565b90505b60018111156127a5576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061276157612761613fba565b1a60f81b82828151811061277757612777613fba565b60200101906001600160f81b031916908160001a90535060049490941c9361279e8161442f565b9050612730565b5083156127f45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161081d565b9392505050565b6060808361283057602683600c811061281657612816613fba565b01603284600c811061282a5761282a613fba565b01612859565b600e83600c811061284357612843613fba565b01601a84600c811061285757612857613fba565b015b81805480602002602001604051908101604052809291908181526020016000905b8282101561292657838290600052602060002001805461289990613f2e565b80601f01602080910402602001604051908101604052809291908181526020018280546128c590613f2e565b80156129125780601f106128e757610100808354040283529160200191612912565b820191906000526020600020905b8154815290600101906020018083116128f557829003601f168201915b50505050508152602001906001019061287a565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156129f957838290600052602060002001805461296c90613f2e565b80601f016020809104026020016040519081016040528092919081815260200182805461299890613f2e565b80156129e55780601f106129ba576101008083540402835291602001916129e5565b820191906000526020600020905b8154815290600101906020018083116129c857829003601f168201915b50505050508152602001906001019061294d565b505050509050915091509250929050565b600a5460ff1615612a2d5760405162461bcd60e51b815260040161081d90613fd0565b61095383838361315f565b60006001600160a01b0384163b15612b2b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a7c903390899088908890600401614446565b6020604051808303816000875af1925050508015612ab7575060408051601f3d908101601f19168201909252612ab491810190614483565b60015b612b11573d808015612ae5576040519150601f19603f3d011682016040523d82523d6000602084013e612aea565b606091505b508051612b095760405162461bcd60e51b815260040161081d90614188565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610990565b506001610990565b6060806000604051602001612b4f90605b60f81b815260010190565b60405160208183030381529060405290506000604051602001612c20907f3c7376672077696474683d223130302522206865696768743d2231303025222081527f76657273696f6e3d22312e31222076696577426f783d2230203020343020343060208201527f2220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f60408201527f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e60608201526f37b93397989c9c9c97bc3634b735911f60811b608082015260900190565b604051602081830303815290604052905060005b600c8160ff161015612d795782612c6c612c4d83613217565b898460ff16600c8110612c6257612c62613fba565b6020020151613240565b600b8360ff1610612c9657604051806040016040528060018152602001605d60f81b815250612cb1565b604051806040016040528060018152602001600b60fa1b8152505b604051602001612cc3939291906144a0565b6040516020818303038152906040529250612cdc61326c565b868260ff16600c8110612cf157612cf1613fba565b6020020151604051602001612d0691906144e3565b6040516020818303038152906040528051906020012014612d675781612d44878360ff16600c8110612d3a57612d3a613fba565b60200201516132a6565b604051602001612d559291906144ff565b60405160208183030381529060405291505b80612d718161452e565b915050612c34565b50612d8e816040516020016123db919061454e565b604051602001612d9e9190614578565b60408051808303601f190181529190529196919550909350505050565b606081612ddf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e095780612df38161413e565b9150612e029050600a836145d3565b9150612de3565b60008167ffffffffffffffff811115612e2457612e24613ac4565b6040519080825280601f01601f191660200182016040528015612e4e576020820181803683370190505b5090505b841561099057612e63600183614159565b9150612e70600a866145e7565b612e7b906030614170565b60f81b818381518110612e9057612e90613fba565b60200101906001600160f81b031916908160001a905350612eb2600a866145d3565b9450612e52565b6060815160001415612ed957505060408051602081019091526000815290565b60006040518060600160405280604081526020016147836040913990506000600384516002612f089190614170565b612f1291906145d3565b612f1d906004614410565b67ffffffffffffffff811115612f3557612f35613ac4565b6040519080825280601f01601f191660200182016040528015612f5f576020820181803683370190505b509050600182016020820185865187015b80821015612fcb576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250612f70565b5050600386510660018114612fe75760028114612ffa57613002565b603d6001830353603d6002830353613002565b603d60018303535b509195945050505050565b613015613821565b6000426130224341614170565b61302c9190614170565b9050613036613821565b60005b600c8160ff1610156130da578060ff166002141561305d57600060408301526130c8565b6130a5868260ff16600c811061307557613075613fba565b6020020151868360ff16600c811061308f5761308f613fba565b602002015161309f84600b6145fb565b866132cf565b828260ff16600c81106130ba576130ba613fba565b60ff90921660209290920201525b806130d28161452e565b915050613039565b50602081015160ff16610990576101608101518160046125d2565b610ddb828260405180602001604052806000815250613315565b60006001600160e01b031982166380ac58cd60e01b148061314057506001600160e01b03198216635b5e139f60e01b145b8061071057506301ffc9a760e01b6001600160e01b0319831614610710565b6001600160a01b0383166131ba576131b581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6131dd565b816001600160a01b0316836001600160a01b0316146131dd576131dd8382613348565b6001600160a01b0382166131f457610953816133e5565b826001600160a01b0316826001600160a01b031614610953576109538282613494565b60606132216134d8565b8260ff16600c811061323557613235613fba565b602002015192915050565b60608282604051602001613255929190614620565b604051602081830303815290604052905092915050565b60408051602080820183526000808352925161328a918391016144e3565b6040516020818303038152906040528051906020012091505090565b6060816040516020016132b99190614698565b6040516020818303038152906040529050919050565b60006132db83856145fb565b6132e89060ff16836145e7565b6132f284876145fb565b6132ff9060ff16846145e7565b111561330c575083610990565b50919392505050565b61331f838361364e565b61332c6000848484612a38565b6109535760405162461bcd60e51b815260040161081d90614188565b6000600161335584610ff2565b61335f9190614159565b6000838152600760205260409020549091508082146133b2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906133f790600190614159565b6000838152600960205260408120546008805493945090928490811061341f5761341f613fba565b90600052602060002001549050806008838154811061344057613440613fba565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806134785761347861476c565b6001900381819060005260206000200160009055905550505050565b600061349f83610ff2565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6134e061379c565b50604080516101c081018252600661018082019081526523b2b73232b960d11b6101a0830152815281518083018352600580825264436c61737360d81b602083810191909152808401929092528351808501855260038082526241676560e81b82850152848601919091528451808601865290815262233ab960e91b818401526060840152835180850185526004808252631219585960e21b82850152608085019190915284518086018652818152634561727360e01b8185015260a085015284518086018652818152634579657360e01b8185015260c085015284518086018652818152634e6f736560e01b8185015260e0850152845180860186528281526409adeeae8d60db1b8185015261010085015284518086018652818152634e65636b60e01b8185015261012085015284518086018652908152631199595d60e21b818401526101408401528351808501909452835264416c70686160d81b9083015261016081019190915290565b6001600160a01b0382166136a45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161081d565b6000818152600260205260409020546001600160a01b0316156137095760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161081d565b61371560008383612a0a565b6001600160a01b038216600090815260036020526040812080546001929061373e908490614170565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604051806101800160405280600c905b60608152602001906001900390816137ac5790505090565b828054828255906000526020600020908101928215613811579160200282015b8281111561381157825180516138019184916020909101906138cf565b50916020019190600101906137e4565b5061381d929150613943565b5090565b604051806101800160405280600c906020820280368337509192915050565b6001830191839082156138c35791602002820160005b8382111561389457835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613856565b80156138c15782816101000a81549060ff0219169055600101602081600001049283019260010302613894565b505b5061381d929150613960565b8280546138db90613f2e565b90600052602060002090601f0160209004810192826138fd57600085556138c3565b82601f1061391657805160ff19168380011785556138c3565b828001600101855582156138c3579182015b828111156138c3578251825591602001919060010190613928565b8082111561381d5760006139578282613975565b50600101613943565b5b8082111561381d5760008155600101613961565b50805461398190613f2e565b6000825580601f10613991575050565b601f016020900490600052602060002090810190610e129190613960565b6001600160e01b031981168114610e1257600080fd5b6000602082840312156139d757600080fd5b81356127f4816139af565b60005b838110156139fd5781810151838201526020016139e5565b838111156111595750506000910152565b60008151808452613a268160208601602086016139e2565b601f01601f19169290920160200192915050565b6020815260006127f46020830184613a0e565b600060208284031215613a5f57600080fd5b5035919050565b6001600160a01b0381168114610e1257600080fd5b60008060408385031215613a8e57600080fd5b8235613a9981613a66565b946020939093013593505050565b600060208284031215613ab957600080fd5b81356127f481613a66565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff81118282101715613afe57613afe613ac4565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613b2d57613b2d613ac4565b604052919050565b600067ffffffffffffffff831115613b4f57613b4f613ac4565b613b62601f8401601f1916602001613b04565b9050828152838383011115613b7657600080fd5b828260208301376000602084830101529392505050565b60008060008060808587031215613ba357600080fd5b8435613bae81613a66565b93506020850135613bbe81613a66565b925060408501359150606085013567ffffffffffffffff811115613be157600080fd5b8501601f81018713613bf257600080fd5b613c0187823560208401613b35565b91505092959194509250565b60208082526000906101a0830183820185845b600c811015613c4f57601f19878503018352613c3d848351613a0e565b93509184019190840190600101613c20565b50919695505050505050565b8015158114610e1257600080fd5b600060208284031215613c7b57600080fd5b81356127f481613c5b565b60208082526000906101a083018382018584805b600c811015613d0a57601f1988860381018552835180518088529088019088880190600581901b89018a01865b82811015613cf357858b8303018452613ce1828651613a0e565b948c0194938c01939150600101613cc7565b509850505094870194505091850191600101613c9a565b5092979650505050505050565b600080600060608486031215613d2c57600080fd5b8335613d3781613a66565b92506020840135613d4781613a66565b929592945050506040919091013590565b60008060408385031215613d6b57600080fd5b823591506020830135613d7d81613a66565b809150509250929050565b60008060408385031215613d9b57600080fd5b8235613da681613a66565b91506020830135613d7d81613c5b565b60008060408385031215613dc957600080fd5b50508035926020909101359150565b600082601f830112613de957600080fd5b8135602067ffffffffffffffff80831115613e0657613e06613ac4565b8260051b613e15838201613b04565b9384528581018301938381019088861115613e2f57600080fd5b84880192505b85831015613e8057823584811115613e4d5760008081fd5b8801603f81018a13613e5f5760008081fd5b613e708a8783013560408401613b35565b8352509184019190840190613e35565b98975050505050505050565b60008060008060808587031215613ea257600080fd5b8435613ead81613c5b565b935060208501359250604085013567ffffffffffffffff80821115613ed157600080fd5b613edd88838901613dd8565b93506060870135915080821115613ef357600080fd5b50613c0187828801613dd8565b60008060408385031215613f1357600080fd5b8235613f1e81613a66565b91506020830135613d7d81613a66565b600181811c90821680613f4257607f821691505b60208210811415613f6357634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60006020828403121561400c57600080fd5b81516127f481613a66565b805161402281613c5b565b919050565b60006020828403121561403957600080fd5b81516127f481613c5b565b60006020828403121561405657600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600081516140938185602086016139e2565b9290920192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516140d58160178501602088016139e2565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516141068160288401602088016139e2565b01602801949350505050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561415257614152614128565b5060010190565b60008282101561416b5761416b614128565b500390565b6000821982111561418357614183614128565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b607b60f81b815269113730b6b291101d101160b11b6001820152855160009061420a81600b850160208b016139e2565b600160fd1b600b91840191820152865161422b81600c840160208b016139e2565b61202360f01b600c9290910191820152855161424e81600e840160208a016139e2565b61088b60f21b9101600e8101919091527f226465736372697074696f6e22203a202246616e746f6d20576f6c662047616d60108201526a194814995d9a5d985b088b60aa1b60308201526a1134b6b0b3b291101d101160a91b603b820152613e806142e56142df6142c26046850189614081565b70011161130ba3a3934b13aba32b991101d1607d1b815260110190565b86614081565b607d60f81b815260010190565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161432a81601d8501602087016139e2565b91909101601d0192915050565b805160ff8116811461402257600080fd5b6000610140828403121561435b57600080fd5b614363613ada565b61436c83614017565b815261437a60208401614337565b602082015261438b60408401614337565b604082015261439c60608401614337565b60608201526143ad60808401614337565b60808201526143be60a08401614337565b60a08201526143cf60c08401614337565b60c08201526143e060e08401614337565b60e08201526101006143f3818501614337565b90820152610120614405848201614337565b908201529392505050565b600081600019048311821515161561442a5761442a614128565b500290565b60008161443e5761443e614128565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061447990830184613a0e565b9695505050505050565b60006020828403121561449557600080fd5b81516127f4816139af565b600084516144b28184602089016139e2565b8451908301906144c68183602089016139e2565b84519101906144d98183602088016139e2565b0195945050505050565b600082516144f58184602087016139e2565b9190910192915050565b600083516145118184602088016139e2565b8351908301906145258183602088016139e2565b01949350505050565b600060ff821660ff81141561454557614545614128565b60010192915050565b600082516145608184602087016139e2565b651e17b9bb339f60d11b920191825250600601919050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152600082516145b081601a8501602087016139e2565b91909101601a0192915050565b634e487b7160e01b600052601260045260246000fd5b6000826145e2576145e26145bd565b500490565b6000826145f6576145f66145bd565b500690565b600060ff821660ff84168060ff0382111561461857614618614128565b019392505050565b713d90113a3930b4ba2fba3cb83291101d101160711b8152825160009061464e8160128501602088016139e2565b6d111610113b30b63ab291101d101160911b601291840191820152835161467c8160208085019088016139e2565b6222207d60e81b60209290910191820152602301949350505050565b7f3c696d61676520783d22342220793d2234222077696474683d2233322220686581527f696768743d2233322220696d6167652d72656e646572696e673d22706978656c60208201527f6174656422207072657365727665417370656374526174696f3d22784d69645960408201527f4d69642220786c696e6b3a687265663d22646174613a696d6167652f706e673b60608201526618985cd94d8d0b60ca1b6080820152600082516147528160878501602087016139e2565b6211179f60e91b6087939091019283015250608a01919050565b634e487b7160e01b600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122022ae3576c480cfc4b0208a7ee1b8ade58395c365c9433816046a5cdca00cc25f64736f6c634300080c003300000000000000000000000000000000000000000000000014d1120d7b16000000000000000000000000000000000000000000000000000022b1c8c1227a0000000000000000000000000000000000000000000000000000010a741a4627800000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000b028ec29751e8c3fae5fdfd3aa26e8082935d79e00000000000000000000000069f27fdd99a98d25600da64806230401625f92f60000000000000000000000001c9d99a1e056354ca776be0656da88f80e9d191500000000000000000000000003153623a8e4cf729fc0b6d2472373a4998c52e80000000000000000000000000a9856a4f6933d330f13a75e2d9dabc15e19334f

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

00000000000000000000000000000000000000000000000014d1120d7b16000000000000000000000000000000000000000000000000000022b1c8c1227a0000000000000000000000000000000000000000000000000000010a741a4627800000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000b028ec29751e8c3fae5fdfd3aa26e8082935d79e00000000000000000000000069f27fdd99a98d25600da64806230401625f92f60000000000000000000000001c9d99a1e056354ca776be0656da88f80e9d191500000000000000000000000003153623a8e4cf729fc0b6d2472373a4998c52e80000000000000000000000000a9856a4f6933d330f13a75e2d9dabc15e19334f

-----Decoded View---------------
Arg [0] : woolBreedPrice (uint256): 1500000000000000000
Arg [1] : milkBreedPrice (uint256): 2500000000000000000
Arg [2] : woolFee (uint256): 75000000000000000
Arg [3] : milkFee (uint256): 125000000000000000
Arg [4] : maleCreature (address): 0xb028ec29751e8c3fae5fdfd3aa26e8082935d79e
Arg [5] : femaleCreature (address): 0x69f27fdd99a98d25600da64806230401625f92f6
Arg [6] : wool (address): 0x1c9d99a1e056354ca776be0656da88f80e9d1915
Arg [7] : milk (address): 0x03153623a8e4cf729fc0b6d2472373a4998c52e8
Arg [8] : feeAccount (address): 0x0a9856a4f6933d330f13a75e2d9dabc15e19334f

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000014d1120d7b160000
Arg [1] : 00000000000000000000000000000000000000000000000022b1c8c1227a0000
Arg [2] : 000000000000000000000000000000000000000000000000010a741a46278000
Arg [3] : 00000000000000000000000000000000000000000000000001bc16d674ec8000
Arg [4] : 000000000000000000000000b028ec29751e8c3fae5fdfd3aa26e8082935d79e
Arg [5] : 00000000000000000000000069f27fdd99a98d25600da64806230401625f92f6
Arg [6] : 0000000000000000000000001c9d99a1e056354ca776be0656da88f80e9d1915
Arg [7] : 00000000000000000000000003153623a8e4cf729fc0b6d2472373a4998c52e8
Arg [8] : 0000000000000000000000000a9856a4f6933d330f13a75e2d9dabc15e19334f


Deployed ByteCode Sourcemap

93155:6224:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58261:227;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;58261:227:0;;;;;;;;23168:100;;;:::i;:::-;;;;;;;:::i;24727:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;24727:221:0;1550:203:1;24250:411:0;;;;;;:::i;:::-;;:::i;:::-;;96853:108;;;;;;:::i;:::-;;:::i;97520:102::-;97599:15;;97520:102;;;2612:25:1;;;2600:2;2585:18;97520:102:0;2466:177:1;76620:207:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;4689:33:1;;;4671:52;;4659:2;4644:18;76620:207:0;4527:202:1;38064:113:0;38152:10;:17;38064:113;;68031:267;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70718:179::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25477:339::-;;;;;;:::i;:::-;;:::i;52945:131::-;;;;;;:::i;:::-;53019:7;53046:12;;;:6;:12;;;;;:22;;;;52945:131;53338:147;;;;;;:::i;:::-;;:::i;37732:256::-;;;;;;:::i;:::-;;:::i;70905:182::-;;;;;;:::i;:::-;;:::i;96054:163::-;;;;;;:::i;:::-;;:::i;54386:218::-;;;;;;:::i;:::-;;:::i;57869:77::-;;;:::i;25887:185::-;;;;;;:::i;:::-;;:::i;57037:245::-;;;;;;:::i;:::-;;:::i;98217:94::-;98292:11;;-1:-1:-1;;;;;98292:11:0;98217:94;;98062:147;;;;;;:::i;:::-;;:::i;38254:233::-;;;;;;:::i;:::-;;:::i;96225:107::-;96310:13;;-1:-1:-1;;;;;96310:13:0;96225:107;;97068:163;;;;;;:::i;:::-;;:::i;44702:86::-;44773:7;;;;44702:86;;22862:239;;;;;;:::i;:::-;;:::i;22592:208::-;;;;;;:::i;:::-;;:::i;97630:112::-;;;;;;:::i;:::-;;:::i;97750:88::-;97822:8;;97750:88;;96754:91;96831:5;;-1:-1:-1;;;;;96831:5:0;96754:91;;57788:73;;;:::i;97966:88::-;98038:8;;97966:88;;97239:102;97318:15;;97239:102;;51814:147;;;;;;:::i;:::-;;:::i;23337:104::-;;;:::i;97846:112::-;;;;;;:::i;:::-;;:::i;50905:49::-;;50950:4;50905:49;;25020:155;;;;;;:::i;:::-;;:::i;97349:163::-;;;;;;:::i;:::-;;:::i;26143:328::-;;;;;;:::i;:::-;;:::i;68736:343::-;;;;;;:::i;:::-;;:::i;96638:108::-;;;;;;:::i;:::-;;:::i;96969:91::-;97046:5;;-1:-1:-1;;;;;97046:5:0;96969:91;;53730:149;;;;;;:::i;:::-;;:::i;94145:1901::-;;;;;;:::i;:::-;;:::i;96519:111::-;96606:15;;-1:-1:-1;;;;;96606:15:0;96519:111;;71095:389;;;;;;:::i;:::-;;:::i;96340:171::-;;;;;;:::i;:::-;;:::i;57527:62::-;;57565:24;57527:62;;25246:164;;;;;;:::i;:::-;-1:-1:-1;;;;;25367:25:0;;;25343:4;25367:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25246:164;58261:227;58415:4;58444:36;58468:11;58444:23;:36::i;:::-;58437:43;58261:227;-1:-1:-1;;58261:227:0:o;23168:100::-;23222:13;23255:5;23248:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23168:100;:::o;24727:221::-;24803:7;28070:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28070:16:0;24823:73;;;;-1:-1:-1;;;24823:73:0;;11923:2:1;24823:73:0;;;11905:21:1;11962:2;11942:18;;;11935:30;12001:34;11981:18;;;11974:62;-1:-1:-1;;;12052:18:1;;;12045:42;12104:19;;24823:73:0;;;;;;;;;-1:-1:-1;24916:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24916:24:0;;24727:221::o;24250:411::-;24331:13;24347:23;24362:7;24347:14;:23::i;:::-;24331:39;;24395:5;-1:-1:-1;;;;;24389:11:0;:2;-1:-1:-1;;;;;24389:11:0;;;24381:57;;;;-1:-1:-1;;;24381:57:0;;12336:2:1;24381:57:0;;;12318:21:1;12375:2;12355:18;;;12348:30;12414:34;12394:18;;;12387:62;-1:-1:-1;;;12465:18:1;;;12458:31;12506:19;;24381:57:0;12134:397:1;24381:57:0;17533:10;-1:-1:-1;;;;;24473:21:0;;;;:62;;-1:-1:-1;24498:37:0;24515:5;17533:10;25246:164;:::i;24498:37::-;24451:168;;;;-1:-1:-1;;;24451:168:0;;12738:2:1;24451:168:0;;;12720:21:1;12777:2;12757:18;;;12750:30;12816:34;12796:18;;;12789:62;12887:26;12867:18;;;12860:54;12931:19;;24451:168:0;12536:420:1;24451:168:0;24632:21;24641:2;24645:7;24632:8;:21::i;:::-;24320:341;24250:411;;:::o;96853:108::-;50950:4;51396:30;50950:4;17533:10;51396;:30::i;:::-;-1:-1:-1;96933:5:0::1;:20:::0;;-1:-1:-1;;;;;;96933:20:0::1;-1:-1:-1::0;;;;;96933:20:0;;;::::1;::::0;;;::::1;::::0;;96853:108::o;76620:207::-;-1:-1:-1;;;76620:207:0;;;;;;;:::o;68031:267::-;68132:17;;:::i;:::-;68167:23;;:::i;:::-;68232:34;;;;:22;:34;;;;;;;;68213:54;;;;;;;;;;;;;68232:34;;68213:54;68232:34;;68213:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:54::i;:::-;-1:-1:-1;68201:66:0;68031:267;-1:-1:-1;;;68031:267:0:o;70718:179::-;70803:19;;:::i;:::-;70847:5;:42;;70874:15;70847:42;;;70855:16;70847:42;70840:49;;;;;;;;;;;-1:-1:-1;70840:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70718:179;;;:::o;25477:339::-;25672:41;17533:10;25691:12;25705:7;25672:18;:41::i;:::-;25664:103;;;;-1:-1:-1;;;25664:103:0;;;;;;;:::i;:::-;25780:28;25790:4;25796:2;25800:7;25780:9;:28::i;53338:147::-;53019:7;53046:12;;;:6;:12;;;;;:22;;;51396:30;51407:4;17533:10;51396;:30::i;:::-;53452:25:::1;53463:4;53469:7;53452:10;:25::i;37732:256::-:0;37829:7;37865:23;37882:5;37865:16;:23::i;:::-;37857:5;:31;37849:87;;;;-1:-1:-1;;;37849:87:0;;13581:2:1;37849:87:0;;;13563:21:1;13620:2;13600:18;;;13593:30;13659:34;13639:18;;;13632:62;-1:-1:-1;;;13710:18:1;;;13703:41;13761:19;;37849:87:0;13379:407:1;37849:87:0;-1:-1:-1;;;;;;37954:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37732:256::o;70905:182::-;70991:19;;:::i;:::-;71035:5;:44;;71063:16;71035:44;;;71043:17;71035:44;71028:51;;;;;;;;;;;-1:-1:-1;71028:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96054:163;50950:4;51396:30;50950:4;17533:10;51396;:30::i;:::-;-1:-1:-1;96173:13:0::1;:36:::0;;-1:-1:-1;;;;;;96173:36:0::1;-1:-1:-1::0;;;;;96173:36:0;;;::::1;::::0;;;::::1;::::0;;96054:163::o;54386:218::-;-1:-1:-1;;;;;54482:23:0;;17533:10;54482:23;54474:83;;;;-1:-1:-1;;;54474:83:0;;13993:2:1;54474:83:0;;;13975:21:1;14032:2;14012:18;;;14005:30;14071:34;14051:18;;;14044:62;-1:-1:-1;;;14122:18:1;;;14115:45;14177:19;;54474:83:0;13791:411:1;54474:83:0;54570:26;54582:4;54588:7;54570:11;:26::i;:::-;54386:218;;:::o;57869:77::-;57565:24;51396:30;57565:24;17533:10;51396;:30::i;:::-;57928:10:::1;:8;:10::i;:::-;57869:77:::0;:::o;25887:185::-;26025:39;26042:4;26048:2;26052:7;26025:39;;;;;;;;;;;;:16;:39::i;57037:245::-;57155:41;17533:10;57174:12;17453:98;57155:41;57147:102;;;;-1:-1:-1;;;57147:102:0;;14409:2:1;57147:102:0;;;14391:21:1;14448:2;14428:18;;;14421:30;14487:34;14467:18;;;14460:62;-1:-1:-1;;;14538:18:1;;;14531:46;14594:19;;57147:102:0;14207:412:1;57147:102:0;57260:14;57266:7;57260:5;:14::i;98062:147::-;50950:4;51396:30;50950:4;17533:10;51396;:30::i;:::-;-1:-1:-1;98177:11:0::1;:24:::0;;-1:-1:-1;;;;;;98177:24:0::1;-1:-1:-1::0;;;;;98177:24:0;;;::::1;::::0;;;::::1;::::0;;98062:147::o;38254:233::-;38329:7;38365:30;38152:10;:17;;38064:113;38365:30;38357:5;:38;38349:95;;;;-1:-1:-1;;;38349:95:0;;14826:2:1;38349:95:0;;;14808:21:1;14865:2;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;-1:-1:-1;;;14955:18:1;;;14948:42;15007:19;;38349:95:0;14624:408:1;38349:95:0;38462:10;38473:5;38462:17;;;;;;;;:::i;:::-;;;;;;;;;38455:24;;38254:233;;;:::o;97068:163::-;50950:4;51396:30;50950:4;17533:10;51396;:30::i;:::-;-1:-1:-1;97191:15:0::1;:32:::0;97068:163::o;22862:239::-;22934:7;22970:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22970:16:0;23005:19;22997:73;;;;-1:-1:-1;;;22997:73:0;;15371:2:1;22997:73:0;;;15353:21:1;15410:2;15390:18;;;15383:30;15449:34;15429:18;;;15422:62;-1:-1:-1;;;15500:18:1;;;15493:39;15549:19;;22997:73:0;15169:405:1;22592:208:0;22664:7;-1:-1:-1;;;;;22692:19:0;;22684:74;;;;-1:-1:-1;;;22684:74:0;;15781:2:1;22684:74:0;;;15763:21:1;15820:2;15800:18;;;15793:30;15859:34;15839:18;;;15832:62;-1:-1:-1;;;15910:18:1;;;15903:40;15960:19;;22684:74:0;15579:406:1;22684:74:0;-1:-1:-1;;;;;;22776:16:0;;;;;:9;:16;;;;;;;22592:208::o;97630:112::-;50950:4;51396:30;50950:4;17533:10;51396;:30::i;:::-;-1:-1:-1;97716:8:0::1;:18:::0;97630:112::o;57788:73::-;57565:24;51396:30;57565:24;17533:10;51396;:30::i;:::-;57845:8:::1;:6;:8::i;51814:147::-:0;51900:4;51924:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;51924:29:0;;;;;;;;;;;;;;;51814:147::o;23337:104::-;23393:13;23426:7;23419:14;;;;;:::i;97846:112::-;50950:4;51396:30;50950:4;17533:10;51396;:30::i;:::-;-1:-1:-1;97932:8:0::1;:18:::0;97846:112::o;25020:155::-;25115:52;17533:10;25148:8;25158;25115:18;:52::i;97349:163::-;50950:4;51396:30;50950:4;17533:10;51396;:30::i;:::-;-1:-1:-1;97472:15:0::1;:32:::0;97349:163::o;26143:328::-;26318:41;17533:10;26351:7;26318:18;:41::i;:::-;26310:103;;;;-1:-1:-1;;;26310:103:0;;;;;;;:::i;:::-;26424:39;26438:4;26444:2;26448:7;26457:5;26424:13;:39::i;:::-;26143:328;;;;:::o;68736:343::-;68837:13;68868:23;;:::i;:::-;68902:24;;:::i;:::-;68974:31;;;;:22;:31;;;;;;;;;68955:51;;;;;;;;;;;;;;;;;;;68974:31;;;;68955:51;;;;;;;;;;;;;;;;:18;:51::i;:::-;68937:69;;-1:-1:-1;68937:69:0;-1:-1:-1;69024:47:0;68937:69;;69063:7;69024:23;:47::i;96638:108::-;50950:4;51396:30;50950:4;17533:10;51396;:30::i;:::-;-1:-1:-1;96718:5:0::1;:20:::0;;-1:-1:-1;;;;;;96718:20:0::1;-1:-1:-1::0;;;;;96718:20:0;;;::::1;::::0;;;::::1;::::0;;96638:108::o;53730:149::-;53019:7;53046:12;;;:6;:12;;;;;:22;;;51396:30;51407:4;17533:10;51396;:30::i;:::-;53845:26:::1;53857:4;53863:7;53845:11;:26::i;94145:1901::-:0;44773:7;;;;45027:9;45019:38;;;;-1:-1:-1;;;45019:38:0;;;;;;;:::i;:::-;94279:13:::1;::::0;:32:::1;::::0;-1:-1:-1;;;94279:32:0;;::::1;::::0;::::1;2612:25:1::0;;;94315:10:0::1;::::0;-1:-1:-1;;;;;94279:13:0::1;::::0;:21:::1;::::0;2585:18:1;;94279:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;94279:46:0::1;;:117;;;;-1:-1:-1::0;94346:15:0::1;::::0;:36:::1;::::0;-1:-1:-1;;;94346:36:0;;::::1;::::0;::::1;2612:25:1::0;;;94386:10:0::1;::::0;-1:-1:-1;;;;;94346:15:0::1;::::0;:23:::1;::::0;2585:18:1;;94346:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;94346:50:0::1;;94279:117;94257:202;;;::::0;-1:-1:-1;;;94257:202:0;;16793:2:1;94257:202:0::1;::::0;::::1;16775:21:1::0;16832:2;16812:18;;;16805:30;16871:34;16851:18;;;16844:62;-1:-1:-1;;;16922:18:1;;;16915:33;16965:19;;94257:202:0::1;16591:399:1::0;94257:202:0::1;94493:13;::::0;:57:::1;::::0;-1:-1:-1;;;94493:57:0;;94524:10:::1;94493:57;::::0;::::1;17207:34:1::0;94544:4:0::1;17257:18:1::0;;;17250:43;-1:-1:-1;;;;;94493:13:0;;::::1;::::0;:30:::1;::::0;17142:18:1;;94493:57:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:131;;;-1:-1:-1::0;94571:13:0::1;::::0;:36:::1;::::0;-1:-1:-1;;;94571:36:0;;::::1;::::0;::::1;2612:25:1::0;;;94619:4:0::1;::::0;-1:-1:-1;;;;;94571:13:0::1;::::0;:25:::1;::::0;2585:18:1;;94571:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;94571:53:0::1;;94493:131;94492:297;;;;-1:-1:-1::0;94647:15:0::1;::::0;:59:::1;::::0;-1:-1:-1;;;94647:59:0;;94680:10:::1;94647:59;::::0;::::1;17207:34:1::0;94700:4:0::1;17257:18:1::0;;;17250:43;-1:-1:-1;;;;;94647:15:0;;::::1;::::0;:32:::1;::::0;17142:18:1;;94647:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:141;;;-1:-1:-1::0;94731:15:0::1;::::0;:40:::1;::::0;-1:-1:-1;;;94731:40:0;;::::1;::::0;::::1;2612:25:1::0;;;94783:4:0::1;::::0;-1:-1:-1;;;;;94731:15:0::1;::::0;:27:::1;::::0;2585:18:1;;94731:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;94731:57:0::1;;94647:141;94470:383;;;::::0;-1:-1:-1;;;94470:383:0;;17893:2:1;94470:383:0::1;::::0;::::1;17875:21:1::0;17932:2;17912:18;;;17905:30;17971:34;17951:18;;;17944:62;-1:-1:-1;;;18022:18:1;;;18015:34;18066:19;;94470:383:0::1;17691:400:1::0;94470:383:0::1;94932:15;::::0;94886:5:::1;::::0;:42:::1;::::0;-1:-1:-1;;;94886:42:0;;94902:10:::1;94886:42;::::0;::::1;17207:34:1::0;94922:4:0::1;17257:18:1::0;;;17250:43;-1:-1:-1;;;;;94886:5:0;;::::1;::::0;:15:::1;::::0;17142:18:1;;94886:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;:143;;;;-1:-1:-1::0;95014:15:0::1;::::0;94968:5:::1;::::0;;:42;;-1:-1:-1;;;94968:42:0;;94984:10:::1;94968:42;::::0;::::1;17207:34:1::0;95004:4:0::1;17257:18:1::0;;;17250:43;-1:-1:-1;;;;;94968:5:0;;::::1;::::0;:15:::1;::::0;17142:18:1;;94968:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;94886:143;94864:251;;;::::0;-1:-1:-1;;;94864:251:0;;18487:2:1;94864:251:0::1;::::0;::::1;18469:21:1::0;18526:2;18506:18;;;18499:30;18565:34;18545:18;;;18538:62;18636:28;18616:18;;;18609:56;18682:19;;94864:251:0::1;18285:422:1::0;94864:251:0::1;95128:33;95164:73;95201:9;95225:1;95164:22;:73::i;:::-;95128:109;;95248:35;95286:75;95323:11;95349:1;95286:22;:75::i;:::-;95248:113:::0;-1:-1:-1;95248:113:0;95436:1:::1;95417:21;;;::::0;95394:44:::1;;:16:::0;95411:1:::1;95394:19;;;;:44;;;95372:130;;;::::0;-1:-1:-1;;;95372:130:0;;18914:2:1;95372:130:0::1;::::0;::::1;18896:21:1::0;18953:2;18933:18;;;18926:30;18992:34;18972:18;;;18965:62;-1:-1:-1;;;19043:18:1;;;19036:34;19087:19;;95372:130:0::1;18712:400:1::0;95372:130:0::1;95515:13;::::0;:68:::1;::::0;-1:-1:-1;;;95515:68:0;;-1:-1:-1;;;;;95515:13:0;;::::1;::::0;:30:::1;::::0;:68:::1;::::0;95546:10:::1;::::0;95566:4:::1;::::0;95573:9;;95515:68:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;95594:15:0::1;::::0;:122:::1;::::0;-1:-1:-1;;;95594:122:0;;-1:-1:-1;;;;;95594:15:0;;::::1;::::0;-1:-1:-1;95594:32:0::1;::::0;-1:-1:-1;95594:122:0::1;::::0;95641:10:::1;::::0;95674:4:::1;::::0;95694:11;;95594:122:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;95729:5:0::1;::::0;95775:15:::1;::::0;95729:62:::1;::::0;-1:-1:-1;;;95729:62:0;;-1:-1:-1;;;;;95729:5:0;;::::1;::::0;-1:-1:-1;95729:18:0::1;::::0;-1:-1:-1;95729:62:0::1;::::0;95748:10:::1;::::0;95768:4:::1;::::0;95729:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;95802:5:0::1;::::0;;95848:15:::1;::::0;95802:62;;-1:-1:-1;;;95802:62:0;;-1:-1:-1;;;;;95802:5:0;;::::1;::::0;:18:::1;::::0;:62:::1;::::0;95821:10:::1;::::0;95841:4:::1;::::0;95848:15;95802:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;95877:63;95891:16;95909:18;95929:10;95877:13;:63::i;:::-;95953:5;::::0;95968:11:::1;::::0;95981:8:::1;::::0;;95953:37:::1;::::0;-1:-1:-1;;;95953:37:0;;-1:-1:-1;;;;;95968:11:0;;::::1;95953:37;::::0;::::1;19671:51:1::0;19738:18;;;19731:34;;;;95953:5:0;;;::::1;::::0;:14:::1;::::0;19644:18:1;95953:37:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;96001:5:0::1;::::0;;96016:11:::1;::::0;96029:8:::1;::::0;96001:37;;-1:-1:-1;;;96001:37:0;;-1:-1:-1;;;;;96016:11:0;;::::1;96001:37;::::0;::::1;19671:51:1::0;19738:18;;;19731:34;;;;96001:5:0::1;::::0;:14:::1;::::0;19644:18:1;;96001:37:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;94246:1800;;94145:1901:::0;;:::o;71095:389::-;71254:5;71250:227;;;71302:5;71276:16;71293:5;71276:23;;;;;;;:::i;:::-;;:31;;;;;;;;;;;;:::i;:::-;;71349:6;71322:17;71340:5;71322:24;;;;;;;:::i;:::-;;:33;;;;;;;;;;;;:::i;:::-;;71250:227;;;71413:5;71388:15;71404:5;71388:22;;;;;;;:::i;:::-;;:30;;;;;;;;;;;;:::i;:::-;;71459:6;71433:16;71450:5;71433:23;;;;;;;:::i;:::-;;:32;;;;;;;;;;;;:::i;96340:171::-;50950:4;51396:30;50950:4;17533:10;51396;:30::i;:::-;-1:-1:-1;96463:15:0::1;:40:::0;;-1:-1:-1;;;;;;96463:40:0::1;-1:-1:-1::0;;;;;96463:40:0;;;::::1;::::0;;;::::1;::::0;;96340:171::o;51518:204::-;51603:4;-1:-1:-1;;;;;;51627:47:0;;-1:-1:-1;;;51627:47:0;;:87;;;51678:36;51702:11;51678:23;:36::i;32127:174::-;32202:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32202:29:0;-1:-1:-1;;;;;32202:29:0;;;;;;;;:24;;32256:23;32202:24;32256:14;:23::i;:::-;-1:-1:-1;;;;;32247:46:0;;;;;;;;;;;32127:174;;:::o;52251:505::-;52340:22;52348:4;52354:7;52340;:22::i;:::-;52335:414;;52528:41;52556:7;-1:-1:-1;;;;;52528:41:0;52566:2;52528:19;:41::i;:::-;52642:38;52670:4;52677:2;52642:19;:38::i;:::-;52433:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52433:270:0;;;;;;;;;;-1:-1:-1;;;52379:358:0;;;;;;;:::i;69454:878::-;69568:17;;:::i;:::-;69587;;:::i;:::-;69622:27;;:::i;:::-;69660:28;;:::i;:::-;69699:26;;69774:18;;69816;69835:1;69816:21;;;;:26;;69841:1;69816:26;:41;;69852:5;69816:41;;;69845:4;69816:41;69803:54;;69875:9;69870:414;69894:2;69890:1;:6;69870:414;;;69931:18;69950:1;69931:21;;;;;;;:::i;:::-;;;;;69918:34;;;;69995:28;70014:5;70021:1;69995:18;:28::i;:::-;70065:17;;69967:56;;-1:-1:-1;69967:56:0;-1:-1:-1;70065:30:0;-1:-1:-1;70065:86:0;;;;;70141:10;70120:11;:18;:31;70065:86;70040:126;;;;:::i;:::-;70196:10;70207;70196:22;;;;;;;;:::i;:::-;;;;;;;70181:9;70191:1;70181:12;;;;;;;:::i;:::-;;;;:37;70249:23;;:11;;70261:10;;70249:23;;;;;;:::i;:::-;;;;;;;70233:10;70244:1;70233:13;;;;;;;:::i;:::-;;;;:39;69898:3;;;;:::i;:::-;;;;69870:414;;;-1:-1:-1;70302:9:0;;70313:10;;-1:-1:-1;69454:878:0;;-1:-1:-1;;;;;;69454:878:0:o;28275:348::-;28368:4;28070:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28070:16:0;28385:73;;;;-1:-1:-1;;;28385:73:0;;21363:2:1;28385:73:0;;;21345:21:1;21402:2;21382:18;;;21375:30;21441:34;21421:18;;;21414:62;-1:-1:-1;;;21492:18:1;;;21485:42;21544:19;;28385:73:0;21161:408:1;28385:73:0;28469:13;28485:23;28500:7;28485:14;:23::i;:::-;28469:39;;28538:5;-1:-1:-1;;;;;28527:16:0;:7;-1:-1:-1;;;;;28527:16:0;;:51;;;;28571:7;-1:-1:-1;;;;;28547:31:0;:20;28559:7;28547:11;:20::i;:::-;-1:-1:-1;;;;;28547:31:0;;28527:51;:87;;;-1:-1:-1;;;;;;25367:25:0;;;25343:4;25367:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28582:32;25246:164;31384:625;31543:4;-1:-1:-1;;;;;31516:31:0;:23;31531:7;31516:14;:23::i;:::-;-1:-1:-1;;;;;31516:31:0;;31508:81;;;;-1:-1:-1;;;31508:81:0;;21776:2:1;31508:81:0;;;21758:21:1;21815:2;21795:18;;;21788:30;21854:34;21834:18;;;21827:62;-1:-1:-1;;;21905:18:1;;;21898:35;21950:19;;31508:81:0;21574:401:1;31508:81:0;-1:-1:-1;;;;;31608:16:0;;31600:65;;;;-1:-1:-1;;;31600:65:0;;22182:2:1;31600:65:0;;;22164:21:1;22221:2;22201:18;;;22194:30;22260:34;22240:18;;;22233:62;-1:-1:-1;;;22311:18:1;;;22304:34;22355:19;;31600:65:0;21980:400:1;31600:65:0;31678:39;31699:4;31705:2;31709:7;31678:20;:39::i;:::-;31782:29;31799:1;31803:7;31782:8;:29::i;:::-;-1:-1:-1;;;;;31824:15:0;;;;;;:9;:15;;;;;:20;;31843:1;;31824:15;:20;;31843:1;;31824:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31855:13:0;;;;;;:9;:13;;;;;:18;;31872:1;;31855:13;:18;;31872:1;;31855:18;:::i;:::-;;;;-1:-1:-1;;31884:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31884:21:0;-1:-1:-1;;;;;31884:21:0;;;;;;;;;31923:27;;31884:16;;31923:27;;;;;;;24320:341;24250:411;;:::o;55887:238::-;55971:22;55979:4;55985:7;55971;:22::i;:::-;55966:152;;56010:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;56010:29:0;;;;;;;;;:36;;-1:-1:-1;;56010:36:0;56042:4;56010:36;;;56093:12;17533:10;;17453:98;56093:12;-1:-1:-1;;;;;56066:40:0;56084:7;-1:-1:-1;;;;;56066:40:0;56078:4;56066:40;;;;;;;;;;55887:238;;:::o;56257:239::-;56341:22;56349:4;56355:7;56341;:22::i;:::-;56337:152;;;56412:5;56380:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;56380:29:0;;;;;;;;;;:37;;-1:-1:-1;;56380:37:0;;;56437:40;17533:10;;56380:12;;56437:40;;56412:5;56437:40;56257:239;;:::o;45761:120::-;44773:7;;;;45297:41;;;;-1:-1:-1;;;45297:41:0;;22850:2:1;45297:41:0;;;22832:21:1;22889:2;22869:18;;;22862:30;-1:-1:-1;;;22908:18:1;;;22901:50;22968:18;;45297:41:0;22648:344:1;45297:41:0;45820:7:::1;:15:::0;;-1:-1:-1;;45820:15:0::1;::::0;;45851:22:::1;17533:10:::0;45860:12:::1;45851:22;::::0;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;45851:22:0::1;;;;;;;45761:120::o:0;30627:420::-;30687:13;30703:23;30718:7;30703:14;:23::i;:::-;30687:39;;30739:48;30760:5;30775:1;30779:7;30739:20;:48::i;:::-;30828:29;30845:1;30849:7;30828:8;:29::i;:::-;-1:-1:-1;;;;;30870:16:0;;;;;;:9;:16;;;;;:21;;30890:1;;30870:16;:21;;30890:1;;30870:21;:::i;:::-;;;;-1:-1:-1;;30909:16:0;;;;:7;:16;;;;;;30902:23;;-1:-1:-1;;;;;;30902:23:0;;;30943:36;30917:7;;30909:16;-1:-1:-1;;;;;30943:36:0;;;;;30909:16;;30943:36;54386:218;;:::o;45502:118::-;44773:7;;;;45027:9;45019:38;;;;-1:-1:-1;;;45019:38:0;;;;;;;:::i;:::-;45562:7:::1;:14:::0;;-1:-1:-1;;45562:14:0::1;45572:4;45562:14;::::0;;45592:20:::1;45599:12;17533:10:::0;;17453:98;32443:315;32598:8;-1:-1:-1;;;;;32589:17:0;:5;-1:-1:-1;;;;;32589:17:0;;;32581:55;;;;-1:-1:-1;;;32581:55:0;;23199:2:1;32581:55:0;;;23181:21:1;23238:2;23218:18;;;23211:30;23277:27;23257:18;;;23250:55;23322:18;;32581:55:0;22997:349:1;32581:55:0;-1:-1:-1;;;;;32647:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32647:46:0;;;;;;;;;;32709:41;;540::1;;;32709::0;;513:18:1;32709:41:0;;;;;;;32443:315;;;:::o;27353:::-;27510:28;27520:4;27526:2;27530:7;27510:9;:28::i;:::-;27557:48;27580:4;27586:2;27590:7;27599:5;27557:22;:48::i;:::-;27549:111;;;;-1:-1:-1;;;27549:111:0;;;;;;;:::i;62201:1281::-;62370:13;62396:22;62429:21;62483:48;62496:18;62516:14;62483:12;:48::i;:::-;62844:21;;;;;62930;;;62461:70;;-1:-1:-1;62461:70:0;;-1:-1:-1;62680:760:0;;63017:25;63034:7;63017:16;:25::i;:::-;63260:7;63348:8;62720:697;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62680:13;:760::i;:::-;62587:872;;;;;;;;:::i;:::-;;;;;;;;;;;;;62542:932;;;;62201:1281;;;;;:::o;98319:1057::-;98434:16;;:::i;:::-;98468:33;98505:11;;;;98504:127;;98589:15;;:42;;-1:-1:-1;;;98589:42:0;;;;;2612:25:1;;;-1:-1:-1;;;;;98589:15:0;;;;:30;;2585:18:1;;98589:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98504:127;;;98533:13;;:40;;-1:-1:-1;;;98533:40:0;;;;;2612:25:1;;;-1:-1:-1;;;;;98533:13:0;;;;:28;;2585:18:1;;98533:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98468:163;;98642:35;;:::i;:::-;98688:30;;;;;98753:17;;:25;;98777:1;98753:25;;;98773:1;98753:25;98729:49;;;;:21;;;;:49;;;;98748:1;98789:21;;;:25;98849:13;;;98825:37;:21;;;:37;98897:17;;:83;;98960:9;:20;;;98897:83;;;98930:9;:14;;;98897:83;98873:107;;;;:21;;;;:107;;;;99015:14;;;;98991:38;;:21;;;;:38;;;;99064:14;;;;99040:38;;:21;;;;:38;;;;99113:14;;;;99089:38;;:21;;;;:38;;;;99162:15;;;;99138:39;;:21;;;;:39;;;;99212:14;;;;99188:38;;:21;;;;:38;;;;99262:14;;;;99237:39;;;:22;;;:39;99312:20;;;98873:18;99306:2;99287:22;:45;;;;;:22;;;;;:45;99350:18;98319:1057;-1:-1:-1;;;;98319:1057:0:o;68306:422::-;68463:15;68481:25;:15;67199:14;;67107:114;68481:25;68463:43;;68517:27;:15;67318:19;;67336:1;67318:19;;;67229:127;68517:27;68589:98;68631:14;68660:16;68589:27;:98::i;:::-;68555:31;;;;:22;:31;;;;;;;;:132;;:31;;:132;:::i;:::-;;68698:22;68708:2;68712:7;68698:9;:22::i;37424:224::-;37526:4;-1:-1:-1;;;;;;37550:50:0;;-1:-1:-1;;;37550:50:0;;:90;;;37604:36;37628:11;37604:23;:36::i;19333:451::-;19408:13;19434:19;19466:10;19470:6;19466:1;:10;:::i;:::-;:14;;19479:1;19466:14;:::i;:::-;19456:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19456:25:0;;19434:47;;-1:-1:-1;;;19492:6:0;19499:1;19492:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;19492:15:0;;;;;;;;;-1:-1:-1;;;19518:6:0;19525:1;19518:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;19518:15:0;;;;;;;;-1:-1:-1;19549:9:0;19561:10;19565:6;19561:1;:10;:::i;:::-;:14;;19574:1;19561:14;:::i;:::-;19549:26;;19544:135;19581:1;19577;:5;19544:135;;;-1:-1:-1;;;19629:5:0;19637:3;19629:11;19616:25;;;;;;;:::i;:::-;;;;19604:6;19611:1;19604:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;19604:37:0;;;;;;;;-1:-1:-1;19666:1:0;19656:11;;;;;19584:3;;;:::i;:::-;;;19544:135;;;-1:-1:-1;19697:10:0;;19689:55;;;;-1:-1:-1;;;19689:55:0;;28637:2:1;19689:55:0;;;28619:21:1;;;28656:18;;;28649:30;28715:34;28695:18;;;28688:62;28767:18;;19689:55:0;28435:356:1;19689:55:0;19769:6;19333:451;-1:-1:-1;;;19333:451:0:o;71492:346::-;71615:15;71632;71685:5;:145;;71782:15;71798:5;71782:22;;;;;;;:::i;:::-;;71806:16;71823:5;71806:23;;;;;;;:::i;:::-;;71685:145;;;71711:16;71728:5;71711:23;;;;;;;:::i;:::-;;71736:17;71754:5;71736:24;;;;;;;:::i;:::-;;71685:145;71665:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71492:346;;;;;:::o;57954:229::-;44773:7;;;;45027:9;45019:38;;;;-1:-1:-1;;;45019:38:0;;;;;;;:::i;:::-;58130:45:::1;58157:4;58163:2;58167:7;58130:26;:45::i;33323:799::-:0;33478:4;-1:-1:-1;;;;;33499:13:0;;9799:19;:23;33495:620;;33535:72;;-1:-1:-1;;;33535:72:0;;-1:-1:-1;;;;;33535:36:0;;;;;:72;;17533:10;;33586:4;;33592:7;;33601:5;;33535:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33535:72:0;;;;;;;;-1:-1:-1;;33535:72:0;;;;;;;;;;;;:::i;:::-;;;33531:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33777:13:0;;33773:272;;33820:60;;-1:-1:-1;;;33820:60:0;;;;;;;:::i;33773:272::-;33995:6;33989:13;33980:6;33976:2;33972:15;33965:38;33531:529;-1:-1:-1;;;;;;33658:51:0;-1:-1:-1;;;33658:51:0;;-1:-1:-1;33651:58:0;;33495:620;-1:-1:-1;34099:4:0;34092:11;;63896:1223;64037:13;64052;64078:18;64106:21;;;;;;-1:-1:-1;;;29757:16:1;;29798:1;29789:11;;29555:251;64106:21:0;;;;;;;;;;;;;64078:50;;64139:17;64180:196;;;;;;30025:66:1;30013:79;;30122:66;30117:2;30108:12;;30101:88;30219:66;30214:2;30205:12;;30198:88;30316:66;30311:2;30302:12;;30295:88;-1:-1:-1;;;30408:3:1;30399:13;;30392:67;30484:3;30475:13;;29811:683;64180:196:0;;;;;;;;;;;;;64139:248;;64403:7;64398:493;64420:2;64416:1;:6;;;64398:493;;;64515:4;64542:44;64551:11;64560:1;64551:8;:11::i;:::-;64564:18;64583:1;64564:21;;;;;;;;;:::i;:::-;;;;;64542:8;:44::i;:::-;64613:6;64609:1;:10;;;:22;;;;;;;;;;;;;;;-1:-1:-1;;;64609:22:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64609:22:0;;;;64476:174;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64444:221;;64752:14;:12;:14::i;:::-;64729;64744:1;64729:17;;;;;;;;;:::i;:::-;;;;;64712:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;64702:46;;;;;;:64;64680:200;;64831:3;64836:26;64844:14;64859:1;64844:17;;;;;;;;;:::i;:::-;;;;;64836:7;:26::i;:::-;64814:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64801:63;;64680:200;64424:3;;;;:::i;:::-;;;;64398:493;;;;65010:46;65041:3;65024:31;;;;;;;;:::i;65010:46::-;64928:143;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;64928:143:0;;;;;;65101:4;;64928:143;;-1:-1:-1;63896:1223:0;;-1:-1:-1;;;;63896:1223:0:o;18032:723::-;18088:13;18309:10;18305:53;;-1:-1:-1;;18336:10:0;;;;;;;;;;;;-1:-1:-1;;;18336:10:0;;;;;18032:723::o;18305:53::-;18383:5;18368:12;18424:78;18431:9;;18424:78;;18457:8;;;;:::i;:::-;;-1:-1:-1;18480:10:0;;-1:-1:-1;18488:2:0;18480:10;;:::i;:::-;;;18424:78;;;18512:19;18544:6;18534:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18534:17:0;;18512:39;;18562:154;18569:10;;18562:154;;18596:11;18606:1;18596:11;;:::i;:::-;;-1:-1:-1;18665:10:0;18673:2;18665:5;:10;:::i;:::-;18652:24;;:2;:24;:::i;:::-;18639:39;;18622:6;18629;18622:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18622:56:0;;;;;;;;-1:-1:-1;18693:11:0;18702:2;18693:11;;:::i;:::-;;;18562:154;;59041:3053;59099:13;59336:4;:11;59351:1;59336:16;59332:31;;;-1:-1:-1;;59354:9:0;;;;;;;;;-1:-1:-1;59354:9:0;;;59041:3053::o;59332:31::-;59416:19;59438:6;;;;;;;;;;;;;;;;;59416:28;;59855:20;59914:1;59895:4;:11;59909:1;59895:15;;;;:::i;:::-;59894:21;;;;:::i;:::-;59889:27;;:1;:27;:::i;:::-;59878:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59878:39:0;;59855:62;;60053:1;60046:5;60042:13;60157:2;60149:6;60145:15;60268:4;60320;60314:11;60308:4;60304:22;60230:1432;60354:6;60345:7;60342:19;60230:1432;;;60460:1;60451:7;60447:15;60436:26;;60499:7;60493:14;61152:4;61144:5;61140:2;61136:14;61132:25;61122:8;61118:40;61112:47;61101:9;61093:67;61206:1;61195:9;61191:17;61178:30;;61298:4;61290:5;61286:2;61282:14;61278:25;61268:8;61264:40;61258:47;61247:9;61239:67;61352:1;61341:9;61337:17;61324:30;;61443:4;61435:5;61432:1;61428:13;61424:24;61414:8;61410:39;61404:46;61393:9;61385:66;61497:1;61486:9;61482:17;61469:30;;61580:4;61573:5;61569:16;61559:8;61555:31;61549:38;61538:9;61530:58;;61634:1;61623:9;61619:17;61606:30;;60230:1432;;;60234:107;;61824:1;61817:4;61811:11;61807:19;61845:1;61840:123;;;;61982:1;61977:73;;;;61800:250;;61840:123;61893:4;61889:1;61878:9;61874:17;61866:32;61943:4;61939:1;61928:9;61924:17;61916:32;61840:123;;61977:73;62030:4;62026:1;62015:9;62011:17;62003:32;61800:250;-1:-1:-1;62080:6:0;;59041:3053;-1:-1:-1;;;;;59041:3053:0:o;71846:875::-;72012:16;;:::i;:::-;72041:13;72142:15;72057:69;72114:12;72081:14;72057:69;:::i;:::-;:100;;;;:::i;:::-;72041:116;;72168:33;;:::i;:::-;72217:7;72212:359;72234:2;72230:1;:6;;;72212:359;;;72262:1;:6;;72267:1;72262:6;72258:97;;;72311:1;72289:19;;;:23;72331:8;;72258:97;72391:168;72429:16;72446:1;72429:19;;;;;;;;;:::i;:::-;;;;;72467:18;72486:1;72467:21;;;;;;;;;:::i;:::-;;;;;72513:6;:1;72517:2;72513:6;:::i;:::-;72539:5;72391:19;:168::i;:::-;72369:16;72386:1;72369:19;;;;;;;;;:::i;:::-;:190;;;;:19;;;;;;:190;72212:359;72238:3;;;;:::i;:::-;;;;72212:359;;;-1:-1:-1;72585:19:0;;;;:24;;72581:99;;72648:20;;;;:16;72643:1;72626:19;;28965:110;29041:26;29051:2;29055:7;29041:26;;;;;;;;;;;;:9;:26::i;22223:305::-;22325:4;-1:-1:-1;;;;;;22362:40:0;;-1:-1:-1;;;22362:40:0;;:105;;-1:-1:-1;;;;;;;22419:48:0;;-1:-1:-1;;;22419:48:0;22362:105;:158;;;-1:-1:-1;;;;;;;;;;20763:40:0;;;22484:36;20654:157;39100:589;-1:-1:-1;;;;;39306:18:0;;39302:187;;39341:40;39373:7;40516:10;:17;;40489:24;;;;:15;:24;;;;;:44;;;40544:24;;;;;;;;;;;;40412:164;39341:40;39302:187;;;39411:2;-1:-1:-1;;;;;39403:10:0;:4;-1:-1:-1;;;;;39403:10:0;;39399:90;;39430:47;39463:4;39469:7;39430:32;:47::i;:::-;-1:-1:-1;;;;;39503:16:0;;39499:183;;39536:45;39573:7;39536:36;:45::i;39499:183::-;39609:4;-1:-1:-1;;;;;39603:10:0;:2;-1:-1:-1;;;;;39603:10:0;;39599:83;;39630:40;39658:2;39662:7;39630:27;:40::i;65544:113::-;65597:13;65630:12;:10;:12::i;:::-;65643:5;65630:19;;;;;;;;;:::i;:::-;;;;;;65544:113;-1:-1:-1;;65544:113:0:o;65127:409::-;65236:13;65394:5;65461;65312:201;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65267:261;;65127:409;;;;:::o;66078:150::-;66144:24;;;;;;;;;66124:7;66144:24;;;66196:23;;;;66144:24;;66196:23;;:::i;:::-;;;;;;;;;;;;;66186:34;;;;;;66179:41;;;66078:150;:::o;65665:405::-;65725:13;65995:5;65796:251;;;;;;;;:::i;:::-;;;;;;;;;;;;;65751:311;;65665:405;;;:::o;72729:393::-;72899:5;72992:24;73013:3;72992:18;:24;:::i;:::-;72983:34;;;;:5;:34;:::i;:::-;72944:22;72963:3;72944:16;:22;:::i;:::-;72935:32;;;;:5;:32;:::i;:::-;:82;72917:162;;;-1:-1:-1;73051:16:0;73044:23;;72917:162;-1:-1:-1;73096:18:0;;72729:393;-1:-1:-1;;;72729:393:0:o;29302:321::-;29432:18;29438:2;29442:7;29432:5;:18::i;:::-;29483:54;29514:1;29518:2;29522:7;29531:5;29483:22;:54::i;:::-;29461:154;;;;-1:-1:-1;;;29461:154:0;;;;;;;:::i;41203:988::-;41469:22;41519:1;41494:22;41511:4;41494:16;:22::i;:::-;:26;;;;:::i;:::-;41531:18;41552:26;;;:17;:26;;;;;;41469:51;;-1:-1:-1;41685:28:0;;;41681:328;;-1:-1:-1;;;;;41752:18:0;;41730:19;41752:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41803:30;;;;;;:44;;;41920:30;;:17;:30;;;;;:43;;;41681:328;-1:-1:-1;42105:26:0;;;;:17;:26;;;;;;;;42098:33;;;-1:-1:-1;;;;;42149:18:0;;;;;:12;:18;;;;;:34;;;;;;;42142:41;41203:988::o;42486:1079::-;42764:10;:17;42739:22;;42764:21;;42784:1;;42764:21;:::i;:::-;42796:18;42817:24;;;:15;:24;;;;;;43190:10;:26;;42739:46;;-1:-1:-1;42817:24:0;;42739:46;;43190:26;;;;;;:::i;:::-;;;;;;;;;43168:48;;43254:11;43229:10;43240;43229:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;43334:28;;;:15;:28;;;;;;;:41;;;43506:24;;;;;43499:31;43541:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42557:1008;;;42486:1079;:::o;39990:221::-;40075:14;40092:20;40109:2;40092:16;:20::i;:::-;-1:-1:-1;;;;;40123:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40168:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39990:221:0:o;63490:398::-;63535:17;;:::i;:::-;-1:-1:-1;63565:292:0;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;-1:-1:-1;;;63565:292:0;;;;;;;;;;;-1:-1:-1;;;63565:292:0;;;;-1:-1:-1;;;63565:292:0;;;;;63490:398::o;29959:439::-;-1:-1:-1;;;;;30039:16:0;;30031:61;;;;-1:-1:-1;;;30031:61:0;;35918:2:1;30031:61:0;;;35900:21:1;;;35937:18;;;35930:30;35996:34;35976:18;;;35969:62;36048:18;;30031:61:0;35716:356:1;30031:61:0;28046:4;28070:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28070:16:0;:30;30103:58;;;;-1:-1:-1;;;30103:58:0;;36279:2:1;30103:58:0;;;36261:21:1;36318:2;36298:18;;;36291:30;36357;36337:18;;;36330:58;36405:18;;30103:58:0;36077:352:1;30103:58:0;30174:45;30203:1;30207:2;30211:7;30174:20;:45::i;:::-;-1:-1:-1;;;;;30232:13:0;;;;;;:9;:13;;;;;:18;;30249:1;;30232:13;:18;;30249:1;;30232:18;:::i;:::-;;;;-1:-1:-1;;30261:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30261:21:0;-1:-1:-1;;;;;30261:21:0;;;;;;;;30300:33;;30261:16;;;30300:33;;30261:16;;30300:33;54386:218;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:131::-;-1:-1:-1;;;;;1833:31:1;;1823:42;;1813:70;;1879:1;1876;1869:12;1894:315;1962:6;1970;2023:2;2011:9;2002:7;1998:23;1994:32;1991:52;;;2039:1;2036;2029:12;1991:52;2078:9;2065:23;2097:31;2122:5;2097:31;:::i;:::-;2147:5;2199:2;2184:18;;;;2171:32;;-1:-1:-1;;;1894:315:1:o;2214:247::-;2273:6;2326:2;2314:9;2305:7;2301:23;2297:32;2294:52;;;2342:1;2339;2332:12;2294:52;2381:9;2368:23;2400:31;2425:5;2400:31;:::i;2648:127::-;2709:10;2704:3;2700:20;2697:1;2690:31;2740:4;2737:1;2730:15;2764:4;2761:1;2754:15;2780:252;2852:2;2846:9;2894:3;2882:16;;2928:18;2913:34;;2949:22;;;2910:62;2907:88;;;2975:18;;:::i;:::-;3011:2;3004:22;2780:252;:::o;3037:275::-;3108:2;3102:9;3173:2;3154:13;;-1:-1:-1;;3150:27:1;3138:40;;3208:18;3193:34;;3229:22;;;3190:62;3187:88;;;3255:18;;:::i;:::-;3291:2;3284:22;3037:275;;-1:-1:-1;3037:275:1:o;3317:406::-;3381:5;3415:18;3407:6;3404:30;3401:56;;;3437:18;;:::i;:::-;3475:57;3520:2;3499:15;;-1:-1:-1;;3495:29:1;3526:4;3491:40;3475:57;:::i;:::-;3466:66;;3555:6;3548:5;3541:21;3595:3;3586:6;3581:3;3577:16;3574:25;3571:45;;;3612:1;3609;3602:12;3571:45;3661:6;3656:3;3649:4;3642:5;3638:16;3625:43;3715:1;3708:4;3699:6;3692:5;3688:18;3684:29;3677:40;3317:406;;;;;:::o;3728:794::-;3823:6;3831;3839;3847;3900:3;3888:9;3879:7;3875:23;3871:33;3868:53;;;3917:1;3914;3907:12;3868:53;3956:9;3943:23;3975:31;4000:5;3975:31;:::i;:::-;4025:5;-1:-1:-1;4082:2:1;4067:18;;4054:32;4095:33;4054:32;4095:33;:::i;:::-;4147:7;-1:-1:-1;4201:2:1;4186:18;;4173:32;;-1:-1:-1;4256:2:1;4241:18;;4228:32;4283:18;4272:30;;4269:50;;;4315:1;4312;4305:12;4269:50;4338:22;;4391:4;4383:13;;4379:27;-1:-1:-1;4369:55:1;;4420:1;4417;4410:12;4369:55;4443:73;4508:7;4503:2;4490:16;4485:2;4481;4477:11;4443:73;:::i;:::-;4433:83;;;3728:794;;;;;;;:::o;4734:702::-;4923:2;4975:21;;;4894:4;;5082:3;5067:19;;4948:18;;;5109:6;4894:4;5143:264;5157:4;5154:1;5151:11;5143:264;;;5248:2;5244:7;5232:9;5224:6;5220:22;5216:36;5211:3;5204:49;5276:51;5320:6;5311;5305:13;5276:51;:::i;:::-;5266:61;-1:-1:-1;5385:12:1;;;;5350:15;;;;5177:1;5170:9;5143:264;;;-1:-1:-1;5424:6:1;;4734:702;-1:-1:-1;;;;;;4734:702:1:o;5441:118::-;5527:5;5520:13;5513:21;5506:5;5503:32;5493:60;;5549:1;5546;5539:12;5564:241;5620:6;5673:2;5661:9;5652:7;5648:23;5644:32;5641:52;;;5689:1;5686;5679:12;5641:52;5728:9;5715:23;5747:28;5769:5;5747:28;:::i;5810:1376::-;6049:2;6101:21;;;6020:4;;6208:3;6193:19;;6074:18;;;6235:6;6020:4;;6290:867;6306:4;6301:3;6298:13;6290:867;;;-1:-1:-1;;6403:22:1;;;6399:31;;6387:44;;6454:13;;6526:9;;6548:22;;;6699:11;;;;6592:15;;;;6654:1;6650:14;;;6638:27;;6634:36;;6734:1;6748:300;6764:6;6759:3;6756:15;6748:300;;;6864:2;6855:6;6847;6843:19;6839:28;6832:5;6825:43;6895:53;6941:6;6930:8;6924:15;6895:53;:::i;:::-;6977:17;;;;7020:14;;;;6885:63;-1:-1:-1;6790:1:1;6781:11;6748:300;;;-1:-1:-1;7071:6:1;-1:-1:-1;;;7135:12:1;;;;-1:-1:-1;;7100:15:1;;;;6330:1;6321:11;6290:867;;;-1:-1:-1;7174:6:1;;5810:1376;-1:-1:-1;;;;;;;5810:1376:1:o;7191:456::-;7268:6;7276;7284;7337:2;7325:9;7316:7;7312:23;7308:32;7305:52;;;7353:1;7350;7343:12;7305:52;7392:9;7379:23;7411:31;7436:5;7411:31;:::i;:::-;7461:5;-1:-1:-1;7518:2:1;7503:18;;7490:32;7531:33;7490:32;7531:33;:::i;:::-;7191:456;;7583:7;;-1:-1:-1;;;7637:2:1;7622:18;;;;7609:32;;7191:456::o;8019:315::-;8087:6;8095;8148:2;8136:9;8127:7;8123:23;8119:32;8116:52;;;8164:1;8161;8154:12;8116:52;8200:9;8187:23;8177:33;;8260:2;8249:9;8245:18;8232:32;8273:31;8298:5;8273:31;:::i;:::-;8323:5;8313:15;;;8019:315;;;;;:::o;8339:382::-;8404:6;8412;8465:2;8453:9;8444:7;8440:23;8436:32;8433:52;;;8481:1;8478;8471:12;8433:52;8520:9;8507:23;8539:31;8564:5;8539:31;:::i;:::-;8589:5;-1:-1:-1;8646:2:1;8631:18;;8618:32;8659:30;8618:32;8659:30;:::i;8726:248::-;8794:6;8802;8855:2;8843:9;8834:7;8830:23;8826:32;8823:52;;;8871:1;8868;8861:12;8823:52;-1:-1:-1;;8894:23:1;;;8964:2;8949:18;;;8936:32;;-1:-1:-1;8726:248:1:o;8979:1143::-;9032:5;9085:3;9078:4;9070:6;9066:17;9062:27;9052:55;;9103:1;9100;9093:12;9052:55;9139:6;9126:20;9165:4;9188:18;9225:2;9221;9218:10;9215:36;;;9231:18;;:::i;:::-;9277:2;9274:1;9270:10;9300:28;9324:2;9320;9316:11;9300:28;:::i;:::-;9362:15;;;9432;;;9428:24;;;9393:12;;;;9464:15;;;9461:35;;;9492:1;9489;9482:12;9461:35;9528:2;9520:6;9516:15;9505:26;;9540:553;9556:6;9551:3;9548:15;9540:553;;;9642:3;9629:17;9678:2;9665:11;9662:19;9659:109;;;9722:1;9751:2;9747;9740:14;9659:109;9791:24;;9850:2;9842:11;;9838:21;-1:-1:-1;9828:119:1;;9901:1;9930:2;9926;9919:14;9828:119;9972:78;10046:3;10040:2;10036;10032:11;10019:25;10014:2;10010;10006:11;9972:78;:::i;:::-;9960:91;;-1:-1:-1;9573:12:1;;;;10071;;;;9540:553;;;10111:5;8979:1143;-1:-1:-1;;;;;;;;8979:1143:1:o;10127:811::-;10280:6;10288;10296;10304;10357:3;10345:9;10336:7;10332:23;10328:33;10325:53;;;10374:1;10371;10364:12;10325:53;10413:9;10400:23;10432:28;10454:5;10432:28;:::i;:::-;10479:5;-1:-1:-1;10531:2:1;10516:18;;10503:32;;-1:-1:-1;10586:2:1;10571:18;;10558:32;10609:18;10639:14;;;10636:34;;;10666:1;10663;10656:12;10636:34;10689:60;10741:7;10732:6;10721:9;10717:22;10689:60;:::i;:::-;10679:70;;10802:2;10791:9;10787:18;10774:32;10758:48;;10831:2;10821:8;10818:16;10815:36;;;10847:1;10844;10837:12;10815:36;;10870:62;10924:7;10913:8;10902:9;10898:24;10870:62;:::i;10943:388::-;11011:6;11019;11072:2;11060:9;11051:7;11047:23;11043:32;11040:52;;;11088:1;11085;11078:12;11040:52;11127:9;11114:23;11146:31;11171:5;11146:31;:::i;:::-;11196:5;-1:-1:-1;11253:2:1;11238:18;;11225:32;11266:33;11225:32;11266:33;:::i;11336:380::-;11415:1;11411:12;;;;11458;;;11479:61;;11533:4;11525:6;11521:17;11511:27;;11479:61;11586:2;11578:6;11575:14;11555:18;11552:38;11549:161;;;11632:10;11627:3;11623:20;11620:1;11613:31;11667:4;11664:1;11657:15;11695:4;11692:1;11685:15;11549:161;;11336:380;;;:::o;12961:413::-;13163:2;13145:21;;;13202:2;13182:18;;;13175:30;13241:34;13236:2;13221:18;;13214:62;-1:-1:-1;;;13307:2:1;13292:18;;13285:47;13364:3;13349:19;;12961:413::o;15037:127::-;15098:10;15093:3;15089:20;15086:1;15079:31;15129:4;15126:1;15119:15;15153:4;15150:1;15143:15;15990:340;16192:2;16174:21;;;16231:2;16211:18;;;16204:30;-1:-1:-1;;;16265:2:1;16250:18;;16243:46;16321:2;16306:18;;15990:340::o;16335:251::-;16405:6;16458:2;16446:9;16437:7;16433:23;16429:32;16426:52;;;16474:1;16471;16464:12;16426:52;16506:9;16500:16;16525:31;16550:5;16525:31;:::i;17304:132::-;17380:13;;17402:28;17380:13;17402:28;:::i;:::-;17304:132;;;:::o;17441:245::-;17508:6;17561:2;17549:9;17540:7;17536:23;17532:32;17529:52;;;17577:1;17574;17567:12;17529:52;17609:9;17603:16;17628:28;17650:5;17628:28;:::i;18096:184::-;18166:6;18219:2;18207:9;18198:7;18194:23;18190:32;18187:52;;;18235:1;18232;18225:12;18187:52;-1:-1:-1;18258:16:1;;18096:184;-1:-1:-1;18096:184:1:o;19117:375::-;-1:-1:-1;;;;;19375:15:1;;;19357:34;;19427:15;;;;19422:2;19407:18;;19400:43;19474:2;19459:18;;19452:34;;;;19307:2;19292:18;;19117:375::o;19776:185::-;19818:3;19856:5;19850:12;19871:52;19916:6;19911:3;19904:4;19897:5;19893:16;19871:52;:::i;:::-;19939:16;;;;;19776:185;-1:-1:-1;;19776:185:1:o;19966:786::-;20377:25;20372:3;20365:38;20347:3;20432:6;20426:13;20448:62;20503:6;20498:2;20493:3;20489:12;20482:4;20474:6;20470:17;20448:62;:::i;:::-;-1:-1:-1;;;20569:2:1;20529:16;;;20561:11;;;20554:40;20619:13;;20641:63;20619:13;20690:2;20682:11;;20675:4;20663:17;;20641:63;:::i;:::-;20724:17;20743:2;20720:26;;19966:786;-1:-1:-1;;;;19966:786:1:o;20757:127::-;20818:10;20813:3;20809:20;20806:1;20799:31;20849:4;20846:1;20839:15;20873:4;20870:1;20863:15;20889:127;20950:10;20945:3;20941:20;20938:1;20931:31;20981:4;20978:1;20971:15;21005:4;21002:1;20995:15;21021:135;21060:3;-1:-1:-1;;21081:17:1;;21078:43;;;21101:18;;:::i;:::-;-1:-1:-1;21148:1:1;21137:13;;21021:135::o;22385:125::-;22425:4;22453:1;22450;22447:8;22444:34;;;22458:18;;:::i;:::-;-1:-1:-1;22495:9:1;;22385:125::o;22515:128::-;22555:3;22586:1;22582:6;22579:1;22576:13;22573:39;;;22592:18;;:::i;:::-;-1:-1:-1;22628:9:1;;22515:128::o;23351:414::-;23553:2;23535:21;;;23592:2;23572:18;;;23565:30;23631:34;23626:2;23611:18;;23604:62;-1:-1:-1;;;23697:2:1;23682:18;;23675:48;23755:3;23740:19;;23351:414::o;24203:2213::-;-1:-1:-1;;;25453:16:1;;-1:-1:-1;;;25494:1:1;25485:11;;25478:53;25554:13;;-1:-1:-1;;25576:62:1;25554:13;25626:2;25617:12;;25610:4;25598:17;;25576:62;:::i;:::-;-1:-1:-1;;;25697:2:1;25657:16;;;25689:11;;;25682:24;25731:13;;25753:63;25731:13;25802:2;25794:11;;25787:4;25775:17;;25753:63;:::i;:::-;-1:-1:-1;;;25876:2:1;25835:17;;;;25868:11;;;25861:25;25911:13;;25933:63;25911:13;25982:2;25974:11;;25967:4;25955:17;;25933:63;:::i;:::-;-1:-1:-1;;;26015:17:1;;26056:2;26048:11;;26041:35;;;;26105:66;26100:2;26092:11;;26085:87;-1:-1:-1;;;26196:2:1;26188:11;;26181:55;-1:-1:-1;;;26402:2:1;26394:11;;23835:47;26252:158;26282:127;26308:100;26338:69;23898:12;;;26356:6;26338:69;:::i;:::-;-1:-1:-1;;;23986:59:1;;24070:2;24061:12;;23921:158;26308:100;26300:6;26282:127;:::i;:::-;-1:-1:-1;;;24149:16:1;;24190:1;24181:11;;24084:114;26421:448;26683:31;26678:3;26671:44;26653:3;26744:6;26738:13;26760:62;26815:6;26810:2;26805:3;26801:12;26794:4;26786:6;26782:17;26760:62;:::i;:::-;26842:16;;;;26860:2;26838:25;;26421:448;-1:-1:-1;;26421:448:1:o;26874:160::-;26951:13;;27004:4;26993:16;;26983:27;;26973:55;;27024:1;27021;27014:12;27039:1077;27135:6;27188:3;27176:9;27167:7;27163:23;27159:33;27156:53;;;27205:1;27202;27195:12;27156:53;27231:22;;:::i;:::-;27276:37;27303:9;27276:37;:::i;:::-;27269:5;27262:52;27346:47;27389:2;27378:9;27374:18;27346:47;:::i;:::-;27341:2;27334:5;27330:14;27323:71;27426:47;27469:2;27458:9;27454:18;27426:47;:::i;:::-;27421:2;27414:5;27410:14;27403:71;27506:47;27549:2;27538:9;27534:18;27506:47;:::i;:::-;27501:2;27494:5;27490:14;27483:71;27587:48;27630:3;27619:9;27615:19;27587:48;:::i;:::-;27581:3;27574:5;27570:15;27563:73;27669:48;27712:3;27701:9;27697:19;27669:48;:::i;:::-;27663:3;27656:5;27652:15;27645:73;27751:48;27794:3;27783:9;27779:19;27751:48;:::i;:::-;27745:3;27738:5;27734:15;27727:73;27833:48;27876:3;27865:9;27861:19;27833:48;:::i;:::-;27827:3;27820:5;27816:15;27809:73;27901:3;27936:47;27979:2;27968:9;27964:18;27936:47;:::i;:::-;27920:14;;;27913:71;28003:3;28038:47;28066:18;;;28038:47;:::i;:::-;28022:14;;;28015:71;28026:5;27039:1077;-1:-1:-1;;;27039:1077:1:o;28121:168::-;28161:7;28227:1;28223;28219:6;28215:14;28212:1;28209:21;28204:1;28197:9;28190:17;28186:45;28183:71;;;28234:18;;:::i;:::-;-1:-1:-1;28274:9:1;;28121:168::o;28294:136::-;28333:3;28361:5;28351:39;;28370:18;;:::i;:::-;-1:-1:-1;;;28406:18:1;;28294:136::o;28796:500::-;-1:-1:-1;;;;;29065:15:1;;;29047:34;;29117:15;;29112:2;29097:18;;29090:43;29164:2;29149:18;;29142:34;;;29212:3;29207:2;29192:18;;29185:31;;;28990:4;;29233:57;;29270:19;;29262:6;29233:57;:::i;:::-;29225:65;28796:500;-1:-1:-1;;;;;;28796:500:1:o;29301:249::-;29370:6;29423:2;29411:9;29402:7;29398:23;29394:32;29391:52;;;29439:1;29436;29429:12;29391:52;29471:9;29465:16;29490:30;29514:5;29490:30;:::i;30499:664::-;30726:3;30764:6;30758:13;30780:53;30826:6;30821:3;30814:4;30806:6;30802:17;30780:53;:::i;:::-;30896:13;;30855:16;;;;30918:57;30896:13;30855:16;30952:4;30940:17;;30918:57;:::i;:::-;31042:13;;30997:20;;;31064:57;31042:13;30997:20;31098:4;31086:17;;31064:57;:::i;:::-;31137:20;;30499:664;-1:-1:-1;;;;;30499:664:1:o;31168:276::-;31299:3;31337:6;31331:13;31353:53;31399:6;31394:3;31387:4;31379:6;31375:17;31353:53;:::i;:::-;31422:16;;;;;31168:276;-1:-1:-1;;31168:276:1:o;31449:470::-;31628:3;31666:6;31660:13;31682:53;31728:6;31723:3;31716:4;31708:6;31704:17;31682:53;:::i;:::-;31798:13;;31757:16;;;;31820:57;31798:13;31757:16;31854:4;31842:17;;31820:57;:::i;:::-;31893:20;;31449:470;-1:-1:-1;;;;31449:470:1:o;31924:175::-;31961:3;32005:4;31998:5;31994:16;32034:4;32025:7;32022:17;32019:43;;;32042:18;;:::i;:::-;32091:1;32078:15;;31924:175;-1:-1:-1;;31924:175:1:o;32104:444::-;32336:3;32374:6;32368:13;32390:53;32436:6;32431:3;32424:4;32416:6;32412:17;32390:53;:::i;:::-;-1:-1:-1;;;32465:16:1;;32490:23;;;-1:-1:-1;32540:1:1;32529:13;;32104:444;-1:-1:-1;32104:444:1:o;32553:445::-;32815:28;32810:3;32803:41;32785:3;32873:6;32867:13;32889:62;32944:6;32939:2;32934:3;32930:12;32923:4;32915:6;32911:17;32889:62;:::i;:::-;32971:16;;;;32989:2;32967:25;;32553:445;-1:-1:-1;;32553:445:1:o;33003:127::-;33064:10;33059:3;33055:20;33052:1;33045:31;33095:4;33092:1;33085:15;33119:4;33116:1;33109:15;33135:120;33175:1;33201;33191:35;;33206:18;;:::i;:::-;-1:-1:-1;33240:9:1;;33135:120::o;33260:112::-;33292:1;33318;33308:35;;33323:18;;:::i;:::-;-1:-1:-1;33357:9:1;;33260:112::o;33377:204::-;33415:3;33451:4;33448:1;33444:12;33483:4;33480:1;33476:12;33518:3;33512:4;33508:14;33503:3;33500:23;33497:49;;;33526:18;;:::i;:::-;33562:13;;33377:204;-1:-1:-1;;;33377:204:1:o;33586:1003::-;-1:-1:-1;;;34086:61:1;;34170:13;;34068:3;;34192:62;34170:13;34242:2;34233:12;;34226:4;34214:17;;34192:62;:::i;:::-;-1:-1:-1;;;34313:2:1;34273:16;;;34305:11;;;34298:61;34384:13;;34406:65;34384:13;34455:4;34447:13;;;;34428:17;;34406:65;:::i;:::-;-1:-1:-1;;;34531:4:1;34490:17;;;;34523:13;;;34516:40;34580:2;34572:11;;33586:1003;-1:-1:-1;;;;33586:1003:1:o;34594:985::-;34957:66;34952:3;34945:79;35054:66;35049:2;35044:3;35040:12;35033:88;35151:66;35146:2;35141:3;35137:12;35130:88;35248:66;35243:2;35238:3;35234:12;35227:88;-1:-1:-1;;;35340:3:1;35335;35331:13;35324:32;34927:3;35385:6;35379:13;35401:61;35455:6;35449:3;35444;35440:13;35435:2;35427:6;35423:15;35401:61;:::i;:::-;-1:-1:-1;;;35521:3:1;35481:16;;;;35513:12;;;35506:39;-1:-1:-1;35569:3:1;35561:12;;34594:985;-1:-1:-1;34594:985:1:o;35584:127::-;35645:10;35640:3;35636:20;35633:1;35626:31;35676:4;35673:1;35666:15;35700:4;35697:1;35690:15

Swarm Source

ipfs://22ae3576c480cfc4b0208a7ee1b8ade58395c365c9433816046a5cdca00cc25f
Loading