Token FantomSheepo

Overview ERC-721

Total Supply:
31 SHEEPO

Holders:
2 addresses

Profile Summary

 
Contract:
0x491f495371a1cb4a454d98aad9d4c184ad3e8b640x491f495371A1CB4a454D98AaD9d4C184ad3E8b64

Balance
0 SHEEPO
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:
FantomSheepo

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at FtmScan.com on 2021-08-25
*/

// Sources flattened with hardhat v2.3.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

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/[email protected]

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 @openzeppelin/contracts/token/ERC721/[email protected]

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/[email protected]

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/[email protected]

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File @openzeppelin/contracts/utils/[email protected]

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = '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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, 'Strings: hex length insufficient');
        return string(buffer);
    }
}

// File @openzeppelin/contracts/utils/introspection/[email protected]

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/[email protected]

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}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), 'ERC721: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), 'ERC721URIStorage: URI set of nonexistent token');
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File @openzeppelin/contracts/security/[email protected]

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/[email protected]

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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 @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. 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;
        }
    }
}

// File contracts/Sheepo.sol
// Fantom Sheepos!
pragma solidity ^0.8.0;

contract FantomSheepo is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, ERC721Burnable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    uint256 public maxSupply = 1000;
    uint256 public price = 1 * 1 ether;
    string public baseURI;

    constructor() ERC721('FantomSheepo', 'SHEEPO') {}

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

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

    function setMaxSupply(uint256 newMaxSupply) public onlyOwner {
        maxSupply = newMaxSupply;
    }

    function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

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

    function internalMint(address to) internal {
        require(totalSupply() <= maxSupply, 'supply depleted');
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    function safeMint(address to) public onlyOwner {
        internalMint(to);
    }

    function buySheepos(uint256 amount) public payable {
        require(msg.value >= price * amount, 'not enough was paid');
        for (uint256 i = 0; i < amount; i++) {
            internalMint(msg.sender);
        }
    }

    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 _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        return super.tokenURI(tokenId);
    }

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

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buySheepos","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526103e8600d55670de0b6b3a7640000600e553480156200002357600080fd5b506040518060400160405280600c81526020017f46616e746f6d53686565706f00000000000000000000000000000000000000008152506040518060400160405280600681526020017f53484545504f00000000000000000000000000000000000000000000000000008152508160009080519060200190620000a89291906200019e565b508060019080519060200190620000c19291906200019e565b5050506000600b60006101000a81548160ff0219169083151502179055506000620000f16200019660201b60201c565b905080600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002b3565b600033905090565b828054620001ac906200024e565b90600052602060002090601f016020900481019282620001d057600085556200021c565b82601f10620001eb57805160ff19168380011785556200021c565b828001600101855582156200021c579182015b828111156200021b578251825591602001919060010190620001fe565b5b5090506200022b91906200022f565b5090565b5b808211156200024a57600081600090555060010162000230565b5090565b600060028204905060018216806200026757607f821691505b602082108114156200027e576200027d62000284565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6146b980620002c36000396000f3fe6080604052600436106101e35760003560e01c80636c0360eb11610102578063a035b1fe11610095578063d5abeb0111610064578063d5abeb01146106b6578063e985e9c5146106e1578063f2fde38b1461071e578063fedb739b14610747576101e3565b8063a035b1fe146105fc578063a22cb46514610627578063b88d4fde14610650578063c87b56dd14610679576101e3565b80638456cb59116100d15780638456cb59146105665780638da5cb5b1461057d57806391b7f5ed146105a857806395d89b41146105d1576101e3565b80636c0360eb146104be5780636f8b44b0146104e957806370a0823114610512578063715018a61461054f576101e3565b80633f4ba83a1161017a5780634f6ccce7116101495780634f6ccce7146103f057806355f804b31461042d5780635c975abb146104565780636352211e14610481576101e3565b80633f4ba83a1461035e57806340d097c31461037557806342842e0e1461039e57806342966c68146103c7576101e3565b806318160ddd116101b657806318160ddd146102b657806323b872dd146102e15780632f745c591461030a5780633ccfd60b14610347576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613273565b610763565b60405161021c91906137e6565b60405180910390f35b34801561023157600080fd5b5061023a610775565b6040516102479190613801565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613316565b610807565b604051610284919061377f565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613233565b61088c565b005b3480156102c257600080fd5b506102cb6109a4565b6040516102d89190613b23565b60405180910390f35b3480156102ed57600080fd5b506103086004803603810190610303919061311d565b6109b1565b005b34801561031657600080fd5b50610331600480360381019061032c9190613233565b610a11565b60405161033e9190613b23565b60405180910390f35b34801561035357600080fd5b5061035c610ab6565b005b34801561036a57600080fd5b50610373610b7b565b005b34801561038157600080fd5b5061039c600480360381019061039791906130b0565b610c01565b005b3480156103aa57600080fd5b506103c560048036038101906103c0919061311d565b610c89565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190613316565b610ca9565b005b3480156103fc57600080fd5b5061041760048036038101906104129190613316565b610d05565b6040516104249190613b23565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f91906132cd565b610d76565b005b34801561046257600080fd5b5061046b610e0c565b60405161047891906137e6565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190613316565b610e23565b6040516104b5919061377f565b60405180910390f35b3480156104ca57600080fd5b506104d3610ed5565b6040516104e09190613801565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190613316565b610f63565b005b34801561051e57600080fd5b50610539600480360381019061053491906130b0565b610fe9565b6040516105469190613b23565b60405180910390f35b34801561055b57600080fd5b506105646110a1565b005b34801561057257600080fd5b5061057b6111de565b005b34801561058957600080fd5b50610592611264565b60405161059f919061377f565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613316565b61128e565b005b3480156105dd57600080fd5b506105e6611314565b6040516105f39190613801565b60405180910390f35b34801561060857600080fd5b506106116113a6565b60405161061e9190613b23565b60405180910390f35b34801561063357600080fd5b5061064e600480360381019061064991906131f3565b6113ac565b005b34801561065c57600080fd5b5061067760048036038101906106729190613170565b61152d565b005b34801561068557600080fd5b506106a0600480360381019061069b9190613316565b61158f565b6040516106ad9190613801565b60405180910390f35b3480156106c257600080fd5b506106cb6115a1565b6040516106d89190613b23565b60405180910390f35b3480156106ed57600080fd5b50610708600480360381019061070391906130dd565b6115a7565b60405161071591906137e6565b60405180910390f35b34801561072a57600080fd5b50610745600480360381019061074091906130b0565b61163b565b005b610761600480360381019061075c9190613316565b6117e7565b005b600061076e82611862565b9050919050565b60606000805461078490613dd3565b80601f01602080910402602001604051908101604052809291908181526020018280546107b090613dd3565b80156107fd5780601f106107d2576101008083540402835291602001916107fd565b820191906000526020600020905b8154815290600101906020018083116107e057829003601f168201915b5050505050905090565b6000610812826118dc565b610851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084890613a03565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089782610e23565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ff90613a83565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610927611948565b73ffffffffffffffffffffffffffffffffffffffff161480610956575061095581610950611948565b6115a7565b5b610995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098c90613963565b60405180910390fd5b61099f8383611950565b505050565b6000600880549050905090565b6109c26109bc611948565b82611a09565b610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f890613ac3565b60405180910390fd5b610a0c838383611ae7565b505050565b6000610a1c83610fe9565b8210610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5490613863565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610abe611948565b73ffffffffffffffffffffffffffffffffffffffff16610adc611264565b73ffffffffffffffffffffffffffffffffffffffff1614610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2990613a23565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b78573d6000803e3d6000fd5b50565b610b83611948565b73ffffffffffffffffffffffffffffffffffffffff16610ba1611264565b73ffffffffffffffffffffffffffffffffffffffff1614610bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bee90613a23565b60405180910390fd5b610bff611d43565b565b610c09611948565b73ffffffffffffffffffffffffffffffffffffffff16610c27611264565b73ffffffffffffffffffffffffffffffffffffffff1614610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490613a23565b60405180910390fd5b610c8681611de5565b50565b610ca48383836040518060200160405280600081525061152d565b505050565b610cba610cb4611948565b82611a09565b610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090613b03565b60405180910390fd5b610d0281611e51565b50565b6000610d0f6109a4565b8210610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790613ae3565b60405180910390fd5b60088281548110610d6457610d63613f6c565b5b90600052602060002001549050919050565b610d7e611948565b73ffffffffffffffffffffffffffffffffffffffff16610d9c611264565b73ffffffffffffffffffffffffffffffffffffffff1614610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990613a23565b60405180910390fd5b80600f9080519060200190610e08929190612e84565b5050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec3906139a3565b60405180910390fd5b80915050919050565b600f8054610ee290613dd3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0e90613dd3565b8015610f5b5780601f10610f3057610100808354040283529160200191610f5b565b820191906000526020600020905b815481529060010190602001808311610f3e57829003601f168201915b505050505081565b610f6b611948565b73ffffffffffffffffffffffffffffffffffffffff16610f89611264565b73ffffffffffffffffffffffffffffffffffffffff1614610fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd690613a23565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105190613983565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110a9611948565b73ffffffffffffffffffffffffffffffffffffffff166110c7611264565b73ffffffffffffffffffffffffffffffffffffffff161461111d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111490613a23565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6111e6611948565b73ffffffffffffffffffffffffffffffffffffffff16611204611264565b73ffffffffffffffffffffffffffffffffffffffff161461125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190613a23565b60405180910390fd5b611262611e5d565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611296611948565b73ffffffffffffffffffffffffffffffffffffffff166112b4611264565b73ffffffffffffffffffffffffffffffffffffffff161461130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190613a23565b60405180910390fd5b80600e8190555050565b60606001805461132390613dd3565b80601f016020809104026020016040519081016040528092919081815260200182805461134f90613dd3565b801561139c5780601f106113715761010080835404028352916020019161139c565b820191906000526020600020905b81548152906001019060200180831161137f57829003601f168201915b5050505050905090565b600e5481565b6113b4611948565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990613903565b60405180910390fd5b806005600061142f611948565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114dc611948565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161152191906137e6565b60405180910390a35050565b61153e611538611948565b83611a09565b61157d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157490613ac3565b60405180910390fd5b61158984848484611f00565b50505050565b606061159a82611f5c565b9050919050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611643611948565b73ffffffffffffffffffffffffffffffffffffffff16611661611264565b73ffffffffffffffffffffffffffffffffffffffff16146116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90613a23565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e906138a3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600e546117f59190613c8f565b341015611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90613aa3565b60405180910390fd5b60005b8181101561185e5761184b33611de5565b808061185690613e36565b91505061183a565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118d557506118d4826120ae565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119c383610e23565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a14826118dc565b611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90613923565b60405180910390fd5b6000611a5e83610e23565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611acd57508373ffffffffffffffffffffffffffffffffffffffff16611ab584610807565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ade5750611add81856115a7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b0782610e23565b73ffffffffffffffffffffffffffffffffffffffff1614611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5490613a43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc4906138e3565b60405180910390fd5b611bd8838383612190565b611be3600082611950565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c339190613ce9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c8a9190613c08565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d4b610e0c565b611d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8190613823565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611dce611948565b604051611ddb919061377f565b60405180910390a1565b600d54611df06109a4565b1115611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2890613843565b60405180910390fd5b611e4481611e3f600c6121e8565b6121f6565b611e4e600c612214565b50565b611e5a8161222a565b50565b611e65610e0c565b15611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90613943565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ee9611948565b604051611ef6919061377f565b60405180910390a1565b611f0b848484611ae7565b611f178484848461227d565b611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d90613883565b60405180910390fd5b50505050565b6060611f67826118dc565b611fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9d906139e3565b60405180910390fd5b6000600a60008481526020019081526020016000208054611fc690613dd3565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff290613dd3565b801561203f5780601f106120145761010080835404028352916020019161203f565b820191906000526020600020905b81548152906001019060200180831161202257829003601f168201915b505050505090506000612050612414565b90506000815114156120665781925050506120a9565b60008251111561209b57808260405160200161208392919061375b565b604051602081830303815290604052925050506120a9565b6120a4846124a6565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061217957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061218957506121888261254d565b5b9050919050565b612198610e0c565b156121d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cf90613943565b60405180910390fd5b6121e38383836125b7565b505050565b600081600001549050919050565b6122108282604051806020016040528060008152506126cb565b5050565b6001816000016000828254019250508190555050565b61223381612726565b6000600a6000838152602001908152602001600020805461225390613dd3565b90501461227a57600a600082815260200190815260200160002060006122799190612f0a565b5b50565b600061229e8473ffffffffffffffffffffffffffffffffffffffff16612837565b15612407578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122c7611948565b8786866040518563ffffffff1660e01b81526004016122e9949392919061379a565b602060405180830381600087803b15801561230357600080fd5b505af192505050801561233457506040513d601f19601f8201168201806040525081019061233191906132a0565b60015b6123b7573d8060008114612364576040519150601f19603f3d011682016040523d82523d6000602084013e612369565b606091505b506000815114156123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a690613883565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061240c565b600190505b949350505050565b6060600f805461242390613dd3565b80601f016020809104026020016040519081016040528092919081815260200182805461244f90613dd3565b801561249c5780601f106124715761010080835404028352916020019161249c565b820191906000526020600020905b81548152906001019060200180831161247f57829003601f168201915b5050505050905090565b60606124b1826118dc565b6124f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e790613a63565b60405180910390fd5b60006124fa612414565b9050600081511161251a5760405180602001604052806000815250612545565b806125248461284a565b60405160200161253592919061375b565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125c28383836129ab565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561260557612600816129b0565b612644565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126435761264283826129f9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126875761268281612b66565b6126c6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126c5576126c48282612c37565b5b5b505050565b6126d58383612cb6565b6126e2600084848461227d565b612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890613883565b60405180910390fd5b505050565b600061273182610e23565b905061273f81600084612190565b61274a600083611950565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461279a9190613ce9565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415612892576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129a6565b600082905060005b600082146128c45780806128ad90613e36565b915050600a826128bd9190613c5e565b915061289a565b60008167ffffffffffffffff8111156128e0576128df613f9b565b5b6040519080825280601f01601f1916602001820160405280156129125781602001600182028036833780820191505090505b5090505b6000851461299f5760018261292b9190613ce9565b9150600a8561293a9190613e7f565b60306129469190613c08565b60f81b81838151811061295c5761295b613f6c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129989190613c5e565b9450612916565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a0684610fe9565b612a109190613ce9565b9050600060076000848152602001908152602001600020549050818114612af5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b7a9190613ce9565b9050600060096000848152602001908152602001600020549050600060088381548110612baa57612ba9613f6c565b5b906000526020600020015490508060088381548110612bcc57612bcb613f6c565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c1b57612c1a613f3d565b5b6001900381819060005260206000200160009055905550505050565b6000612c4283610fe9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1d906139c3565b60405180910390fd5b612d2f816118dc565b15612d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d66906138c3565b60405180910390fd5b612d7b60008383612190565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dcb9190613c08565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e9090613dd3565b90600052602060002090601f016020900481019282612eb25760008555612ef9565b82601f10612ecb57805160ff1916838001178555612ef9565b82800160010185558215612ef9579182015b82811115612ef8578251825591602001919060010190612edd565b5b509050612f069190612f4a565b5090565b508054612f1690613dd3565b6000825580601f10612f285750612f47565b601f016020900490600052602060002090810190612f469190612f4a565b5b50565b5b80821115612f63576000816000905550600101612f4b565b5090565b6000612f7a612f7584613b63565b613b3e565b905082815260208101848484011115612f9657612f95613fcf565b5b612fa1848285613d91565b509392505050565b6000612fbc612fb784613b94565b613b3e565b905082815260208101848484011115612fd857612fd7613fcf565b5b612fe3848285613d91565b509392505050565b600081359050612ffa81614627565b92915050565b60008135905061300f8161463e565b92915050565b60008135905061302481614655565b92915050565b60008151905061303981614655565b92915050565b600082601f83011261305457613053613fca565b5b8135613064848260208601612f67565b91505092915050565b600082601f83011261308257613081613fca565b5b8135613092848260208601612fa9565b91505092915050565b6000813590506130aa8161466c565b92915050565b6000602082840312156130c6576130c5613fd9565b5b60006130d484828501612feb565b91505092915050565b600080604083850312156130f4576130f3613fd9565b5b600061310285828601612feb565b925050602061311385828601612feb565b9150509250929050565b60008060006060848603121561313657613135613fd9565b5b600061314486828701612feb565b935050602061315586828701612feb565b92505060406131668682870161309b565b9150509250925092565b6000806000806080858703121561318a57613189613fd9565b5b600061319887828801612feb565b94505060206131a987828801612feb565b93505060406131ba8782880161309b565b925050606085013567ffffffffffffffff8111156131db576131da613fd4565b5b6131e78782880161303f565b91505092959194509250565b6000806040838503121561320a57613209613fd9565b5b600061321885828601612feb565b925050602061322985828601613000565b9150509250929050565b6000806040838503121561324a57613249613fd9565b5b600061325885828601612feb565b92505060206132698582860161309b565b9150509250929050565b60006020828403121561328957613288613fd9565b5b600061329784828501613015565b91505092915050565b6000602082840312156132b6576132b5613fd9565b5b60006132c48482850161302a565b91505092915050565b6000602082840312156132e3576132e2613fd9565b5b600082013567ffffffffffffffff81111561330157613300613fd4565b5b61330d8482850161306d565b91505092915050565b60006020828403121561332c5761332b613fd9565b5b600061333a8482850161309b565b91505092915050565b61334c81613d1d565b82525050565b61335b81613d2f565b82525050565b600061336c82613bc5565b6133768185613bdb565b9350613386818560208601613da0565b61338f81613fde565b840191505092915050565b60006133a582613bd0565b6133af8185613bec565b93506133bf818560208601613da0565b6133c881613fde565b840191505092915050565b60006133de82613bd0565b6133e88185613bfd565b93506133f8818560208601613da0565b80840191505092915050565b6000613411601483613bec565b915061341c82613fef565b602082019050919050565b6000613434600f83613bec565b915061343f82614018565b602082019050919050565b6000613457602b83613bec565b915061346282614041565b604082019050919050565b600061347a603283613bec565b915061348582614090565b604082019050919050565b600061349d602683613bec565b91506134a8826140df565b604082019050919050565b60006134c0601c83613bec565b91506134cb8261412e565b602082019050919050565b60006134e3602483613bec565b91506134ee82614157565b604082019050919050565b6000613506601983613bec565b9150613511826141a6565b602082019050919050565b6000613529602c83613bec565b9150613534826141cf565b604082019050919050565b600061354c601083613bec565b91506135578261421e565b602082019050919050565b600061356f603883613bec565b915061357a82614247565b604082019050919050565b6000613592602a83613bec565b915061359d82614296565b604082019050919050565b60006135b5602983613bec565b91506135c0826142e5565b604082019050919050565b60006135d8602083613bec565b91506135e382614334565b602082019050919050565b60006135fb603183613bec565b91506136068261435d565b604082019050919050565b600061361e602c83613bec565b9150613629826143ac565b604082019050919050565b6000613641602083613bec565b915061364c826143fb565b602082019050919050565b6000613664602983613bec565b915061366f82614424565b604082019050919050565b6000613687602f83613bec565b915061369282614473565b604082019050919050565b60006136aa602183613bec565b91506136b5826144c2565b604082019050919050565b60006136cd601383613bec565b91506136d882614511565b602082019050919050565b60006136f0603183613bec565b91506136fb8261453a565b604082019050919050565b6000613713602c83613bec565b915061371e82614589565b604082019050919050565b6000613736603083613bec565b9150613741826145d8565b604082019050919050565b61375581613d87565b82525050565b600061376782856133d3565b915061377382846133d3565b91508190509392505050565b60006020820190506137946000830184613343565b92915050565b60006080820190506137af6000830187613343565b6137bc6020830186613343565b6137c9604083018561374c565b81810360608301526137db8184613361565b905095945050505050565b60006020820190506137fb6000830184613352565b92915050565b6000602082019050818103600083015261381b818461339a565b905092915050565b6000602082019050818103600083015261383c81613404565b9050919050565b6000602082019050818103600083015261385c81613427565b9050919050565b6000602082019050818103600083015261387c8161344a565b9050919050565b6000602082019050818103600083015261389c8161346d565b9050919050565b600060208201905081810360008301526138bc81613490565b9050919050565b600060208201905081810360008301526138dc816134b3565b9050919050565b600060208201905081810360008301526138fc816134d6565b9050919050565b6000602082019050818103600083015261391c816134f9565b9050919050565b6000602082019050818103600083015261393c8161351c565b9050919050565b6000602082019050818103600083015261395c8161353f565b9050919050565b6000602082019050818103600083015261397c81613562565b9050919050565b6000602082019050818103600083015261399c81613585565b9050919050565b600060208201905081810360008301526139bc816135a8565b9050919050565b600060208201905081810360008301526139dc816135cb565b9050919050565b600060208201905081810360008301526139fc816135ee565b9050919050565b60006020820190508181036000830152613a1c81613611565b9050919050565b60006020820190508181036000830152613a3c81613634565b9050919050565b60006020820190508181036000830152613a5c81613657565b9050919050565b60006020820190508181036000830152613a7c8161367a565b9050919050565b60006020820190508181036000830152613a9c8161369d565b9050919050565b60006020820190508181036000830152613abc816136c0565b9050919050565b60006020820190508181036000830152613adc816136e3565b9050919050565b60006020820190508181036000830152613afc81613706565b9050919050565b60006020820190508181036000830152613b1c81613729565b9050919050565b6000602082019050613b38600083018461374c565b92915050565b6000613b48613b59565b9050613b548282613e05565b919050565b6000604051905090565b600067ffffffffffffffff821115613b7e57613b7d613f9b565b5b613b8782613fde565b9050602081019050919050565b600067ffffffffffffffff821115613baf57613bae613f9b565b5b613bb882613fde565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c1382613d87565b9150613c1e83613d87565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c5357613c52613eb0565b5b828201905092915050565b6000613c6982613d87565b9150613c7483613d87565b925082613c8457613c83613edf565b5b828204905092915050565b6000613c9a82613d87565b9150613ca583613d87565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cde57613cdd613eb0565b5b828202905092915050565b6000613cf482613d87565b9150613cff83613d87565b925082821015613d1257613d11613eb0565b5b828203905092915050565b6000613d2882613d67565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613dbe578082015181840152602081019050613da3565b83811115613dcd576000848401525b50505050565b60006002820490506001821680613deb57607f821691505b60208210811415613dff57613dfe613f0e565b5b50919050565b613e0e82613fde565b810181811067ffffffffffffffff82111715613e2d57613e2c613f9b565b5b80604052505050565b6000613e4182613d87565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e7457613e73613eb0565b5b600182019050919050565b6000613e8a82613d87565b9150613e9583613d87565b925082613ea557613ea4613edf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f737570706c79206465706c657465640000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f75676820776173207061696400000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b61463081613d1d565b811461463b57600080fd5b50565b61464781613d2f565b811461465257600080fd5b50565b61465e81613d3b565b811461466957600080fd5b50565b61467581613d87565b811461468057600080fd5b5056fea26469706673582212203c46e67bee0c87c7abe33dfe5d47e0ef3967efb593f32133ccd5decc0406fed364736f6c63430008070033

