Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
2,000 RXJ
Holders
1,434
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 RXJLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RXJ
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-10 */ // Sources flattened with hardhat v2.10.1 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/RJX.sol pragma solidity ^0.8.9; // solhint-disable-line contract RXJ is ERC721, Ownable, ReentrancyGuard { uint256 public constant MAX_SUPPLY = 2000; using Counters for Counters.Counter; string private _baseURIextended; Counters.Counter private _tokenSupply; constructor() ERC721("Romeo x Juliet", "RXJ") {} function totalSupply() public view returns (uint256) { return _tokenSupply.current(); } function privateMint(uint256 numberOfTokens) external onlyOwner { require(totalSupply() + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens"); for (uint256 i = 1; i <= numberOfTokens; i++) { _tokenSupply.increment(); _safeMint(msg.sender, totalSupply()); } } function setBaseURI(string memory baseURI_) external onlyOwner { _baseURIextended = baseURI_; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } /** * Optional override for modifying the token URI before return. */ function tokenURI(uint256 tokenId) public view virtual override(ERC721) returns (string memory) { string memory uri = super.tokenURI(tokenId); return bytes(uri).length > 0 ? string(abi.encodePacked(uri, ".json")) : ""; } function withdraw(address payable to) external onlyOwner nonReentrant { uint256 balance = address(this).balance; Address.sendValue(to, balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600e81526020017f526f6d656f2078204a756c6965740000000000000000000000000000000000008152506040518060400160405280600381526020017f52584a0000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001ae565b508060019080519060200190620000af929190620001ae565b505050620000d2620000c6620000e060201b60201c565b620000e860201b60201c565b6001600781905550620002c3565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001bc906200028d565b90600052602060002090601f016020900481019282620001e057600085556200022c565b82601f10620001fb57805160ff19168380011785556200022c565b828001600101855582156200022c579182015b828111156200022b5782518255916020019190600101906200020e565b5b5090506200023b91906200023f565b5090565b5b808211156200025a57600081600090555060010162000240565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002a657607f821691505b60208210811415620002bd57620002bc6200025e565b5b50919050565b6130b580620002d36000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80636352211e116100b8578063a22cb4651161007c578063a22cb46514610328578063abfe40a814610344578063b88d4fde14610360578063c87b56dd1461037c578063e985e9c5146103ac578063f2fde38b146103dc57610137565b80636352211e1461028257806370a08231146102b2578063715018a6146102e25780638da5cb5b146102ec57806395d89b411461030a57610137565b806323b872dd116100ff57806323b872dd146101f457806332cb6b0c1461021057806342842e0e1461022e57806351cff8d91461024a57806355f804b31461026657610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806318160ddd146101d6575b600080fd5b61015660048036038101906101519190611d37565b6103f8565b6040516101639190611d7f565b60405180910390f35b6101746104da565b6040516101819190611e33565b60405180910390f35b6101a4600480360381019061019f9190611e8b565b61056c565b6040516101b19190611ef9565b60405180910390f35b6101d460048036038101906101cf9190611f40565b6105b2565b005b6101de6106ca565b6040516101eb9190611f8f565b60405180910390f35b61020e60048036038101906102099190611faa565b6106db565b005b61021861073b565b6040516102259190611f8f565b60405180910390f35b61024860048036038101906102439190611faa565b610741565b005b610264600480360381019061025f919061203b565b610761565b005b610280600480360381019061027b919061219d565b6107d2565b005b61029c60048036038101906102979190611e8b565b6107f4565b6040516102a99190611ef9565b60405180910390f35b6102cc60048036038101906102c791906121e6565b6108a6565b6040516102d99190611f8f565b60405180910390f35b6102ea61095e565b005b6102f4610972565b6040516103019190611ef9565b60405180910390f35b61031261099c565b60405161031f9190611e33565b60405180910390f35b610342600480360381019061033d919061223f565b610a2e565b005b61035e60048036038101906103599190611e8b565b610a44565b005b61037a60048036038101906103759190612320565b610ae3565b005b61039660048036038101906103919190611e8b565b610b45565b6040516103a39190611e33565b60405180910390f35b6103c660048036038101906103c191906123a3565b610b9b565b6040516103d39190611d7f565b60405180910390f35b6103f660048036038101906103f191906121e6565b610c2f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104d357506104d282610cb3565b5b9050919050565b6060600080546104e990612412565b80601f016020809104026020016040519081016040528092919081815260200182805461051590612412565b80156105625780601f1061053757610100808354040283529160200191610562565b820191906000526020600020905b81548152906001019060200180831161054557829003601f168201915b5050505050905090565b600061057782610d1d565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105bd826107f4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561062e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610625906124b6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661064d610d68565b73ffffffffffffffffffffffffffffffffffffffff16148061067c575061067b81610676610d68565b610b9b565b5b6106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b290612548565b60405180910390fd5b6106c58383610d70565b505050565b60006106d66009610e29565b905090565b6106ec6106e6610d68565b82610e37565b61072b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610722906125da565b60405180910390fd5b610736838383610ecc565b505050565b6107d081565b61075c83838360405180602001604052806000815250610ae3565b505050565b610769611133565b600260075414156107af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a690612646565b60405180910390fd5b600260078190555060004790506107c682826111b1565b50600160078190555050565b6107da611133565b80600890805190602001906107f0929190611c28565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561089d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610894906126b2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612744565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610966611133565b61097060006112a5565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546109ab90612412565b80601f01602080910402602001604051908101604052809291908181526020018280546109d790612412565b8015610a245780601f106109f957610100808354040283529160200191610a24565b820191906000526020600020905b815481529060010190602001808311610a0757829003601f168201915b5050505050905090565b610a40610a39610d68565b838361136b565b5050565b610a4c611133565b6107d081610a586106ca565b610a629190612793565b1115610aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9a90612835565b60405180910390fd5b6000600190505b818111610adf57610abb60096114d8565b610acc33610ac76106ca565b6114ee565b8080610ad790612855565b915050610aaa565b5050565b610af4610aee610d68565b83610e37565b610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a906125da565b60405180910390fd5b610b3f8484848461150c565b50505050565b60606000610b5283611568565b90506000815111610b725760405180602001604052806000815250610b93565b80604051602001610b839190612926565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610c37611133565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e906129ba565b60405180910390fd5b610cb0816112a5565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610d26816115d0565b610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c906126b2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610de3836107f4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080610e43836107f4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610e855750610e848185610b9b565b5b80610ec357508373ffffffffffffffffffffffffffffffffffffffff16610eab8461056c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610eec826107f4565b73ffffffffffffffffffffffffffffffffffffffff1614610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3990612a4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990612ade565b60405180910390fd5b610fbd83838361163c565b610fc8600082610d70565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110189190612afe565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461106f9190612793565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461112e838383611641565b505050565b61113b610d68565b73ffffffffffffffffffffffffffffffffffffffff16611159610972565b73ffffffffffffffffffffffffffffffffffffffff16146111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690612b7e565b60405180910390fd5b565b804710156111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90612bea565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161121a90612c3b565b60006040518083038185875af1925050503d8060008114611257576040519150601f19603f3d011682016040523d82523d6000602084013e61125c565b606091505b50509050806112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129790612cc2565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190612d2e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114cb9190611d7f565b60405180910390a3505050565b6001816000016000828254019250508190555050565b611508828260405180602001604052806000815250611646565b5050565b611517848484610ecc565b611523848484846116a1565b611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990612dc0565b60405180910390fd5b50505050565b606061157382610d1d565b600061157d611838565b9050600081511161159d57604051806020016040528060008152506115c8565b806115a7846118ca565b6040516020016115b8929190612de0565b6040516020818303038152906040525b915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6116508383611a2b565b61165d60008484846116a1565b61169c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169390612dc0565b60405180910390fd5b505050565b60006116c28473ffffffffffffffffffffffffffffffffffffffff16611c05565b1561182b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026116eb610d68565b8786866040518563ffffffff1660e01b815260040161170d9493929190612e59565b602060405180830381600087803b15801561172757600080fd5b505af192505050801561175857506040513d601f19601f820116820180604052508101906117559190612eba565b60015b6117db573d8060008114611788576040519150601f19603f3d011682016040523d82523d6000602084013e61178d565b606091505b506000815114156117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90612dc0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611830565b600190505b949350505050565b60606008805461184790612412565b80601f016020809104026020016040519081016040528092919081815260200182805461187390612412565b80156118c05780601f10611895576101008083540402835291602001916118c0565b820191906000526020600020905b8154815290600101906020018083116118a357829003601f168201915b5050505050905090565b60606000821415611912576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a26565b600082905060005b6000821461194457808061192d90612855565b915050600a8261193d9190612f16565b915061191a565b60008167ffffffffffffffff8111156119605761195f612072565b5b6040519080825280601f01601f1916602001820160405280156119925781602001600182028036833780820191505090505b5090505b60008514611a1f576001826119ab9190612afe565b9150600a856119ba9190612f47565b60306119c69190612793565b60f81b8183815181106119dc576119db612f78565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a189190612f16565b9450611996565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290612ff3565b60405180910390fd5b611aa4816115d0565b15611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb9061305f565b60405180910390fd5b611af06000838361163c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b409190612793565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c0160008383611641565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054611c3490612412565b90600052602060002090601f016020900481019282611c565760008555611c9d565b82601f10611c6f57805160ff1916838001178555611c9d565b82800160010185558215611c9d579182015b82811115611c9c578251825591602001919060010190611c81565b5b509050611caa9190611cae565b5090565b5b80821115611cc7576000816000905550600101611caf565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d1481611cdf565b8114611d1f57600080fd5b50565b600081359050611d3181611d0b565b92915050565b600060208284031215611d4d57611d4c611cd5565b5b6000611d5b84828501611d22565b91505092915050565b60008115159050919050565b611d7981611d64565b82525050565b6000602082019050611d946000830184611d70565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611dd4578082015181840152602081019050611db9565b83811115611de3576000848401525b50505050565b6000601f19601f8301169050919050565b6000611e0582611d9a565b611e0f8185611da5565b9350611e1f818560208601611db6565b611e2881611de9565b840191505092915050565b60006020820190508181036000830152611e4d8184611dfa565b905092915050565b6000819050919050565b611e6881611e55565b8114611e7357600080fd5b50565b600081359050611e8581611e5f565b92915050565b600060208284031215611ea157611ea0611cd5565b5b6000611eaf84828501611e76565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611ee382611eb8565b9050919050565b611ef381611ed8565b82525050565b6000602082019050611f0e6000830184611eea565b92915050565b611f1d81611ed8565b8114611f2857600080fd5b50565b600081359050611f3a81611f14565b92915050565b60008060408385031215611f5757611f56611cd5565b5b6000611f6585828601611f2b565b9250506020611f7685828601611e76565b9150509250929050565b611f8981611e55565b82525050565b6000602082019050611fa46000830184611f80565b92915050565b600080600060608486031215611fc357611fc2611cd5565b5b6000611fd186828701611f2b565b9350506020611fe286828701611f2b565b9250506040611ff386828701611e76565b9150509250925092565b600061200882611eb8565b9050919050565b61201881611ffd565b811461202357600080fd5b50565b6000813590506120358161200f565b92915050565b60006020828403121561205157612050611cd5565b5b600061205f84828501612026565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6120aa82611de9565b810181811067ffffffffffffffff821117156120c9576120c8612072565b5b80604052505050565b60006120dc611ccb565b90506120e882826120a1565b919050565b600067ffffffffffffffff82111561210857612107612072565b5b61211182611de9565b9050602081019050919050565b82818337600083830152505050565b600061214061213b846120ed565b6120d2565b90508281526020810184848401111561215c5761215b61206d565b5b61216784828561211e565b509392505050565b600082601f83011261218457612183612068565b5b813561219484826020860161212d565b91505092915050565b6000602082840312156121b3576121b2611cd5565b5b600082013567ffffffffffffffff8111156121d1576121d0611cda565b5b6121dd8482850161216f565b91505092915050565b6000602082840312156121fc576121fb611cd5565b5b600061220a84828501611f2b565b91505092915050565b61221c81611d64565b811461222757600080fd5b50565b60008135905061223981612213565b92915050565b6000806040838503121561225657612255611cd5565b5b600061226485828601611f2b565b92505060206122758582860161222a565b9150509250929050565b600067ffffffffffffffff82111561229a57612299612072565b5b6122a382611de9565b9050602081019050919050565b60006122c36122be8461227f565b6120d2565b9050828152602081018484840111156122df576122de61206d565b5b6122ea84828561211e565b509392505050565b600082601f83011261230757612306612068565b5b81356123178482602086016122b0565b91505092915050565b6000806000806080858703121561233a57612339611cd5565b5b600061234887828801611f2b565b945050602061235987828801611f2b565b935050604061236a87828801611e76565b925050606085013567ffffffffffffffff81111561238b5761238a611cda565b5b612397878288016122f2565b91505092959194509250565b600080604083850312156123ba576123b9611cd5565b5b60006123c885828601611f2b565b92505060206123d985828601611f2b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061242a57607f821691505b6020821081141561243e5761243d6123e3565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006124a0602183611da5565b91506124ab82612444565b604082019050919050565b600060208201905081810360008301526124cf81612493565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612532603e83611da5565b915061253d826124d6565b604082019050919050565b6000602082019050818103600083015261256181612525565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006125c4602e83611da5565b91506125cf82612568565b604082019050919050565b600060208201905081810360008301526125f3816125b7565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612630601f83611da5565b915061263b826125fa565b602082019050919050565b6000602082019050818103600083015261265f81612623565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061269c601883611da5565b91506126a782612666565b602082019050919050565b600060208201905081810360008301526126cb8161268f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061272e602983611da5565b9150612739826126d2565b604082019050919050565b6000602082019050818103600083015261275d81612721565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061279e82611e55565b91506127a983611e55565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127de576127dd612764565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b600061281f602083611da5565b915061282a826127e9565b602082019050919050565b6000602082019050818103600083015261284e81612812565b9050919050565b600061286082611e55565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561289357612892612764565b5b600182019050919050565b600081905092915050565b60006128b482611d9a565b6128be818561289e565b93506128ce818560208601611db6565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061291060058361289e565b915061291b826128da565b600582019050919050565b600061293282846128a9565b915061293d82612903565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006129a4602683611da5565b91506129af82612948565b604082019050919050565b600060208201905081810360008301526129d381612997565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612a36602583611da5565b9150612a41826129da565b604082019050919050565b60006020820190508181036000830152612a6581612a29565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612ac8602483611da5565b9150612ad382612a6c565b604082019050919050565b60006020820190508181036000830152612af781612abb565b9050919050565b6000612b0982611e55565b9150612b1483611e55565b925082821015612b2757612b26612764565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612b68602083611da5565b9150612b7382612b32565b602082019050919050565b60006020820190508181036000830152612b9781612b5b565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000612bd4601d83611da5565b9150612bdf82612b9e565b602082019050919050565b60006020820190508181036000830152612c0381612bc7565b9050919050565b600081905092915050565b50565b6000612c25600083612c0a565b9150612c3082612c15565b600082019050919050565b6000612c4682612c18565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000612cac603a83611da5565b9150612cb782612c50565b604082019050919050565b60006020820190508181036000830152612cdb81612c9f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612d18601983611da5565b9150612d2382612ce2565b602082019050919050565b60006020820190508181036000830152612d4781612d0b565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612daa603283611da5565b9150612db582612d4e565b604082019050919050565b60006020820190508181036000830152612dd981612d9d565b9050919050565b6000612dec82856128a9565b9150612df882846128a9565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000612e2b82612e04565b612e358185612e0f565b9350612e45818560208601611db6565b612e4e81611de9565b840191505092915050565b6000608082019050612e6e6000830187611eea565b612e7b6020830186611eea565b612e886040830185611f80565b8181036060830152612e9a8184612e20565b905095945050505050565b600081519050612eb481611d0b565b92915050565b600060208284031215612ed057612ecf611cd5565b5b6000612ede84828501612ea5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f2182611e55565b9150612f2c83611e55565b925082612f3c57612f3b612ee7565b5b828204905092915050565b6000612f5282611e55565b9150612f5d83611e55565b925082612f6d57612f6c612ee7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612fdd602083611da5565b9150612fe882612fa7565b602082019050919050565b6000602082019050818103600083015261300c81612fd0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613049601c83611da5565b915061305482613013565b602082019050919050565b600060208201905081810360008301526130788161303c565b905091905056fea26469706673582212203e7c43013bb6885b62a9149c299900f0764cb15b74e961ac2a39ae5f417632ae64736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c80636352211e116100b8578063a22cb4651161007c578063a22cb46514610328578063abfe40a814610344578063b88d4fde14610360578063c87b56dd1461037c578063e985e9c5146103ac578063f2fde38b146103dc57610137565b80636352211e1461028257806370a08231146102b2578063715018a6146102e25780638da5cb5b146102ec57806395d89b411461030a57610137565b806323b872dd116100ff57806323b872dd146101f457806332cb6b0c1461021057806342842e0e1461022e57806351cff8d91461024a57806355f804b31461026657610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806318160ddd146101d6575b600080fd5b61015660048036038101906101519190611d37565b6103f8565b6040516101639190611d7f565b60405180910390f35b6101746104da565b6040516101819190611e33565b60405180910390f35b6101a4600480360381019061019f9190611e8b565b61056c565b6040516101b19190611ef9565b60405180910390f35b6101d460048036038101906101cf9190611f40565b6105b2565b005b6101de6106ca565b6040516101eb9190611f8f565b60405180910390f35b61020e60048036038101906102099190611faa565b6106db565b005b61021861073b565b6040516102259190611f8f565b60405180910390f35b61024860048036038101906102439190611faa565b610741565b005b610264600480360381019061025f919061203b565b610761565b005b610280600480360381019061027b919061219d565b6107d2565b005b61029c60048036038101906102979190611e8b565b6107f4565b6040516102a99190611ef9565b60405180910390f35b6102cc60048036038101906102c791906121e6565b6108a6565b6040516102d99190611f8f565b60405180910390f35b6102ea61095e565b005b6102f4610972565b6040516103019190611ef9565b60405180910390f35b61031261099c565b60405161031f9190611e33565b60405180910390f35b610342600480360381019061033d919061223f565b610a2e565b005b61035e60048036038101906103599190611e8b565b610a44565b005b61037a60048036038101906103759190612320565b610ae3565b005b61039660048036038101906103919190611e8b565b610b45565b6040516103a39190611e33565b60405180910390f35b6103c660048036038101906103c191906123a3565b610b9b565b6040516103d39190611d7f565b60405180910390f35b6103f660048036038101906103f191906121e6565b610c2f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104d357506104d282610cb3565b5b9050919050565b6060600080546104e990612412565b80601f016020809104026020016040519081016040528092919081815260200182805461051590612412565b80156105625780601f1061053757610100808354040283529160200191610562565b820191906000526020600020905b81548152906001019060200180831161054557829003601f168201915b5050505050905090565b600061057782610d1d565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105bd826107f4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561062e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610625906124b6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661064d610d68565b73ffffffffffffffffffffffffffffffffffffffff16148061067c575061067b81610676610d68565b610b9b565b5b6106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b290612548565b60405180910390fd5b6106c58383610d70565b505050565b60006106d66009610e29565b905090565b6106ec6106e6610d68565b82610e37565b61072b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610722906125da565b60405180910390fd5b610736838383610ecc565b505050565b6107d081565b61075c83838360405180602001604052806000815250610ae3565b505050565b610769611133565b600260075414156107af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a690612646565b60405180910390fd5b600260078190555060004790506107c682826111b1565b50600160078190555050565b6107da611133565b80600890805190602001906107f0929190611c28565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561089d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610894906126b2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612744565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610966611133565b61097060006112a5565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546109ab90612412565b80601f01602080910402602001604051908101604052809291908181526020018280546109d790612412565b8015610a245780601f106109f957610100808354040283529160200191610a24565b820191906000526020600020905b815481529060010190602001808311610a0757829003601f168201915b5050505050905090565b610a40610a39610d68565b838361136b565b5050565b610a4c611133565b6107d081610a586106ca565b610a629190612793565b1115610aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9a90612835565b60405180910390fd5b6000600190505b818111610adf57610abb60096114d8565b610acc33610ac76106ca565b6114ee565b8080610ad790612855565b915050610aaa565b5050565b610af4610aee610d68565b83610e37565b610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a906125da565b60405180910390fd5b610b3f8484848461150c565b50505050565b60606000610b5283611568565b90506000815111610b725760405180602001604052806000815250610b93565b80604051602001610b839190612926565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610c37611133565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e906129ba565b60405180910390fd5b610cb0816112a5565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610d26816115d0565b610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c906126b2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610de3836107f4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080610e43836107f4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610e855750610e848185610b9b565b5b80610ec357508373ffffffffffffffffffffffffffffffffffffffff16610eab8461056c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610eec826107f4565b73ffffffffffffffffffffffffffffffffffffffff1614610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3990612a4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990612ade565b60405180910390fd5b610fbd83838361163c565b610fc8600082610d70565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110189190612afe565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461106f9190612793565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461112e838383611641565b505050565b61113b610d68565b73ffffffffffffffffffffffffffffffffffffffff16611159610972565b73ffffffffffffffffffffffffffffffffffffffff16146111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690612b7e565b60405180910390fd5b565b804710156111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90612bea565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161121a90612c3b565b60006040518083038185875af1925050503d8060008114611257576040519150601f19603f3d011682016040523d82523d6000602084013e61125c565b606091505b50509050806112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129790612cc2565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190612d2e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114cb9190611d7f565b60405180910390a3505050565b6001816000016000828254019250508190555050565b611508828260405180602001604052806000815250611646565b5050565b611517848484610ecc565b611523848484846116a1565b611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990612dc0565b60405180910390fd5b50505050565b606061157382610d1d565b600061157d611838565b9050600081511161159d57604051806020016040528060008152506115c8565b806115a7846118ca565b6040516020016115b8929190612de0565b6040516020818303038152906040525b915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6116508383611a2b565b61165d60008484846116a1565b61169c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169390612dc0565b60405180910390fd5b505050565b60006116c28473ffffffffffffffffffffffffffffffffffffffff16611c05565b1561182b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026116eb610d68565b8786866040518563ffffffff1660e01b815260040161170d9493929190612e59565b602060405180830381600087803b15801561172757600080fd5b505af192505050801561175857506040513d601f19601f820116820180604052508101906117559190612eba565b60015b6117db573d8060008114611788576040519150601f19603f3d011682016040523d82523d6000602084013e61178d565b606091505b506000815114156117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90612dc0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611830565b600190505b949350505050565b60606008805461184790612412565b80601f016020809104026020016040519081016040528092919081815260200182805461187390612412565b80156118c05780601f10611895576101008083540402835291602001916118c0565b820191906000526020600020905b8154815290600101906020018083116118a357829003601f168201915b5050505050905090565b60606000821415611912576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a26565b600082905060005b6000821461194457808061192d90612855565b915050600a8261193d9190612f16565b915061191a565b60008167ffffffffffffffff8111156119605761195f612072565b5b6040519080825280601f01601f1916602001820160405280156119925781602001600182028036833780820191505090505b5090505b60008514611a1f576001826119ab9190612afe565b9150600a856119ba9190612f47565b60306119c69190612793565b60f81b8183815181106119dc576119db612f78565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a189190612f16565b9450611996565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290612ff3565b60405180910390fd5b611aa4816115d0565b15611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb9061305f565b60405180910390fd5b611af06000838361163c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b409190612793565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c0160008383611641565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054611c3490612412565b90600052602060002090601f016020900481019282611c565760008555611c9d565b82601f10611c6f57805160ff1916838001178555611c9d565b82800160010185558215611c9d579182015b82811115611c9c578251825591602001919060010190611c81565b5b509050611caa9190611cae565b5090565b5b80821115611cc7576000816000905550600101611caf565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d1481611cdf565b8114611d1f57600080fd5b50565b600081359050611d3181611d0b565b92915050565b600060208284031215611d4d57611d4c611cd5565b5b6000611d5b84828501611d22565b91505092915050565b60008115159050919050565b611d7981611d64565b82525050565b6000602082019050611d946000830184611d70565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611dd4578082015181840152602081019050611db9565b83811115611de3576000848401525b50505050565b6000601f19601f8301169050919050565b6000611e0582611d9a565b611e0f8185611da5565b9350611e1f818560208601611db6565b611e2881611de9565b840191505092915050565b60006020820190508181036000830152611e4d8184611dfa565b905092915050565b6000819050919050565b611e6881611e55565b8114611e7357600080fd5b50565b600081359050611e8581611e5f565b92915050565b600060208284031215611ea157611ea0611cd5565b5b6000611eaf84828501611e76565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611ee382611eb8565b9050919050565b611ef381611ed8565b82525050565b6000602082019050611f0e6000830184611eea565b92915050565b611f1d81611ed8565b8114611f2857600080fd5b50565b600081359050611f3a81611f14565b92915050565b60008060408385031215611f5757611f56611cd5565b5b6000611f6585828601611f2b565b9250506020611f7685828601611e76565b9150509250929050565b611f8981611e55565b82525050565b6000602082019050611fa46000830184611f80565b92915050565b600080600060608486031215611fc357611fc2611cd5565b5b6000611fd186828701611f2b565b9350506020611fe286828701611f2b565b9250506040611ff386828701611e76565b9150509250925092565b600061200882611eb8565b9050919050565b61201881611ffd565b811461202357600080fd5b50565b6000813590506120358161200f565b92915050565b60006020828403121561205157612050611cd5565b5b600061205f84828501612026565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6120aa82611de9565b810181811067ffffffffffffffff821117156120c9576120c8612072565b5b80604052505050565b60006120dc611ccb565b90506120e882826120a1565b919050565b600067ffffffffffffffff82111561210857612107612072565b5b61211182611de9565b9050602081019050919050565b82818337600083830152505050565b600061214061213b846120ed565b6120d2565b90508281526020810184848401111561215c5761215b61206d565b5b61216784828561211e565b509392505050565b600082601f83011261218457612183612068565b5b813561219484826020860161212d565b91505092915050565b6000602082840312156121b3576121b2611cd5565b5b600082013567ffffffffffffffff8111156121d1576121d0611cda565b5b6121dd8482850161216f565b91505092915050565b6000602082840312156121fc576121fb611cd5565b5b600061220a84828501611f2b565b91505092915050565b61221c81611d64565b811461222757600080fd5b50565b60008135905061223981612213565b92915050565b6000806040838503121561225657612255611cd5565b5b600061226485828601611f2b565b92505060206122758582860161222a565b9150509250929050565b600067ffffffffffffffff82111561229a57612299612072565b5b6122a382611de9565b9050602081019050919050565b60006122c36122be8461227f565b6120d2565b9050828152602081018484840111156122df576122de61206d565b5b6122ea84828561211e565b509392505050565b600082601f83011261230757612306612068565b5b81356123178482602086016122b0565b91505092915050565b6000806000806080858703121561233a57612339611cd5565b5b600061234887828801611f2b565b945050602061235987828801611f2b565b935050604061236a87828801611e76565b925050606085013567ffffffffffffffff81111561238b5761238a611cda565b5b612397878288016122f2565b91505092959194509250565b600080604083850312156123ba576123b9611cd5565b5b60006123c885828601611f2b565b92505060206123d985828601611f2b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061242a57607f821691505b6020821081141561243e5761243d6123e3565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006124a0602183611da5565b91506124ab82612444565b604082019050919050565b600060208201905081810360008301526124cf81612493565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612532603e83611da5565b915061253d826124d6565b604082019050919050565b6000602082019050818103600083015261256181612525565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006125c4602e83611da5565b91506125cf82612568565b604082019050919050565b600060208201905081810360008301526125f3816125b7565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612630601f83611da5565b915061263b826125fa565b602082019050919050565b6000602082019050818103600083015261265f81612623565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061269c601883611da5565b91506126a782612666565b602082019050919050565b600060208201905081810360008301526126cb8161268f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061272e602983611da5565b9150612739826126d2565b604082019050919050565b6000602082019050818103600083015261275d81612721565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061279e82611e55565b91506127a983611e55565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127de576127dd612764565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b600061281f602083611da5565b915061282a826127e9565b602082019050919050565b6000602082019050818103600083015261284e81612812565b9050919050565b600061286082611e55565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561289357612892612764565b5b600182019050919050565b600081905092915050565b60006128b482611d9a565b6128be818561289e565b93506128ce818560208601611db6565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061291060058361289e565b915061291b826128da565b600582019050919050565b600061293282846128a9565b915061293d82612903565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006129a4602683611da5565b91506129af82612948565b604082019050919050565b600060208201905081810360008301526129d381612997565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612a36602583611da5565b9150612a41826129da565b604082019050919050565b60006020820190508181036000830152612a6581612a29565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612ac8602483611da5565b9150612ad382612a6c565b604082019050919050565b60006020820190508181036000830152612af781612abb565b9050919050565b6000612b0982611e55565b9150612b1483611e55565b925082821015612b2757612b26612764565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612b68602083611da5565b9150612b7382612b32565b602082019050919050565b60006020820190508181036000830152612b9781612b5b565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000612bd4601d83611da5565b9150612bdf82612b9e565b602082019050919050565b60006020820190508181036000830152612c0381612bc7565b9050919050565b600081905092915050565b50565b6000612c25600083612c0a565b9150612c3082612c15565b600082019050919050565b6000612c4682612c18565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000612cac603a83611da5565b9150612cb782612c50565b604082019050919050565b60006020820190508181036000830152612cdb81612c9f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612d18601983611da5565b9150612d2382612ce2565b602082019050919050565b60006020820190508181036000830152612d4781612d0b565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612daa603283611da5565b9150612db582612d4e565b604082019050919050565b60006020820190508181036000830152612dd981612d9d565b9050919050565b6000612dec82856128a9565b9150612df882846128a9565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000612e2b82612e04565b612e358185612e0f565b9350612e45818560208601611db6565b612e4e81611de9565b840191505092915050565b6000608082019050612e6e6000830187611eea565b612e7b6020830186611eea565b612e886040830185611f80565b8181036060830152612e9a8184612e20565b905095945050505050565b600081519050612eb481611d0b565b92915050565b600060208284031215612ed057612ecf611cd5565b5b6000612ede84828501612ea5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f2182611e55565b9150612f2c83611e55565b925082612f3c57612f3b612ee7565b5b828204905092915050565b6000612f5282611e55565b9150612f5d83611e55565b925082612f6d57612f6c612ee7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612fdd602083611da5565b9150612fe882612fa7565b602082019050919050565b6000602082019050818103600083015261300c81612fd0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613049601c83611da5565b915061305482613013565b602082019050919050565b600060208201905081810360008301526130788161303c565b905091905056fea26469706673582212203e7c43013bb6885b62a9149c299900f0764cb15b74e961ac2a39ae5f417632ae64736f6c63430008090033
Deployed Bytecode Sourcemap
51567:1541:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22219:355;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23196:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24722:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24239:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51857:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25472:373;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51623:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25916:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52936:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52306:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22907:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22638:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47907:103;;;:::i;:::-;;47259:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23365:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24965:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51966:332;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26172:360;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52635:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25191:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48165:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22219:355;22366:4;22423:25;22408:40;;;:11;:40;;;;:105;;;;22480:33;22465:48;;;:11;:48;;;;22408:105;:158;;;;22530:36;22554:11;22530:23;:36::i;:::-;22408:158;22388:178;;22219:355;;;:::o;23196:100::-;23250:13;23283:5;23276:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23196:100;:::o;24722:171::-;24798:7;24818:23;24833:7;24818:14;:23::i;:::-;24861:15;:24;24877:7;24861:24;;;;;;;;;;;;;;;;;;;;;24854:31;;24722:171;;;:::o;24239:417::-;24320:13;24336:23;24351:7;24336:14;:23::i;:::-;24320:39;;24384:5;24378:11;;:2;:11;;;;24370:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24478:5;24462:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24487:37;24504:5;24511:12;:10;:12::i;:::-;24487:16;:37::i;:::-;24462:62;24440:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24627:21;24636:2;24640:7;24627:8;:21::i;:::-;24309:347;24239:417;;:::o;51857:101::-;51901:7;51928:22;:12;:20;:22::i;:::-;51921:29;;51857:101;:::o;25472:373::-;25681:41;25700:12;:10;:12::i;:::-;25714:7;25681:18;:41::i;:::-;25659:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;25809:28;25819:4;25825:2;25829:7;25809:9;:28::i;:::-;25472:373;;;:::o;51623:41::-;51660:4;51623:41;:::o;25916:185::-;26054:39;26071:4;26077:2;26081:7;26054:39;;;;;;;;;;;;:16;:39::i;:::-;25916:185;;;:::o;52936:169::-;47145:13;:11;:13::i;:::-;50540:1:::1;51138:7;;:19;;51130:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50540:1;51271:7;:18;;;;53017:15:::2;53035:21;53017:39;;53067:30;53085:2;53089:7;53067:17;:30::i;:::-;53006:99;50496:1:::1;51450:7;:22;;;;52936:169:::0;:::o;52306:109::-;47145:13;:11;:13::i;:::-;52399:8:::1;52380:16;:27;;;;;;;;;;;;:::i;:::-;;52306:109:::0;:::o;22907:222::-;22979:7;22999:13;23015:7;:16;23023:7;23015:16;;;;;;;;;;;;;;;;;;;;;22999:32;;23067:1;23050:19;;:5;:19;;;;23042:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;23116:5;23109:12;;;22907:222;;;:::o;22638:207::-;22710:7;22755:1;22738:19;;:5;:19;;;;22730:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22821:9;:16;22831:5;22821:16;;;;;;;;;;;;;;;;22814:23;;22638:207;;;:::o;47907:103::-;47145:13;:11;:13::i;:::-;47972:30:::1;47999:1;47972:18;:30::i;:::-;47907:103::o:0;47259:87::-;47305:7;47332:6;;;;;;;;;;;47325:13;;47259:87;:::o;23365:104::-;23421:13;23454:7;23447:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23365:104;:::o;24965:155::-;25060:52;25079:12;:10;:12::i;:::-;25093:8;25103;25060:18;:52::i;:::-;24965:155;;:::o;51966:332::-;47145:13;:11;:13::i;:::-;51660:4:::1;52065:14;52049:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;52041:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;52148:9;52160:1;52148:13;;52143:148;52168:14;52163:1;:19;52143:148;;52204:24;:12;:22;:24::i;:::-;52243:36;52253:10;52265:13;:11;:13::i;:::-;52243:9;:36::i;:::-;52184:3;;;;;:::i;:::-;;;;52143:148;;;;51966:332:::0;:::o;26172:360::-;26360:41;26379:12;:10;:12::i;:::-;26393:7;26360:18;:41::i;:::-;26338:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;26486:38;26500:4;26506:2;26510:7;26519:4;26486:13;:38::i;:::-;26172:360;;;;:::o;52635:293::-;52761:13;52792:17;52812:23;52827:7;52812:14;:23::i;:::-;52792:43;;52873:1;52859:3;52853:17;:21;:67;;;;;;;;;;;;;;;;;52901:3;52884:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;52853:67;52846:74;;;52635:293;;;:::o;25191:214::-;25333:4;25362:18;:25;25381:5;25362:25;;;;;;;;;;;;;;;:35;25388:8;25362:35;;;;;;;;;;;;;;;;;;;;;;;;;25355:42;;25191:214;;;;:::o;48165:201::-;47145:13;:11;:13::i;:::-;48274:1:::1;48254:22;;:8;:22;;;;48246:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48330:28;48349:8;48330:18;:28::i;:::-;48165:201:::0;:::o;20658:157::-;20743:4;20782:25;20767:40;;;:11;:40;;;;20760:47;;20658:157;;;:::o;32925:135::-;33007:16;33015:7;33007;:16::i;:::-;32999:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32925:135;:::o;17076:98::-;17129:7;17156:10;17149:17;;17076:98;:::o;32204:174::-;32306:2;32279:15;:24;32295:7;32279:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32362:7;32358:2;32324:46;;32333:23;32348:7;32333:14;:23::i;:::-;32324:46;;;;;;;;;;;;32204:174;;:::o;36600:114::-;36665:7;36692;:14;;;36685:21;;36600:114;;;:::o;28370:331::-;28499:4;28521:13;28537:23;28552:7;28537:14;:23::i;:::-;28521:39;;28590:5;28579:16;;:7;:16;;;:65;;;;28612:32;28629:5;28636:7;28612:16;:32::i;:::-;28579:65;:113;;;;28685:7;28661:31;;:20;28673:7;28661:11;:20::i;:::-;:31;;;28579:113;28571:122;;;28370:331;;;;:::o;31460:625::-;31619:4;31592:31;;:23;31607:7;31592:14;:23::i;:::-;:31;;;31584:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31698:1;31684:16;;:2;:16;;;;31676:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31754:39;31775:4;31781:2;31785:7;31754:20;:39::i;:::-;31858:29;31875:1;31879:7;31858:8;:29::i;:::-;31919:1;31900:9;:15;31910:4;31900:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31948:1;31931:9;:13;31941:2;31931:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31979:2;31960:7;:16;31968:7;31960:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32018:7;32014:2;31999:27;;32008:4;31999:27;;;;;;;;;;;;32039:38;32059:4;32065:2;32069:7;32039:19;:38::i;:::-;31460:625;;;:::o;47424:132::-;47499:12;:10;:12::i;:::-;47488:23;;:7;:5;:7::i;:::-;:23;;;47480:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47424:132::o;10266:317::-;10381:6;10356:21;:31;;10348:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10435:12;10453:9;:14;;10475:6;10453:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10434:52;;;10505:7;10497:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;10337:246;10266:317;;:::o;48526:191::-;48600:16;48619:6;;;;;;;;;;;48600:25;;48645:8;48636:6;;:17;;;;;;;;;;;;;;;;;;48700:8;48669:40;;48690:8;48669:40;;;;;;;;;;;;48589:128;48526:191;:::o;32521:315::-;32676:8;32667:17;;:5;:17;;;;32659:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32763:8;32725:18;:25;32744:5;32725:25;;;;;;;;;;;;;;;:35;32751:8;32725:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32809:8;32787:41;;32802:5;32787:41;;;32819:8;32787:41;;;;;;:::i;:::-;;;;;;;;32521:315;;;:::o;36722:127::-;36829:1;36811:7;:14;;;:19;;;;;;;;;;;36722:127;:::o;29043:110::-;29119:26;29129:2;29133:7;29119:26;;;;;;;;;;;;:9;:26::i;:::-;29043:110;;:::o;27413:350::-;27569:28;27579:4;27585:2;27589:7;27569:9;:28::i;:::-;27630:47;27653:4;27659:2;27663:7;27672:4;27630:22;:47::i;:::-;27608:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;27413:350;;;;:::o;23540:294::-;23613:13;23639:23;23654:7;23639:14;:23::i;:::-;23675:21;23699:10;:8;:10::i;:::-;23675:34;;23764:1;23746:7;23740:21;:25;:86;;;;;;;;;;;;;;;;;23792:7;23801:18;:7;:16;:18::i;:::-;23775:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23740:86;23720:106;;;23540:294;;;:::o;28076:127::-;28141:4;28193:1;28165:30;;:7;:16;28173:7;28165:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28158:37;;28076:127;;;:::o;35081:126::-;;;;:::o;35592:125::-;;;;:::o;29380:319::-;29509:18;29515:2;29519:7;29509:5;:18::i;:::-;29560:53;29591:1;29595:2;29599:7;29608:4;29560:22;:53::i;:::-;29538:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;29380:319;;;:::o;33624:885::-;33778:4;33799:15;:2;:13;;;:15::i;:::-;33795:707;;;33851:2;33835:36;;;33872:12;:10;:12::i;:::-;33886:4;33892:7;33901:4;33835:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33831:616;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34125:1;34108:6;:13;:18;34104:328;;;34151:60;;;;;;;;;;:::i;:::-;;;;;;;;34104:328;34382:6;34376:13;34367:6;34363:2;34359:15;34352:38;33831:616;33999:41;;;33989:51;;;:6;:51;;;;33982:58;;;;;33795:707;34486:4;34479:11;;33624:885;;;;;;;:::o;52423:117::-;52483:13;52516:16;52509:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52423:117;:::o;17724:723::-;17780:13;18010:1;18001:5;:10;17997:53;;;18028:10;;;;;;;;;;;;;;;;;;;;;17997:53;18060:12;18075:5;18060:20;;18091:14;18116:78;18131:1;18123:4;:9;18116:78;;18149:8;;;;;:::i;:::-;;;;18180:2;18172:10;;;;;:::i;:::-;;;18116:78;;;18204:19;18236:6;18226:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18204:39;;18254:154;18270:1;18261:5;:10;18254:154;;18298:1;18288:11;;;;;:::i;:::-;;;18365:2;18357:5;:10;;;;:::i;:::-;18344:2;:24;;;;:::i;:::-;18331:39;;18314:6;18321;18314:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18394:2;18385:11;;;;;:::i;:::-;;;18254:154;;;18432:6;18418:21;;;;;17724:723;;;;:::o;30035:439::-;30129:1;30115:16;;:2;:16;;;;30107:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30188:16;30196:7;30188;:16::i;:::-;30187:17;30179:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30250:45;30279:1;30283:2;30287:7;30250:20;:45::i;:::-;30325:1;30308:9;:13;30318:2;30308:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30356:2;30337:7;:16;30345:7;30337:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30401:7;30397:2;30376:33;;30393:1;30376:33;;;;;;;;;;;;30422:44;30450:1;30454:2;30458:7;30422:19;:44::i;:::-;30035:439;;:::o;9005:326::-;9065:4;9322:1;9300:7;:19;;;:23;9293:30;;9005:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:104::-;5960:7;5989:24;6007:5;5989:24;:::i;:::-;5978:35;;5915:104;;;:::o;6025:138::-;6106:32;6132:5;6106:32;:::i;:::-;6099:5;6096:43;6086:71;;6153:1;6150;6143:12;6086:71;6025:138;:::o;6169:155::-;6223:5;6261:6;6248:20;6239:29;;6277:41;6312:5;6277:41;:::i;:::-;6169:155;;;;:::o;6330:345::-;6397:6;6446:2;6434:9;6425:7;6421:23;6417:32;6414:119;;;6452:79;;:::i;:::-;6414:119;6572:1;6597:61;6650:7;6641:6;6630:9;6626:22;6597:61;:::i;:::-;6587:71;;6543:125;6330:345;;;;:::o;6681:117::-;6790:1;6787;6780:12;6804:117;6913:1;6910;6903:12;6927:180;6975:77;6972:1;6965:88;7072:4;7069:1;7062:15;7096:4;7093:1;7086:15;7113:281;7196:27;7218:4;7196:27;:::i;:::-;7188:6;7184:40;7326:6;7314:10;7311:22;7290:18;7278:10;7275:34;7272:62;7269:88;;;7337:18;;:::i;:::-;7269:88;7377:10;7373:2;7366:22;7156:238;7113:281;;:::o;7400:129::-;7434:6;7461:20;;:::i;:::-;7451:30;;7490:33;7518:4;7510:6;7490:33;:::i;:::-;7400:129;;;:::o;7535:308::-;7597:4;7687:18;7679:6;7676:30;7673:56;;;7709:18;;:::i;:::-;7673:56;7747:29;7769:6;7747:29;:::i;:::-;7739:37;;7831:4;7825;7821:15;7813:23;;7535:308;;;:::o;7849:154::-;7933:6;7928:3;7923;7910:30;7995:1;7986:6;7981:3;7977:16;7970:27;7849:154;;;:::o;8009:412::-;8087:5;8112:66;8128:49;8170:6;8128:49;:::i;:::-;8112:66;:::i;:::-;8103:75;;8201:6;8194:5;8187:21;8239:4;8232:5;8228:16;8277:3;8268:6;8263:3;8259:16;8256:25;8253:112;;;8284:79;;:::i;:::-;8253:112;8374:41;8408:6;8403:3;8398;8374:41;:::i;:::-;8093:328;8009:412;;;;;:::o;8441:340::-;8497:5;8546:3;8539:4;8531:6;8527:17;8523:27;8513:122;;8554:79;;:::i;:::-;8513:122;8671:6;8658:20;8696:79;8771:3;8763:6;8756:4;8748:6;8744:17;8696:79;:::i;:::-;8687:88;;8503:278;8441:340;;;;:::o;8787:509::-;8856:6;8905:2;8893:9;8884:7;8880:23;8876:32;8873:119;;;8911:79;;:::i;:::-;8873:119;9059:1;9048:9;9044:17;9031:31;9089:18;9081:6;9078:30;9075:117;;;9111:79;;:::i;:::-;9075:117;9216:63;9271:7;9262:6;9251:9;9247:22;9216:63;:::i;:::-;9206:73;;9002:287;8787:509;;;;:::o;9302:329::-;9361:6;9410:2;9398:9;9389:7;9385:23;9381:32;9378:119;;;9416:79;;:::i;:::-;9378:119;9536:1;9561:53;9606:7;9597:6;9586:9;9582:22;9561:53;:::i;:::-;9551:63;;9507:117;9302:329;;;;:::o;9637:116::-;9707:21;9722:5;9707:21;:::i;:::-;9700:5;9697:32;9687:60;;9743:1;9740;9733:12;9687:60;9637:116;:::o;9759:133::-;9802:5;9840:6;9827:20;9818:29;;9856:30;9880:5;9856:30;:::i;:::-;9759:133;;;;:::o;9898:468::-;9963:6;9971;10020:2;10008:9;9999:7;9995:23;9991:32;9988:119;;;10026:79;;:::i;:::-;9988:119;10146:1;10171:53;10216:7;10207:6;10196:9;10192:22;10171:53;:::i;:::-;10161:63;;10117:117;10273:2;10299:50;10341:7;10332:6;10321:9;10317:22;10299:50;:::i;:::-;10289:60;;10244:115;9898:468;;;;;:::o;10372:307::-;10433:4;10523:18;10515:6;10512:30;10509:56;;;10545:18;;:::i;:::-;10509:56;10583:29;10605:6;10583:29;:::i;:::-;10575:37;;10667:4;10661;10657:15;10649:23;;10372:307;;;:::o;10685:410::-;10762:5;10787:65;10803:48;10844:6;10803:48;:::i;:::-;10787:65;:::i;:::-;10778:74;;10875:6;10868:5;10861:21;10913:4;10906:5;10902:16;10951:3;10942:6;10937:3;10933:16;10930:25;10927:112;;;10958:79;;:::i;:::-;10927:112;11048:41;11082:6;11077:3;11072;11048:41;:::i;:::-;10768:327;10685:410;;;;;:::o;11114:338::-;11169:5;11218:3;11211:4;11203:6;11199:17;11195:27;11185:122;;11226:79;;:::i;:::-;11185:122;11343:6;11330:20;11368:78;11442:3;11434:6;11427:4;11419:6;11415:17;11368:78;:::i;:::-;11359:87;;11175:277;11114:338;;;;:::o;11458:943::-;11553:6;11561;11569;11577;11626:3;11614:9;11605:7;11601:23;11597:33;11594:120;;;11633:79;;:::i;:::-;11594:120;11753:1;11778:53;11823:7;11814:6;11803:9;11799:22;11778:53;:::i;:::-;11768:63;;11724:117;11880:2;11906:53;11951:7;11942:6;11931:9;11927:22;11906:53;:::i;:::-;11896:63;;11851:118;12008:2;12034:53;12079:7;12070:6;12059:9;12055:22;12034:53;:::i;:::-;12024:63;;11979:118;12164:2;12153:9;12149:18;12136:32;12195:18;12187:6;12184:30;12181:117;;;12217:79;;:::i;:::-;12181:117;12322:62;12376:7;12367:6;12356:9;12352:22;12322:62;:::i;:::-;12312:72;;12107:287;11458:943;;;;;;;:::o;12407:474::-;12475:6;12483;12532:2;12520:9;12511:7;12507:23;12503:32;12500:119;;;12538:79;;:::i;:::-;12500:119;12658:1;12683:53;12728:7;12719:6;12708:9;12704:22;12683:53;:::i;:::-;12673:63;;12629:117;12785:2;12811:53;12856:7;12847:6;12836:9;12832:22;12811:53;:::i;:::-;12801:63;;12756:118;12407:474;;;;;:::o;12887:180::-;12935:77;12932:1;12925:88;13032:4;13029:1;13022:15;13056:4;13053:1;13046:15;13073:320;13117:6;13154:1;13148:4;13144:12;13134:22;;13201:1;13195:4;13191:12;13222:18;13212:81;;13278:4;13270:6;13266:17;13256:27;;13212:81;13340:2;13332:6;13329:14;13309:18;13306:38;13303:84;;;13359:18;;:::i;:::-;13303:84;13124:269;13073:320;;;:::o;13399:220::-;13539:34;13535:1;13527:6;13523:14;13516:58;13608:3;13603:2;13595:6;13591:15;13584:28;13399:220;:::o;13625:366::-;13767:3;13788:67;13852:2;13847:3;13788:67;:::i;:::-;13781:74;;13864:93;13953:3;13864:93;:::i;:::-;13982:2;13977:3;13973:12;13966:19;;13625:366;;;:::o;13997:419::-;14163:4;14201:2;14190:9;14186:18;14178:26;;14250:9;14244:4;14240:20;14236:1;14225:9;14221:17;14214:47;14278:131;14404:4;14278:131;:::i;:::-;14270:139;;13997:419;;;:::o;14422:249::-;14562:34;14558:1;14550:6;14546:14;14539:58;14631:32;14626:2;14618:6;14614:15;14607:57;14422:249;:::o;14677:366::-;14819:3;14840:67;14904:2;14899:3;14840:67;:::i;:::-;14833:74;;14916:93;15005:3;14916:93;:::i;:::-;15034:2;15029:3;15025:12;15018:19;;14677:366;;;:::o;15049:419::-;15215:4;15253:2;15242:9;15238:18;15230:26;;15302:9;15296:4;15292:20;15288:1;15277:9;15273:17;15266:47;15330:131;15456:4;15330:131;:::i;:::-;15322:139;;15049:419;;;:::o;15474:233::-;15614:34;15610:1;15602:6;15598:14;15591:58;15683:16;15678:2;15670:6;15666:15;15659:41;15474:233;:::o;15713:366::-;15855:3;15876:67;15940:2;15935:3;15876:67;:::i;:::-;15869:74;;15952:93;16041:3;15952:93;:::i;:::-;16070:2;16065:3;16061:12;16054:19;;15713:366;;;:::o;16085:419::-;16251:4;16289:2;16278:9;16274:18;16266:26;;16338:9;16332:4;16328:20;16324:1;16313:9;16309:17;16302:47;16366:131;16492:4;16366:131;:::i;:::-;16358:139;;16085:419;;;:::o;16510:181::-;16650:33;16646:1;16638:6;16634:14;16627:57;16510:181;:::o;16697:366::-;16839:3;16860:67;16924:2;16919:3;16860:67;:::i;:::-;16853:74;;16936:93;17025:3;16936:93;:::i;:::-;17054:2;17049:3;17045:12;17038:19;;16697:366;;;:::o;17069:419::-;17235:4;17273:2;17262:9;17258:18;17250:26;;17322:9;17316:4;17312:20;17308:1;17297:9;17293:17;17286:47;17350:131;17476:4;17350:131;:::i;:::-;17342:139;;17069:419;;;:::o;17494:174::-;17634:26;17630:1;17622:6;17618:14;17611:50;17494:174;:::o;17674:366::-;17816:3;17837:67;17901:2;17896:3;17837:67;:::i;:::-;17830:74;;17913:93;18002:3;17913:93;:::i;:::-;18031:2;18026:3;18022:12;18015:19;;17674:366;;;:::o;18046:419::-;18212:4;18250:2;18239:9;18235:18;18227:26;;18299:9;18293:4;18289:20;18285:1;18274:9;18270:17;18263:47;18327:131;18453:4;18327:131;:::i;:::-;18319:139;;18046:419;;;:::o;18471:228::-;18611:34;18607:1;18599:6;18595:14;18588:58;18680:11;18675:2;18667:6;18663:15;18656:36;18471:228;:::o;18705:366::-;18847:3;18868:67;18932:2;18927:3;18868:67;:::i;:::-;18861:74;;18944:93;19033:3;18944:93;:::i;:::-;19062:2;19057:3;19053:12;19046:19;;18705:366;;;:::o;19077:419::-;19243:4;19281:2;19270:9;19266:18;19258:26;;19330:9;19324:4;19320:20;19316:1;19305:9;19301:17;19294:47;19358:131;19484:4;19358:131;:::i;:::-;19350:139;;19077:419;;;:::o;19502:180::-;19550:77;19547:1;19540:88;19647:4;19644:1;19637:15;19671:4;19668:1;19661:15;19688:305;19728:3;19747:20;19765:1;19747:20;:::i;:::-;19742:25;;19781:20;19799:1;19781:20;:::i;:::-;19776:25;;19935:1;19867:66;19863:74;19860:1;19857:81;19854:107;;;19941:18;;:::i;:::-;19854:107;19985:1;19982;19978:9;19971:16;;19688:305;;;;:::o;19999:182::-;20139:34;20135:1;20127:6;20123:14;20116:58;19999:182;:::o;20187:366::-;20329:3;20350:67;20414:2;20409:3;20350:67;:::i;:::-;20343:74;;20426:93;20515:3;20426:93;:::i;:::-;20544:2;20539:3;20535:12;20528:19;;20187:366;;;:::o;20559:419::-;20725:4;20763:2;20752:9;20748:18;20740:26;;20812:9;20806:4;20802:20;20798:1;20787:9;20783:17;20776:47;20840:131;20966:4;20840:131;:::i;:::-;20832:139;;20559:419;;;:::o;20984:233::-;21023:3;21046:24;21064:5;21046:24;:::i;:::-;21037:33;;21092:66;21085:5;21082:77;21079:103;;;21162:18;;:::i;:::-;21079:103;21209:1;21202:5;21198:13;21191:20;;20984:233;;;:::o;21223:148::-;21325:11;21362:3;21347:18;;21223:148;;;;:::o;21377:377::-;21483:3;21511:39;21544:5;21511:39;:::i;:::-;21566:89;21648:6;21643:3;21566:89;:::i;:::-;21559:96;;21664:52;21709:6;21704:3;21697:4;21690:5;21686:16;21664:52;:::i;:::-;21741:6;21736:3;21732:16;21725:23;;21487:267;21377:377;;;;:::o;21760:155::-;21900:7;21896:1;21888:6;21884:14;21877:31;21760:155;:::o;21921:400::-;22081:3;22102:84;22184:1;22179:3;22102:84;:::i;:::-;22095:91;;22195:93;22284:3;22195:93;:::i;:::-;22313:1;22308:3;22304:11;22297:18;;21921:400;;;:::o;22327:541::-;22560:3;22582:95;22673:3;22664:6;22582:95;:::i;:::-;22575:102;;22694:148;22838:3;22694:148;:::i;:::-;22687:155;;22859:3;22852:10;;22327:541;;;;:::o;22874:225::-;23014:34;23010:1;23002:6;22998:14;22991:58;23083:8;23078:2;23070:6;23066:15;23059:33;22874:225;:::o;23105:366::-;23247:3;23268:67;23332:2;23327:3;23268:67;:::i;:::-;23261:74;;23344:93;23433:3;23344:93;:::i;:::-;23462:2;23457:3;23453:12;23446:19;;23105:366;;;:::o;23477:419::-;23643:4;23681:2;23670:9;23666:18;23658:26;;23730:9;23724:4;23720:20;23716:1;23705:9;23701:17;23694:47;23758:131;23884:4;23758:131;:::i;:::-;23750:139;;23477:419;;;:::o;23902:224::-;24042:34;24038:1;24030:6;24026:14;24019:58;24111:7;24106:2;24098:6;24094:15;24087:32;23902:224;:::o;24132:366::-;24274:3;24295:67;24359:2;24354:3;24295:67;:::i;:::-;24288:74;;24371:93;24460:3;24371:93;:::i;:::-;24489:2;24484:3;24480:12;24473:19;;24132:366;;;:::o;24504:419::-;24670:4;24708:2;24697:9;24693:18;24685:26;;24757:9;24751:4;24747:20;24743:1;24732:9;24728:17;24721:47;24785:131;24911:4;24785:131;:::i;:::-;24777:139;;24504:419;;;:::o;24929:223::-;25069:34;25065:1;25057:6;25053:14;25046:58;25138:6;25133:2;25125:6;25121:15;25114:31;24929:223;:::o;25158:366::-;25300:3;25321:67;25385:2;25380:3;25321:67;:::i;:::-;25314:74;;25397:93;25486:3;25397:93;:::i;:::-;25515:2;25510:3;25506:12;25499:19;;25158:366;;;:::o;25530:419::-;25696:4;25734:2;25723:9;25719:18;25711:26;;25783:9;25777:4;25773:20;25769:1;25758:9;25754:17;25747:47;25811:131;25937:4;25811:131;:::i;:::-;25803:139;;25530:419;;;:::o;25955:191::-;25995:4;26015:20;26033:1;26015:20;:::i;:::-;26010:25;;26049:20;26067:1;26049:20;:::i;:::-;26044:25;;26088:1;26085;26082:8;26079:34;;;26093:18;;:::i;:::-;26079:34;26138:1;26135;26131:9;26123:17;;25955:191;;;;:::o;26152:182::-;26292:34;26288:1;26280:6;26276:14;26269:58;26152:182;:::o;26340:366::-;26482:3;26503:67;26567:2;26562:3;26503:67;:::i;:::-;26496:74;;26579:93;26668:3;26579:93;:::i;:::-;26697:2;26692:3;26688:12;26681:19;;26340:366;;;:::o;26712:419::-;26878:4;26916:2;26905:9;26901:18;26893:26;;26965:9;26959:4;26955:20;26951:1;26940:9;26936:17;26929:47;26993:131;27119:4;26993:131;:::i;:::-;26985:139;;26712:419;;;:::o;27137:179::-;27277:31;27273:1;27265:6;27261:14;27254:55;27137:179;:::o;27322:366::-;27464:3;27485:67;27549:2;27544:3;27485:67;:::i;:::-;27478:74;;27561:93;27650:3;27561:93;:::i;:::-;27679:2;27674:3;27670:12;27663:19;;27322:366;;;:::o;27694:419::-;27860:4;27898:2;27887:9;27883:18;27875:26;;27947:9;27941:4;27937:20;27933:1;27922:9;27918:17;27911:47;27975:131;28101:4;27975:131;:::i;:::-;27967:139;;27694:419;;;:::o;28119:147::-;28220:11;28257:3;28242:18;;28119:147;;;;:::o;28272:114::-;;:::o;28392:398::-;28551:3;28572:83;28653:1;28648:3;28572:83;:::i;:::-;28565:90;;28664:93;28753:3;28664:93;:::i;:::-;28782:1;28777:3;28773:11;28766:18;;28392:398;;;:::o;28796:379::-;28980:3;29002:147;29145:3;29002:147;:::i;:::-;28995:154;;29166:3;29159:10;;28796:379;;;:::o;29181:245::-;29321:34;29317:1;29309:6;29305:14;29298:58;29390:28;29385:2;29377:6;29373:15;29366:53;29181:245;:::o;29432:366::-;29574:3;29595:67;29659:2;29654:3;29595:67;:::i;:::-;29588:74;;29671:93;29760:3;29671:93;:::i;:::-;29789:2;29784:3;29780:12;29773:19;;29432:366;;;:::o;29804:419::-;29970:4;30008:2;29997:9;29993:18;29985:26;;30057:9;30051:4;30047:20;30043:1;30032:9;30028:17;30021:47;30085:131;30211:4;30085:131;:::i;:::-;30077:139;;29804:419;;;:::o;30229:175::-;30369:27;30365:1;30357:6;30353:14;30346:51;30229:175;:::o;30410:366::-;30552:3;30573:67;30637:2;30632:3;30573:67;:::i;:::-;30566:74;;30649:93;30738:3;30649:93;:::i;:::-;30767:2;30762:3;30758:12;30751:19;;30410:366;;;:::o;30782:419::-;30948:4;30986:2;30975:9;30971:18;30963:26;;31035:9;31029:4;31025:20;31021:1;31010:9;31006:17;30999:47;31063:131;31189:4;31063:131;:::i;:::-;31055:139;;30782:419;;;:::o;31207:237::-;31347:34;31343:1;31335:6;31331:14;31324:58;31416:20;31411:2;31403:6;31399:15;31392:45;31207:237;:::o;31450:366::-;31592:3;31613:67;31677:2;31672:3;31613:67;:::i;:::-;31606:74;;31689:93;31778:3;31689:93;:::i;:::-;31807:2;31802:3;31798:12;31791:19;;31450:366;;;:::o;31822:419::-;31988:4;32026:2;32015:9;32011:18;32003:26;;32075:9;32069:4;32065:20;32061:1;32050:9;32046:17;32039:47;32103:131;32229:4;32103:131;:::i;:::-;32095:139;;31822:419;;;:::o;32247:435::-;32427:3;32449:95;32540:3;32531:6;32449:95;:::i;:::-;32442:102;;32561:95;32652:3;32643:6;32561:95;:::i;:::-;32554:102;;32673:3;32666:10;;32247:435;;;;;:::o;32688:98::-;32739:6;32773:5;32767:12;32757:22;;32688:98;;;:::o;32792:168::-;32875:11;32909:6;32904:3;32897:19;32949:4;32944:3;32940:14;32925:29;;32792:168;;;;:::o;32966:360::-;33052:3;33080:38;33112:5;33080:38;:::i;:::-;33134:70;33197:6;33192:3;33134:70;:::i;:::-;33127:77;;33213:52;33258:6;33253:3;33246:4;33239:5;33235:16;33213:52;:::i;:::-;33290:29;33312:6;33290:29;:::i;:::-;33285:3;33281:39;33274:46;;33056:270;32966:360;;;;:::o;33332:640::-;33527:4;33565:3;33554:9;33550:19;33542:27;;33579:71;33647:1;33636:9;33632:17;33623:6;33579:71;:::i;:::-;33660:72;33728:2;33717:9;33713:18;33704:6;33660:72;:::i;:::-;33742;33810:2;33799:9;33795:18;33786:6;33742:72;:::i;:::-;33861:9;33855:4;33851:20;33846:2;33835:9;33831:18;33824:48;33889:76;33960:4;33951:6;33889:76;:::i;:::-;33881:84;;33332:640;;;;;;;:::o;33978:141::-;34034:5;34065:6;34059:13;34050:22;;34081:32;34107:5;34081:32;:::i;:::-;33978:141;;;;:::o;34125:349::-;34194:6;34243:2;34231:9;34222:7;34218:23;34214:32;34211:119;;;34249:79;;:::i;:::-;34211:119;34369:1;34394:63;34449:7;34440:6;34429:9;34425:22;34394:63;:::i;:::-;34384:73;;34340:127;34125:349;;;;:::o;34480:180::-;34528:77;34525:1;34518:88;34625:4;34622:1;34615:15;34649:4;34646:1;34639:15;34666:185;34706:1;34723:20;34741:1;34723:20;:::i;:::-;34718:25;;34757:20;34775:1;34757:20;:::i;:::-;34752:25;;34796:1;34786:35;;34801:18;;:::i;:::-;34786:35;34843:1;34840;34836:9;34831:14;;34666:185;;;;:::o;34857:176::-;34889:1;34906:20;34924:1;34906:20;:::i;:::-;34901:25;;34940:20;34958:1;34940:20;:::i;:::-;34935:25;;34979:1;34969:35;;34984:18;;:::i;:::-;34969:35;35025:1;35022;35018:9;35013:14;;34857:176;;;;:::o;35039:180::-;35087:77;35084:1;35077:88;35184:4;35181:1;35174:15;35208:4;35205:1;35198:15;35225:182;35365:34;35361:1;35353:6;35349:14;35342:58;35225:182;:::o;35413:366::-;35555:3;35576:67;35640:2;35635:3;35576:67;:::i;:::-;35569:74;;35652:93;35741:3;35652:93;:::i;:::-;35770:2;35765:3;35761:12;35754:19;;35413:366;;;:::o;35785:419::-;35951:4;35989:2;35978:9;35974:18;35966:26;;36038:9;36032:4;36028:20;36024:1;36013:9;36009:17;36002:47;36066:131;36192:4;36066:131;:::i;:::-;36058:139;;35785:419;;;:::o;36210:178::-;36350:30;36346:1;36338:6;36334:14;36327:54;36210:178;:::o;36394:366::-;36536:3;36557:67;36621:2;36616:3;36557:67;:::i;:::-;36550:74;;36633:93;36722:3;36633:93;:::i;:::-;36751:2;36746:3;36742:12;36735:19;;36394:366;;;:::o;36766:419::-;36932:4;36970:2;36959:9;36955:18;36947:26;;37019:9;37013:4;37009:20;37005:1;36994:9;36990:17;36983:47;37047:131;37173:4;37047:131;:::i;:::-;37039:139;;36766:419;;;:::o
Swarm Source
ipfs://3e7c43013bb6885b62a9149c299900f0764cb15b74e961ac2a39ae5f417632ae
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.