ERC-721
Overview
Max Total Supply
3,630 Shroomies
Holders
648
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
Shroomies
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-02-18 */ // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/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 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: shroomies.sol pragma solidity 0.8.9; contract Shroomies is ERC721Enumerable, Ownable { using Strings for uint256; uint256 public constant MAX_ENTRIES = 5000; uint8 public constant maxMintCount = 10; uint public price = 1 ether; bool public paused = true; address public admin = 0x27DF8590c11F2e5E7B0d0e00Ac8f39aFE0BA127E; uint256[MAX_ENTRIES] internal availableIds; string _baseTokenURI; constructor(string memory baseURI) ERC721("Fantom Shroomies", "Shroomies") { setBaseURI(baseURI); } function _getNewId(uint256 _totalMinted) internal returns(uint256 value) { uint256 remaining = MAX_ENTRIES - _totalMinted; uint256 rand = uint256(keccak256(abi.encodePacked(msg.sender, block.difficulty, block.timestamp, remaining))) % remaining; value = 0; // if array value exists, use, otherwise, use generated random value if (availableIds[rand] != 0) value = availableIds[rand]; else value = rand; // store remaining - 1 in used ID to create mapping if (availableIds[remaining - 1] == 0) availableIds[rand] = remaining - 1; else availableIds[rand] = availableIds[remaining - 1]; value += 1; } function mint(uint256 _amount) external payable { require(!paused, "Sale not started"); require(_amount>0, "Amount too low"); require(_amount <= maxMintCount, "MAX ONE TIME PURCHASE AMOUNT EXCEEDED"); uint256 totalMinted = totalSupply(); require(_amount + totalMinted <= MAX_ENTRIES, 'Amount exceed'); require(msg.value >= price * _amount, "Shroomies: not enough price"); payable(admin).transfer(address(this).balance); for (uint8 i = 0; i < _amount; i++) _mint(msg.sender, _getNewId(totalMinted + i)); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setPrice(uint256 _price) external onlyOwner { price = _price; } function airdropShroomies(address[] calldata addresses) external onlyOwner { uint256 currentSupply = totalSupply(); require(addresses.length + currentSupply <= MAX_ENTRIES, 'Amount exceed'); for (uint8 i = 0; i < addresses.length; i++) { _mint(addresses[i], _getNewId(currentSupply + i)); } } function setPaused(bool _paused) external onlyOwner { paused = _paused; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","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":[],"name":"MAX_ENTRIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"airdropShroomies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052670de0b6b3a7640000600b556001600c60006101000a81548160ff0219169083151502179055507327df8590c11f2e5e7b0d0e00ac8f39afe0ba127e600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200008d57600080fd5b5060405162004b2438038062004b248339818101604052810190620000b391906200057c565b6040518060400160405280601081526020017f46616e746f6d205368726f6f6d696573000000000000000000000000000000008152506040518060400160405280600981526020017f5368726f6f6d69657300000000000000000000000000000000000000000000008152508160009080519060200190620001379291906200032f565b508060019080519060200190620001509291906200032f565b50505062000173620001676200018b60201b60201c565b6200019360201b60201c565b62000184816200025960201b60201c565b50620006b5565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002696200018b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200028f6200030560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002df906200062e565b60405180910390fd5b806113959080519060200190620003019291906200032f565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200033d906200067f565b90600052602060002090601f016020900481019282620003615760008555620003ad565b82601f106200037c57805160ff1916838001178555620003ad565b82800160010185558215620003ad579182015b82811115620003ac5782518255916020019190600101906200038f565b5b509050620003bc9190620003c0565b5090565b5b80821115620003db576000816000905550600101620003c1565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200044882620003fd565b810181811067ffffffffffffffff821117156200046a57620004696200040e565b5b80604052505050565b60006200047f620003df565b90506200048d82826200043d565b919050565b600067ffffffffffffffff821115620004b057620004af6200040e565b5b620004bb82620003fd565b9050602081019050919050565b60005b83811015620004e8578082015181840152602081019050620004cb565b83811115620004f8576000848401525b50505050565b6000620005156200050f8462000492565b62000473565b905082815260208101848484011115620005345762000533620003f8565b5b62000541848285620004c8565b509392505050565b600082601f830112620005615762000560620003f3565b5b815162000573848260208601620004fe565b91505092915050565b600060208284031215620005955762000594620003e9565b5b600082015167ffffffffffffffff811115620005b657620005b5620003ee565b5b620005c48482850162000549565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000616602083620005cd565b91506200062382620005de565b602082019050919050565b60006020820190508181036000830152620006498162000607565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200069857607f821691505b60208210811415620006af57620006ae62000650565b5b50919050565b61445f80620006c56000396000f3fe6080604052600436106101cd5760003560e01c80636352211e116100f7578063a035b1fe11610095578063c87b56dd11610064578063c87b56dd14610679578063e985e9c5146106b6578063f2fde38b146106f3578063f851a4401461071c576101cd565b8063a035b1fe146105e0578063a0712d681461060b578063a22cb46514610627578063b88d4fde14610650576101cd565b80637d4cb964116100d15780637d4cb964146105365780638da5cb5b1461056157806391b7f5ed1461058c57806395d89b41146105b5576101cd565b80636352211e146104a557806370a08231146104e2578063715018a61461051f576101cd565b80632f745c591161016f578063438b63001161013e578063438b6300146103d75780634f6ccce71461041457806355f804b3146104515780635c975abb1461047a576101cd565b80632f745c591461031d578063306ccc931461035a57806332c60eef1461038357806342842e0e146103ae576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806316c38b3c146102a057806318160ddd146102c957806323b872dd146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612b39565b610747565b6040516102069190612b81565b60405180910390f35b34801561021b57600080fd5b506102246107c1565b6040516102319190612c35565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612c8d565b610853565b60405161026e9190612cfb565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612d42565b6108d8565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612dae565b6109f0565b005b3480156102d557600080fd5b506102de610a89565b6040516102eb9190612dea565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612e05565b610a96565b005b34801561032957600080fd5b50610344600480360381019061033f9190612d42565b610af6565b6040516103519190612dea565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190612ebd565b610b9b565b005b34801561038f57600080fd5b50610398610cea565b6040516103a59190612f26565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190612e05565b610cef565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190612f41565b610d0f565b60405161040b919061302c565b60405180910390f35b34801561042057600080fd5b5061043b60048036038101906104369190612c8d565b610dbd565b6040516104489190612dea565b60405180910390f35b34801561045d57600080fd5b506104786004803603810190610473919061317e565b610e2e565b005b34801561048657600080fd5b5061048f610ec5565b60405161049c9190612b81565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190612c8d565b610ed8565b6040516104d99190612cfb565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612f41565b610f8a565b6040516105169190612dea565b60405180910390f35b34801561052b57600080fd5b50610534611042565b005b34801561054257600080fd5b5061054b6110ca565b6040516105589190612dea565b60405180910390f35b34801561056d57600080fd5b506105766110d0565b6040516105839190612cfb565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612c8d565b6110fa565b005b3480156105c157600080fd5b506105ca611180565b6040516105d79190612c35565b60405180910390f35b3480156105ec57600080fd5b506105f5611212565b6040516106029190612dea565b60405180910390f35b61062560048036038101906106209190612c8d565b611218565b005b34801561063357600080fd5b5061064e600480360381019061064991906131c7565b61144d565b005b34801561065c57600080fd5b50610677600480360381019061067291906132a8565b6115ce565b005b34801561068557600080fd5b506106a0600480360381019061069b9190612c8d565b611630565b6040516106ad9190612c35565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d8919061332b565b6116d7565b6040516106ea9190612b81565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190612f41565b61176b565b005b34801561072857600080fd5b50610731611863565b60405161073e9190612cfb565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ba57506107b982611889565b5b9050919050565b6060600080546107d09061339a565b80601f01602080910402602001604051908101604052809291908181526020018280546107fc9061339a565b80156108495780601f1061081e57610100808354040283529160200191610849565b820191906000526020600020905b81548152906001019060200180831161082c57829003601f168201915b5050505050905090565b600061085e8261196b565b61089d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108949061343e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e382610ed8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b906134d0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109736119d7565b73ffffffffffffffffffffffffffffffffffffffff1614806109a257506109a18161099c6119d7565b6116d7565b5b6109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d890613562565b60405180910390fd5b6109eb83836119df565b505050565b6109f86119d7565b73ffffffffffffffffffffffffffffffffffffffff16610a166110d0565b73ffffffffffffffffffffffffffffffffffffffff1614610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a63906135ce565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b610aa7610aa16119d7565b82611a98565b610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90613660565b60405180910390fd5b610af1838383611b76565b505050565b6000610b0183610f8a565b8210610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906136f2565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ba36119d7565b73ffffffffffffffffffffffffffffffffffffffff16610bc16110d0565b73ffffffffffffffffffffffffffffffffffffffff1614610c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0e906135ce565b60405180910390fd5b6000610c21610a89565b90506113888184849050610c359190613741565b1115610c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6d906137e3565b60405180910390fd5b60005b838390508160ff161015610ce457610cd184848360ff16818110610ca057610c9f613803565b5b9050602002016020810190610cb59190612f41565b610ccc8360ff1685610cc79190613741565b611dd2565b611f13565b8080610cdc90613832565b915050610c79565b50505050565b600a81565b610d0a838383604051806020016040528060008152506115ce565b505050565b60606000610d1c83610f8a565b905060008167ffffffffffffffff811115610d3a57610d39613053565b5b604051908082528060200260200182016040528015610d685781602001602082028036833780820191505090505b50905060005b82811015610db257610d808582610af6565b828281518110610d9357610d92613803565b5b6020026020010181815250508080610daa9061385c565b915050610d6e565b508092505050919050565b6000610dc7610a89565b8210610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90613917565b60405180910390fd5b60088281548110610e1c57610e1b613803565b5b90600052602060002001549050919050565b610e366119d7565b73ffffffffffffffffffffffffffffffffffffffff16610e546110d0565b73ffffffffffffffffffffffffffffffffffffffff1614610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea1906135ce565b60405180910390fd5b806113959080519060200190610ec1929190612a2a565b5050565b600c60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f78906139a9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff290613a3b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61104a6119d7565b73ffffffffffffffffffffffffffffffffffffffff166110686110d0565b73ffffffffffffffffffffffffffffffffffffffff16146110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b5906135ce565b60405180910390fd5b6110c860006120e1565b565b61138881565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111026119d7565b73ffffffffffffffffffffffffffffffffffffffff166111206110d0565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d906135ce565b60405180910390fd5b80600b8190555050565b60606001805461118f9061339a565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb9061339a565b80156112085780601f106111dd57610100808354040283529160200191611208565b820191906000526020600020905b8154815290600101906020018083116111eb57829003601f168201915b5050505050905090565b600b5481565b600c60009054906101000a900460ff1615611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90613aa7565b60405180910390fd5b600081116112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290613b13565b60405180910390fd5b600a60ff168111156112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990613ba5565b60405180910390fd5b60006112fc610a89565b9050611388818361130d9190613741565b111561134e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611345906137e3565b60405180910390fd5b81600b5461135c9190613bc5565b34101561139e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139590613c6b565b60405180910390fd5b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611406573d6000803e3d6000fd5b5060005b828160ff16101561144857611435336114308360ff168561142b9190613741565b611dd2565b611f13565b808061144090613832565b91505061140a565b505050565b6114556119d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90613cd7565b60405180910390fd5b80600560006114d06119d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661157d6119d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c29190612b81565b60405180910390a35050565b6115df6115d96119d7565b83611a98565b61161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590613660565b60405180910390fd5b61162a848484846121a7565b50505050565b606061163b8261196b565b61167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190613d69565b60405180910390fd5b6000611684612203565b905060008151116116a457604051806020016040528060008152506116cf565b806116ae84612296565b6040516020016116bf929190613dc5565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117736119d7565b73ffffffffffffffffffffffffffffffffffffffff166117916110d0565b73ffffffffffffffffffffffffffffffffffffffff16146117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de906135ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e90613e5b565b60405180910390fd5b611860816120e1565b50565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061195457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119645750611963826123f7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a5283610ed8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611aa38261196b565b611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990613eed565b60405180910390fd5b6000611aed83610ed8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b5c57508373ffffffffffffffffffffffffffffffffffffffff16611b4484610853565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b6d5750611b6c81856116d7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b9682610ed8565b73ffffffffffffffffffffffffffffffffffffffff1614611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be390613f7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390614011565b60405180910390fd5b611c67838383612461565b611c726000826119df565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc29190614031565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d199190613741565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082611388611de39190614031565b905060008133444285604051602001611dff94939291906140ce565b6040516020818303038152906040528051906020012060001c611e22919061414b565b9050600092506000600d826113888110611e3f57611e3e613803565b5b015414611e6457600d816113888110611e5b57611e5a613803565b5b01549250611e68565b8092505b6000600d600184611e799190614031565b6113888110611e8b57611e8a613803565b5b01541415611ebf57600182611ea09190614031565b600d826113888110611eb557611eb4613803565b5b0181905550611efd565b600d600183611ece9190614031565b6113888110611ee057611edf613803565b5b0154600d826113888110611ef757611ef6613803565b5b01819055505b600183611f0a9190613741565b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a906141c8565b60405180910390fd5b611f8c8161196b565b15611fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc390614234565b60405180910390fd5b611fd860008383612461565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120289190613741565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121b2848484611b76565b6121be84848484612575565b6121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f4906142c6565b60405180910390fd5b50505050565b606061139580546122139061339a565b80601f016020809104026020016040519081016040528092919081815260200182805461223f9061339a565b801561228c5780601f106122615761010080835404028352916020019161228c565b820191906000526020600020905b81548152906001019060200180831161226f57829003601f168201915b5050505050905090565b606060008214156122de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123f2565b600082905060005b600082146123105780806122f99061385c565b915050600a8261230991906142e6565b91506122e6565b60008167ffffffffffffffff81111561232c5761232b613053565b5b6040519080825280601f01601f19166020018201604052801561235e5781602001600182028036833780820191505090505b5090505b600085146123eb576001826123779190614031565b9150600a85612386919061414b565b60306123929190613741565b60f81b8183815181106123a8576123a7613803565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123e491906142e6565b9450612362565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61246c83838361270c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124af576124aa81612711565b6124ee565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124ed576124ec838261275a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125315761252c816128c7565b612570565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461256f5761256e8282612998565b5b5b505050565b60006125968473ffffffffffffffffffffffffffffffffffffffff16612a17565b156126ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125bf6119d7565b8786866040518563ffffffff1660e01b81526004016125e1949392919061436c565b602060405180830381600087803b1580156125fb57600080fd5b505af192505050801561262c57506040513d601f19601f8201168201806040525081019061262991906143cd565b60015b6126af573d806000811461265c576040519150601f19603f3d011682016040523d82523d6000602084013e612661565b606091505b506000815114156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e906142c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612704565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161276784610f8a565b6127719190614031565b9050600060076000848152602001908152602001600020549050818114612856576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128db9190614031565b905060006009600084815260200190815260200160002054905060006008838154811061290b5761290a613803565b5b90600052602060002001549050806008838154811061292d5761292c613803565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061297c5761297b6143fa565b5b6001900381819060005260206000200160009055905550505050565b60006129a383610f8a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612a369061339a565b90600052602060002090601f016020900481019282612a585760008555612a9f565b82601f10612a7157805160ff1916838001178555612a9f565b82800160010185558215612a9f579182015b82811115612a9e578251825591602001919060010190612a83565b5b509050612aac9190612ab0565b5090565b5b80821115612ac9576000816000905550600101612ab1565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b1681612ae1565b8114612b2157600080fd5b50565b600081359050612b3381612b0d565b92915050565b600060208284031215612b4f57612b4e612ad7565b5b6000612b5d84828501612b24565b91505092915050565b60008115159050919050565b612b7b81612b66565b82525050565b6000602082019050612b966000830184612b72565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bd6578082015181840152602081019050612bbb565b83811115612be5576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c0782612b9c565b612c118185612ba7565b9350612c21818560208601612bb8565b612c2a81612beb565b840191505092915050565b60006020820190508181036000830152612c4f8184612bfc565b905092915050565b6000819050919050565b612c6a81612c57565b8114612c7557600080fd5b50565b600081359050612c8781612c61565b92915050565b600060208284031215612ca357612ca2612ad7565b5b6000612cb184828501612c78565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ce582612cba565b9050919050565b612cf581612cda565b82525050565b6000602082019050612d106000830184612cec565b92915050565b612d1f81612cda565b8114612d2a57600080fd5b50565b600081359050612d3c81612d16565b92915050565b60008060408385031215612d5957612d58612ad7565b5b6000612d6785828601612d2d565b9250506020612d7885828601612c78565b9150509250929050565b612d8b81612b66565b8114612d9657600080fd5b50565b600081359050612da881612d82565b92915050565b600060208284031215612dc457612dc3612ad7565b5b6000612dd284828501612d99565b91505092915050565b612de481612c57565b82525050565b6000602082019050612dff6000830184612ddb565b92915050565b600080600060608486031215612e1e57612e1d612ad7565b5b6000612e2c86828701612d2d565b9350506020612e3d86828701612d2d565b9250506040612e4e86828701612c78565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612e7d57612e7c612e58565b5b8235905067ffffffffffffffff811115612e9a57612e99612e5d565b5b602083019150836020820283011115612eb657612eb5612e62565b5b9250929050565b60008060208385031215612ed457612ed3612ad7565b5b600083013567ffffffffffffffff811115612ef257612ef1612adc565b5b612efe85828601612e67565b92509250509250929050565b600060ff82169050919050565b612f2081612f0a565b82525050565b6000602082019050612f3b6000830184612f17565b92915050565b600060208284031215612f5757612f56612ad7565b5b6000612f6584828501612d2d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612fa381612c57565b82525050565b6000612fb58383612f9a565b60208301905092915050565b6000602082019050919050565b6000612fd982612f6e565b612fe38185612f79565b9350612fee83612f8a565b8060005b8381101561301f5781516130068882612fa9565b975061301183612fc1565b925050600181019050612ff2565b5085935050505092915050565b600060208201905081810360008301526130468184612fce565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61308b82612beb565b810181811067ffffffffffffffff821117156130aa576130a9613053565b5b80604052505050565b60006130bd612acd565b90506130c98282613082565b919050565b600067ffffffffffffffff8211156130e9576130e8613053565b5b6130f282612beb565b9050602081019050919050565b82818337600083830152505050565b600061312161311c846130ce565b6130b3565b90508281526020810184848401111561313d5761313c61304e565b5b6131488482856130ff565b509392505050565b600082601f83011261316557613164612e58565b5b813561317584826020860161310e565b91505092915050565b60006020828403121561319457613193612ad7565b5b600082013567ffffffffffffffff8111156131b2576131b1612adc565b5b6131be84828501613150565b91505092915050565b600080604083850312156131de576131dd612ad7565b5b60006131ec85828601612d2d565b92505060206131fd85828601612d99565b9150509250929050565b600067ffffffffffffffff82111561322257613221613053565b5b61322b82612beb565b9050602081019050919050565b600061324b61324684613207565b6130b3565b9050828152602081018484840111156132675761326661304e565b5b6132728482856130ff565b509392505050565b600082601f83011261328f5761328e612e58565b5b813561329f848260208601613238565b91505092915050565b600080600080608085870312156132c2576132c1612ad7565b5b60006132d087828801612d2d565b94505060206132e187828801612d2d565b93505060406132f287828801612c78565b925050606085013567ffffffffffffffff81111561331357613312612adc565b5b61331f8782880161327a565b91505092959194509250565b6000806040838503121561334257613341612ad7565b5b600061335085828601612d2d565b925050602061336185828601612d2d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133b257607f821691505b602082108114156133c6576133c561336b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613428602c83612ba7565b9150613433826133cc565b604082019050919050565b600060208201905081810360008301526134578161341b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134ba602183612ba7565b91506134c58261345e565b604082019050919050565b600060208201905081810360008301526134e9816134ad565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061354c603883612ba7565b9150613557826134f0565b604082019050919050565b6000602082019050818103600083015261357b8161353f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135b8602083612ba7565b91506135c382613582565b602082019050919050565b600060208201905081810360008301526135e7816135ab565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061364a603183612ba7565b9150613655826135ee565b604082019050919050565b600060208201905081810360008301526136798161363d565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006136dc602b83612ba7565b91506136e782613680565b604082019050919050565b6000602082019050818103600083015261370b816136cf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061374c82612c57565b915061375783612c57565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561378c5761378b613712565b5b828201905092915050565b7f416d6f756e742065786365656400000000000000000000000000000000000000600082015250565b60006137cd600d83612ba7565b91506137d882613797565b602082019050919050565b600060208201905081810360008301526137fc816137c0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061383d82612f0a565b915060ff82141561385157613850613712565b5b600182019050919050565b600061386782612c57565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561389a57613899613712565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613901602c83612ba7565b915061390c826138a5565b604082019050919050565b60006020820190508181036000830152613930816138f4565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613993602983612ba7565b915061399e82613937565b604082019050919050565b600060208201905081810360008301526139c281613986565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613a25602a83612ba7565b9150613a30826139c9565b604082019050919050565b60006020820190508181036000830152613a5481613a18565b9050919050565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b6000613a91601083612ba7565b9150613a9c82613a5b565b602082019050919050565b60006020820190508181036000830152613ac081613a84565b9050919050565b7f416d6f756e7420746f6f206c6f77000000000000000000000000000000000000600082015250565b6000613afd600e83612ba7565b9150613b0882613ac7565b602082019050919050565b60006020820190508181036000830152613b2c81613af0565b9050919050565b7f4d4158204f4e452054494d4520505552434841534520414d4f554e542045584360008201527f4545444544000000000000000000000000000000000000000000000000000000602082015250565b6000613b8f602583612ba7565b9150613b9a82613b33565b604082019050919050565b60006020820190508181036000830152613bbe81613b82565b9050919050565b6000613bd082612c57565b9150613bdb83612c57565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c1457613c13613712565b5b828202905092915050565b7f5368726f6f6d6965733a206e6f7420656e6f7567682070726963650000000000600082015250565b6000613c55601b83612ba7565b9150613c6082613c1f565b602082019050919050565b60006020820190508181036000830152613c8481613c48565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613cc1601983612ba7565b9150613ccc82613c8b565b602082019050919050565b60006020820190508181036000830152613cf081613cb4565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613d53602f83612ba7565b9150613d5e82613cf7565b604082019050919050565b60006020820190508181036000830152613d8281613d46565b9050919050565b600081905092915050565b6000613d9f82612b9c565b613da98185613d89565b9350613db9818560208601612bb8565b80840191505092915050565b6000613dd18285613d94565b9150613ddd8284613d94565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e45602683612ba7565b9150613e5082613de9565b604082019050919050565b60006020820190508181036000830152613e7481613e38565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ed7602c83612ba7565b9150613ee282613e7b565b604082019050919050565b60006020820190508181036000830152613f0681613eca565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613f69602983612ba7565b9150613f7482613f0d565b604082019050919050565b60006020820190508181036000830152613f9881613f5c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613ffb602483612ba7565b915061400682613f9f565b604082019050919050565b6000602082019050818103600083015261402a81613fee565b9050919050565b600061403c82612c57565b915061404783612c57565b92508282101561405a57614059613712565b5b828203905092915050565b60008160601b9050919050565b600061407d82614065565b9050919050565b600061408f82614072565b9050919050565b6140a76140a282612cda565b614084565b82525050565b6000819050919050565b6140c86140c382612c57565b6140ad565b82525050565b60006140da8287614096565b6014820191506140ea82866140b7565b6020820191506140fa82856140b7565b60208201915061410a82846140b7565b60208201915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061415682612c57565b915061416183612c57565b9250826141715761417061411c565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006141b2602083612ba7565b91506141bd8261417c565b602082019050919050565b600060208201905081810360008301526141e1816141a5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061421e601c83612ba7565b9150614229826141e8565b602082019050919050565b6000602082019050818103600083015261424d81614211565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006142b0603283612ba7565b91506142bb82614254565b604082019050919050565b600060208201905081810360008301526142df816142a3565b9050919050565b60006142f182612c57565b91506142fc83612c57565b92508261430c5761430b61411c565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b600061433e82614317565b6143488185614322565b9350614358818560208601612bb8565b61436181612beb565b840191505092915050565b60006080820190506143816000830187612cec565b61438e6020830186612cec565b61439b6040830185612ddb565b81810360608301526143ad8184614333565b905095945050505050565b6000815190506143c781612b0d565b92915050565b6000602082840312156143e3576143e2612ad7565b5b60006143f1848285016143b8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220034bc737d98099f87fb92e5aba0df3b6db8de19193fd41fee0446b75174d4ac764736f6c634300080900330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d61666763595856557a507976597a344a527144414462564646546f7a38714850476b7367647a4e70666b75542f000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80636352211e116100f7578063a035b1fe11610095578063c87b56dd11610064578063c87b56dd14610679578063e985e9c5146106b6578063f2fde38b146106f3578063f851a4401461071c576101cd565b8063a035b1fe146105e0578063a0712d681461060b578063a22cb46514610627578063b88d4fde14610650576101cd565b80637d4cb964116100d15780637d4cb964146105365780638da5cb5b1461056157806391b7f5ed1461058c57806395d89b41146105b5576101cd565b80636352211e146104a557806370a08231146104e2578063715018a61461051f576101cd565b80632f745c591161016f578063438b63001161013e578063438b6300146103d75780634f6ccce71461041457806355f804b3146104515780635c975abb1461047a576101cd565b80632f745c591461031d578063306ccc931461035a57806332c60eef1461038357806342842e0e146103ae576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806316c38b3c146102a057806318160ddd146102c957806323b872dd146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612b39565b610747565b6040516102069190612b81565b60405180910390f35b34801561021b57600080fd5b506102246107c1565b6040516102319190612c35565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612c8d565b610853565b60405161026e9190612cfb565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612d42565b6108d8565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612dae565b6109f0565b005b3480156102d557600080fd5b506102de610a89565b6040516102eb9190612dea565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612e05565b610a96565b005b34801561032957600080fd5b50610344600480360381019061033f9190612d42565b610af6565b6040516103519190612dea565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190612ebd565b610b9b565b005b34801561038f57600080fd5b50610398610cea565b6040516103a59190612f26565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190612e05565b610cef565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190612f41565b610d0f565b60405161040b919061302c565b60405180910390f35b34801561042057600080fd5b5061043b60048036038101906104369190612c8d565b610dbd565b6040516104489190612dea565b60405180910390f35b34801561045d57600080fd5b506104786004803603810190610473919061317e565b610e2e565b005b34801561048657600080fd5b5061048f610ec5565b60405161049c9190612b81565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190612c8d565b610ed8565b6040516104d99190612cfb565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612f41565b610f8a565b6040516105169190612dea565b60405180910390f35b34801561052b57600080fd5b50610534611042565b005b34801561054257600080fd5b5061054b6110ca565b6040516105589190612dea565b60405180910390f35b34801561056d57600080fd5b506105766110d0565b6040516105839190612cfb565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612c8d565b6110fa565b005b3480156105c157600080fd5b506105ca611180565b6040516105d79190612c35565b60405180910390f35b3480156105ec57600080fd5b506105f5611212565b6040516106029190612dea565b60405180910390f35b61062560048036038101906106209190612c8d565b611218565b005b34801561063357600080fd5b5061064e600480360381019061064991906131c7565b61144d565b005b34801561065c57600080fd5b50610677600480360381019061067291906132a8565b6115ce565b005b34801561068557600080fd5b506106a0600480360381019061069b9190612c8d565b611630565b6040516106ad9190612c35565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d8919061332b565b6116d7565b6040516106ea9190612b81565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190612f41565b61176b565b005b34801561072857600080fd5b50610731611863565b60405161073e9190612cfb565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ba57506107b982611889565b5b9050919050565b6060600080546107d09061339a565b80601f01602080910402602001604051908101604052809291908181526020018280546107fc9061339a565b80156108495780601f1061081e57610100808354040283529160200191610849565b820191906000526020600020905b81548152906001019060200180831161082c57829003601f168201915b5050505050905090565b600061085e8261196b565b61089d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108949061343e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e382610ed8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b906134d0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109736119d7565b73ffffffffffffffffffffffffffffffffffffffff1614806109a257506109a18161099c6119d7565b6116d7565b5b6109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d890613562565b60405180910390fd5b6109eb83836119df565b505050565b6109f86119d7565b73ffffffffffffffffffffffffffffffffffffffff16610a166110d0565b73ffffffffffffffffffffffffffffffffffffffff1614610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a63906135ce565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b610aa7610aa16119d7565b82611a98565b610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90613660565b60405180910390fd5b610af1838383611b76565b505050565b6000610b0183610f8a565b8210610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906136f2565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ba36119d7565b73ffffffffffffffffffffffffffffffffffffffff16610bc16110d0565b73ffffffffffffffffffffffffffffffffffffffff1614610c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0e906135ce565b60405180910390fd5b6000610c21610a89565b90506113888184849050610c359190613741565b1115610c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6d906137e3565b60405180910390fd5b60005b838390508160ff161015610ce457610cd184848360ff16818110610ca057610c9f613803565b5b9050602002016020810190610cb59190612f41565b610ccc8360ff1685610cc79190613741565b611dd2565b611f13565b8080610cdc90613832565b915050610c79565b50505050565b600a81565b610d0a838383604051806020016040528060008152506115ce565b505050565b60606000610d1c83610f8a565b905060008167ffffffffffffffff811115610d3a57610d39613053565b5b604051908082528060200260200182016040528015610d685781602001602082028036833780820191505090505b50905060005b82811015610db257610d808582610af6565b828281518110610d9357610d92613803565b5b6020026020010181815250508080610daa9061385c565b915050610d6e565b508092505050919050565b6000610dc7610a89565b8210610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90613917565b60405180910390fd5b60088281548110610e1c57610e1b613803565b5b90600052602060002001549050919050565b610e366119d7565b73ffffffffffffffffffffffffffffffffffffffff16610e546110d0565b73ffffffffffffffffffffffffffffffffffffffff1614610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea1906135ce565b60405180910390fd5b806113959080519060200190610ec1929190612a2a565b5050565b600c60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f78906139a9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff290613a3b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61104a6119d7565b73ffffffffffffffffffffffffffffffffffffffff166110686110d0565b73ffffffffffffffffffffffffffffffffffffffff16146110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b5906135ce565b60405180910390fd5b6110c860006120e1565b565b61138881565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111026119d7565b73ffffffffffffffffffffffffffffffffffffffff166111206110d0565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d906135ce565b60405180910390fd5b80600b8190555050565b60606001805461118f9061339a565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb9061339a565b80156112085780601f106111dd57610100808354040283529160200191611208565b820191906000526020600020905b8154815290600101906020018083116111eb57829003601f168201915b5050505050905090565b600b5481565b600c60009054906101000a900460ff1615611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90613aa7565b60405180910390fd5b600081116112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290613b13565b60405180910390fd5b600a60ff168111156112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990613ba5565b60405180910390fd5b60006112fc610a89565b9050611388818361130d9190613741565b111561134e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611345906137e3565b60405180910390fd5b81600b5461135c9190613bc5565b34101561139e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139590613c6b565b60405180910390fd5b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611406573d6000803e3d6000fd5b5060005b828160ff16101561144857611435336114308360ff168561142b9190613741565b611dd2565b611f13565b808061144090613832565b91505061140a565b505050565b6114556119d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90613cd7565b60405180910390fd5b80600560006114d06119d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661157d6119d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c29190612b81565b60405180910390a35050565b6115df6115d96119d7565b83611a98565b61161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590613660565b60405180910390fd5b61162a848484846121a7565b50505050565b606061163b8261196b565b61167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190613d69565b60405180910390fd5b6000611684612203565b905060008151116116a457604051806020016040528060008152506116cf565b806116ae84612296565b6040516020016116bf929190613dc5565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117736119d7565b73ffffffffffffffffffffffffffffffffffffffff166117916110d0565b73ffffffffffffffffffffffffffffffffffffffff16146117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de906135ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e90613e5b565b60405180910390fd5b611860816120e1565b50565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061195457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119645750611963826123f7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a5283610ed8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611aa38261196b565b611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990613eed565b60405180910390fd5b6000611aed83610ed8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b5c57508373ffffffffffffffffffffffffffffffffffffffff16611b4484610853565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b6d5750611b6c81856116d7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b9682610ed8565b73ffffffffffffffffffffffffffffffffffffffff1614611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be390613f7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390614011565b60405180910390fd5b611c67838383612461565b611c726000826119df565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc29190614031565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d199190613741565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082611388611de39190614031565b905060008133444285604051602001611dff94939291906140ce565b6040516020818303038152906040528051906020012060001c611e22919061414b565b9050600092506000600d826113888110611e3f57611e3e613803565b5b015414611e6457600d816113888110611e5b57611e5a613803565b5b01549250611e68565b8092505b6000600d600184611e799190614031565b6113888110611e8b57611e8a613803565b5b01541415611ebf57600182611ea09190614031565b600d826113888110611eb557611eb4613803565b5b0181905550611efd565b600d600183611ece9190614031565b6113888110611ee057611edf613803565b5b0154600d826113888110611ef757611ef6613803565b5b01819055505b600183611f0a9190613741565b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a906141c8565b60405180910390fd5b611f8c8161196b565b15611fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc390614234565b60405180910390fd5b611fd860008383612461565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120289190613741565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121b2848484611b76565b6121be84848484612575565b6121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f4906142c6565b60405180910390fd5b50505050565b606061139580546122139061339a565b80601f016020809104026020016040519081016040528092919081815260200182805461223f9061339a565b801561228c5780601f106122615761010080835404028352916020019161228c565b820191906000526020600020905b81548152906001019060200180831161226f57829003601f168201915b5050505050905090565b606060008214156122de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123f2565b600082905060005b600082146123105780806122f99061385c565b915050600a8261230991906142e6565b91506122e6565b60008167ffffffffffffffff81111561232c5761232b613053565b5b6040519080825280601f01601f19166020018201604052801561235e5781602001600182028036833780820191505090505b5090505b600085146123eb576001826123779190614031565b9150600a85612386919061414b565b60306123929190613741565b60f81b8183815181106123a8576123a7613803565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123e491906142e6565b9450612362565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61246c83838361270c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124af576124aa81612711565b6124ee565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124ed576124ec838261275a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125315761252c816128c7565b612570565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461256f5761256e8282612998565b5b5b505050565b60006125968473ffffffffffffffffffffffffffffffffffffffff16612a17565b156126ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125bf6119d7565b8786866040518563ffffffff1660e01b81526004016125e1949392919061436c565b602060405180830381600087803b1580156125fb57600080fd5b505af192505050801561262c57506040513d601f19601f8201168201806040525081019061262991906143cd565b60015b6126af573d806000811461265c576040519150601f19603f3d011682016040523d82523d6000602084013e612661565b606091505b506000815114156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e906142c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612704565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161276784610f8a565b6127719190614031565b9050600060076000848152602001908152602001600020549050818114612856576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128db9190614031565b905060006009600084815260200190815260200160002054905060006008838154811061290b5761290a613803565b5b90600052602060002001549050806008838154811061292d5761292c613803565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061297c5761297b6143fa565b5b6001900381819060005260206000200160009055905550505050565b60006129a383610f8a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612a369061339a565b90600052602060002090601f016020900481019282612a585760008555612a9f565b82601f10612a7157805160ff1916838001178555612a9f565b82800160010185558215612a9f579182015b82811115612a9e578251825591602001919060010190612a83565b5b509050612aac9190612ab0565b5090565b5b80821115612ac9576000816000905550600101612ab1565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b1681612ae1565b8114612b2157600080fd5b50565b600081359050612b3381612b0d565b92915050565b600060208284031215612b4f57612b4e612ad7565b5b6000612b5d84828501612b24565b91505092915050565b60008115159050919050565b612b7b81612b66565b82525050565b6000602082019050612b966000830184612b72565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bd6578082015181840152602081019050612bbb565b83811115612be5576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c0782612b9c565b612c118185612ba7565b9350612c21818560208601612bb8565b612c2a81612beb565b840191505092915050565b60006020820190508181036000830152612c4f8184612bfc565b905092915050565b6000819050919050565b612c6a81612c57565b8114612c7557600080fd5b50565b600081359050612c8781612c61565b92915050565b600060208284031215612ca357612ca2612ad7565b5b6000612cb184828501612c78565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ce582612cba565b9050919050565b612cf581612cda565b82525050565b6000602082019050612d106000830184612cec565b92915050565b612d1f81612cda565b8114612d2a57600080fd5b50565b600081359050612d3c81612d16565b92915050565b60008060408385031215612d5957612d58612ad7565b5b6000612d6785828601612d2d565b9250506020612d7885828601612c78565b9150509250929050565b612d8b81612b66565b8114612d9657600080fd5b50565b600081359050612da881612d82565b92915050565b600060208284031215612dc457612dc3612ad7565b5b6000612dd284828501612d99565b91505092915050565b612de481612c57565b82525050565b6000602082019050612dff6000830184612ddb565b92915050565b600080600060608486031215612e1e57612e1d612ad7565b5b6000612e2c86828701612d2d565b9350506020612e3d86828701612d2d565b9250506040612e4e86828701612c78565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612e7d57612e7c612e58565b5b8235905067ffffffffffffffff811115612e9a57612e99612e5d565b5b602083019150836020820283011115612eb657612eb5612e62565b5b9250929050565b60008060208385031215612ed457612ed3612ad7565b5b600083013567ffffffffffffffff811115612ef257612ef1612adc565b5b612efe85828601612e67565b92509250509250929050565b600060ff82169050919050565b612f2081612f0a565b82525050565b6000602082019050612f3b6000830184612f17565b92915050565b600060208284031215612f5757612f56612ad7565b5b6000612f6584828501612d2d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612fa381612c57565b82525050565b6000612fb58383612f9a565b60208301905092915050565b6000602082019050919050565b6000612fd982612f6e565b612fe38185612f79565b9350612fee83612f8a565b8060005b8381101561301f5781516130068882612fa9565b975061301183612fc1565b925050600181019050612ff2565b5085935050505092915050565b600060208201905081810360008301526130468184612fce565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61308b82612beb565b810181811067ffffffffffffffff821117156130aa576130a9613053565b5b80604052505050565b60006130bd612acd565b90506130c98282613082565b919050565b600067ffffffffffffffff8211156130e9576130e8613053565b5b6130f282612beb565b9050602081019050919050565b82818337600083830152505050565b600061312161311c846130ce565b6130b3565b90508281526020810184848401111561313d5761313c61304e565b5b6131488482856130ff565b509392505050565b600082601f83011261316557613164612e58565b5b813561317584826020860161310e565b91505092915050565b60006020828403121561319457613193612ad7565b5b600082013567ffffffffffffffff8111156131b2576131b1612adc565b5b6131be84828501613150565b91505092915050565b600080604083850312156131de576131dd612ad7565b5b60006131ec85828601612d2d565b92505060206131fd85828601612d99565b9150509250929050565b600067ffffffffffffffff82111561322257613221613053565b5b61322b82612beb565b9050602081019050919050565b600061324b61324684613207565b6130b3565b9050828152602081018484840111156132675761326661304e565b5b6132728482856130ff565b509392505050565b600082601f83011261328f5761328e612e58565b5b813561329f848260208601613238565b91505092915050565b600080600080608085870312156132c2576132c1612ad7565b5b60006132d087828801612d2d565b94505060206132e187828801612d2d565b93505060406132f287828801612c78565b925050606085013567ffffffffffffffff81111561331357613312612adc565b5b61331f8782880161327a565b91505092959194509250565b6000806040838503121561334257613341612ad7565b5b600061335085828601612d2d565b925050602061336185828601612d2d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133b257607f821691505b602082108114156133c6576133c561336b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613428602c83612ba7565b9150613433826133cc565b604082019050919050565b600060208201905081810360008301526134578161341b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134ba602183612ba7565b91506134c58261345e565b604082019050919050565b600060208201905081810360008301526134e9816134ad565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061354c603883612ba7565b9150613557826134f0565b604082019050919050565b6000602082019050818103600083015261357b8161353f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135b8602083612ba7565b91506135c382613582565b602082019050919050565b600060208201905081810360008301526135e7816135ab565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061364a603183612ba7565b9150613655826135ee565b604082019050919050565b600060208201905081810360008301526136798161363d565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006136dc602b83612ba7565b91506136e782613680565b604082019050919050565b6000602082019050818103600083015261370b816136cf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061374c82612c57565b915061375783612c57565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561378c5761378b613712565b5b828201905092915050565b7f416d6f756e742065786365656400000000000000000000000000000000000000600082015250565b60006137cd600d83612ba7565b91506137d882613797565b602082019050919050565b600060208201905081810360008301526137fc816137c0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061383d82612f0a565b915060ff82141561385157613850613712565b5b600182019050919050565b600061386782612c57565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561389a57613899613712565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613901602c83612ba7565b915061390c826138a5565b604082019050919050565b60006020820190508181036000830152613930816138f4565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613993602983612ba7565b915061399e82613937565b604082019050919050565b600060208201905081810360008301526139c281613986565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613a25602a83612ba7565b9150613a30826139c9565b604082019050919050565b60006020820190508181036000830152613a5481613a18565b9050919050565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b6000613a91601083612ba7565b9150613a9c82613a5b565b602082019050919050565b60006020820190508181036000830152613ac081613a84565b9050919050565b7f416d6f756e7420746f6f206c6f77000000000000000000000000000000000000600082015250565b6000613afd600e83612ba7565b9150613b0882613ac7565b602082019050919050565b60006020820190508181036000830152613b2c81613af0565b9050919050565b7f4d4158204f4e452054494d4520505552434841534520414d4f554e542045584360008201527f4545444544000000000000000000000000000000000000000000000000000000602082015250565b6000613b8f602583612ba7565b9150613b9a82613b33565b604082019050919050565b60006020820190508181036000830152613bbe81613b82565b9050919050565b6000613bd082612c57565b9150613bdb83612c57565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c1457613c13613712565b5b828202905092915050565b7f5368726f6f6d6965733a206e6f7420656e6f7567682070726963650000000000600082015250565b6000613c55601b83612ba7565b9150613c6082613c1f565b602082019050919050565b60006020820190508181036000830152613c8481613c48565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613cc1601983612ba7565b9150613ccc82613c8b565b602082019050919050565b60006020820190508181036000830152613cf081613cb4565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613d53602f83612ba7565b9150613d5e82613cf7565b604082019050919050565b60006020820190508181036000830152613d8281613d46565b9050919050565b600081905092915050565b6000613d9f82612b9c565b613da98185613d89565b9350613db9818560208601612bb8565b80840191505092915050565b6000613dd18285613d94565b9150613ddd8284613d94565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e45602683612ba7565b9150613e5082613de9565b604082019050919050565b60006020820190508181036000830152613e7481613e38565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ed7602c83612ba7565b9150613ee282613e7b565b604082019050919050565b60006020820190508181036000830152613f0681613eca565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613f69602983612ba7565b9150613f7482613f0d565b604082019050919050565b60006020820190508181036000830152613f9881613f5c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613ffb602483612ba7565b915061400682613f9f565b604082019050919050565b6000602082019050818103600083015261402a81613fee565b9050919050565b600061403c82612c57565b915061404783612c57565b92508282101561405a57614059613712565b5b828203905092915050565b60008160601b9050919050565b600061407d82614065565b9050919050565b600061408f82614072565b9050919050565b6140a76140a282612cda565b614084565b82525050565b6000819050919050565b6140c86140c382612c57565b6140ad565b82525050565b60006140da8287614096565b6014820191506140ea82866140b7565b6020820191506140fa82856140b7565b60208201915061410a82846140b7565b60208201915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061415682612c57565b915061416183612c57565b9250826141715761417061411c565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006141b2602083612ba7565b91506141bd8261417c565b602082019050919050565b600060208201905081810360008301526141e1816141a5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061421e601c83612ba7565b9150614229826141e8565b602082019050919050565b6000602082019050818103600083015261424d81614211565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006142b0603283612ba7565b91506142bb82614254565b604082019050919050565b600060208201905081810360008301526142df816142a3565b9050919050565b60006142f182612c57565b91506142fc83612c57565b92508261430c5761430b61411c565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b600061433e82614317565b6143488185614322565b9350614358818560208601612bb8565b61436181612beb565b840191505092915050565b60006080820190506143816000830187612cec565b61438e6020830186612cec565b61439b6040830185612ddb565b81810360608301526143ad8184614333565b905095945050505050565b6000815190506143c781612b0d565b92915050565b6000602082840312156143e3576143e2612ad7565b5b60006143f1848285016143b8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220034bc737d98099f87fb92e5aba0df3b6db8de19193fd41fee0446b75174d4ac764736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d61666763595856557a507976597a344a527144414462564646546f7a38714850476b7367647a4e70666b75542f000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://gateway.pinata.cloud/ipfs/QmafgcYXVUzPyvYz4JRqDADbVFFToz8qHPGksgdzNpfkuT/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d61666763595856557a507976597a344a527144414462564646546f7a
Arg [4] : 38714850476b7367647a4e70666b75542f000000000000000000000000000000
Deployed Bytecode Sourcemap
43175:3046:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34689:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22581:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24140:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23663:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46131:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35329:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25030:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34997:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45777:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43315:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25440:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45079:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35519:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45451:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43395:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22275:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22005:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42486:94;;;;;;;;;;;;;:::i;:::-;;43266:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41835:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45683:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22750:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43361:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44464:605;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24433:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25696:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22925:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24799:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42735:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43429:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34689:224;34791:4;34830:35;34815:50;;;:11;:50;;;;:90;;;;34869:36;34893:11;34869:23;:36::i;:::-;34815:90;34808:97;;34689:224;;;:::o;22581:100::-;22635:13;22668:5;22661:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22581:100;:::o;24140:221::-;24216:7;24244:16;24252:7;24244;:16::i;:::-;24236:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24329:15;:24;24345:7;24329:24;;;;;;;;;;;;;;;;;;;;;24322:31;;24140:221;;;:::o;23663:411::-;23744:13;23760:23;23775:7;23760:14;:23::i;:::-;23744:39;;23808:5;23802:11;;:2;:11;;;;23794:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23902:5;23886:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23911:37;23928:5;23935:12;:10;:12::i;:::-;23911:16;:37::i;:::-;23886:62;23864:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24045:21;24054:2;24058:7;24045:8;:21::i;:::-;23733:341;23663:411;;:::o;46131:87::-;42066:12;:10;:12::i;:::-;42055:23;;:7;:5;:7::i;:::-;:23;;;42047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46203:7:::1;46194:6;;:16;;;;;;;;;;;;;;;;;;46131:87:::0;:::o;35329:113::-;35390:7;35417:10;:17;;;;35410:24;;35329:113;:::o;25030:339::-;25225:41;25244:12;:10;:12::i;:::-;25258:7;25225:18;:41::i;:::-;25217:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25333:28;25343:4;25349:2;25353:7;25333:9;:28::i;:::-;25030:339;;;:::o;34997:256::-;35094:7;35130:23;35147:5;35130:16;:23::i;:::-;35122:5;:31;35114:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35219:12;:19;35232:5;35219:19;;;;;;;;;;;;;;;:26;35239:5;35219:26;;;;;;;;;;;;35212:33;;34997:256;;;;:::o;45777:346::-;42066:12;:10;:12::i;:::-;42055:23;;:7;:5;:7::i;:::-;:23;;;42047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45863:21:::1;45887:13;:11;:13::i;:::-;45863:37;;43304:4;45938:13;45919:9;;:16;;:32;;;;:::i;:::-;:47;;45911:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46000:7;45995:121;46017:9;;:16;;46013:1;:20;;;45995:121;;;46055:49;46061:9;;46071:1;46061:12;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46075:28;46101:1;46085:17;;:13;:17;;;;:::i;:::-;46075:9;:28::i;:::-;46055:5;:49::i;:::-;46035:3;;;;;:::i;:::-;;;;45995:121;;;;45852:271;45777:346:::0;;:::o;43315:39::-;43352:2;43315:39;:::o;25440:185::-;25578:39;25595:4;25601:2;25605:7;25578:39;;;;;;;;;;;;:16;:39::i;:::-;25440:185;;;:::o;45079:363::-;45139:16;45173:23;45199:17;45209:6;45199:9;:17::i;:::-;45173:43;;45227:25;45269:15;45255:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45227:58;;45301:9;45296:113;45316:15;45312:1;:19;45296:113;;;45367:30;45387:6;45395:1;45367:19;:30::i;:::-;45353:8;45362:1;45353:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;45333:3;;;;;:::i;:::-;;;;45296:113;;;;45426:8;45419:15;;;;45079:363;;;:::o;35519:233::-;35594:7;35630:30;:28;:30::i;:::-;35622:5;:38;35614:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35727:10;35738:5;35727:17;;;;;;;;:::i;:::-;;;;;;;;;;35720:24;;35519:233;;;:::o;45451:102::-;42066:12;:10;:12::i;:::-;42055:23;;:7;:5;:7::i;:::-;:23;;;42047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45538:7:::1;45522:13;:23;;;;;;;;;;;;:::i;:::-;;45451:102:::0;:::o;43395:25::-;;;;;;;;;;;;;:::o;22275:239::-;22347:7;22367:13;22383:7;:16;22391:7;22383:16;;;;;;;;;;;;;;;;;;;;;22367:32;;22435:1;22418:19;;:5;:19;;;;22410:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22501:5;22494:12;;;22275:239;;;:::o;22005:208::-;22077:7;22122:1;22105:19;;:5;:19;;;;22097:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22189:9;:16;22199:5;22189:16;;;;;;;;;;;;;;;;22182:23;;22005:208;;;:::o;42486:94::-;42066:12;:10;:12::i;:::-;42055:23;;:7;:5;:7::i;:::-;:23;;;42047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42551:21:::1;42569:1;42551:9;:21::i;:::-;42486:94::o:0;43266:42::-;43304:4;43266:42;:::o;41835:87::-;41881:7;41908:6;;;;;;;;;;;41901:13;;41835:87;:::o;45683:86::-;42066:12;:10;:12::i;:::-;42055:23;;:7;:5;:7::i;:::-;:23;;;42047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45755:6:::1;45747:5;:14;;;;45683:86:::0;:::o;22750:104::-;22806:13;22839:7;22832:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22750:104;:::o;43361:27::-;;;;:::o;44464:605::-;44537:6;;;;;;;;;;;44536:7;44528:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;44591:1;44583:7;:9;44575:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;43352:2;44630:23;;:7;:23;;44622:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44706:19;44728:13;:11;:13::i;:::-;44706:35;;43304:4;44770:11;44760:7;:21;;;;:::i;:::-;:36;;44752:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44854:7;44846:5;;:15;;;;:::i;:::-;44833:9;:28;;44825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44914:5;;;;;;;;;;;44906:23;;:46;44930:21;44906:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44970:7;44965:95;44987:7;44983:1;:11;;;44965:95;;;45015:45;45021:10;45033:26;45057:1;45043:15;;:11;:15;;;;:::i;:::-;45033:9;:26::i;:::-;45015:5;:45::i;:::-;44996:3;;;;;:::i;:::-;;;;44965:95;;;;44517:552;44464:605;:::o;24433:295::-;24548:12;:10;:12::i;:::-;24536:24;;:8;:24;;;;24528:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24648:8;24603:18;:32;24622:12;:10;:12::i;:::-;24603:32;;;;;;;;;;;;;;;:42;24636:8;24603:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24701:8;24672:48;;24687:12;:10;:12::i;:::-;24672:48;;;24711:8;24672:48;;;;;;:::i;:::-;;;;;;;;24433:295;;:::o;25696:328::-;25871:41;25890:12;:10;:12::i;:::-;25904:7;25871:18;:41::i;:::-;25863:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25977:39;25991:4;25997:2;26001:7;26010:5;25977:13;:39::i;:::-;25696:328;;;;:::o;22925:334::-;22998:13;23032:16;23040:7;23032;:16::i;:::-;23024:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23113:21;23137:10;:8;:10::i;:::-;23113:34;;23189:1;23171:7;23165:21;:25;:86;;;;;;;;;;;;;;;;;23217:7;23226:18;:7;:16;:18::i;:::-;23200:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23165:86;23158:93;;;22925:334;;;:::o;24799:164::-;24896:4;24920:18;:25;24939:5;24920:25;;;;;;;;;;;;;;;:35;24946:8;24920:35;;;;;;;;;;;;;;;;;;;;;;;;;24913:42;;24799:164;;;;:::o;42735:192::-;42066:12;:10;:12::i;:::-;42055:23;;:7;:5;:7::i;:::-;:23;;;42047:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42844:1:::1;42824:22;;:8;:22;;;;42816:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42900:19;42910:8;42900:9;:19::i;:::-;42735:192:::0;:::o;43429:65::-;;;;;;;;;;;;;:::o;21636:305::-;21738:4;21790:25;21775:40;;;:11;:40;;;;:105;;;;21847:33;21832:48;;;:11;:48;;;;21775:105;:158;;;;21897:36;21921:11;21897:23;:36::i;:::-;21775:158;21755:178;;21636:305;;;:::o;27534:127::-;27599:4;27651:1;27623:30;;:7;:16;27631:7;27623:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27616:37;;27534:127;;;:::o;20090:98::-;20143:7;20170:10;20163:17;;20090:98;:::o;31516:174::-;31618:2;31591:15;:24;31607:7;31591:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31674:7;31670:2;31636:46;;31645:23;31660:7;31645:14;:23::i;:::-;31636:46;;;;;;;;;;;;31516:174;;:::o;27828:348::-;27921:4;27946:16;27954:7;27946;:16::i;:::-;27938:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28022:13;28038:23;28053:7;28038:14;:23::i;:::-;28022:39;;28091:5;28080:16;;:7;:16;;;:51;;;;28124:7;28100:31;;:20;28112:7;28100:11;:20::i;:::-;:31;;;28080:51;:87;;;;28135:32;28152:5;28159:7;28135:16;:32::i;:::-;28080:87;28072:96;;;27828:348;;;;:::o;30820:578::-;30979:4;30952:31;;:23;30967:7;30952:14;:23::i;:::-;:31;;;30944:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31062:1;31048:16;;:2;:16;;;;31040:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31118:39;31139:4;31145:2;31149:7;31118:20;:39::i;:::-;31222:29;31239:1;31243:7;31222:8;:29::i;:::-;31283:1;31264:9;:15;31274:4;31264:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31312:1;31295:9;:13;31305:2;31295:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31343:2;31324:7;:16;31332:7;31324:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31382:7;31378:2;31363:27;;31372:4;31363:27;;;;;;;;;;;;30820:578;;;:::o;43712:743::-;43770:13;43796:17;43830:12;43304:4;43816:26;;;;:::i;:::-;43796:46;;43853:12;43965:9;43903:10;43915:16;43933:15;43950:9;43886:74;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43876:85;;;;;;43868:94;;:106;;;;:::i;:::-;43853:121;;43993:1;43985:9;;44109:1;44087:12;44100:4;44087:18;;;;;;;:::i;:::-;;;;:23;44083:109;;44133:12;44146:4;44133:18;;;;;;;:::i;:::-;;;;44125:26;;44083:109;;;44188:4;44180:12;;44083:109;44299:1;44268:12;44293:1;44281:9;:13;;;;:::i;:::-;44268:27;;;;;;;:::i;:::-;;;;:32;44264:162;;;44348:1;44336:9;:13;;;;:::i;:::-;44315:12;44328:4;44315:18;;;;;;;:::i;:::-;;;:34;;;;44264:162;;;44399:12;44424:1;44412:9;:13;;;;:::i;:::-;44399:27;;;;;;;:::i;:::-;;;;44378:12;44391:4;44378:18;;;;;;;:::i;:::-;;;:48;;;;44264:162;44446:1;44437:10;;;;;:::i;:::-;;;43785:670;;43712:743;;;:::o;29512:382::-;29606:1;29592:16;;:2;:16;;;;29584:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29665:16;29673:7;29665;:16::i;:::-;29664:17;29656:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29727:45;29756:1;29760:2;29764:7;29727:20;:45::i;:::-;29802:1;29785:9;:13;29795:2;29785:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29833:2;29814:7;:16;29822:7;29814:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29878:7;29874:2;29853:33;;29870:1;29853:33;;;;;;;;;;;;29512:382;;:::o;42935:173::-;42991:16;43010:6;;;;;;;;;;;42991:25;;43036:8;43027:6;;:17;;;;;;;;;;;;;;;;;;43091:8;43060:40;;43081:8;43060:40;;;;;;;;;;;;42980:128;42935:173;:::o;26906:315::-;27063:28;27073:4;27079:2;27083:7;27063:9;:28::i;:::-;27110:48;27133:4;27139:2;27143:7;27152:5;27110:22;:48::i;:::-;27102:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26906:315;;;;:::o;45561:114::-;45621:13;45654;45647:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45561:114;:::o;311:723::-;367:13;597:1;588:5;:10;584:53;;;615:10;;;;;;;;;;;;;;;;;;;;;584:53;647:12;662:5;647:20;;678:14;703:78;718:1;710:4;:9;703:78;;736:8;;;;;:::i;:::-;;;;767:2;759:10;;;;;:::i;:::-;;;703:78;;;791:19;823:6;813:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;791:39;;841:154;857:1;848:5;:10;841:154;;885:1;875:11;;;;;:::i;:::-;;;952:2;944:5;:10;;;;:::i;:::-;931:2;:24;;;;:::i;:::-;918:39;;901:6;908;901:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;841:154;;;1019:6;1005:21;;;;;311:723;;;;:::o;12776:157::-;12861:4;12900:25;12885:40;;;:11;:40;;;;12878:47;;12776:157;;;:::o;36365:589::-;36509:45;36536:4;36542:2;36546:7;36509:26;:45::i;:::-;36587:1;36571:18;;:4;:18;;;36567:187;;;36606:40;36638:7;36606:31;:40::i;:::-;36567:187;;;36676:2;36668:10;;:4;:10;;;36664:90;;36695:47;36728:4;36734:7;36695:32;:47::i;:::-;36664:90;36567:187;36782:1;36768:16;;:2;:16;;;36764:183;;;36801:45;36838:7;36801:36;:45::i;:::-;36764:183;;;36874:4;36868:10;;:2;:10;;;36864:83;;36895:40;36923:2;36927:7;36895:27;:40::i;:::-;36864:83;36764:183;36365:589;;;:::o;32255:799::-;32410:4;32431:15;:2;:13;;;:15::i;:::-;32427:620;;;32483:2;32467:36;;;32504:12;:10;:12::i;:::-;32518:4;32524:7;32533:5;32467:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32463:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32726:1;32709:6;:13;:18;32705:272;;;32752:60;;;;;;;;;;:::i;:::-;;;;;;;;32705:272;32927:6;32921:13;32912:6;32908:2;32904:15;32897:38;32463:529;32600:41;;;32590:51;;;:6;:51;;;;32583:58;;;;;32427:620;33031:4;33024:11;;32255:799;;;;;;;:::o;33626:126::-;;;;:::o;37677:164::-;37781:10;:17;;;;37754:15;:24;37770:7;37754:24;;;;;;;;;;;:44;;;;37809:10;37825:7;37809:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37677:164;:::o;38468:988::-;38734:22;38784:1;38759:22;38776:4;38759:16;:22::i;:::-;:26;;;;:::i;:::-;38734:51;;38796:18;38817:17;:26;38835:7;38817:26;;;;;;;;;;;;38796:47;;38964:14;38950:10;:28;38946:328;;38995:19;39017:12;:18;39030:4;39017:18;;;;;;;;;;;;;;;:34;39036:14;39017:34;;;;;;;;;;;;38995:56;;39101:11;39068:12;:18;39081:4;39068:18;;;;;;;;;;;;;;;:30;39087:10;39068:30;;;;;;;;;;;:44;;;;39218:10;39185:17;:30;39203:11;39185:30;;;;;;;;;;;:43;;;;38980:294;38946:328;39370:17;:26;39388:7;39370:26;;;;;;;;;;;39363:33;;;39414:12;:18;39427:4;39414:18;;;;;;;;;;;;;;;:34;39433:14;39414:34;;;;;;;;;;;39407:41;;;38549:907;;38468:988;;:::o;39751:1079::-;40004:22;40049:1;40029:10;:17;;;;:21;;;;:::i;:::-;40004:46;;40061:18;40082:15;:24;40098:7;40082:24;;;;;;;;;;;;40061:45;;40433:19;40455:10;40466:14;40455:26;;;;;;;;:::i;:::-;;;;;;;;;;40433:48;;40519:11;40494:10;40505;40494:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40630:10;40599:15;:28;40615:11;40599:28;;;;;;;;;;;:41;;;;40771:15;:24;40787:7;40771:24;;;;;;;;;;;40764:31;;;40806:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39822:1008;;;39751:1079;:::o;37255:221::-;37340:14;37357:20;37374:2;37357:16;:20::i;:::-;37340:37;;37415:7;37388:12;:16;37401:2;37388:16;;;;;;;;;;;;;;;:24;37405:6;37388:24;;;;;;;;;;;:34;;;;37462:6;37433:17;:26;37451:7;37433:26;;;;;;;;;;;:35;;;;37329:147;37255:221;;:::o;2836:387::-;2896:4;3104:12;3171:7;3159:20;3151:28;;3214:1;3207:4;:8;3200:15;;;2836:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:116::-;5008:21;5023:5;5008:21;:::i;:::-;5001:5;4998:32;4988:60;;5044:1;5041;5034:12;4988:60;4938:116;:::o;5060:133::-;5103:5;5141:6;5128:20;5119:29;;5157:30;5181:5;5157:30;:::i;:::-;5060:133;;;;:::o;5199:323::-;5255:6;5304:2;5292:9;5283:7;5279:23;5275:32;5272:119;;;5310:79;;:::i;:::-;5272:119;5430:1;5455:50;5497:7;5488:6;5477:9;5473:22;5455:50;:::i;:::-;5445:60;;5401:114;5199:323;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:117::-;6614:1;6611;6604:12;6628:117;6737:1;6734;6727:12;6751:117;6860:1;6857;6850:12;6891:568;6964:8;6974:6;7024:3;7017:4;7009:6;7005:17;7001:27;6991:122;;7032:79;;:::i;:::-;6991:122;7145:6;7132:20;7122:30;;7175:18;7167:6;7164:30;7161:117;;;7197:79;;:::i;:::-;7161:117;7311:4;7303:6;7299:17;7287:29;;7365:3;7357:4;7349:6;7345:17;7335:8;7331:32;7328:41;7325:128;;;7372:79;;:::i;:::-;7325:128;6891:568;;;;;:::o;7465:559::-;7551:6;7559;7608:2;7596:9;7587:7;7583:23;7579:32;7576:119;;;7614:79;;:::i;:::-;7576:119;7762:1;7751:9;7747:17;7734:31;7792:18;7784:6;7781:30;7778:117;;;7814:79;;:::i;:::-;7778:117;7927:80;7999:7;7990:6;7979:9;7975:22;7927:80;:::i;:::-;7909:98;;;;7705:312;7465:559;;;;;:::o;8030:86::-;8065:7;8105:4;8098:5;8094:16;8083:27;;8030:86;;;:::o;8122:112::-;8205:22;8221:5;8205:22;:::i;:::-;8200:3;8193:35;8122:112;;:::o;8240:214::-;8329:4;8367:2;8356:9;8352:18;8344:26;;8380:67;8444:1;8433:9;8429:17;8420:6;8380:67;:::i;:::-;8240:214;;;;:::o;8460:329::-;8519:6;8568:2;8556:9;8547:7;8543:23;8539:32;8536:119;;;8574:79;;:::i;:::-;8536:119;8694:1;8719:53;8764:7;8755:6;8744:9;8740:22;8719:53;:::i;:::-;8709:63;;8665:117;8460:329;;;;:::o;8795:114::-;8862:6;8896:5;8890:12;8880:22;;8795:114;;;:::o;8915:184::-;9014:11;9048:6;9043:3;9036:19;9088:4;9083:3;9079:14;9064:29;;8915:184;;;;:::o;9105:132::-;9172:4;9195:3;9187:11;;9225:4;9220:3;9216:14;9208:22;;9105:132;;;:::o;9243:108::-;9320:24;9338:5;9320:24;:::i;:::-;9315:3;9308:37;9243:108;;:::o;9357:179::-;9426:10;9447:46;9489:3;9481:6;9447:46;:::i;:::-;9525:4;9520:3;9516:14;9502:28;;9357:179;;;;:::o;9542:113::-;9612:4;9644;9639:3;9635:14;9627:22;;9542:113;;;:::o;9691:732::-;9810:3;9839:54;9887:5;9839:54;:::i;:::-;9909:86;9988:6;9983:3;9909:86;:::i;:::-;9902:93;;10019:56;10069:5;10019:56;:::i;:::-;10098:7;10129:1;10114:284;10139:6;10136:1;10133:13;10114:284;;;10215:6;10209:13;10242:63;10301:3;10286:13;10242:63;:::i;:::-;10235:70;;10328:60;10381:6;10328:60;:::i;:::-;10318:70;;10174:224;10161:1;10158;10154:9;10149:14;;10114:284;;;10118:14;10414:3;10407:10;;9815:608;;;9691:732;;;;:::o;10429:373::-;10572:4;10610:2;10599:9;10595:18;10587:26;;10659:9;10653:4;10649:20;10645:1;10634:9;10630:17;10623:47;10687:108;10790:4;10781:6;10687:108;:::i;:::-;10679:116;;10429:373;;;;:::o;10808:117::-;10917:1;10914;10907:12;10931:180;10979:77;10976:1;10969:88;11076:4;11073:1;11066:15;11100:4;11097:1;11090:15;11117:281;11200:27;11222:4;11200:27;:::i;:::-;11192:6;11188:40;11330:6;11318:10;11315:22;11294:18;11282:10;11279:34;11276:62;11273:88;;;11341:18;;:::i;:::-;11273:88;11381:10;11377:2;11370:22;11160:238;11117:281;;:::o;11404:129::-;11438:6;11465:20;;:::i;:::-;11455:30;;11494:33;11522:4;11514:6;11494:33;:::i;:::-;11404:129;;;:::o;11539:308::-;11601:4;11691:18;11683:6;11680:30;11677:56;;;11713:18;;:::i;:::-;11677:56;11751:29;11773:6;11751:29;:::i;:::-;11743:37;;11835:4;11829;11825:15;11817:23;;11539:308;;;:::o;11853:154::-;11937:6;11932:3;11927;11914:30;11999:1;11990:6;11985:3;11981:16;11974:27;11853:154;;;:::o;12013:412::-;12091:5;12116:66;12132:49;12174:6;12132:49;:::i;:::-;12116:66;:::i;:::-;12107:75;;12205:6;12198:5;12191:21;12243:4;12236:5;12232:16;12281:3;12272:6;12267:3;12263:16;12260:25;12257:112;;;12288:79;;:::i;:::-;12257:112;12378:41;12412:6;12407:3;12402;12378:41;:::i;:::-;12097:328;12013:412;;;;;:::o;12445:340::-;12501:5;12550:3;12543:4;12535:6;12531:17;12527:27;12517:122;;12558:79;;:::i;:::-;12517:122;12675:6;12662:20;12700:79;12775:3;12767:6;12760:4;12752:6;12748:17;12700:79;:::i;:::-;12691:88;;12507:278;12445:340;;;;:::o;12791:509::-;12860:6;12909:2;12897:9;12888:7;12884:23;12880:32;12877:119;;;12915:79;;:::i;:::-;12877:119;13063:1;13052:9;13048:17;13035:31;13093:18;13085:6;13082:30;13079:117;;;13115:79;;:::i;:::-;13079:117;13220:63;13275:7;13266:6;13255:9;13251:22;13220:63;:::i;:::-;13210:73;;13006:287;12791:509;;;;:::o;13306:468::-;13371:6;13379;13428:2;13416:9;13407:7;13403:23;13399:32;13396:119;;;13434:79;;:::i;:::-;13396:119;13554:1;13579:53;13624:7;13615:6;13604:9;13600:22;13579:53;:::i;:::-;13569:63;;13525:117;13681:2;13707:50;13749:7;13740:6;13729:9;13725:22;13707:50;:::i;:::-;13697:60;;13652:115;13306:468;;;;;:::o;13780:307::-;13841:4;13931:18;13923:6;13920:30;13917:56;;;13953:18;;:::i;:::-;13917:56;13991:29;14013:6;13991:29;:::i;:::-;13983:37;;14075:4;14069;14065:15;14057:23;;13780:307;;;:::o;14093:410::-;14170:5;14195:65;14211:48;14252:6;14211:48;:::i;:::-;14195:65;:::i;:::-;14186:74;;14283:6;14276:5;14269:21;14321:4;14314:5;14310:16;14359:3;14350:6;14345:3;14341:16;14338:25;14335:112;;;14366:79;;:::i;:::-;14335:112;14456:41;14490:6;14485:3;14480;14456:41;:::i;:::-;14176:327;14093:410;;;;;:::o;14522:338::-;14577:5;14626:3;14619:4;14611:6;14607:17;14603:27;14593:122;;14634:79;;:::i;:::-;14593:122;14751:6;14738:20;14776:78;14850:3;14842:6;14835:4;14827:6;14823:17;14776:78;:::i;:::-;14767:87;;14583:277;14522:338;;;;:::o;14866:943::-;14961:6;14969;14977;14985;15034:3;15022:9;15013:7;15009:23;15005:33;15002:120;;;15041:79;;:::i;:::-;15002:120;15161:1;15186:53;15231:7;15222:6;15211:9;15207:22;15186:53;:::i;:::-;15176:63;;15132:117;15288:2;15314:53;15359:7;15350:6;15339:9;15335:22;15314:53;:::i;:::-;15304:63;;15259:118;15416:2;15442:53;15487:7;15478:6;15467:9;15463:22;15442:53;:::i;:::-;15432:63;;15387:118;15572:2;15561:9;15557:18;15544:32;15603:18;15595:6;15592:30;15589:117;;;15625:79;;:::i;:::-;15589:117;15730:62;15784:7;15775:6;15764:9;15760:22;15730:62;:::i;:::-;15720:72;;15515:287;14866:943;;;;;;;:::o;15815:474::-;15883:6;15891;15940:2;15928:9;15919:7;15915:23;15911:32;15908:119;;;15946:79;;:::i;:::-;15908:119;16066:1;16091:53;16136:7;16127:6;16116:9;16112:22;16091:53;:::i;:::-;16081:63;;16037:117;16193:2;16219:53;16264:7;16255:6;16244:9;16240:22;16219:53;:::i;:::-;16209:63;;16164:118;15815:474;;;;;:::o;16295:180::-;16343:77;16340:1;16333:88;16440:4;16437:1;16430:15;16464:4;16461:1;16454:15;16481:320;16525:6;16562:1;16556:4;16552:12;16542:22;;16609:1;16603:4;16599:12;16630:18;16620:81;;16686:4;16678:6;16674:17;16664:27;;16620:81;16748:2;16740:6;16737:14;16717:18;16714:38;16711:84;;;16767:18;;:::i;:::-;16711:84;16532:269;16481:320;;;:::o;16807:231::-;16947:34;16943:1;16935:6;16931:14;16924:58;17016:14;17011:2;17003:6;16999:15;16992:39;16807:231;:::o;17044:366::-;17186:3;17207:67;17271:2;17266:3;17207:67;:::i;:::-;17200:74;;17283:93;17372:3;17283:93;:::i;:::-;17401:2;17396:3;17392:12;17385:19;;17044:366;;;:::o;17416:419::-;17582:4;17620:2;17609:9;17605:18;17597:26;;17669:9;17663:4;17659:20;17655:1;17644:9;17640:17;17633:47;17697:131;17823:4;17697:131;:::i;:::-;17689:139;;17416:419;;;:::o;17841:220::-;17981:34;17977:1;17969:6;17965:14;17958:58;18050:3;18045:2;18037:6;18033:15;18026:28;17841:220;:::o;18067:366::-;18209:3;18230:67;18294:2;18289:3;18230:67;:::i;:::-;18223:74;;18306:93;18395:3;18306:93;:::i;:::-;18424:2;18419:3;18415:12;18408:19;;18067:366;;;:::o;18439:419::-;18605:4;18643:2;18632:9;18628:18;18620:26;;18692:9;18686:4;18682:20;18678:1;18667:9;18663:17;18656:47;18720:131;18846:4;18720:131;:::i;:::-;18712:139;;18439:419;;;:::o;18864:243::-;19004:34;19000:1;18992:6;18988:14;18981:58;19073:26;19068:2;19060:6;19056:15;19049:51;18864:243;:::o;19113:366::-;19255:3;19276:67;19340:2;19335:3;19276:67;:::i;:::-;19269:74;;19352:93;19441:3;19352:93;:::i;:::-;19470:2;19465:3;19461:12;19454:19;;19113:366;;;:::o;19485:419::-;19651:4;19689:2;19678:9;19674:18;19666:26;;19738:9;19732:4;19728:20;19724:1;19713:9;19709:17;19702:47;19766:131;19892:4;19766:131;:::i;:::-;19758:139;;19485:419;;;:::o;19910:182::-;20050:34;20046:1;20038:6;20034:14;20027:58;19910:182;:::o;20098:366::-;20240:3;20261:67;20325:2;20320:3;20261:67;:::i;:::-;20254:74;;20337:93;20426:3;20337:93;:::i;:::-;20455:2;20450:3;20446:12;20439:19;;20098:366;;;:::o;20470:419::-;20636:4;20674:2;20663:9;20659:18;20651:26;;20723:9;20717:4;20713:20;20709:1;20698:9;20694:17;20687:47;20751:131;20877:4;20751:131;:::i;:::-;20743:139;;20470:419;;;:::o;20895:236::-;21035:34;21031:1;21023:6;21019:14;21012:58;21104:19;21099:2;21091:6;21087:15;21080:44;20895:236;:::o;21137:366::-;21279:3;21300:67;21364:2;21359:3;21300:67;:::i;:::-;21293:74;;21376:93;21465:3;21376:93;:::i;:::-;21494:2;21489:3;21485:12;21478:19;;21137:366;;;:::o;21509:419::-;21675:4;21713:2;21702:9;21698:18;21690:26;;21762:9;21756:4;21752:20;21748:1;21737:9;21733:17;21726:47;21790:131;21916:4;21790:131;:::i;:::-;21782:139;;21509:419;;;:::o;21934:230::-;22074:34;22070:1;22062:6;22058:14;22051:58;22143:13;22138:2;22130:6;22126:15;22119:38;21934:230;:::o;22170:366::-;22312:3;22333:67;22397:2;22392:3;22333:67;:::i;:::-;22326:74;;22409:93;22498:3;22409:93;:::i;:::-;22527:2;22522:3;22518:12;22511:19;;22170:366;;;:::o;22542:419::-;22708:4;22746:2;22735:9;22731:18;22723:26;;22795:9;22789:4;22785:20;22781:1;22770:9;22766:17;22759:47;22823:131;22949:4;22823:131;:::i;:::-;22815:139;;22542:419;;;:::o;22967:180::-;23015:77;23012:1;23005:88;23112:4;23109:1;23102:15;23136:4;23133:1;23126:15;23153:305;23193:3;23212:20;23230:1;23212:20;:::i;:::-;23207:25;;23246:20;23264:1;23246:20;:::i;:::-;23241:25;;23400:1;23332:66;23328:74;23325:1;23322:81;23319:107;;;23406:18;;:::i;:::-;23319:107;23450:1;23447;23443:9;23436:16;;23153:305;;;;:::o;23464:163::-;23604:15;23600:1;23592:6;23588:14;23581:39;23464:163;:::o;23633:366::-;23775:3;23796:67;23860:2;23855:3;23796:67;:::i;:::-;23789:74;;23872:93;23961:3;23872:93;:::i;:::-;23990:2;23985:3;23981:12;23974:19;;23633:366;;;:::o;24005:419::-;24171:4;24209:2;24198:9;24194:18;24186:26;;24258:9;24252:4;24248:20;24244:1;24233:9;24229:17;24222:47;24286:131;24412:4;24286:131;:::i;:::-;24278:139;;24005:419;;;:::o;24430:180::-;24478:77;24475:1;24468:88;24575:4;24572:1;24565:15;24599:4;24596:1;24589:15;24616:167;24653:3;24676:22;24692:5;24676:22;:::i;:::-;24667:31;;24720:4;24713:5;24710:15;24707:41;;;24728:18;;:::i;:::-;24707:41;24775:1;24768:5;24764:13;24757:20;;24616:167;;;:::o;24789:233::-;24828:3;24851:24;24869:5;24851:24;:::i;:::-;24842:33;;24897:66;24890:5;24887:77;24884:103;;;24967:18;;:::i;:::-;24884:103;25014:1;25007:5;25003:13;24996:20;;24789:233;;;:::o;25028:231::-;25168:34;25164:1;25156:6;25152:14;25145:58;25237:14;25232:2;25224:6;25220:15;25213:39;25028:231;:::o;25265:366::-;25407:3;25428:67;25492:2;25487:3;25428:67;:::i;:::-;25421:74;;25504:93;25593:3;25504:93;:::i;:::-;25622:2;25617:3;25613:12;25606:19;;25265:366;;;:::o;25637:419::-;25803:4;25841:2;25830:9;25826:18;25818:26;;25890:9;25884:4;25880:20;25876:1;25865:9;25861:17;25854:47;25918:131;26044:4;25918:131;:::i;:::-;25910:139;;25637:419;;;:::o;26062:228::-;26202:34;26198:1;26190:6;26186:14;26179:58;26271:11;26266:2;26258:6;26254:15;26247:36;26062:228;:::o;26296:366::-;26438:3;26459:67;26523:2;26518:3;26459:67;:::i;:::-;26452:74;;26535:93;26624:3;26535:93;:::i;:::-;26653:2;26648:3;26644:12;26637:19;;26296:366;;;:::o;26668:419::-;26834:4;26872:2;26861:9;26857:18;26849:26;;26921:9;26915:4;26911:20;26907:1;26896:9;26892:17;26885:47;26949:131;27075:4;26949:131;:::i;:::-;26941:139;;26668:419;;;:::o;27093:229::-;27233:34;27229:1;27221:6;27217:14;27210:58;27302:12;27297:2;27289:6;27285:15;27278:37;27093:229;:::o;27328:366::-;27470:3;27491:67;27555:2;27550:3;27491:67;:::i;:::-;27484:74;;27567:93;27656:3;27567:93;:::i;:::-;27685:2;27680:3;27676:12;27669:19;;27328:366;;;:::o;27700:419::-;27866:4;27904:2;27893:9;27889:18;27881:26;;27953:9;27947:4;27943:20;27939:1;27928:9;27924:17;27917:47;27981:131;28107:4;27981:131;:::i;:::-;27973:139;;27700:419;;;:::o;28125:166::-;28265:18;28261:1;28253:6;28249:14;28242:42;28125:166;:::o;28297:366::-;28439:3;28460:67;28524:2;28519:3;28460:67;:::i;:::-;28453:74;;28536:93;28625:3;28536:93;:::i;:::-;28654:2;28649:3;28645:12;28638:19;;28297:366;;;:::o;28669:419::-;28835:4;28873:2;28862:9;28858:18;28850:26;;28922:9;28916:4;28912:20;28908:1;28897:9;28893:17;28886:47;28950:131;29076:4;28950:131;:::i;:::-;28942:139;;28669:419;;;:::o;29094:164::-;29234:16;29230:1;29222:6;29218:14;29211:40;29094:164;:::o;29264:366::-;29406:3;29427:67;29491:2;29486:3;29427:67;:::i;:::-;29420:74;;29503:93;29592:3;29503:93;:::i;:::-;29621:2;29616:3;29612:12;29605:19;;29264:366;;;:::o;29636:419::-;29802:4;29840:2;29829:9;29825:18;29817:26;;29889:9;29883:4;29879:20;29875:1;29864:9;29860:17;29853:47;29917:131;30043:4;29917:131;:::i;:::-;29909:139;;29636:419;;;:::o;30061:224::-;30201:34;30197:1;30189:6;30185:14;30178:58;30270:7;30265:2;30257:6;30253:15;30246:32;30061:224;:::o;30291:366::-;30433:3;30454:67;30518:2;30513:3;30454:67;:::i;:::-;30447:74;;30530:93;30619:3;30530:93;:::i;:::-;30648:2;30643:3;30639:12;30632:19;;30291:366;;;:::o;30663:419::-;30829:4;30867:2;30856:9;30852:18;30844:26;;30916:9;30910:4;30906:20;30902:1;30891:9;30887:17;30880:47;30944:131;31070:4;30944:131;:::i;:::-;30936:139;;30663:419;;;:::o;31088:348::-;31128:7;31151:20;31169:1;31151:20;:::i;:::-;31146:25;;31185:20;31203:1;31185:20;:::i;:::-;31180:25;;31373:1;31305:66;31301:74;31298:1;31295:81;31290:1;31283:9;31276:17;31272:105;31269:131;;;31380:18;;:::i;:::-;31269:131;31428:1;31425;31421:9;31410:20;;31088:348;;;;:::o;31442:177::-;31582:29;31578:1;31570:6;31566:14;31559:53;31442:177;:::o;31625:366::-;31767:3;31788:67;31852:2;31847:3;31788:67;:::i;:::-;31781:74;;31864:93;31953:3;31864:93;:::i;:::-;31982:2;31977:3;31973:12;31966:19;;31625:366;;;:::o;31997:419::-;32163:4;32201:2;32190:9;32186:18;32178:26;;32250:9;32244:4;32240:20;32236:1;32225:9;32221:17;32214:47;32278:131;32404:4;32278:131;:::i;:::-;32270:139;;31997:419;;;:::o;32422:175::-;32562:27;32558:1;32550:6;32546:14;32539:51;32422:175;:::o;32603:366::-;32745:3;32766:67;32830:2;32825:3;32766:67;:::i;:::-;32759:74;;32842:93;32931:3;32842:93;:::i;:::-;32960:2;32955:3;32951:12;32944:19;;32603:366;;;:::o;32975:419::-;33141:4;33179:2;33168:9;33164:18;33156:26;;33228:9;33222:4;33218:20;33214:1;33203:9;33199:17;33192:47;33256:131;33382:4;33256:131;:::i;:::-;33248:139;;32975:419;;;:::o;33400:234::-;33540:34;33536:1;33528:6;33524:14;33517:58;33609:17;33604:2;33596:6;33592:15;33585:42;33400:234;:::o;33640:366::-;33782:3;33803:67;33867:2;33862:3;33803:67;:::i;:::-;33796:74;;33879:93;33968:3;33879:93;:::i;:::-;33997:2;33992:3;33988:12;33981:19;;33640:366;;;:::o;34012:419::-;34178:4;34216:2;34205:9;34201:18;34193:26;;34265:9;34259:4;34255:20;34251:1;34240:9;34236:17;34229:47;34293:131;34419:4;34293:131;:::i;:::-;34285:139;;34012:419;;;:::o;34437:148::-;34539:11;34576:3;34561:18;;34437:148;;;;:::o;34591:377::-;34697:3;34725:39;34758:5;34725:39;:::i;:::-;34780:89;34862:6;34857:3;34780:89;:::i;:::-;34773:96;;34878:52;34923:6;34918:3;34911:4;34904:5;34900:16;34878:52;:::i;:::-;34955:6;34950:3;34946:16;34939:23;;34701:267;34591:377;;;;:::o;34974:435::-;35154:3;35176:95;35267:3;35258:6;35176:95;:::i;:::-;35169:102;;35288:95;35379:3;35370:6;35288:95;:::i;:::-;35281:102;;35400:3;35393:10;;34974:435;;;;;:::o;35415:225::-;35555:34;35551:1;35543:6;35539:14;35532:58;35624:8;35619:2;35611:6;35607:15;35600:33;35415:225;:::o;35646:366::-;35788:3;35809:67;35873:2;35868:3;35809:67;:::i;:::-;35802:74;;35885:93;35974:3;35885:93;:::i;:::-;36003:2;35998:3;35994:12;35987:19;;35646:366;;;:::o;36018:419::-;36184:4;36222:2;36211:9;36207:18;36199:26;;36271:9;36265:4;36261:20;36257:1;36246:9;36242:17;36235:47;36299:131;36425:4;36299:131;:::i;:::-;36291:139;;36018:419;;;:::o;36443:231::-;36583:34;36579:1;36571:6;36567:14;36560:58;36652:14;36647:2;36639:6;36635:15;36628:39;36443:231;:::o;36680:366::-;36822:3;36843:67;36907:2;36902:3;36843:67;:::i;:::-;36836:74;;36919:93;37008:3;36919:93;:::i;:::-;37037:2;37032:3;37028:12;37021:19;;36680:366;;;:::o;37052:419::-;37218:4;37256:2;37245:9;37241:18;37233:26;;37305:9;37299:4;37295:20;37291:1;37280:9;37276:17;37269:47;37333:131;37459:4;37333:131;:::i;:::-;37325:139;;37052:419;;;:::o;37477:228::-;37617:34;37613:1;37605:6;37601:14;37594:58;37686:11;37681:2;37673:6;37669:15;37662:36;37477:228;:::o;37711:366::-;37853:3;37874:67;37938:2;37933:3;37874:67;:::i;:::-;37867:74;;37950:93;38039:3;37950:93;:::i;:::-;38068:2;38063:3;38059:12;38052:19;;37711:366;;;:::o;38083:419::-;38249:4;38287:2;38276:9;38272:18;38264:26;;38336:9;38330:4;38326:20;38322:1;38311:9;38307:17;38300:47;38364:131;38490:4;38364:131;:::i;:::-;38356:139;;38083:419;;;:::o;38508:223::-;38648:34;38644:1;38636:6;38632:14;38625:58;38717:6;38712:2;38704:6;38700:15;38693:31;38508:223;:::o;38737:366::-;38879:3;38900:67;38964:2;38959:3;38900:67;:::i;:::-;38893:74;;38976:93;39065:3;38976:93;:::i;:::-;39094:2;39089:3;39085:12;39078:19;;38737:366;;;:::o;39109:419::-;39275:4;39313:2;39302:9;39298:18;39290:26;;39362:9;39356:4;39352:20;39348:1;39337:9;39333:17;39326:47;39390:131;39516:4;39390:131;:::i;:::-;39382:139;;39109:419;;;:::o;39534:191::-;39574:4;39594:20;39612:1;39594:20;:::i;:::-;39589:25;;39628:20;39646:1;39628:20;:::i;:::-;39623:25;;39667:1;39664;39661:8;39658:34;;;39672:18;;:::i;:::-;39658:34;39717:1;39714;39710:9;39702:17;;39534:191;;;;:::o;39731:94::-;39764:8;39812:5;39808:2;39804:14;39783:35;;39731:94;;;:::o;39831:::-;39870:7;39899:20;39913:5;39899:20;:::i;:::-;39888:31;;39831:94;;;:::o;39931:100::-;39970:7;39999:26;40019:5;39999:26;:::i;:::-;39988:37;;39931:100;;;:::o;40037:157::-;40142:45;40162:24;40180:5;40162:24;:::i;:::-;40142:45;:::i;:::-;40137:3;40130:58;40037:157;;:::o;40200:79::-;40239:7;40268:5;40257:16;;40200:79;;;:::o;40285:157::-;40390:45;40410:24;40428:5;40410:24;:::i;:::-;40390:45;:::i;:::-;40385:3;40378:58;40285:157;;:::o;40448:679::-;40644:3;40659:75;40730:3;40721:6;40659:75;:::i;:::-;40759:2;40754:3;40750:12;40743:19;;40772:75;40843:3;40834:6;40772:75;:::i;:::-;40872:2;40867:3;40863:12;40856:19;;40885:75;40956:3;40947:6;40885:75;:::i;:::-;40985:2;40980:3;40976:12;40969:19;;40998:75;41069:3;41060:6;40998:75;:::i;:::-;41098:2;41093:3;41089:12;41082:19;;41118:3;41111:10;;40448:679;;;;;;;:::o;41133:180::-;41181:77;41178:1;41171:88;41278:4;41275:1;41268:15;41302:4;41299:1;41292:15;41319:176;41351:1;41368:20;41386:1;41368:20;:::i;:::-;41363:25;;41402:20;41420:1;41402:20;:::i;:::-;41397:25;;41441:1;41431:35;;41446:18;;:::i;:::-;41431:35;41487:1;41484;41480:9;41475:14;;41319:176;;;;:::o;41501:182::-;41641:34;41637:1;41629:6;41625:14;41618:58;41501:182;:::o;41689:366::-;41831:3;41852:67;41916:2;41911:3;41852:67;:::i;:::-;41845:74;;41928:93;42017:3;41928:93;:::i;:::-;42046:2;42041:3;42037:12;42030:19;;41689:366;;;:::o;42061:419::-;42227:4;42265:2;42254:9;42250:18;42242:26;;42314:9;42308:4;42304:20;42300:1;42289:9;42285:17;42278:47;42342:131;42468:4;42342:131;:::i;:::-;42334:139;;42061:419;;;:::o;42486:178::-;42626:30;42622:1;42614:6;42610:14;42603:54;42486:178;:::o;42670:366::-;42812:3;42833:67;42897:2;42892:3;42833:67;:::i;:::-;42826:74;;42909:93;42998:3;42909:93;:::i;:::-;43027:2;43022:3;43018:12;43011:19;;42670:366;;;:::o;43042:419::-;43208:4;43246:2;43235:9;43231:18;43223:26;;43295:9;43289:4;43285:20;43281:1;43270:9;43266:17;43259:47;43323:131;43449:4;43323:131;:::i;:::-;43315:139;;43042:419;;;:::o;43467:237::-;43607:34;43603:1;43595:6;43591:14;43584:58;43676:20;43671:2;43663:6;43659:15;43652:45;43467:237;:::o;43710:366::-;43852:3;43873:67;43937:2;43932:3;43873:67;:::i;:::-;43866:74;;43949:93;44038:3;43949:93;:::i;:::-;44067:2;44062:3;44058:12;44051:19;;43710:366;;;:::o;44082:419::-;44248:4;44286:2;44275:9;44271:18;44263:26;;44335:9;44329:4;44325:20;44321:1;44310:9;44306:17;44299:47;44363:131;44489:4;44363:131;:::i;:::-;44355:139;;44082:419;;;:::o;44507:185::-;44547:1;44564:20;44582:1;44564:20;:::i;:::-;44559:25;;44598:20;44616:1;44598:20;:::i;:::-;44593:25;;44637:1;44627:35;;44642:18;;:::i;:::-;44627:35;44684:1;44681;44677:9;44672:14;;44507:185;;;;:::o;44698:98::-;44749:6;44783:5;44777:12;44767:22;;44698:98;;;:::o;44802:168::-;44885:11;44919:6;44914:3;44907:19;44959:4;44954:3;44950:14;44935:29;;44802:168;;;;:::o;44976:360::-;45062:3;45090:38;45122:5;45090:38;:::i;:::-;45144:70;45207:6;45202:3;45144:70;:::i;:::-;45137:77;;45223:52;45268:6;45263:3;45256:4;45249:5;45245:16;45223:52;:::i;:::-;45300:29;45322:6;45300:29;:::i;:::-;45295:3;45291:39;45284:46;;45066:270;44976:360;;;;:::o;45342:640::-;45537:4;45575:3;45564:9;45560:19;45552:27;;45589:71;45657:1;45646:9;45642:17;45633:6;45589:71;:::i;:::-;45670:72;45738:2;45727:9;45723:18;45714:6;45670:72;:::i;:::-;45752;45820:2;45809:9;45805:18;45796:6;45752:72;:::i;:::-;45871:9;45865:4;45861:20;45856:2;45845:9;45841:18;45834:48;45899:76;45970:4;45961:6;45899:76;:::i;:::-;45891:84;;45342:640;;;;;;;:::o;45988:141::-;46044:5;46075:6;46069:13;46060:22;;46091:32;46117:5;46091:32;:::i;:::-;45988:141;;;;:::o;46135:349::-;46204:6;46253:2;46241:9;46232:7;46228:23;46224:32;46221:119;;;46259:79;;:::i;:::-;46221:119;46379:1;46404:63;46459:7;46450:6;46439:9;46435:22;46404:63;:::i;:::-;46394:73;;46350:127;46135:349;;;;:::o;46490:180::-;46538:77;46535:1;46528:88;46635:4;46632:1;46625:15;46659:4;46656:1;46649:15
Swarm Source
ipfs://034bc737d98099f87fb92e5aba0df3b6db8de19193fd41fee0446b75174d4ac7
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.