Deployed ByteCode Sourcemap

49765:2355:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51946:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22005:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23416:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22976:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35671:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24306:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35339:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50274:107;;;;;;;;;;;;;:::i;:::-;;50201:65;;;;;;;;;;;;;:::i;:::-;;51028:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24716:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48118:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35861:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50501:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44177:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21699:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50045:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50389:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21429:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47109:148;;;;;;;;;;;;;:::i;:::-;;50132:61;;;;;;;;;;;;;:::i;:::-;;46458:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50611:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22174:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50004:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23709:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24972:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51783:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49966:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24075:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47412:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51118:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51946:171;52049:4;52073:36;52097:11;52073:23;:36::i;:::-;52066:43;;51946:171;;;:::o;22005:100::-;22059:13;22092:5;22085:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22005:100;:::o;23416:221::-;23492:7;23520:16;23528:7;23520;:16::i;:::-;23512:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23605:15;:24;23621:7;23605:24;;;;;;;;;;;;;;;;;;;;;23598:31;;23416:221;;;:::o;22976:374::-;23057:13;23073:23;23088:7;23073:14;:23::i;:::-;23057:39;;23121:5;23115:11;;:2;:11;;;;23107:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23201:5;23185:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23210:37;23227:5;23234:12;:10;:12::i;:::-;23210:16;:37::i;:::-;23185:62;23177:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;23321:21;23330:2;23334:7;23321:8;:21::i;:::-;23046:304;22976:374;;:::o;35671:113::-;35732:7;35759:10;:17;;;;35752:24;;35671:113;:::o;24306:339::-;24501:41;24520:12;:10;:12::i;:::-;24534:7;24501:18;:41::i;:::-;24493:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24609:28;24619:4;24625:2;24629:7;24609:9;:28::i;:::-;24306:339;;;:::o;35339:256::-;35436:7;35472:23;35489:5;35472:16;:23::i;:::-;35464:5;:31;35456:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35561:12;:19;35574:5;35561:19;;;;;;;;;;;;;;;:26;35581:5;35561:26;;;;;;;;;;;;35554:33;;35339:256;;;;:::o;50274:107::-;46689:12;:10;:12::i;:::-;46678:23;;:7;:5;:7::i;:::-;:23;;;46670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50330:10:::1;50322:28;;:51;50351:21;50322:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50274:107::o:0;50201:65::-;46689:12;:10;:12::i;:::-;46678:23;;:7;:5;:7::i;:::-;:23;;;46670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50248:10:::1;:8;:10::i;:::-;50201:65::o:0;51028:82::-;46689:12;:10;:12::i;:::-;46678:23;;:7;:5;:7::i;:::-;:23;;;46670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51086:16:::1;51099:2;51086:12;:16::i;:::-;51028:82:::0;:::o;24716:185::-;24854:39;24871:4;24877:2;24881:7;24854:39;;;;;;;;;;;;:16;:39::i;:::-;24716:185;;;:::o;48118:245::-;48236:41;48255:12;:10;:12::i;:::-;48269:7;48236:18;:41::i;:::-;48228:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;48341:14;48347:7;48341:5;:14::i;:::-;48118:245;:::o;35861:233::-;35936:7;35972:30;:28;:30::i;:::-;35964:5;:38;35956:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36069:10;36080:5;36069:17;;;;;;;;:::i;:::-;;;;;;;;;;36062:24;;35861:233;;;:::o;50501:102::-;46689:12;:10;:12::i;:::-;46678:23;;:7;:5;:7::i;:::-;:23;;;46670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50585:10:::1;50575:7;:20;;;;;;;;;;;;:::i;:::-;;50501:102:::0;:::o;44177:86::-;44224:4;44248:7;;;;;;;;;;;44241:14;;44177:86;:::o;21699:239::-;21771:7;21791:13;21807:7;:16;21815:7;21807:16;;;;;;;;;;;;;;;;;;;;;21791:32;;21859:1;21842:19;;:5;:19;;;;21834:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21925:5;21918:12;;;21699:239;;;:::o;50045:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50389:104::-;46689:12;:10;:12::i;:::-;46678:23;;:7;:5;:7::i;:::-;:23;;;46670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50473:12:::1;50461:9;:24;;;;50389:104:::0;:::o;21429:208::-;21501:7;21546:1;21529:19;;:5;:19;;;;21521:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21613:9;:16;21623:5;21613:16;;;;;;;;;;;;;;;;21606:23;;21429:208;;;:::o;47109:148::-;46689:12;:10;:12::i;:::-;46678:23;;:7;:5;:7::i;:::-;:23;;;46670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47216:1:::1;47179:40;;47200:6;;;;;;;;;;;47179:40;;;;;;;;;;;;47247:1;47230:6;;:19;;;;;;;;;;;;;;;;;;47109:148::o:0;50132:61::-;46689:12;:10;:12::i;:::-;46678:23;;:7;:5;:7::i;:::-;:23;;;46670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50177:8:::1;:6;:8::i;:::-;50132:61::o:0;46458:87::-;46504:7;46531:6;;;;;;;;;;;46524:13;;46458:87;:::o;50611:88::-;46689:12;:10;:12::i;:::-;46678:23;;:7;:5;:7::i;:::-;:23;;;46670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50683:8:::1;50675:5;:16;;;;50611:88:::0;:::o;22174:104::-;22230:13;22263:7;22256:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22174:104;:::o;50004:34::-;;;;:::o;23709:295::-;23824:12;:10;:12::i;:::-;23812:24;;:8;:24;;;;23804:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23924:8;23879:18;:32;23898:12;:10;:12::i;:::-;23879:32;;;;;;;;;;;;;;;:42;23912:8;23879:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23977:8;23948:48;;23963:12;:10;:12::i;:::-;23948:48;;;23987:8;23948:48;;;;;;:::i;:::-;;;;;;;;23709:295;;:::o;24972:328::-;25147:41;25166:12;:10;:12::i;:::-;25180:7;25147:18;:41::i;:::-;25139:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25253:39;25267:4;25273:2;25277:7;25286:5;25253:13;:39::i;:::-;24972:328;;;;:::o;51783:155::-;51874:13;51907:23;51922:7;51907:14;:23::i;:::-;51900:30;;51783:155;;;:::o;49966:31::-;;;;:::o;24075:164::-;24172:4;24196:18;:25;24215:5;24196:25;;;;;;;;;;;;;;;:35;24222:8;24196:35;;;;;;;;;;;;;;;;;;;;;;;;;24189:42;;24075:164;;;;:::o;47412:244::-;46689:12;:10;:12::i;:::-;46678:23;;:7;:5;:7::i;:::-;:23;;;46670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47521:1:::1;47501:22;;:8;:22;;;;47493:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47611:8;47582:38;;47603:6;;;;;;;;;;;47582:38;;;;;;;;;;;;47640:8;47631:6;;:17;;;;;;;;;;;;;;;;;;47412:244:::0;:::o;51118:227::-;51209:6;51201:5;;:14;;;;:::i;:::-;51188:9;:27;;51180:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51255:9;51250:88;51274:6;51270:1;:10;51250:88;;;51302:24;51315:10;51302:12;:24::i;:::-;51282:3;;;;;:::i;:::-;;;;51250:88;;;;51118:227;:::o;35031:224::-;35133:4;35172:35;35157:50;;;:11;:50;;;;:90;;;;35211:36;35235:11;35211:23;:36::i;:::-;35157:90;35150:97;;35031:224;;;:::o;26810:127::-;26875:4;26927:1;26899:30;;:7;:16;26907:7;26899:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26892:37;;26810:127;;;:::o;16405:98::-;16458:7;16485:10;16478:17;;16405:98;:::o;30755:174::-;30857:2;30830:15;:24;30846:7;30830:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30913:7;30909:2;30875:46;;30884:23;30899:7;30884:14;:23::i;:::-;30875:46;;;;;;;;;;;;30755:174;;:::o;27104:348::-;27197:4;27222:16;27230:7;27222;:16::i;:::-;27214:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27298:13;27314:23;27329:7;27314:14;:23::i;:::-;27298:39;;27367:5;27356:16;;:7;:16;;;:51;;;;27400:7;27376:31;;:20;27388:7;27376:11;:20::i;:::-;:31;;;27356:51;:87;;;;27411:32;27428:5;27435:7;27411:16;:32::i;:::-;27356:87;27348:96;;;27104:348;;;;:::o;30059:578::-;30218:4;30191:31;;:23;30206:7;30191:14;:23::i;:::-;:31;;;30183:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30301:1;30287:16;;:2;:16;;;;30279:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30357:39;30378:4;30384:2;30388:7;30357:20;:39::i;:::-;30461:29;30478:1;30482:7;30461:8;:29::i;:::-;30522:1;30503:9;:15;30513:4;30503:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30551:1;30534:9;:13;30544:2;30534:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30582:2;30563:7;:16;30571:7;30563:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30621:7;30617:2;30602:27;;30611:4;30602:27;;;;;;;;;;;;30059:578;;;:::o;45236:120::-;44780:8;:6;:8::i;:::-;44772:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;45305:5:::1;45295:7;;:15;;;;;;;;;;;;;;;;;;45326:22;45335:12;:10;:12::i;:::-;45326:22;;;;;;:::i;:::-;;;;;;;;45236:120::o:0;50815:205::-;50894:9;;50877:13;:11;:13::i;:::-;:26;;50869:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;50934:40;50944:2;50948:25;:15;:23;:25::i;:::-;50934:9;:40::i;:::-;50985:27;:15;:25;:27::i;:::-;50815:205;:::o;51660:115::-;51747:20;51759:7;51747:11;:20::i;:::-;51660:115;:::o;44977:118::-;44503:8;:6;:8::i;:::-;44502:9;44494:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45047:4:::1;45037:7;;:14;;;;;;;;;;;;;;;;;;45067:20;45074:12;:10;:12::i;:::-;45067:20;;;;;;:::i;:::-;;;;;;;;44977:118::o:0;26182:315::-;26339:28;26349:4;26355:2;26359:7;26339:9;:28::i;:::-;26386:48;26409:4;26415:2;26419:7;26428:5;26386:22;:48::i;:::-;26378:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26182:315;;;;:::o;41609:679::-;41682:13;41716:16;41724:7;41716;:16::i;:::-;41708:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;41799:23;41825:10;:19;41836:7;41825:19;;;;;;;;;;;41799:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41855:18;41876:10;:8;:10::i;:::-;41855:31;;41984:1;41968:4;41962:18;:23;41958:72;;;42009:9;42002:16;;;;;;41958:72;42160:1;42140:9;42134:23;:27;42130:108;;;42209:4;42215:9;42192:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42178:48;;;;;;42130:108;42257:23;42272:7;42257:14;:23::i;:::-;42250:30;;;;41609:679;;;;:::o;21099:266::-;21201:4;21240:25;21225:40;;;:11;:40;;;;:92;;;;21284:33;21269:48;;;:11;:48;;;;21225:92;:132;;;;21321:36;21345:11;21321:23;:36::i;:::-;21225:132;21218:139;;21099:266;;;:::o;51353:229::-;44503:8;:6;:8::i;:::-;44502:9;44494:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51529:45:::1;51556:4;51562:2;51566:7;51529:26;:45::i;:::-;51353:229:::0;;;:::o;49189:114::-;49254:7;49281;:14;;;49274:21;;49189:114;;;:::o;27794:110::-;27870:26;27880:2;27884:7;27870:26;;;;;;;;;;;;:9;:26::i;:::-;27794:110;;:::o;49311:127::-;49418:1;49400:7;:14;;;:19;;;;;;;;;;;49311:127;:::o;42890:206::-;42959:20;42971:7;42959:11;:20::i;:::-;43033:1;43002:10;:19;43013:7;43002:19;;;;;;;;;;;42996:33;;;;;:::i;:::-;;;:38;42992:97;;43058:10;:19;43069:7;43058:19;;;;;;;;;;;;43051:26;;;;:::i;:::-;42992:97;42890:206;:::o;31494:872::-;31649:4;31670:15;:2;:13;;;:15::i;:::-;31666:693;;;31722:2;31706:36;;;31743:12;:10;:12::i;:::-;31757:4;31763:7;31772:5;31706:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31702:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31969:1;31952:6;:13;:18;31948:341;;;31995:60;;;;;;;;;;:::i;:::-;;;;;;;;31948:341;32239:6;32233:13;32224:6;32220:2;32216:15;32209:38;31702:602;31839:45;;;31829:55;;;:6;:55;;;;31822:62;;;;;31666:693;32343:4;32336:11;;31494:872;;;;;;;:::o;50707:100::-;50759:13;50792:7;50785:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50707:100;:::o;22349:334::-;22422:13;22456:16;22464:7;22456;:16::i;:::-;22448:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22537:21;22561:10;:8;:10::i;:::-;22537:34;;22613:1;22595:7;22589:21;:25;:86;;;;;;;;;;;;;;;;;22641:7;22650:18;:7;:16;:18::i;:::-;22624:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22589:86;22582:93;;;22349:334;;;:::o;19615:157::-;19700:4;19739:25;19724:40;;;:11;:40;;;;19717:47;;19615:157;;;:::o;36707:589::-;36851:45;36878:4;36884:2;36888:7;36851:26;:45::i;:::-;36929:1;36913:18;;:4;:18;;;36909:187;;;36948:40;36980:7;36948:31;:40::i;:::-;36909:187;;;37018:2;37010:10;;:4;:10;;;37006:90;;37037:47;37070:4;37076:7;37037:32;:47::i;:::-;37006:90;36909:187;37124:1;37110:16;;:2;:16;;;37106:183;;;37143:45;37180:7;37143:36;:45::i;:::-;37106:183;;;37216:4;37210:10;;:2;:10;;;37206:83;;37237:40;37265:2;37269:7;37237:27;:40::i;:::-;37206:83;37106:183;36707:589;;;:::o;28131:284::-;28261:18;28267:2;28271:7;28261:5;:18::i;:::-;28298:54;28329:1;28333:2;28337:7;28346:5;28298:22;:54::i;:::-;28290:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;28131:284;;;:::o;29362:360::-;29422:13;29438:23;29453:7;29438:14;:23::i;:::-;29422:39;;29474:48;29495:5;29510:1;29514:7;29474:20;:48::i;:::-;29563:29;29580:1;29584:7;29563:8;:29::i;:::-;29625:1;29605:9;:16;29615:5;29605:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;29644:7;:16;29652:7;29644:16;;;;;;;;;;;;29637:23;;;;;;;;;;;29706:7;29702:1;29678:36;;29687:5;29678:36;;;;;;;;;;;;29411:311;29362:360;:::o;8286:444::-;8346:4;8554:12;8678:7;8666:20;8658:28;;8721:1;8714:4;:8;8707:15;;;8286:444;;;:::o;17062:723::-;17118:13;17348:1;17339:5;:10;17335:53;;;17366:10;;;;;;;;;;;;;;;;;;;;;17335:53;17398:12;17413:5;17398:20;;17429:14;17454:78;17469:1;17461:4;:9;17454:78;;17487:8;;;;;:::i;:::-;;;;17518:2;17510:10;;;;;:::i;:::-;;;17454:78;;;17542:19;17574:6;17564:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17542:39;;17592:154;17608:1;17599:5;:10;17592:154;;17636:1;17626:11;;;;;:::i;:::-;;;17703:2;17695:5;:10;;;;:::i;:::-;17682:2;:24;;;;:::i;:::-;17669:39;;17652:6;17659;17652:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17732:2;17723:11;;;;;:::i;:::-;;;17592:154;;;17770:6;17756:21;;;;;17062:723;;;;:::o;32979:126::-;;;;:::o;38019:164::-;38123:10;:17;;;;38096:15;:24;38112:7;38096:24;;;;;;;;;;;:44;;;;38151:10;38167:7;38151:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38019:164;:::o;38810:988::-;39076:22;39126:1;39101:22;39118:4;39101:16;:22::i;:::-;:26;;;;:::i;:::-;39076:51;;39138:18;39159:17;:26;39177:7;39159:26;;;;;;;;;;;;39138:47;;39306:14;39292:10;:28;39288:328;;39337:19;39359:12;:18;39372:4;39359:18;;;;;;;;;;;;;;;:34;39378:14;39359:34;;;;;;;;;;;;39337:56;;39443:11;39410:12;:18;39423:4;39410:18;;;;;;;;;;;;;;;:30;39429:10;39410:30;;;;;;;;;;;:44;;;;39560:10;39527:17;:30;39545:11;39527:30;;;;;;;;;;;:43;;;;39322:294;39288:328;39712:17;:26;39730:7;39712:26;;;;;;;;;;;39705:33;;;39756:12;:18;39769:4;39756:18;;;;;;;;;;;;;;;:34;39775:14;39756:34;;;;;;;;;;;39749:41;;;38891:907;;38810:988;;:::o;40093:1079::-;40346:22;40391:1;40371:10;:17;;;;:21;;;;:::i;:::-;40346:46;;40403:18;40424:15;:24;40440:7;40424:24;;;;;;;;;;;;40403:45;;40775:19;40797:10;40808:14;40797:26;;;;;;;;:::i;:::-;;;;;;;;;;40775:48;;40861:11;40836:10;40847;40836:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40972:10;40941:15;:28;40957:11;40941:28;;;;;;;;;;;:41;;;;41113:15;:24;41129:7;41113:24;;;;;;;;;;;41106:31;;;41148:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40164:1008;;;40093:1079;:::o;37597:221::-;37682:14;37699:20;37716:2;37699:16;:20::i;:::-;37682:37;;37757:7;37730:12;:16;37743:2;37730:16;;;;;;;;;;;;;;;:24;37747:6;37730:24;;;;;;;;;;;:34;;;;37804:6;37775:17;:26;37793:7;37775:26;;;;;;;;;;;:35;;;;37671:147;37597:221;;:::o;28751:382::-;28845:1;28831:16;;:2;:16;;;;28823:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28904:16;28912:7;28904;:16::i;:::-;28903:17;28895:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28966:45;28995:1;28999:2;29003:7;28966:20;:45::i;:::-;29041:1;29024:9;:13;29034:2;29024:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29072:2;29053:7;:16;29061:7;29053:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29117:7;29113:2;29092:33;;29109:1;29092:33;;;;;;;;;;;;28751:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:::-;14610:3;14631:67;14695:2;14690:3;14631:67;:::i;:::-;14624:74;;14707:93;14796:3;14707:93;:::i;:::-;14825:2;14820:3;14816:12;14809:19;;14468:366;;;:::o;14840:::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:::-;15726:3;15747:67;15811:2;15806:3;15747:67;:::i;:::-;15740:74;;15823:93;15912:3;15823:93;:::i;:::-;15941:2;15936:3;15932:12;15925:19;;15584:366;;;:::o;15956:::-;16098:3;16119:67;16183:2;16178:3;16119:67;:::i;:::-;16112:74;;16195:93;16284:3;16195:93;:::i;:::-;16313:2;16308:3;16304:12;16297:19;;15956:366;;;:::o;16328:::-;16470:3;16491:67;16555:2;16550:3;16491:67;:::i;:::-;16484:74;;16567:93;16656:3;16567:93;:::i;:::-;16685:2;16680:3;16676:12;16669:19;;16328:366;;;:::o;16700:::-;16842:3;16863:67;16927:2;16922:3;16863:67;:::i;:::-;16856:74;;16939:93;17028:3;16939:93;:::i;:::-;17057:2;17052:3;17048:12;17041:19;;16700:366;;;:::o;17072:::-;17214:3;17235:67;17299:2;17294:3;17235:67;:::i;:::-;17228:74;;17311:93;17400:3;17311:93;:::i;:::-;17429:2;17424:3;17420:12;17413:19;;17072:366;;;:::o;17444:118::-;17531:24;17549:5;17531:24;:::i;:::-;17526:3;17519:37;17444:118;;:::o;17568:435::-;17748:3;17770:95;17861:3;17852:6;17770:95;:::i;:::-;17763:102;;17882:95;17973:3;17964:6;17882:95;:::i;:::-;17875:102;;17994:3;17987:10;;17568:435;;;;;:::o;18009:222::-;18102:4;18140:2;18129:9;18125:18;18117:26;;18153:71;18221:1;18210:9;18206:17;18197:6;18153:71;:::i;:::-;18009:222;;;;:::o;18237:640::-;18432:4;18470:3;18459:9;18455:19;18447:27;;18484:71;18552:1;18541:9;18537:17;18528:6;18484:71;:::i;:::-;18565:72;18633:2;18622:9;18618:18;18609:6;18565:72;:::i;:::-;18647;18715:2;18704:9;18700:18;18691:6;18647:72;:::i;:::-;18766:9;18760:4;18756:20;18751:2;18740:9;18736:18;18729:48;18794:76;18865:4;18856:6;18794:76;:::i;:::-;18786:84;;18237:640;;;;;;;:::o;18883:210::-;18970:4;19008:2;18997:9;18993:18;18985:26;;19021:65;19083:1;19072:9;19068:17;19059:6;19021:65;:::i;:::-;18883:210;;;;:::o;19099:313::-;19212:4;19250:2;19239:9;19235:18;19227:26;;19299:9;19293:4;19289:20;19285:1;19274:9;19270:17;19263:47;19327:78;19400:4;19391:6;19327:78;:::i;:::-;19319:86;;19099:313;;;;:::o;19418:419::-;19584:4;19622:2;19611:9;19607:18;19599:26;;19671:9;19665:4;19661:20;19657:1;19646:9;19642:17;19635:47;19699:131;19825:4;19699:131;:::i;:::-;19691:139;;19418:419;;;:::o;19843:::-;20009:4;20047:2;20036:9;20032:18;20024:26;;20096:9;20090:4;20086:20;20082:1;20071:9;20067:17;20060:47;20124:131;20250:4;20124:131;:::i;:::-;20116:139;;19843:419;;;:::o;20268:::-;20434:4;20472:2;20461:9;20457:18;20449:26;;20521:9;20515:4;20511:20;20507:1;20496:9;20492:17;20485:47;20549:131;20675:4;20549:131;:::i;:::-;20541:139;;20268:419;;;:::o;20693:::-;20859:4;20897:2;20886:9;20882:18;20874:26;;20946:9;20940:4;20936:20;20932:1;20921:9;20917:17;20910:47;20974:131;21100:4;20974:131;:::i;:::-;20966:139;;20693:419;;;:::o;21118:::-;21284:4;21322:2;21311:9;21307:18;21299:26;;21371:9;21365:4;21361:20;21357:1;21346:9;21342:17;21335:47;21399:131;21525:4;21399:131;:::i;:::-;21391:139;;21118:419;;;:::o;21543:::-;21709:4;21747:2;21736:9;21732:18;21724:26;;21796:9;21790:4;21786:20;21782:1;21771:9;21767:17;21760:47;21824:131;21950:4;21824:131;:::i;:::-;21816:139;;21543:419;;;:::o;21968:::-;22134:4;22172:2;22161:9;22157:18;22149:26;;22221:9;22215:4;22211:20;22207:1;22196:9;22192:17;22185:47;22249:131;22375:4;22249:131;:::i;:::-;22241:139;;21968:419;;;:::o;22393:::-;22559:4;22597:2;22586:9;22582:18;22574:26;;22646:9;22640:4;22636:20;22632:1;22621:9;22617:17;22610:47;22674:131;22800:4;22674:131;:::i;:::-;22666:139;;22393:419;;;:::o;22818:::-;22984:4;23022:2;23011:9;23007:18;22999:26;;23071:9;23065:4;23061:20;23057:1;23046:9;23042:17;23035:47;23099:131;23225:4;23099:131;:::i;:::-;23091:139;;22818:419;;;:::o;23243:::-;23409:4;23447:2;23436:9;23432:18;23424:26;;23496:9;23490:4;23486:20;23482:1;23471:9;23467:17;23460:47;23524:131;23650:4;23524:131;:::i;:::-;23516:139;;23243:419;;;:::o;23668:::-;23834:4;23872:2;23861:9;23857:18;23849:26;;23921:9;23915:4;23911:20;23907:1;23896:9;23892:17;23885:47;23949:131;24075:4;23949:131;:::i;:::-;23941:139;;23668:419;;;:::o;24093:::-;24259:4;24297:2;24286:9;24282:18;24274:26;;24346:9;24340:4;24336:20;24332:1;24321:9;24317:17;24310:47;24374:131;24500:4;24374:131;:::i;:::-;24366:139;;24093:419;;;:::o;24518:::-;24684:4;24722:2;24711:9;24707:18;24699:26;;24771:9;24765:4;24761:20;24757:1;24746:9;24742:17;24735:47;24799:131;24925:4;24799:131;:::i;:::-;24791:139;;24518:419;;;:::o;24943:::-;25109:4;25147:2;25136:9;25132:18;25124:26;;25196:9;25190:4;25186:20;25182:1;25171:9;25167:17;25160:47;25224:131;25350:4;25224:131;:::i;:::-;25216:139;;24943:419;;;:::o;25368:::-;25534:4;25572:2;25561:9;25557:18;25549:26;;25621:9;25615:4;25611:20;25607:1;25596:9;25592:17;25585:47;25649:131;25775:4;25649:131;:::i;:::-;25641:139;;25368:419;;;:::o;25793:::-;25959:4;25997:2;25986:9;25982:18;25974:26;;26046:9;26040:4;26036:20;26032:1;26021:9;26017:17;26010:47;26074:131;26200:4;26074:131;:::i;:::-;26066:139;;25793:419;;;:::o;26218:::-;26384:4;26422:2;26411:9;26407:18;26399:26;;26471:9;26465:4;26461:20;26457:1;26446:9;26442:17;26435:47;26499:131;26625:4;26499:131;:::i;:::-;26491:139;;26218:419;;;:::o;26643:::-;26809:4;26847:2;26836:9;26832:18;26824:26;;26896:9;26890:4;26886:20;26882:1;26871:9;26867:17;26860:47;26924:131;27050:4;26924:131;:::i;:::-;26916:139;;26643:419;;;:::o;27068:::-;27234:4;27272:2;27261:9;27257:18;27249:26;;27321:9;27315:4;27311:20;27307:1;27296:9;27292:17;27285:47;27349:131;27475:4;27349:131;:::i;:::-;27341:139;;27068:419;;;:::o;27493:::-;27659:4;27697:2;27686:9;27682:18;27674:26;;27746:9;27740:4;27736:20;27732:1;27721:9;27717:17;27710:47;27774:131;27900:4;27774:131;:::i;:::-;27766:139;;27493:419;;;:::o;27918:::-;28084:4;28122:2;28111:9;28107:18;28099:26;;28171:9;28165:4;28161:20;28157:1;28146:9;28142:17;28135:47;28199:131;28325:4;28199:131;:::i;:::-;28191:139;;27918:419;;;:::o;28343:::-;28509:4;28547:2;28536:9;28532:18;28524:26;;28596:9;28590:4;28586:20;28582:1;28571:9;28567:17;28560:47;28624:131;28750:4;28624:131;:::i;:::-;28616:139;;28343:419;;;:::o;28768:::-;28934:4;28972:2;28961:9;28957:18;28949:26;;29021:9;29015:4;29011:20;29007:1;28996:9;28992:17;28985:47;29049:131;29175:4;29049:131;:::i;:::-;29041:139;;28768:419;;;:::o;29193:::-;29359:4;29397:2;29386:9;29382:18;29374:26;;29446:9;29440:4;29436:20;29432:1;29421:9;29417:17;29410:47;29474:131;29600:4;29474:131;:::i;:::-;29466:139;;29193:419;;;:::o;29618:222::-;29711:4;29749:2;29738:9;29734:18;29726:26;;29762:71;29830:1;29819:9;29815:17;29806:6;29762:71;:::i;:::-;29618:222;;;;:::o;29846:129::-;29880:6;29907:20;;:::i;:::-;29897:30;;29936:33;29964:4;29956:6;29936:33;:::i;:::-;29846:129;;;:::o;29981:75::-;30014:6;30047:2;30041:9;30031:19;;29981:75;:::o;30062:307::-;30123:4;30213:18;30205:6;30202:30;30199:56;;;30235:18;;:::i;:::-;30199:56;30273:29;30295:6;30273:29;:::i;:::-;30265:37;;30357:4;30351;30347:15;30339:23;;30062:307;;;:::o;30375:308::-;30437:4;30527:18;30519:6;30516:30;30513:56;;;30549:18;;:::i;:::-;30513:56;30587:29;30609:6;30587:29;:::i;:::-;30579:37;;30671:4;30665;30661:15;30653:23;;30375:308;;;:::o;30689:98::-;30740:6;30774:5;30768:12;30758:22;;30689:98;;;:::o;30793:99::-;30845:6;30879:5;30873:12;30863:22;;30793:99;;;:::o;30898:168::-;30981:11;31015:6;31010:3;31003:19;31055:4;31050:3;31046:14;31031:29;;30898:168;;;;:::o;31072:169::-;31156:11;31190:6;31185:3;31178:19;31230:4;31225:3;31221:14;31206:29;;31072:169;;;;:::o;31247:148::-;31349:11;31386:3;31371:18;;31247:148;;;;:::o;31401:305::-;31441:3;31460:20;31478:1;31460:20;:::i;:::-;31455:25;;31494:20;31512:1;31494:20;:::i;:::-;31489:25;;31648:1;31580:66;31576:74;31573:1;31570:81;31567:107;;;31654:18;;:::i;:::-;31567:107;31698:1;31695;31691:9;31684:16;;31401:305;;;;:::o;31712:185::-;31752:1;31769:20;31787:1;31769:20;:::i;:::-;31764:25;;31803:20;31821:1;31803:20;:::i;:::-;31798:25;;31842:1;31832:35;;31847:18;;:::i;:::-;31832:35;31889:1;31886;31882:9;31877:14;;31712:185;;;;:::o;31903:348::-;31943:7;31966:20;31984:1;31966:20;:::i;:::-;31961:25;;32000:20;32018:1;32000:20;:::i;:::-;31995:25;;32188:1;32120:66;32116:74;32113:1;32110:81;32105:1;32098:9;32091:17;32087:105;32084:131;;;32195:18;;:::i;:::-;32084:131;32243:1;32240;32236:9;32225:20;;31903:348;;;;:::o;32257:191::-;32297:4;32317:20;32335:1;32317:20;:::i;:::-;32312:25;;32351:20;32369:1;32351:20;:::i;:::-;32346:25;;32390:1;32387;32384:8;32381:34;;;32395:18;;:::i;:::-;32381:34;32440:1;32437;32433:9;32425:17;;32257:191;;;;:::o;32454:96::-;32491:7;32520:24;32538:5;32520:24;:::i;:::-;32509:35;;32454:96;;;:::o;32556:90::-;32590:7;32633:5;32626:13;32619:21;32608:32;;32556:90;;;:::o;32652:149::-;32688:7;32728:66;32721:5;32717:78;32706:89;;32652:149;;;:::o;32807:126::-;32844:7;32884:42;32877:5;32873:54;32862:65;;32807:126;;;:::o;32939:77::-;32976:7;33005:5;32994:16;;32939:77;;;:::o;33022:154::-;33106:6;33101:3;33096;33083:30;33168:1;33159:6;33154:3;33150:16;33143:27;33022:154;;;:::o;33182:307::-;33250:1;33260:113;33274:6;33271:1;33268:13;33260:113;;;33359:1;33354:3;33350:11;33344:18;33340:1;33335:3;33331:11;33324:39;33296:2;33293:1;33289:10;33284:15;;33260:113;;;33391:6;33388:1;33385:13;33382:101;;;33471:1;33462:6;33457:3;33453:16;33446:27;33382:101;33231:258;33182:307;;;:::o;33495:320::-;33539:6;33576:1;33570:4;33566:12;33556:22;;33623:1;33617:4;33613:12;33644:18;33634:81;;33700:4;33692:6;33688:17;33678:27;;33634:81;33762:2;33754:6;33751:14;33731:18;33728:38;33725:84;;;33781:18;;:::i;:::-;33725:84;33546:269;33495:320;;;:::o;33821:281::-;33904:27;33926:4;33904:27;:::i;:::-;33896:6;33892:40;34034:6;34022:10;34019:22;33998:18;33986:10;33983:34;33980:62;33977:88;;;34045:18;;:::i;:::-;33977:88;34085:10;34081:2;34074:22;33864:238;33821:281;;:::o;34108:233::-;34147:3;34170:24;34188:5;34170:24;:::i;:::-;34161:33;;34216:66;34209:5;34206:77;34203:103;;;34286:18;;:::i;:::-;34203:103;34333:1;34326:5;34322:13;34315:20;;34108:233;;;:::o;34347:176::-;34379:1;34396:20;34414:1;34396:20;:::i;:::-;34391:25;;34430:20;34448:1;34430:20;:::i;:::-;34425:25;;34469:1;34459:35;;34474:18;;:::i;:::-;34459:35;34515:1;34512;34508:9;34503:14;;34347:176;;;;:::o;34529:180::-;34577:77;34574:1;34567:88;34674:4;34671:1;34664:15;34698:4;34695:1;34688:15;34715:180;34763:77;34760:1;34753:88;34860:4;34857:1;34850:15;34884:4;34881:1;34874:15;34901:180;34949:77;34946:1;34939:88;35046:4;35043:1;35036:15;35070:4;35067:1;35060:15;35087:180;35135:77;35132:1;35125:88;35232:4;35229:1;35222:15;35256:4;35253:1;35246:15;35273:180;35321:77;35318:1;35311:88;35418:4;35415:1;35408:15;35442:4;35439:1;35432:15;35459:180;35507:77;35504:1;35497:88;35604:4;35601:1;35594:15;35628:4;35625:1;35618:15;35645:117;35754:1;35751;35744:12;35768:117;35877:1;35874;35867:12;35891:117;36000:1;35997;35990:12;36014:117;36123:1;36120;36113:12;36137:102;36178:6;36229:2;36225:7;36220:2;36213:5;36209:14;36205:28;36195:38;;36137:102;;;:::o;36245:170::-;36385:22;36381:1;36373:6;36369:14;36362:46;36245:170;:::o;36421:165::-;36561:17;36557:1;36549:6;36545:14;36538:41;36421:165;:::o;36592:230::-;36732:34;36728:1;36720:6;36716:14;36709:58;36801:13;36796:2;36788:6;36784:15;36777:38;36592:230;:::o;36828:237::-;36968:34;36964:1;36956:6;36952:14;36945:58;37037:20;37032:2;37024:6;37020:15;37013:45;36828:237;:::o;37071:225::-;37211:34;37207:1;37199:6;37195:14;37188:58;37280:8;37275:2;37267:6;37263:15;37256:33;37071:225;:::o;37302:178::-;37442:30;37438:1;37430:6;37426:14;37419:54;37302:178;:::o;37486:223::-;37626:34;37622:1;37614:6;37610:14;37603:58;37695:6;37690:2;37682:6;37678:15;37671:31;37486:223;:::o;37715:175::-;37855:27;37851:1;37843:6;37839:14;37832:51;37715:175;:::o;37896:231::-;38036:34;38032:1;38024:6;38020:14;38013:58;38105:14;38100:2;38092:6;38088:15;38081:39;37896:231;:::o;38133:166::-;38273:18;38269:1;38261:6;38257:14;38250:42;38133:166;:::o;38305:243::-;38445:34;38441:1;38433:6;38429:14;38422:58;38514:26;38509:2;38501:6;38497:15;38490:51;38305:243;:::o;38554:229::-;38694:34;38690:1;38682:6;38678:14;38671:58;38763:12;38758:2;38750:6;38746:15;38739:37;38554:229;:::o;38789:228::-;38929:34;38925:1;38917:6;38913:14;38906:58;38998:11;38993:2;38985:6;38981:15;38974:36;38789:228;:::o;39023:182::-;39163:34;39159:1;39151:6;39147:14;39140:58;39023:182;:::o;39211:236::-;39351:34;39347:1;39339:6;39335:14;39328:58;39420:19;39415:2;39407:6;39403:15;39396:44;39211:236;:::o;39453:231::-;39593:34;39589:1;39581:6;39577:14;39570:58;39662:14;39657:2;39649:6;39645:15;39638:39;39453:231;:::o;39690:182::-;39830:34;39826:1;39818:6;39814:14;39807:58;39690:182;:::o;39878:228::-;40018:34;40014:1;40006:6;40002:14;39995:58;40087:11;40082:2;40074:6;40070:15;40063:36;39878:228;:::o;40112:234::-;40252:34;40248:1;40240:6;40236:14;40229:58;40321:17;40316:2;40308:6;40304:15;40297:42;40112:234;:::o;40352:220::-;40492:34;40488:1;40480:6;40476:14;40469:58;40561:3;40556:2;40548:6;40544:15;40537:28;40352:220;:::o;40578:169::-;40718:21;40714:1;40706:6;40702:14;40695:45;40578:169;:::o;40753:236::-;40893:34;40889:1;40881:6;40877:14;40870:58;40962:19;40957:2;40949:6;40945:15;40938:44;40753:236;:::o;40995:231::-;41135:34;41131:1;41123:6;41119:14;41112:58;41204:14;41199:2;41191:6;41187:15;41180:39;40995:231;:::o;41232:235::-;41372:34;41368:1;41360:6;41356:14;41349:58;41441:18;41436:2;41428:6;41424:15;41417:43;41232:235;:::o;41473:122::-;41546:24;41564:5;41546:24;:::i;:::-;41539:5;41536:35;41526:63;;41585:1;41582;41575:12;41526:63;41473:122;:::o;41601:116::-;41671:21;41686:5;41671:21;:::i;:::-;41664:5;41661:32;41651:60;;41707:1;41704;41697:12;41651:60;41601:116;:::o;41723:120::-;41795:23;41812:5;41795:23;:::i;:::-;41788:5;41785:34;41775:62;;41833:1;41830;41823:12;41775:62;41723:120;:::o;41849:122::-;41922:24;41940:5;41922:24;:::i;:::-;41915:5;41912:35;41902:63;;41961:1;41958;41951:12;41902:63;41849:122;:::o

Swarm Source

ipfs://3c46e67bee0c87c7abe33dfe5d47e0ef3967efb593f32133ccd5decc0406fed3
Loading