Contract Overview
Balance:
0.495 Ether
EtherValue:
$527.20 (@ $1,065.06/ETH)
[ Download CSV Export ]
Latest 4 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x6fe30b78d205657008872da6159365cff4c0a01e60877df9048c3ccd7c02c265 | 10742840 | 26 days 15 hrs ago | 0x065e8a87b8f11aed6facf9447abe5e8c5d7502b6 | 0x9d477a1ca81b928d5c2397ebff86c495401c7ff7 | 0 Ether | ||
0x6fe30b78d205657008872da6159365cff4c0a01e60877df9048c3ccd7c02c265 | 10742840 | 26 days 15 hrs ago | 0x065e8a87b8f11aed6facf9447abe5e8c5d7502b6 | 0x9d477a1ca81b928d5c2397ebff86c495401c7ff7 | 0 Ether | ||
0x6fe30b78d205657008872da6159365cff4c0a01e60877df9048c3ccd7c02c265 | 10742840 | 26 days 15 hrs ago | 0x065e8a87b8f11aed6facf9447abe5e8c5d7502b6 | 0x9d477a1ca81b928d5c2397ebff86c495401c7ff7 | 0 Ether | ||
0x6fe30b78d205657008872da6159365cff4c0a01e60877df9048c3ccd7c02c265 | 10742840 | 26 days 15 hrs ago | 0x065e8a87b8f11aed6facf9447abe5e8c5d7502b6 | 0x9d477a1ca81b928d5c2397ebff86c495401c7ff7 | 0 Ether |
[ Download CSV Export ]
Contract Name:
ScenicCups
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at optimistic.etherscan.io on 2022-06-06 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol) 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]; } } } pragma solidity 0.8.14; contract ScenicCups is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Burnable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; uint256 mintedSupplyCounter = 0; uint256 burnedSupplyCounter = 0; string private _baseTokenURI; constructor (string memory baseTokenURI) ERC721("Scenic Cups", "SC") { _tokenIdCounter.increment(); _baseTokenURI = baseTokenURI; } function contractURI() public pure returns (string memory) { return "ipfs://bafybeicxuy3l7lfeemurztjzdmp4p6gz6gviqxeb5axlqbmwuh23ynkmhe/ScenicCupsContract.json"; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function safeMint(address to) public payable { require(_tokenIdCounter.current() <= 100, "Maximum number of NFTs already minted"); require(msg.value == (0.08 ether + 0.001 ether * (_tokenIdCounter.current() - 1)) , "Incorrect ETH amount, please send the correct amount ETH."); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); mintedSupplyCounter++; _safeMint(to, tokenId); _setTokenURI(tokenId, tokenURI(tokenId)); } function withdrawAllFunds(address payable _to) public onlyOwner { _to.transfer(address(this).balance); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { burnedSupplyCounter++; super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory dotJson = ".json"; return string(abi.encodePacked(_baseTokenURI, Strings.toString(tokenId), dotJson)); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function getMintedSupplyCounter() public view returns(uint256) { return mintedSupplyCounter; } function getBurnedSupplyCounter() public view returns(uint256) { return burnedSupplyCounter; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedSupplyCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintedSupplyCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"payable","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawAllFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600d556000600e553480156200001b57600080fd5b506040516200438538038062004385833981810160405281019062000041919062000469565b6040518060400160405280600b81526020017f5363656e696320437570730000000000000000000000000000000000000000008152506040518060400160405280600281526020017f53430000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c59291906200021c565b508060019080519060200190620000de9291906200021c565b50505062000101620000f56200013860201b60201c565b6200014060201b60201c565b62000118600c6200020660201b620011b51760201c565b80600f9080519060200190620001309291906200021c565b50506200051e565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8280546200022a90620004e9565b90600052602060002090601f0160209004810192826200024e57600085556200029a565b82601f106200026957805160ff19168380011785556200029a565b828001600101855582156200029a579182015b82811115620002995782518255916020019190600101906200027c565b5b509050620002a99190620002ad565b5090565b5b80821115620002c8576000816000905550600101620002ae565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200033582620002ea565b810181811067ffffffffffffffff82111715620003575762000356620002fb565b5b80604052505050565b60006200036c620002cc565b90506200037a82826200032a565b919050565b600067ffffffffffffffff8211156200039d576200039c620002fb565b5b620003a882620002ea565b9050602081019050919050565b60005b83811015620003d5578082015181840152602081019050620003b8565b83811115620003e5576000848401525b50505050565b600062000402620003fc846200037f565b62000360565b905082815260208101848484011115620004215762000420620002e5565b5b6200042e848285620003b5565b509392505050565b600082601f8301126200044e576200044d620002e0565b5b815162000460848260208601620003eb565b91505092915050565b600060208284031215620004825762000481620002d6565b5b600082015167ffffffffffffffff811115620004a357620004a2620002db565b5b620004b18482850162000436565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050257607f821691505b602082108103620005185762000517620004ba565b5b50919050565b613e57806200052e6000396000f3fe6080604052600436106101665760003560e01c80636352211e116100d1578063a22cb4651161008a578063e8a3d48511610064578063e8a3d4851461053f578063e985e9c51461056a578063f2fde38b146105a7578063f91c42d3146105d057610166565b8063a22cb465146104b0578063b88d4fde146104d9578063c87b56dd1461050257610166565b80636352211e1461039e57806364181f04146103db57806370a0823114610406578063715018a6146104435780638da5cb5b1461045a57806395d89b411461048557610166565b80632f745c59116101235780632f745c591461028d57806332dee40b146102ca57806340d097c3146102f357806342842e0e1461030f57806342966c68146103385780634f6ccce71461036157610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612783565b6105fb565b60405161019f91906127cb565b60405180910390f35b3480156101b457600080fd5b506101bd61060d565b6040516101ca919061287f565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f591906128d7565b61069f565b6040516102079190612945565b60405180910390f35b34801561021c57600080fd5b506102376004803603810190610232919061298c565b610724565b005b34801561024557600080fd5b5061024e61083b565b60405161025b91906129db565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906129f6565b610848565b005b34801561029957600080fd5b506102b460048036038101906102af919061298c565b6108a8565b6040516102c191906129db565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190612a87565b61094d565b005b61030d60048036038101906103089190612ab4565b610a13565b005b34801561031b57600080fd5b50610336600480360381019061033191906129f6565b610b2c565b005b34801561034457600080fd5b5061035f600480360381019061035a91906128d7565b610b4c565b005b34801561036d57600080fd5b50610388600480360381019061038391906128d7565b610ba8565b60405161039591906129db565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c091906128d7565b610c19565b6040516103d29190612945565b60405180910390f35b3480156103e757600080fd5b506103f0610cca565b6040516103fd91906129db565b60405180910390f35b34801561041257600080fd5b5061042d60048036038101906104289190612ab4565b610cd4565b60405161043a91906129db565b60405180910390f35b34801561044f57600080fd5b50610458610d8b565b005b34801561046657600080fd5b5061046f610e13565b60405161047c9190612945565b60405180910390f35b34801561049157600080fd5b5061049a610e3d565b6040516104a7919061287f565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d29190612b0d565b610ecf565b005b3480156104e557600080fd5b5061050060048036038101906104fb9190612c82565b610ee5565b005b34801561050e57600080fd5b50610529600480360381019061052491906128d7565b610f47565b604051610536919061287f565b60405180910390f35b34801561054b57600080fd5b50610554611000565b604051610561919061287f565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190612d05565b611020565b60405161059e91906127cb565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190612ab4565b6110b4565b005b3480156105dc57600080fd5b506105e56111ab565b6040516105f291906129db565b60405180910390f35b6000610606826111cb565b9050919050565b60606000805461061c90612d74565b80601f016020809104026020016040519081016040528092919081815260200182805461064890612d74565b80156106955780601f1061066a57610100808354040283529160200191610695565b820191906000526020600020905b81548152906001019060200180831161067857829003601f168201915b5050505050905090565b60006106aa82611245565b6106e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e090612e17565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072f82610c19565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079690612ea9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107be6112b1565b73ffffffffffffffffffffffffffffffffffffffff1614806107ed57506107ec816107e76112b1565b611020565b5b61082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082390612f3b565b60405180910390fd5b61083683836112b9565b505050565b6000600880549050905090565b6108596108536112b1565b82611372565b610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f90612fcd565b60405180910390fd5b6108a3838383611450565b505050565b60006108b383610cd4565b82106108f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108eb9061305f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109556112b1565b73ffffffffffffffffffffffffffffffffffffffff16610973610e13565b73ffffffffffffffffffffffffffffffffffffffff16146109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c0906130cb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a0f573d6000803e3d6000fd5b5050565b6064610a1f600c6116b6565b1115610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a579061315d565b60405180910390fd5b6001610a6c600c6116b6565b610a7691906131ac565b66038d7ea4c68000610a8891906131e0565b67011c37937e080000610a9b919061323a565b3414610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390613302565b60405180910390fd5b6000610ae8600c6116b6565b9050610af4600c6111b5565b600d6000815480929190610b0790613322565b9190505550610b1682826116c4565b610b2881610b2383610f47565b6116e2565b5050565b610b4783838360405180602001604052806000815250610ee5565b505050565b610b5d610b576112b1565b82611372565b610b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b93906133dc565b60405180910390fd5b610ba581611756565b50565b6000610bb261083b565b8210610bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bea9061346e565b60405180910390fd5b60088281548110610c0757610c0661348e565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb89061352f565b60405180910390fd5b80915050919050565b6000600e54905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b906135c1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d936112b1565b73ffffffffffffffffffffffffffffffffffffffff16610db1610e13565b73ffffffffffffffffffffffffffffffffffffffff1614610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe906130cb565b60405180910390fd5b610e11600061177a565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e4c90612d74565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7890612d74565b8015610ec55780601f10610e9a57610100808354040283529160200191610ec5565b820191906000526020600020905b815481529060010190602001808311610ea857829003601f168201915b5050505050905090565b610ee1610eda6112b1565b8383611840565b5050565b610ef6610ef06112b1565b83611372565b610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90612fcd565b60405180910390fd5b610f41848484846119ac565b50505050565b6060610f5282611245565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890613653565b60405180910390fd5b60006040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152509050600f610fd684611a08565b82604051602001610fe993929190613743565b604051602081830303815290604052915050919050565b60606040518060800160405280605a8152602001613dc8605a9139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110bc6112b1565b73ffffffffffffffffffffffffffffffffffffffff166110da610e13565b73ffffffffffffffffffffffffffffffffffffffff1614611130576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611127906130cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361119f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611196906137e6565b60405180910390fd5b6111a88161177a565b50565b6000600d54905090565b6001816000016000828254019250508190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061123e575061123d82611b68565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661132c83610c19565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061137d82611245565b6113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b390613878565b60405180910390fd5b60006113c783610c19565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061140957506114088185611020565b5b8061144757508373ffffffffffffffffffffffffffffffffffffffff1661142f8461069f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661147082610c19565b73ffffffffffffffffffffffffffffffffffffffff16146114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd9061390a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c9061399c565b60405180910390fd5b611540838383611c4a565b61154b6000826112b9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461159b91906131ac565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115f2919061323a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116b1838383611c5a565b505050565b600081600001549050919050565b6116de828260405180602001604052806000815250611c5f565b5050565b6116eb82611245565b61172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190613a2e565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190611751929190612634565b505050565b600e600081548092919061176990613322565b919050555061177781611cba565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590613a9a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161199f91906127cb565b60405180910390a3505050565b6119b7848484611450565b6119c384848484611d0d565b611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f990613b2c565b60405180910390fd5b50505050565b606060008203611a4f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b63565b600082905060005b60008214611a81578080611a6a90613322565b915050600a82611a7a9190613b7b565b9150611a57565b60008167ffffffffffffffff811115611a9d57611a9c612b57565b5b6040519080825280601f01601f191660200182016040528015611acf5781602001600182028036833780820191505090505b5090505b60008514611b5c57600182611ae891906131ac565b9150600a85611af79190613bac565b6030611b03919061323a565b60f81b818381518110611b1957611b1861348e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611b559190613b7b565b9450611ad3565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c3357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c435750611c4282611e94565b5b9050919050565b611c55838383611efe565b505050565b505050565b611c698383612010565b611c766000848484611d0d565b611cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cac90613b2c565b60405180910390fd5b505050565b611cc3816121e9565b6000600a60008381526020019081526020016000208054611ce390612d74565b905014611d0a57600a60008281526020019081526020016000206000611d0991906126ba565b5b50565b6000611d2e8473ffffffffffffffffffffffffffffffffffffffff16612306565b15611e87578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d576112b1565b8786866040518563ffffffff1660e01b8152600401611d799493929190613c32565b6020604051808303816000875af1925050508015611db557506040513d601f19601f82011682018060405250810190611db29190613c93565b60015b611e37573d8060008114611de5576040519150601f19603f3d011682016040523d82523d6000602084013e611dea565b606091505b506000815103611e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2690613b2c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611e8c565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f09838383612329565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f4b57611f468161232e565b611f8a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611f8957611f888382612377565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fcc57611fc7816124e4565b61200b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461200a5761200982826125b5565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361207f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207690613d0c565b60405180910390fd5b61208881611245565b156120c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bf90613d78565b60405180910390fd5b6120d460008383611c4a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612124919061323a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121e560008383611c5a565b5050565b60006121f482610c19565b905061220281600084611c4a565b61220d6000836112b9565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461225d91906131ac565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461230281600084611c5a565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161238484610cd4565b61238e91906131ac565b9050600060076000848152602001908152602001600020549050818114612473576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506124f891906131ac565b90506000600960008481526020019081526020016000205490506000600883815481106125285761252761348e565b5b90600052602060002001549050806008838154811061254a5761254961348e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061259957612598613d98565b5b6001900381819060005260206000200160009055905550505050565b60006125c083610cd4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461264090612d74565b90600052602060002090601f01602090048101928261266257600085556126a9565b82601f1061267b57805160ff19168380011785556126a9565b828001600101855582156126a9579182015b828111156126a857825182559160200191906001019061268d565b5b5090506126b691906126fa565b5090565b5080546126c690612d74565b6000825580601f106126d857506126f7565b601f0160209004906000526020600020908101906126f691906126fa565b5b50565b5b808211156127135760008160009055506001016126fb565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127608161272b565b811461276b57600080fd5b50565b60008135905061277d81612757565b92915050565b60006020828403121561279957612798612721565b5b60006127a78482850161276e565b91505092915050565b60008115159050919050565b6127c5816127b0565b82525050565b60006020820190506127e060008301846127bc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612820578082015181840152602081019050612805565b8381111561282f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612851826127e6565b61285b81856127f1565b935061286b818560208601612802565b61287481612835565b840191505092915050565b600060208201905081810360008301526128998184612846565b905092915050565b6000819050919050565b6128b4816128a1565b81146128bf57600080fd5b50565b6000813590506128d1816128ab565b92915050565b6000602082840312156128ed576128ec612721565b5b60006128fb848285016128c2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061292f82612904565b9050919050565b61293f81612924565b82525050565b600060208201905061295a6000830184612936565b92915050565b61296981612924565b811461297457600080fd5b50565b60008135905061298681612960565b92915050565b600080604083850312156129a3576129a2612721565b5b60006129b185828601612977565b92505060206129c2858286016128c2565b9150509250929050565b6129d5816128a1565b82525050565b60006020820190506129f060008301846129cc565b92915050565b600080600060608486031215612a0f57612a0e612721565b5b6000612a1d86828701612977565b9350506020612a2e86828701612977565b9250506040612a3f868287016128c2565b9150509250925092565b6000612a5482612904565b9050919050565b612a6481612a49565b8114612a6f57600080fd5b50565b600081359050612a8181612a5b565b92915050565b600060208284031215612a9d57612a9c612721565b5b6000612aab84828501612a72565b91505092915050565b600060208284031215612aca57612ac9612721565b5b6000612ad884828501612977565b91505092915050565b612aea816127b0565b8114612af557600080fd5b50565b600081359050612b0781612ae1565b92915050565b60008060408385031215612b2457612b23612721565b5b6000612b3285828601612977565b9250506020612b4385828601612af8565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b8f82612835565b810181811067ffffffffffffffff82111715612bae57612bad612b57565b5b80604052505050565b6000612bc1612717565b9050612bcd8282612b86565b919050565b600067ffffffffffffffff821115612bed57612bec612b57565b5b612bf682612835565b9050602081019050919050565b82818337600083830152505050565b6000612c25612c2084612bd2565b612bb7565b905082815260208101848484011115612c4157612c40612b52565b5b612c4c848285612c03565b509392505050565b600082601f830112612c6957612c68612b4d565b5b8135612c79848260208601612c12565b91505092915050565b60008060008060808587031215612c9c57612c9b612721565b5b6000612caa87828801612977565b9450506020612cbb87828801612977565b9350506040612ccc878288016128c2565b925050606085013567ffffffffffffffff811115612ced57612cec612726565b5b612cf987828801612c54565b91505092959194509250565b60008060408385031215612d1c57612d1b612721565b5b6000612d2a85828601612977565b9250506020612d3b85828601612977565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d8c57607f821691505b602082108103612d9f57612d9e612d45565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612e01602c836127f1565b9150612e0c82612da5565b604082019050919050565b60006020820190508181036000830152612e3081612df4565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e936021836127f1565b9150612e9e82612e37565b604082019050919050565b60006020820190508181036000830152612ec281612e86565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612f256038836127f1565b9150612f3082612ec9565b604082019050919050565b60006020820190508181036000830152612f5481612f18565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612fb76031836127f1565b9150612fc282612f5b565b604082019050919050565b60006020820190508181036000830152612fe681612faa565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613049602b836127f1565b915061305482612fed565b604082019050919050565b600060208201905081810360008301526130788161303c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130b56020836127f1565b91506130c08261307f565b602082019050919050565b600060208201905081810360008301526130e4816130a8565b9050919050565b7f4d6178696d756d206e756d626572206f66204e46547320616c7265616479206d60008201527f696e746564000000000000000000000000000000000000000000000000000000602082015250565b60006131476025836127f1565b9150613152826130eb565b604082019050919050565b600060208201905081810360008301526131768161313a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131b7826128a1565b91506131c2836128a1565b9250828210156131d5576131d461317d565b5b828203905092915050565b60006131eb826128a1565b91506131f6836128a1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561322f5761322e61317d565b5b828202905092915050565b6000613245826128a1565b9150613250836128a1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132855761328461317d565b5b828201905092915050565b7f496e636f72726563742045544820616d6f756e742c20706c656173652073656e60008201527f642074686520636f727265637420616d6f756e7420204554482e000000000000602082015250565b60006132ec603a836127f1565b91506132f782613290565b604082019050919050565b6000602082019050818103600083015261331b816132df565b9050919050565b600061332d826128a1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361335f5761335e61317d565b5b600182019050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b60006133c66030836127f1565b91506133d18261336a565b604082019050919050565b600060208201905081810360008301526133f5816133b9565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613458602c836127f1565b9150613463826133fc565b604082019050919050565b600060208201905081810360008301526134878161344b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006135196029836127f1565b9150613524826134bd565b604082019050919050565b600060208201905081810360008301526135488161350c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006135ab602a836127f1565b91506135b68261354f565b604082019050919050565b600060208201905081810360008301526135da8161359e565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b600061363d6031836127f1565b9150613648826135e1565b604082019050919050565b6000602082019050818103600083015261366c81613630565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546136a081612d74565b6136aa8186613673565b945060018216600081146136c557600181146136d657613709565b60ff19831686528186019350613709565b6136df8561367e565b60005b83811015613701578154818901526001820191506020810190506136e2565b838801955050505b50505092915050565b600061371d826127e6565b6137278185613673565b9350613737818560208601612802565b80840191505092915050565b600061374f8286613693565b915061375b8285613712565b91506137678284613712565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137d06026836127f1565b91506137db82613774565b604082019050919050565b600060208201905081810360008301526137ff816137c3565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613862602c836127f1565b915061386d82613806565b604082019050919050565b6000602082019050818103600083015261389181613855565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006138f46025836127f1565b91506138ff82613898565b604082019050919050565b60006020820190508181036000830152613923816138e7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006139866024836127f1565b91506139918261392a565b604082019050919050565b600060208201905081810360008301526139b581613979565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613a18602e836127f1565b9150613a23826139bc565b604082019050919050565b60006020820190508181036000830152613a4781613a0b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613a846019836127f1565b9150613a8f82613a4e565b602082019050919050565b60006020820190508181036000830152613ab381613a77565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613b166032836127f1565b9150613b2182613aba565b604082019050919050565b60006020820190508181036000830152613b4581613b09565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b86826128a1565b9150613b91836128a1565b925082613ba157613ba0613b4c565b5b828204905092915050565b6000613bb7826128a1565b9150613bc2836128a1565b925082613bd257613bd1613b4c565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000613c0482613bdd565b613c0e8185613be8565b9350613c1e818560208601612802565b613c2781612835565b840191505092915050565b6000608082019050613c476000830187612936565b613c546020830186612936565b613c6160408301856129cc565b8181036060830152613c738184613bf9565b905095945050505050565b600081519050613c8d81612757565b92915050565b600060208284031215613ca957613ca8612721565b5b6000613cb784828501613c7e565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613cf66020836127f1565b9150613d0182613cc0565b602082019050919050565b60006020820190508181036000830152613d2581613ce9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613d62601c836127f1565b9150613d6d82613d2c565b602082019050919050565b60006020820190508181036000830152613d9181613d55565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe697066733a2f2f6261667962656963787579336c376c6665656d75727a746a7a646d70347036677a36677669717865623561786c71626d7775683233796e6b6d68652f5363656e696343757073436f6e74726163742e6a736f6ea26469706673582212201b22574d59c511b2d660132119fe88ca9ac6d048d55dc64e792aa440eb745dd464736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656964356a6e703478716873766c3332627668727273686e6871336c697464676c696a6a6d61336b7a656776376b68796272786b74692f0000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656964356a6e703478716873766c3332627668727273686e6871336c697464676c696a6a6d61336b7a656776376b68796272786b74692f0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseTokenURI (string): ipfs://bafybeid5jnp4xqhsvl32bvhrrshnhq3litdglijjma3kzegv7khybrxkti/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 697066733a2f2f6261667962656964356a6e703478716873766c333262766872
Arg [3] : 7273686e6871336c697464676c696a6a6d61336b7a656776376b68796272786b
Arg [4] : 74692f0000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
48754:2544:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50875:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26861:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28421:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27944:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41298:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29171:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40966:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50049:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49531:510;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29581:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39482:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41488:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26555:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51180:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26285:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15428:103;;;;;;;;;;;;;:::i;:::-;;14777:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27030:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28714:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29837:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50524:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49224:177;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28940:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15686:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51059:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50875:176;50978:4;51007:36;51031:11;51007:23;:36::i;:::-;51000:43;;50875:176;;;:::o;26861:100::-;26915:13;26948:5;26941:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26861:100;:::o;28421:221::-;28497:7;28525:16;28533:7;28525;:16::i;:::-;28517:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28610:15;:24;28626:7;28610:24;;;;;;;;;;;;;;;;;;;;;28603:31;;28421:221;;;:::o;27944:411::-;28025:13;28041:23;28056:7;28041:14;:23::i;:::-;28025:39;;28089:5;28083:11;;:2;:11;;;28075:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28183:5;28167:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28192:37;28209:5;28216:12;:10;:12::i;:::-;28192:16;:37::i;:::-;28167:62;28145:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28326:21;28335:2;28339:7;28326:8;:21::i;:::-;28014:341;27944:411;;:::o;41298:113::-;41359:7;41386:10;:17;;;;41379:24;;41298:113;:::o;29171:339::-;29366:41;29385:12;:10;:12::i;:::-;29399:7;29366:18;:41::i;:::-;29358:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29474:28;29484:4;29490:2;29494:7;29474:9;:28::i;:::-;29171:339;;;:::o;40966:256::-;41063:7;41099:23;41116:5;41099:16;:23::i;:::-;41091:5;:31;41083:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41188:12;:19;41201:5;41188:19;;;;;;;;;;;;;;;:26;41208:5;41188:26;;;;;;;;;;;;41181:33;;40966:256;;;;:::o;50049:118::-;15008:12;:10;:12::i;:::-;14997:23;;:7;:5;:7::i;:::-;:23;;;14989:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50124:3:::1;:12;;:35;50137:21;50124:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50049:118:::0;:::o;49531:510::-;49624:3;49595:25;:15;:23;:25::i;:::-;:32;;49587:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;49758:1;49730:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;49715:11;:45;;;;:::i;:::-;49702:10;:58;;;;:::i;:::-;49688:9;:73;49680:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;49836:15;49854:25;:15;:23;:25::i;:::-;49836:43;;49890:27;:15;:25;:27::i;:::-;49928:19;;:21;;;;;;;;;:::i;:::-;;;;;;49960:22;49970:2;49974:7;49960:9;:22::i;:::-;49993:40;50006:7;50015:17;50024:7;50015:8;:17::i;:::-;49993:12;:40::i;:::-;49576:465;49531:510;:::o;29581:185::-;29719:39;29736:4;29742:2;29746:7;29719:39;;;;;;;;;;;;:16;:39::i;:::-;29581:185;;;:::o;39482:245::-;39600:41;39619:12;:10;:12::i;:::-;39633:7;39600:18;:41::i;:::-;39592:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;39705:14;39711:7;39705:5;:14::i;:::-;39482:245;:::o;41488:233::-;41563:7;41599:30;:28;:30::i;:::-;41591:5;:38;41583:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41696:10;41707:5;41696:17;;;;;;;;:::i;:::-;;;;;;;;;;41689:24;;41488:233;;;:::o;26555:239::-;26627:7;26647:13;26663:7;:16;26671:7;26663:16;;;;;;;;;;;;;;;;;;;;;26647:32;;26715:1;26698:19;;:5;:19;;;26690:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26781:5;26774:12;;;26555:239;;;:::o;51180:113::-;51234:7;51266:19;;51259:26;;51180:113;:::o;26285:208::-;26357:7;26402:1;26385:19;;:5;:19;;;26377:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26469:9;:16;26479:5;26469:16;;;;;;;;;;;;;;;;26462:23;;26285:208;;;:::o;15428:103::-;15008:12;:10;:12::i;:::-;14997:23;;:7;:5;:7::i;:::-;:23;;;14989:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15493:30:::1;15520:1;15493:18;:30::i;:::-;15428:103::o:0;14777:87::-;14823:7;14850:6;;;;;;;;;;;14843:13;;14777:87;:::o;27030:104::-;27086:13;27119:7;27112:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27030:104;:::o;28714:155::-;28809:52;28828:12;:10;:12::i;:::-;28842:8;28852;28809:18;:52::i;:::-;28714:155;;:::o;29837:328::-;30012:41;30031:12;:10;:12::i;:::-;30045:7;30012:18;:41::i;:::-;30004:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30118:39;30132:4;30138:2;30142:7;30151:5;30118:13;:39::i;:::-;29837:328;;;;:::o;50524:343::-;50615:13;50654:16;50662:7;50654;:16::i;:::-;50646:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50735:21;:31;;;;;;;;;;;;;;;;;;;50808:13;50823:25;50840:7;50823:16;:25::i;:::-;50850:7;50791:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50777:82;;;50524:343;;;:::o;49224:177::-;49268:13;49294:99;;;;;;;;;;;;;;;;;;;49224:177;:::o;28940:164::-;29037:4;29061:18;:25;29080:5;29061:25;;;;;;;;;;;;;;;:35;29087:8;29061:35;;;;;;;;;;;;;;;;;;;;;;;;;29054:42;;28940:164;;;;:::o;15686:201::-;15008:12;:10;:12::i;:::-;14997:23;;:7;:5;:7::i;:::-;:23;;;14989:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15795:1:::1;15775:22;;:8;:22;;::::0;15767:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;15851:28;15870:8;15851:18;:28::i;:::-;15686:201:::0;:::o;51059:113::-;51113:7;51145:19;;51138:26;;51059:113;:::o;970:127::-;1077:1;1059:7;:14;;;:19;;;;;;;;;;;970:127;:::o;40658:224::-;40760:4;40799:35;40784:50;;;:11;:50;;;;:90;;;;40838:36;40862:11;40838:23;:36::i;:::-;40784:90;40777:97;;40658:224;;;:::o;31675:127::-;31740:4;31792:1;31764:30;;:7;:16;31772:7;31764:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31757:37;;31675:127;;;:::o;13560:98::-;13613:7;13640:10;13633:17;;13560:98;:::o;35821:174::-;35923:2;35896:15;:24;35912:7;35896:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35979:7;35975:2;35941:46;;35950:23;35965:7;35950:14;:23::i;:::-;35941:46;;;;;;;;;;;;35821:174;;:::o;31969:348::-;32062:4;32087:16;32095:7;32087;:16::i;:::-;32079:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32163:13;32179:23;32194:7;32179:14;:23::i;:::-;32163:39;;32232:5;32221:16;;:7;:16;;;:52;;;;32241:32;32258:5;32265:7;32241:16;:32::i;:::-;32221:52;:87;;;;32301:7;32277:31;;:20;32289:7;32277:11;:20::i;:::-;:31;;;32221:87;32213:96;;;31969:348;;;;:::o;35078:625::-;35237:4;35210:31;;:23;35225:7;35210:14;:23::i;:::-;:31;;;35202:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35316:1;35302:16;;:2;:16;;;35294:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35372:39;35393:4;35399:2;35403:7;35372:20;:39::i;:::-;35476:29;35493:1;35497:7;35476:8;:29::i;:::-;35537:1;35518:9;:15;35528:4;35518:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35566:1;35549:9;:13;35559:2;35549:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35597:2;35578:7;:16;35586:7;35578:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35636:7;35632:2;35617:27;;35626:4;35617:27;;;;;;;;;;;;35657:38;35677:4;35683:2;35687:7;35657:19;:38::i;:::-;35078:625;;;:::o;848:114::-;913:7;940;:14;;;933:21;;848:114;;;:::o;32659:110::-;32735:26;32745:2;32749:7;32735:26;;;;;;;;;;;;:9;:26::i;:::-;32659:110;;:::o;48067:217::-;48167:16;48175:7;48167;:16::i;:::-;48159:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;48267:9;48245:10;:19;48256:7;48245:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;48067:217;;:::o;50369:147::-;50456:19;;:21;;;;;;;;;:::i;:::-;;;;;;50488:20;50500:7;50488:11;:20::i;:::-;50369:147;:::o;16047:191::-;16121:16;16140:6;;;;;;;;;;;16121:25;;16166:8;16157:6;;:17;;;;;;;;;;;;;;;;;;16221:8;16190:40;;16211:8;16190:40;;;;;;;;;;;;16110:128;16047:191;:::o;36137:315::-;36292:8;36283:17;;:5;:17;;;36275:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36379:8;36341:18;:25;36360:5;36341:25;;;;;;;;;;;;;;;:35;36367:8;36341:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36425:8;36403:41;;36418:5;36403:41;;;36435:8;36403:41;;;;;;:::i;:::-;;;;;;;;36137:315;;;:::o;31047:::-;31204:28;31214:4;31220:2;31224:7;31204:9;:28::i;:::-;31251:48;31274:4;31280:2;31284:7;31293:5;31251:22;:48::i;:::-;31243:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31047:315;;;;:::o;1748:723::-;1804:13;2034:1;2025:5;:10;2021:53;;2052:10;;;;;;;;;;;;;;;;;;;;;2021:53;2084:12;2099:5;2084:20;;2115:14;2140:78;2155:1;2147:4;:9;2140:78;;2173:8;;;;;:::i;:::-;;;;2204:2;2196:10;;;;;:::i;:::-;;;2140:78;;;2228:19;2260:6;2250:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2228:39;;2278:154;2294:1;2285:5;:10;2278:154;;2322:1;2312:11;;;;;:::i;:::-;;;2389:2;2381:5;:10;;;;:::i;:::-;2368:2;:24;;;;:::i;:::-;2355:39;;2338:6;2345;2338:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2418:2;2409:11;;;;;:::i;:::-;;;2278:154;;;2456:6;2442:21;;;;;1748:723;;;;:::o;25916:305::-;26018:4;26070:25;26055:40;;;:11;:40;;;;:105;;;;26127:33;26112:48;;;:11;:48;;;;26055:105;:158;;;;26177:36;26201:11;26177:23;:36::i;:::-;26055:158;26035:178;;25916:305;;;:::o;50175:186::-;50308:45;50335:4;50341:2;50345:7;50308:26;:45::i;:::-;50175:186;;;:::o;38899:125::-;;;;:::o;32996:321::-;33126:18;33132:2;33136:7;33126:5;:18::i;:::-;33177:54;33208:1;33212:2;33216:7;33225:5;33177:22;:54::i;:::-;33155:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32996:321;;;:::o;48513:206::-;48582:20;48594:7;48582:11;:20::i;:::-;48656:1;48625:10;:19;48636:7;48625:19;;;;;;;;;;;48619:33;;;;;:::i;:::-;;;:38;48615:97;;48681:10;:19;48692:7;48681:19;;;;;;;;;;;;48674:26;;;;:::i;:::-;48615:97;48513:206;:::o;37017:799::-;37172:4;37193:15;:2;:13;;;:15::i;:::-;37189:620;;;37245:2;37229:36;;;37266:12;:10;:12::i;:::-;37280:4;37286:7;37295:5;37229:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37225:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37488:1;37471:6;:13;:18;37467:272;;37514:60;;;;;;;;;;:::i;:::-;;;;;;;;37467:272;37689:6;37683:13;37674:6;37670:2;37666:15;37659:38;37225:529;37362:41;;;37352:51;;;:6;:51;;;;37345:58;;;;;37189:620;37793:4;37786:11;;37017:799;;;;;;;:::o;24421:157::-;24506:4;24545:25;24530:40;;;:11;:40;;;;24523:47;;24421:157;;;:::o;42334:589::-;42478:45;42505:4;42511:2;42515:7;42478:26;:45::i;:::-;42556:1;42540:18;;:4;:18;;;42536:187;;42575:40;42607:7;42575:31;:40::i;:::-;42536:187;;;42645:2;42637:10;;:4;:10;;;42633:90;;42664:47;42697:4;42703:7;42664:32;:47::i;:::-;42633:90;42536:187;42751:1;42737:16;;:2;:16;;;42733:183;;42770:45;42807:7;42770:36;:45::i;:::-;42733:183;;;42843:4;42837:10;;:2;:10;;;42833:83;;42864:40;42892:2;42896:7;42864:27;:40::i;:::-;42833:83;42733:183;42334:589;;;:::o;33653:439::-;33747:1;33733:16;;:2;:16;;;33725:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33806:16;33814:7;33806;:16::i;:::-;33805:17;33797:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33868:45;33897:1;33901:2;33905:7;33868:20;:45::i;:::-;33943:1;33926:9;:13;33936:2;33926:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33974:2;33955:7;:16;33963:7;33955:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34019:7;34015:2;33994:33;;34011:1;33994:33;;;;;;;;;;;;34040:44;34068:1;34072:2;34076:7;34040:19;:44::i;:::-;33653:439;;:::o;34321:420::-;34381:13;34397:23;34412:7;34397:14;:23::i;:::-;34381:39;;34433:48;34454:5;34469:1;34473:7;34433:20;:48::i;:::-;34522:29;34539:1;34543:7;34522:8;:29::i;:::-;34584:1;34564:9;:16;34574:5;34564:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;34603:7;:16;34611:7;34603:16;;;;;;;;;;;;34596:23;;;;;;;;;;;34665:7;34661:1;34637:36;;34646:5;34637:36;;;;;;;;;;;;34686:47;34706:5;34721:1;34725:7;34686:19;:47::i;:::-;34370:371;34321:420;:::o;4684:326::-;4744:4;5001:1;4979:7;:19;;;:23;4972:30;;4684:326;;;:::o;38388:126::-;;;;:::o;43646:164::-;43750:10;:17;;;;43723:15;:24;43739:7;43723:24;;;;;;;;;;;:44;;;;43778:10;43794:7;43778:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43646:164;:::o;44437:988::-;44703:22;44753:1;44728:22;44745:4;44728:16;:22::i;:::-;:26;;;;:::i;:::-;44703:51;;44765:18;44786:17;:26;44804:7;44786:26;;;;;;;;;;;;44765:47;;44933:14;44919:10;:28;44915:328;;44964:19;44986:12;:18;44999:4;44986:18;;;;;;;;;;;;;;;:34;45005:14;44986:34;;;;;;;;;;;;44964:56;;45070:11;45037:12;:18;45050:4;45037:18;;;;;;;;;;;;;;;:30;45056:10;45037:30;;;;;;;;;;;:44;;;;45187:10;45154:17;:30;45172:11;45154:30;;;;;;;;;;;:43;;;;44949:294;44915:328;45339:17;:26;45357:7;45339:26;;;;;;;;;;;45332:33;;;45383:12;:18;45396:4;45383:18;;;;;;;;;;;;;;;:34;45402:14;45383:34;;;;;;;;;;;45376:41;;;44518:907;;44437:988;;:::o;45720:1079::-;45973:22;46018:1;45998:10;:17;;;;:21;;;;:::i;:::-;45973:46;;46030:18;46051:15;:24;46067:7;46051:24;;;;;;;;;;;;46030:45;;46402:19;46424:10;46435:14;46424:26;;;;;;;;:::i;:::-;;;;;;;;;;46402:48;;46488:11;46463:10;46474;46463:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46599:10;46568:15;:28;46584:11;46568:28;;;;;;;;;;;:41;;;;46740:15;:24;46756:7;46740:24;;;;;;;;;;;46733:31;;;46775:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45791:1008;;;45720:1079;:::o;43224:221::-;43309:14;43326:20;43343:2;43326:16;:20::i;:::-;43309:37;;43384:7;43357:12;:16;43370:2;43357:16;;;;;;;;;;;;;;;:24;43374:6;43357:24;;;;;;;;;;;:34;;;;43431:6;43402:17;:26;43420:7;43402:26;;;;;;;;;;;:35;;;;43298:147;43224:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:104::-;5960:7;5989:24;6007:5;5989:24;:::i;:::-;5978:35;;5915:104;;;:::o;6025:138::-;6106:32;6132:5;6106:32;:::i;:::-;6099:5;6096:43;6086:71;;6153:1;6150;6143:12;6086:71;6025:138;:::o;6169:155::-;6223:5;6261:6;6248:20;6239:29;;6277:41;6312:5;6277:41;:::i;:::-;6169:155;;;;:::o;6330:345::-;6397:6;6446:2;6434:9;6425:7;6421:23;6417:32;6414:119;;;6452:79;;:::i;:::-;6414:119;6572:1;6597:61;6650:7;6641:6;6630:9;6626:22;6597:61;:::i;:::-;6587:71;;6543:125;6330:345;;;;:::o;6681:329::-;6740:6;6789:2;6777:9;6768:7;6764:23;6760:32;6757:119;;;6795:79;;:::i;:::-;6757:119;6915:1;6940:53;6985:7;6976:6;6965:9;6961:22;6940:53;:::i;:::-;6930:63;;6886:117;6681:329;;;;:::o;7016:116::-;7086:21;7101:5;7086:21;:::i;:::-;7079:5;7076:32;7066:60;;7122:1;7119;7112:12;7066:60;7016:116;:::o;7138:133::-;7181:5;7219:6;7206:20;7197:29;;7235:30;7259:5;7235:30;:::i;:::-;7138:133;;;;:::o;7277:468::-;7342:6;7350;7399:2;7387:9;7378:7;7374:23;7370:32;7367:119;;;7405:79;;:::i;:::-;7367:119;7525:1;7550:53;7595:7;7586:6;7575:9;7571:22;7550:53;:::i;:::-;7540:63;;7496:117;7652:2;7678:50;7720:7;7711:6;7700:9;7696:22;7678:50;:::i;:::-;7668:60;;7623:115;7277:468;;;;;:::o;7751:117::-;7860:1;7857;7850:12;7874:117;7983:1;7980;7973:12;7997:180;8045:77;8042:1;8035:88;8142:4;8139:1;8132:15;8166:4;8163:1;8156:15;8183:281;8266:27;8288:4;8266:27;:::i;:::-;8258:6;8254:40;8396:6;8384:10;8381:22;8360:18;8348:10;8345:34;8342:62;8339:88;;;8407:18;;:::i;:::-;8339:88;8447:10;8443:2;8436:22;8226:238;8183:281;;:::o;8470:129::-;8504:6;8531:20;;:::i;:::-;8521:30;;8560:33;8588:4;8580:6;8560:33;:::i;:::-;8470:129;;;:::o;8605:307::-;8666:4;8756:18;8748:6;8745:30;8742:56;;;8778:18;;:::i;:::-;8742:56;8816:29;8838:6;8816:29;:::i;:::-;8808:37;;8900:4;8894;8890:15;8882:23;;8605:307;;;:::o;8918:154::-;9002:6;8997:3;8992;8979:30;9064:1;9055:6;9050:3;9046:16;9039:27;8918:154;;;:::o;9078:410::-;9155:5;9180:65;9196:48;9237:6;9196:48;:::i;:::-;9180:65;:::i;:::-;9171:74;;9268:6;9261:5;9254:21;9306:4;9299:5;9295:16;9344:3;9335:6;9330:3;9326:16;9323:25;9320:112;;;9351:79;;:::i;:::-;9320:112;9441:41;9475:6;9470:3;9465;9441:41;:::i;:::-;9161:327;9078:410;;;;;:::o;9507:338::-;9562:5;9611:3;9604:4;9596:6;9592:17;9588:27;9578:122;;9619:79;;:::i;:::-;9578:122;9736:6;9723:20;9761:78;9835:3;9827:6;9820:4;9812:6;9808:17;9761:78;:::i;:::-;9752:87;;9568:277;9507:338;;;;:::o;9851:943::-;9946:6;9954;9962;9970;10019:3;10007:9;9998:7;9994:23;9990:33;9987:120;;;10026:79;;:::i;:::-;9987:120;10146:1;10171:53;10216:7;10207:6;10196:9;10192:22;10171:53;:::i;:::-;10161:63;;10117:117;10273:2;10299:53;10344:7;10335:6;10324:9;10320:22;10299:53;:::i;:::-;10289:63;;10244:118;10401:2;10427:53;10472:7;10463:6;10452:9;10448:22;10427:53;:::i;:::-;10417:63;;10372:118;10557:2;10546:9;10542:18;10529:32;10588:18;10580:6;10577:30;10574:117;;;10610:79;;:::i;:::-;10574:117;10715:62;10769:7;10760:6;10749:9;10745:22;10715:62;:::i;:::-;10705:72;;10500:287;9851:943;;;;;;;:::o;10800:474::-;10868:6;10876;10925:2;10913:9;10904:7;10900:23;10896:32;10893:119;;;10931:79;;:::i;:::-;10893:119;11051:1;11076:53;11121:7;11112:6;11101:9;11097:22;11076:53;:::i;:::-;11066:63;;11022:117;11178:2;11204:53;11249:7;11240:6;11229:9;11225:22;11204:53;:::i;:::-;11194:63;;11149:118;10800:474;;;;;:::o;11280:180::-;11328:77;11325:1;11318:88;11425:4;11422:1;11415:15;11449:4;11446:1;11439:15;11466:320;11510:6;11547:1;11541:4;11537:12;11527:22;;11594:1;11588:4;11584:12;11615:18;11605:81;;11671:4;11663:6;11659:17;11649:27;;11605:81;11733:2;11725:6;11722:14;11702:18;11699:38;11696:84;;11752:18;;:::i;:::-;11696:84;11517:269;11466:320;;;:::o;11792:231::-;11932:34;11928:1;11920:6;11916:14;11909:58;12001:14;11996:2;11988:6;11984:15;11977:39;11792:231;:::o;12029:366::-;12171:3;12192:67;12256:2;12251:3;12192:67;:::i;:::-;12185:74;;12268:93;12357:3;12268:93;:::i;:::-;12386:2;12381:3;12377:12;12370:19;;12029:366;;;:::o;12401:419::-;12567:4;12605:2;12594:9;12590:18;12582:26;;12654:9;12648:4;12644:20;12640:1;12629:9;12625:17;12618:47;12682:131;12808:4;12682:131;:::i;:::-;12674:139;;12401:419;;;:::o;12826:220::-;12966:34;12962:1;12954:6;12950:14;12943:58;13035:3;13030:2;13022:6;13018:15;13011:28;12826:220;:::o;13052:366::-;13194:3;13215:67;13279:2;13274:3;13215:67;:::i;:::-;13208:74;;13291:93;13380:3;13291:93;:::i;:::-;13409:2;13404:3;13400:12;13393:19;;13052:366;;;:::o;13424:419::-;13590:4;13628:2;13617:9;13613:18;13605:26;;13677:9;13671:4;13667:20;13663:1;13652:9;13648:17;13641:47;13705:131;13831:4;13705:131;:::i;:::-;13697:139;;13424:419;;;:::o;13849:243::-;13989:34;13985:1;13977:6;13973:14;13966:58;14058:26;14053:2;14045:6;14041:15;14034:51;13849:243;:::o;14098:366::-;14240:3;14261:67;14325:2;14320:3;14261:67;:::i;:::-;14254:74;;14337:93;14426:3;14337:93;:::i;:::-;14455:2;14450:3;14446:12;14439:19;;14098:366;;;:::o;14470:419::-;14636:4;14674:2;14663:9;14659:18;14651:26;;14723:9;14717:4;14713:20;14709:1;14698:9;14694:17;14687:47;14751:131;14877:4;14751:131;:::i;:::-;14743:139;;14470:419;;;:::o;14895:236::-;15035:34;15031:1;15023:6;15019:14;15012:58;15104:19;15099:2;15091:6;15087:15;15080:44;14895:236;:::o;15137:366::-;15279:3;15300:67;15364:2;15359:3;15300:67;:::i;:::-;15293:74;;15376:93;15465:3;15376:93;:::i;:::-;15494:2;15489:3;15485:12;15478:19;;15137:366;;;:::o;15509:419::-;15675:4;15713:2;15702:9;15698:18;15690:26;;15762:9;15756:4;15752:20;15748:1;15737:9;15733:17;15726:47;15790:131;15916:4;15790:131;:::i;:::-;15782:139;;15509:419;;;:::o;15934:230::-;16074:34;16070:1;16062:6;16058:14;16051:58;16143:13;16138:2;16130:6;16126:15;16119:38;15934:230;:::o;16170:366::-;16312:3;16333:67;16397:2;16392:3;16333:67;:::i;:::-;16326:74;;16409:93;16498:3;16409:93;:::i;:::-;16527:2;16522:3;16518:12;16511:19;;16170:366;;;:::o;16542:419::-;16708:4;16746:2;16735:9;16731:18;16723:26;;16795:9;16789:4;16785:20;16781:1;16770:9;16766:17;16759:47;16823:131;16949:4;16823:131;:::i;:::-;16815:139;;16542:419;;;:::o;16967:182::-;17107:34;17103:1;17095:6;17091:14;17084:58;16967:182;:::o;17155:366::-;17297:3;17318:67;17382:2;17377:3;17318:67;:::i;:::-;17311:74;;17394:93;17483:3;17394:93;:::i;:::-;17512:2;17507:3;17503:12;17496:19;;17155:366;;;:::o;17527:419::-;17693:4;17731:2;17720:9;17716:18;17708:26;;17780:9;17774:4;17770:20;17766:1;17755:9;17751:17;17744:47;17808:131;17934:4;17808:131;:::i;:::-;17800:139;;17527:419;;;:::o;17952:224::-;18092:34;18088:1;18080:6;18076:14;18069:58;18161:7;18156:2;18148:6;18144:15;18137:32;17952:224;:::o;18182:366::-;18324:3;18345:67;18409:2;18404:3;18345:67;:::i;:::-;18338:74;;18421:93;18510:3;18421:93;:::i;:::-;18539:2;18534:3;18530:12;18523:19;;18182:366;;;:::o;18554:419::-;18720:4;18758:2;18747:9;18743:18;18735:26;;18807:9;18801:4;18797:20;18793:1;18782:9;18778:17;18771:47;18835:131;18961:4;18835:131;:::i;:::-;18827:139;;18554:419;;;:::o;18979:180::-;19027:77;19024:1;19017:88;19124:4;19121:1;19114:15;19148:4;19145:1;19138:15;19165:191;19205:4;19225:20;19243:1;19225:20;:::i;:::-;19220:25;;19259:20;19277:1;19259:20;:::i;:::-;19254:25;;19298:1;19295;19292:8;19289:34;;;19303:18;;:::i;:::-;19289:34;19348:1;19345;19341:9;19333:17;;19165:191;;;;:::o;19362:348::-;19402:7;19425:20;19443:1;19425:20;:::i;:::-;19420:25;;19459:20;19477:1;19459:20;:::i;:::-;19454:25;;19647:1;19579:66;19575:74;19572:1;19569:81;19564:1;19557:9;19550:17;19546:105;19543:131;;;19654:18;;:::i;:::-;19543:131;19702:1;19699;19695:9;19684:20;;19362:348;;;;:::o;19716:305::-;19756:3;19775:20;19793:1;19775:20;:::i;:::-;19770:25;;19809:20;19827:1;19809:20;:::i;:::-;19804:25;;19963:1;19895:66;19891:74;19888:1;19885:81;19882:107;;;19969:18;;:::i;:::-;19882:107;20013:1;20010;20006:9;19999:16;;19716:305;;;;:::o;20027:245::-;20167:34;20163:1;20155:6;20151:14;20144:58;20236:28;20231:2;20223:6;20219:15;20212:53;20027:245;:::o;20278:366::-;20420:3;20441:67;20505:2;20500:3;20441:67;:::i;:::-;20434:74;;20517:93;20606:3;20517:93;:::i;:::-;20635:2;20630:3;20626:12;20619:19;;20278:366;;;:::o;20650:419::-;20816:4;20854:2;20843:9;20839:18;20831:26;;20903:9;20897:4;20893:20;20889:1;20878:9;20874:17;20867:47;20931:131;21057:4;20931:131;:::i;:::-;20923:139;;20650:419;;;:::o;21075:233::-;21114:3;21137:24;21155:5;21137:24;:::i;:::-;21128:33;;21183:66;21176:5;21173:77;21170:103;;21253:18;;:::i;:::-;21170:103;21300:1;21293:5;21289:13;21282:20;;21075:233;;;:::o;21314:235::-;21454:34;21450:1;21442:6;21438:14;21431:58;21523:18;21518:2;21510:6;21506:15;21499:43;21314:235;:::o;21555:366::-;21697:3;21718:67;21782:2;21777:3;21718:67;:::i;:::-;21711:74;;21794:93;21883:3;21794:93;:::i;:::-;21912:2;21907:3;21903:12;21896:19;;21555:366;;;:::o;21927:419::-;22093:4;22131:2;22120:9;22116:18;22108:26;;22180:9;22174:4;22170:20;22166:1;22155:9;22151:17;22144:47;22208:131;22334:4;22208:131;:::i;:::-;22200:139;;21927:419;;;:::o;22352:231::-;22492:34;22488:1;22480:6;22476:14;22469:58;22561:14;22556:2;22548:6;22544:15;22537:39;22352:231;:::o;22589:366::-;22731:3;22752:67;22816:2;22811:3;22752:67;:::i;:::-;22745:74;;22828:93;22917:3;22828:93;:::i;:::-;22946:2;22941:3;22937:12;22930:19;;22589:366;;;:::o;22961:419::-;23127:4;23165:2;23154:9;23150:18;23142:26;;23214:9;23208:4;23204:20;23200:1;23189:9;23185:17;23178:47;23242:131;23368:4;23242:131;:::i;:::-;23234:139;;22961:419;;;:::o;23386:180::-;23434:77;23431:1;23424:88;23531:4;23528:1;23521:15;23555:4;23552:1;23545:15;23572:228;23712:34;23708:1;23700:6;23696:14;23689:58;23781:11;23776:2;23768:6;23764:15;23757:36;23572:228;:::o;23806:366::-;23948:3;23969:67;24033:2;24028:3;23969:67;:::i;:::-;23962:74;;24045:93;24134:3;24045:93;:::i;:::-;24163:2;24158:3;24154:12;24147:19;;23806:366;;;:::o;24178:419::-;24344:4;24382:2;24371:9;24367:18;24359:26;;24431:9;24425:4;24421:20;24417:1;24406:9;24402:17;24395:47;24459:131;24585:4;24459:131;:::i;:::-;24451:139;;24178:419;;;:::o;24603:229::-;24743:34;24739:1;24731:6;24727:14;24720:58;24812:12;24807:2;24799:6;24795:15;24788:37;24603:229;:::o;24838:366::-;24980:3;25001:67;25065:2;25060:3;25001:67;:::i;:::-;24994:74;;25077:93;25166:3;25077:93;:::i;:::-;25195:2;25190:3;25186:12;25179:19;;24838:366;;;:::o;25210:419::-;25376:4;25414:2;25403:9;25399:18;25391:26;;25463:9;25457:4;25453:20;25449:1;25438:9;25434:17;25427:47;25491:131;25617:4;25491:131;:::i;:::-;25483:139;;25210:419;;;:::o;25635:236::-;25775:34;25771:1;25763:6;25759:14;25752:58;25844:19;25839:2;25831:6;25827:15;25820:44;25635:236;:::o;25877:366::-;26019:3;26040:67;26104:2;26099:3;26040:67;:::i;:::-;26033:74;;26116:93;26205:3;26116:93;:::i;:::-;26234:2;26229:3;26225:12;26218:19;;25877:366;;;:::o;26249:419::-;26415:4;26453:2;26442:9;26438:18;26430:26;;26502:9;26496:4;26492:20;26488:1;26477:9;26473:17;26466:47;26530:131;26656:4;26530:131;:::i;:::-;26522:139;;26249:419;;;:::o;26674:148::-;26776:11;26813:3;26798:18;;26674:148;;;;:::o;26828:141::-;26877:4;26900:3;26892:11;;26923:3;26920:1;26913:14;26957:4;26954:1;26944:18;26936:26;;26828:141;;;:::o;26999:845::-;27102:3;27139:5;27133:12;27168:36;27194:9;27168:36;:::i;:::-;27220:89;27302:6;27297:3;27220:89;:::i;:::-;27213:96;;27340:1;27329:9;27325:17;27356:1;27351:137;;;;27502:1;27497:341;;;;27318:520;;27351:137;27435:4;27431:9;27420;27416:25;27411:3;27404:38;27471:6;27466:3;27462:16;27455:23;;27351:137;;27497:341;27564:38;27596:5;27564:38;:::i;:::-;27624:1;27638:154;27652:6;27649:1;27646:13;27638:154;;;27726:7;27720:14;27716:1;27711:3;27707:11;27700:35;27776:1;27767:7;27763:15;27752:26;;27674:4;27671:1;27667:12;27662:17;;27638:154;;;27821:6;27816:3;27812:16;27805:23;;27504:334;;27318:520;;27106:738;;26999:845;;;;:::o;27850:377::-;27956:3;27984:39;28017:5;27984:39;:::i;:::-;28039:89;28121:6;28116:3;28039:89;:::i;:::-;28032:96;;28137:52;28182:6;28177:3;28170:4;28163:5;28159:16;28137:52;:::i;:::-;28214:6;28209:3;28205:16;28198:23;;27960:267;27850:377;;;;:::o;28233:589::-;28458:3;28480:92;28568:3;28559:6;28480:92;:::i;:::-;28473:99;;28589:95;28680:3;28671:6;28589:95;:::i;:::-;28582:102;;28701:95;28792:3;28783:6;28701:95;:::i;:::-;28694:102;;28813:3;28806:10;;28233:589;;;;;;:::o;28828:225::-;28968:34;28964:1;28956:6;28952:14;28945:58;29037:8;29032:2;29024:6;29020:15;29013:33;28828:225;:::o;29059:366::-;29201:3;29222:67;29286:2;29281:3;29222:67;:::i;:::-;29215:74;;29298:93;29387:3;29298:93;:::i;:::-;29416:2;29411:3;29407:12;29400:19;;29059:366;;;:::o;29431:419::-;29597:4;29635:2;29624:9;29620:18;29612:26;;29684:9;29678:4;29674:20;29670:1;29659:9;29655:17;29648:47;29712:131;29838:4;29712:131;:::i;:::-;29704:139;;29431:419;;;:::o;29856:231::-;29996:34;29992:1;29984:6;29980:14;29973:58;30065:14;30060:2;30052:6;30048:15;30041:39;29856:231;:::o;30093:366::-;30235:3;30256:67;30320:2;30315:3;30256:67;:::i;:::-;30249:74;;30332:93;30421:3;30332:93;:::i;:::-;30450:2;30445:3;30441:12;30434:19;;30093:366;;;:::o;30465:419::-;30631:4;30669:2;30658:9;30654:18;30646:26;;30718:9;30712:4;30708:20;30704:1;30693:9;30689:17;30682:47;30746:131;30872:4;30746:131;:::i;:::-;30738:139;;30465:419;;;:::o;30890:224::-;31030:34;31026:1;31018:6;31014:14;31007:58;31099:7;31094:2;31086:6;31082:15;31075:32;30890:224;:::o;31120:366::-;31262:3;31283:67;31347:2;31342:3;31283:67;:::i;:::-;31276:74;;31359:93;31448:3;31359:93;:::i;:::-;31477:2;31472:3;31468:12;31461:19;;31120:366;;;:::o;31492:419::-;31658:4;31696:2;31685:9;31681:18;31673:26;;31745:9;31739:4;31735:20;31731:1;31720:9;31716:17;31709:47;31773:131;31899:4;31773:131;:::i;:::-;31765:139;;31492:419;;;:::o;31917:223::-;32057:34;32053:1;32045:6;32041:14;32034:58;32126:6;32121:2;32113:6;32109:15;32102:31;31917:223;:::o;32146:366::-;32288:3;32309:67;32373:2;32368:3;32309:67;:::i;:::-;32302:74;;32385:93;32474:3;32385:93;:::i;:::-;32503:2;32498:3;32494:12;32487:19;;32146:366;;;:::o;32518:419::-;32684:4;32722:2;32711:9;32707:18;32699:26;;32771:9;32765:4;32761:20;32757:1;32746:9;32742:17;32735:47;32799:131;32925:4;32799:131;:::i;:::-;32791:139;;32518:419;;;:::o;32943:233::-;33083:34;33079:1;33071:6;33067:14;33060:58;33152:16;33147:2;33139:6;33135:15;33128:41;32943:233;:::o;33182:366::-;33324:3;33345:67;33409:2;33404:3;33345:67;:::i;:::-;33338:74;;33421:93;33510:3;33421:93;:::i;:::-;33539:2;33534:3;33530:12;33523:19;;33182:366;;;:::o;33554:419::-;33720:4;33758:2;33747:9;33743:18;33735:26;;33807:9;33801:4;33797:20;33793:1;33782:9;33778:17;33771:47;33835:131;33961:4;33835:131;:::i;:::-;33827:139;;33554:419;;;:::o;33979:175::-;34119:27;34115:1;34107:6;34103:14;34096:51;33979:175;:::o;34160:366::-;34302:3;34323:67;34387:2;34382:3;34323:67;:::i;:::-;34316:74;;34399:93;34488:3;34399:93;:::i;:::-;34517:2;34512:3;34508:12;34501:19;;34160:366;;;:::o;34532:419::-;34698:4;34736:2;34725:9;34721:18;34713:26;;34785:9;34779:4;34775:20;34771:1;34760:9;34756:17;34749:47;34813:131;34939:4;34813:131;:::i;:::-;34805:139;;34532:419;;;:::o;34957:237::-;35097:34;35093:1;35085:6;35081:14;35074:58;35166:20;35161:2;35153:6;35149:15;35142:45;34957:237;:::o;35200:366::-;35342:3;35363:67;35427:2;35422:3;35363:67;:::i;:::-;35356:74;;35439:93;35528:3;35439:93;:::i;:::-;35557:2;35552:3;35548:12;35541:19;;35200:366;;;:::o;35572:419::-;35738:4;35776:2;35765:9;35761:18;35753:26;;35825:9;35819:4;35815:20;35811:1;35800:9;35796:17;35789:47;35853:131;35979:4;35853:131;:::i;:::-;35845:139;;35572:419;;;:::o;35997:180::-;36045:77;36042:1;36035:88;36142:4;36139:1;36132:15;36166:4;36163:1;36156:15;36183:185;36223:1;36240:20;36258:1;36240:20;:::i;:::-;36235:25;;36274:20;36292:1;36274:20;:::i;:::-;36269:25;;36313:1;36303:35;;36318:18;;:::i;:::-;36303:35;36360:1;36357;36353:9;36348:14;;36183:185;;;;:::o;36374:176::-;36406:1;36423:20;36441:1;36423:20;:::i;:::-;36418:25;;36457:20;36475:1;36457:20;:::i;:::-;36452:25;;36496:1;36486:35;;36501:18;;:::i;:::-;36486:35;36542:1;36539;36535:9;36530:14;;36374:176;;;;:::o;36556:98::-;36607:6;36641:5;36635:12;36625:22;;36556:98;;;:::o;36660:168::-;36743:11;36777:6;36772:3;36765:19;36817:4;36812:3;36808:14;36793:29;;36660:168;;;;:::o;36834:360::-;36920:3;36948:38;36980:5;36948:38;:::i;:::-;37002:70;37065:6;37060:3;37002:70;:::i;:::-;36995:77;;37081:52;37126:6;37121:3;37114:4;37107:5;37103:16;37081:52;:::i;:::-;37158:29;37180:6;37158:29;:::i;:::-;37153:3;37149:39;37142:46;;36924:270;36834:360;;;;:::o;37200:640::-;37395:4;37433:3;37422:9;37418:19;37410:27;;37447:71;37515:1;37504:9;37500:17;37491:6;37447:71;:::i;:::-;37528:72;37596:2;37585:9;37581:18;37572:6;37528:72;:::i;:::-;37610;37678:2;37667:9;37663:18;37654:6;37610:72;:::i;:::-;37729:9;37723:4;37719:20;37714:2;37703:9;37699:18;37692:48;37757:76;37828:4;37819:6;37757:76;:::i;:::-;37749:84;;37200:640;;;;;;;:::o;37846:141::-;37902:5;37933:6;37927:13;37918:22;;37949:32;37975:5;37949:32;:::i;:::-;37846:141;;;;:::o;37993:349::-;38062:6;38111:2;38099:9;38090:7;38086:23;38082:32;38079:119;;;38117:79;;:::i;:::-;38079:119;38237:1;38262:63;38317:7;38308:6;38297:9;38293:22;38262:63;:::i;:::-;38252:73;;38208:127;37993:349;;;;:::o;38348:182::-;38488:34;38484:1;38476:6;38472:14;38465:58;38348:182;:::o;38536:366::-;38678:3;38699:67;38763:2;38758:3;38699:67;:::i;:::-;38692:74;;38775:93;38864:3;38775:93;:::i;:::-;38893:2;38888:3;38884:12;38877:19;;38536:366;;;:::o;38908:419::-;39074:4;39112:2;39101:9;39097:18;39089:26;;39161:9;39155:4;39151:20;39147:1;39136:9;39132:17;39125:47;39189:131;39315:4;39189:131;:::i;:::-;39181:139;;38908:419;;;:::o;39333:178::-;39473:30;39469:1;39461:6;39457:14;39450:54;39333:178;:::o;39517:366::-;39659:3;39680:67;39744:2;39739:3;39680:67;:::i;:::-;39673:74;;39756:93;39845:3;39756:93;:::i;:::-;39874:2;39869:3;39865:12;39858:19;;39517:366;;;:::o;39889:419::-;40055:4;40093:2;40082:9;40078:18;40070:26;;40142:9;40136:4;40132:20;40128:1;40117:9;40113:17;40106:47;40170:131;40296:4;40170:131;:::i;:::-;40162:139;;39889:419;;;:::o;40314:180::-;40362:77;40359:1;40352:88;40459:4;40456:1;40449:15;40483:4;40480:1;40473:15
Swarm Source
ipfs://1b22574d59c511b2d660132119fe88ca9ac6d048d55dc64e792aa440eb745dd4
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.