ERC-721
Overview
Max Total Supply
149 FPDS
Holders
82
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
0 FPDSLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
FPDSNFT
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-10-09 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/FPDS.sol pragma solidity ^0.8.0; contract FPDSNFT is ERC721Enumerable, Ownable { using SafeMath for uint256; string public baseTokenURI; uint256 public price = 0.05 ether; uint256 public saleState = 0; // 0 = paused, 1 = presale, 2 = live uint256 public constant MAX_PANDAS = 1200; // withdraw addresses address[] public adminList; // List of addresses that have a number of reserved tokens for presale mapping(address => uint256) public preSaleReserved; constructor(string memory baseURI) ERC721("FantomPandas", "FPDS") { setBaseURI(baseURI); } // Override so the openzeppelin tokenURI() method will use this method to create the full tokenURI instead function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function mint(uint256 num) public payable { uint256 supply = totalSupply(); require(saleState > 1, "Sale not live"); require(num < 10, "You can mint a maximum of 10 fantastic Pandas"); require(supply + num <= MAX_PANDAS, "Exceeds maximum Pandas supply"); require(msg.value >= price * num, "Ether sent is not correct"); for (uint256 i; i < num; i++) { _safeMint(msg.sender, supply + i); } } function preSaleMint(uint256 num) public payable { uint256 supply = totalSupply(); uint256 reservedAmt = preSaleReserved[msg.sender]; require(saleState > 0, "Presale isn't active"); require(reservedAmt > 0, "No tokens reserved for address"); require(num <= reservedAmt, "Can't mint more than reserved"); require(supply + num <= MAX_PANDAS, "Exceeds maximum Pandas supply"); require(msg.value >= price * num, "Ether sent is not correct"); preSaleReserved[msg.sender] = reservedAmt - num; for (uint256 i; i < num; i++) { _safeMint(msg.sender, supply + i); } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); uint256[] memory tokensId = new uint256[](tokenCount); for (uint256 i; i < tokenCount; i++) { tokensId[i] = tokenOfOwnerByIndex(_owner, i); } return tokensId; } // Edit reserved presale spots function setPreSaleWhitelist(address[] memory _a) public onlyOwner { for (uint256 i; i < _a.length; i++) { preSaleReserved[_a[i]] = 10; } } function setPrice(uint256 _newPrice) public onlyOwner { price = _newPrice; } function setBaseURI(string memory baseURI) public onlyOwner { baseTokenURI = baseURI; } function giveAway(address _to, uint256 _num) external onlyOwner { uint256 supply = totalSupply(); for (uint256 i; i < _num; i++) { _safeMint(_to, supply + i); } } function setSaleState(uint256 _saleState) public onlyOwner { saleState = _saleState; } function setAddresses(address[] memory _f) public onlyOwner { adminList = _f; } function withdraw() public onlyOwner { uint256 balance = address(this).balance; uint256 len = adminList.length; if (len > 0) { uint256 _each = balance / adminList.length; for (uint256 i = 0; i < adminList.length; i++) { require(payable(adminList[i]).send(_each)); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PANDAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminList","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"_to","type":"address"},{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSaleReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_f","type":"address[]"}],"name":"setAddresses","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":"address[]","name":"_a","type":"address[]"}],"name":"setPreSaleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleState","type":"uint256"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405266b1a2bc2ec50000600c556000600d553480156200002157600080fd5b5060405162004fe238038062004fe283398181016040528101906200004791906200050f565b6040518060400160405280600c81526020017f46616e746f6d50616e64617300000000000000000000000000000000000000008152506040518060400160405280600481526020017f46504453000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000cb929190620002c2565b508060019080519060200190620000e4929190620002c2565b50505062000107620000fb6200011f60201b60201c565b6200012760201b60201c565b6200011881620001ed60201b60201c565b5062000648565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001fd6200011f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002236200029860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200027c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200027390620005c1565b60405180910390fd5b80600b908051906020019062000294929190620002c2565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002d09062000612565b90600052602060002090601f016020900481019282620002f4576000855562000340565b82601f106200030f57805160ff191683800117855562000340565b8280016001018555821562000340579182015b828111156200033f57825182559160200191906001019062000322565b5b5090506200034f919062000353565b5090565b5b808211156200036e57600081600090555060010162000354565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003db8262000390565b810181811067ffffffffffffffff82111715620003fd57620003fc620003a1565b5b80604052505050565b60006200041262000372565b9050620004208282620003d0565b919050565b600067ffffffffffffffff821115620004435762000442620003a1565b5b6200044e8262000390565b9050602081019050919050565b60005b838110156200047b5780820151818401526020810190506200045e565b838111156200048b576000848401525b50505050565b6000620004a8620004a28462000425565b62000406565b905082815260208101848484011115620004c757620004c66200038b565b5b620004d48482856200045b565b509392505050565b600082601f830112620004f457620004f362000386565b5b81516200050684826020860162000491565b91505092915050565b6000602082840312156200052857620005276200037c565b5b600082015167ffffffffffffffff81111562000549576200054862000381565b5b6200055784828501620004dc565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620005a960208362000560565b9150620005b68262000571565b602082019050919050565b60006020820190508181036000830152620005dc816200059a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200062b57607f821691505b60208210811415620006425762000641620005e3565b5b50919050565b61498a80620006586000396000f3fe6080604052600436106102045760003560e01c806370a0823111610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd1461075b578063ca80014414610798578063d547cfb7146107c1578063e985e9c5146107ec578063f2fde38b1461082957610204565b8063a22cb465146106b7578063b88d4fde146106e0578063b957172114610709578063bd4a82e41461073257610204565b806391b7f5ed116100e757806391b7f5ed146105df578063928e80151461060857806395d89b4114610645578063a035b1fe14610670578063a0712d681461069b57610204565b806370a0823114610544578063715018a6146105815780637835c635146105985780638da5cb5b146105b457610204565b806323b872dd1161019b578063438b63001161016a578063438b6300146104395780634f6ccce71461047657806355f804b3146104b3578063603f4d52146104dc5780636352211e1461050757610204565b806323b872dd146103935780632f745c59146103bc5780633ccfd60b146103f957806342842e0e1461041057610204565b8063095ea7b3116101d7578063095ea7b3146102d75780631056b16d1461030057806311117fc81461032b57806318160ddd1461036857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063084c4088146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061306d565b610852565b60405161023d91906130b5565b60405180910390f35b34801561025257600080fd5b5061025b6108cc565b6040516102689190613169565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906131c1565b61095e565b6040516102a5919061322f565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906131c1565b6109e3565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190613276565b610a69565b005b34801561030c57600080fd5b50610315610b81565b60405161032291906132c5565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d91906131c1565b610b87565b60405161035f919061322f565b60405180910390f35b34801561037457600080fd5b5061037d610bc6565b60405161038a91906132c5565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b591906132e0565b610bd3565b005b3480156103c857600080fd5b506103e360048036038101906103de9190613276565b610c33565b6040516103f091906132c5565b60405180910390f35b34801561040557600080fd5b5061040e610cd8565b005b34801561041c57600080fd5b50610437600480360381019061043291906132e0565b610e27565b005b34801561044557600080fd5b50610460600480360381019061045b9190613333565b610e47565b60405161046d919061341e565b60405180910390f35b34801561048257600080fd5b5061049d600480360381019061049891906131c1565b610ef5565b6040516104aa91906132c5565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190613575565b610f66565b005b3480156104e857600080fd5b506104f1610ffc565b6040516104fe91906132c5565b60405180910390f35b34801561051357600080fd5b5061052e600480360381019061052991906131c1565b611002565b60405161053b919061322f565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190613333565b6110b4565b60405161057891906132c5565b60405180910390f35b34801561058d57600080fd5b5061059661116c565b005b6105b260048036038101906105ad91906131c1565b6111f4565b005b3480156105c057600080fd5b506105c9611437565b6040516105d6919061322f565b60405180910390f35b3480156105eb57600080fd5b50610606600480360381019061060191906131c1565b611461565b005b34801561061457600080fd5b5061062f600480360381019061062a9190613333565b6114e7565b60405161063c91906132c5565b60405180910390f35b34801561065157600080fd5b5061065a6114ff565b6040516106679190613169565b60405180910390f35b34801561067c57600080fd5b50610685611591565b60405161069291906132c5565b60405180910390f35b6106b560048036038101906106b091906131c1565b611597565b005b3480156106c357600080fd5b506106de60048036038101906106d991906135ea565b611703565b005b3480156106ec57600080fd5b50610707600480360381019061070291906136cb565b611884565b005b34801561071557600080fd5b50610730600480360381019061072b9190613816565b6118e6565b005b34801561073e57600080fd5b5061075960048036038101906107549190613816565b61197c565b005b34801561076757600080fd5b50610782600480360381019061077d91906131c1565b611a7a565b60405161078f9190613169565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba9190613276565b611b21565b005b3480156107cd57600080fd5b506107d6611be2565b6040516107e39190613169565b60405180910390f35b3480156107f857600080fd5b50610813600480360381019061080e919061385f565b611c70565b60405161082091906130b5565b60405180910390f35b34801561083557600080fd5b50610850600480360381019061084b9190613333565b611d04565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c557506108c482611dfc565b5b9050919050565b6060600080546108db906138ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610907906138ce565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905090565b600061096982611ede565b6109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f90613972565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109eb611f4a565b73ffffffffffffffffffffffffffffffffffffffff16610a09611437565b73ffffffffffffffffffffffffffffffffffffffff1614610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a56906139de565b60405180910390fd5b80600d8190555050565b6000610a7482611002565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc90613a70565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b04611f4a565b73ffffffffffffffffffffffffffffffffffffffff161480610b335750610b3281610b2d611f4a565b611c70565b5b610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990613b02565b60405180910390fd5b610b7c8383611f52565b505050565b6104b081565b600e8181548110610b9757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b610be4610bde611f4a565b8261200b565b610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90613b94565b60405180910390fd5b610c2e8383836120e9565b505050565b6000610c3e836110b4565b8210610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7690613c26565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ce0611f4a565b73ffffffffffffffffffffffffffffffffffffffff16610cfe611437565b73ffffffffffffffffffffffffffffffffffffffff1614610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b906139de565b60405180910390fd5b60004790506000600e8054905090506000811115610e23576000600e8054905083610d7f9190613ca4565b905060005b600e80549050811015610e2057600e8181548110610da557610da4613cd5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050610e0d57600080fd5b8080610e1890613d04565b915050610d84565b50505b5050565b610e4283838360405180602001604052806000815250611884565b505050565b60606000610e54836110b4565b905060008167ffffffffffffffff811115610e7257610e7161344a565b5b604051908082528060200260200182016040528015610ea05781602001602082028036833780820191505090505b50905060005b82811015610eea57610eb88582610c33565b828281518110610ecb57610eca613cd5565b5b6020026020010181815250508080610ee290613d04565b915050610ea6565b508092505050919050565b6000610eff610bc6565b8210610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790613dbf565b60405180910390fd5b60088281548110610f5457610f53613cd5565b5b90600052602060002001549050919050565b610f6e611f4a565b73ffffffffffffffffffffffffffffffffffffffff16610f8c611437565b73ffffffffffffffffffffffffffffffffffffffff1614610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd9906139de565b60405180910390fd5b80600b9080519060200190610ff8929190612ed4565b5050565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a290613e51565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90613ee3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611174611f4a565b73ffffffffffffffffffffffffffffffffffffffff16611192611437565b73ffffffffffffffffffffffffffffffffffffffff16146111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df906139de565b60405180910390fd5b6111f26000612345565b565b60006111fe610bc6565b90506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600d5411611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128090613f4f565b60405180910390fd5b600081116112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c390613fbb565b60405180910390fd5b8083111561130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690614027565b60405180910390fd5b6104b0838361131e9190614047565b111561135f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611356906140e9565b60405180910390fd5b82600c5461136d9190614109565b3410156113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a6906141af565b60405180910390fd5b82816113bb91906141cf565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b838110156114315761141e3382856114199190614047565b61240b565b808061142990613d04565b915050611401565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611469611f4a565b73ffffffffffffffffffffffffffffffffffffffff16611487611437565b73ffffffffffffffffffffffffffffffffffffffff16146114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d4906139de565b60405180910390fd5b80600c8190555050565b600f6020528060005260406000206000915090505481565b60606001805461150e906138ce565b80601f016020809104026020016040519081016040528092919081815260200182805461153a906138ce565b80156115875780601f1061155c57610100808354040283529160200191611587565b820191906000526020600020905b81548152906001019060200180831161156a57829003601f168201915b5050505050905090565b600c5481565b60006115a1610bc6565b90506001600d54116115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061424f565b60405180910390fd5b600a821061162b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611622906142e1565b60405180910390fd5b6104b0828261163a9190614047565b111561167b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611672906140e9565b60405180910390fd5b81600c546116899190614109565b3410156116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c2906141af565b60405180910390fd5b60005b828110156116fe576116eb3382846116e69190614047565b61240b565b80806116f690613d04565b9150506116ce565b505050565b61170b611f4a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117709061434d565b60405180910390fd5b8060056000611786611f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611833611f4a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161187891906130b5565b60405180910390a35050565b61189561188f611f4a565b8361200b565b6118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cb90613b94565b60405180910390fd5b6118e084848484612429565b50505050565b6118ee611f4a565b73ffffffffffffffffffffffffffffffffffffffff1661190c611437565b73ffffffffffffffffffffffffffffffffffffffff1614611962576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611959906139de565b60405180910390fd5b80600e9080519060200190611978929190612f5a565b5050565b611984611f4a565b73ffffffffffffffffffffffffffffffffffffffff166119a2611437565b73ffffffffffffffffffffffffffffffffffffffff16146119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef906139de565b60405180910390fd5b60005b8151811015611a7657600a600f6000848481518110611a1d57611a1c613cd5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611a6e90613d04565b9150506119fb565b5050565b6060611a8582611ede565b611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb906143df565b60405180910390fd5b6000611ace612485565b90506000815111611aee5760405180602001604052806000815250611b19565b80611af884612517565b604051602001611b0992919061443b565b6040516020818303038152906040525b915050919050565b611b29611f4a565b73ffffffffffffffffffffffffffffffffffffffff16611b47611437565b73ffffffffffffffffffffffffffffffffffffffff1614611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b94906139de565b60405180910390fd5b6000611ba7610bc6565b905060005b82811015611bdc57611bc9848284611bc49190614047565b61240b565b8080611bd490613d04565b915050611bac565b50505050565b600b8054611bef906138ce565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1b906138ce565b8015611c685780601f10611c3d57610100808354040283529160200191611c68565b820191906000526020600020905b815481529060010190602001808311611c4b57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d0c611f4a565b73ffffffffffffffffffffffffffffffffffffffff16611d2a611437565b73ffffffffffffffffffffffffffffffffffffffff1614611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d77906139de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de7906144d1565b60405180910390fd5b611df981612345565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ec757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ed75750611ed682612678565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611fc583611002565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061201682611ede565b612055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204c90614563565b60405180910390fd5b600061206083611002565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120cf57508373ffffffffffffffffffffffffffffffffffffffff166120b78461095e565b73ffffffffffffffffffffffffffffffffffffffff16145b806120e057506120df8185611c70565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661210982611002565b73ffffffffffffffffffffffffffffffffffffffff161461215f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612156906145f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c690614687565b60405180910390fd5b6121da8383836126e2565b6121e5600082611f52565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461223591906141cf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461228c9190614047565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124258282604051806020016040528060008152506127f6565b5050565b6124348484846120e9565b61244084848484612851565b61247f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247690614719565b60405180910390fd5b50505050565b6060600b8054612494906138ce565b80601f01602080910402602001604051908101604052809291908181526020018280546124c0906138ce565b801561250d5780601f106124e25761010080835404028352916020019161250d565b820191906000526020600020905b8154815290600101906020018083116124f057829003601f168201915b5050505050905090565b6060600082141561255f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612673565b600082905060005b6000821461259157808061257a90613d04565b915050600a8261258a9190613ca4565b9150612567565b60008167ffffffffffffffff8111156125ad576125ac61344a565b5b6040519080825280601f01601f1916602001820160405280156125df5781602001600182028036833780820191505090505b5090505b6000851461266c576001826125f891906141cf565b9150600a856126079190614739565b60306126139190614047565b60f81b81838151811061262957612628613cd5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126659190613ca4565b94506125e3565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126ed8383836129e8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127305761272b816129ed565b61276f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461276e5761276d8382612a36565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b2576127ad81612ba3565b6127f1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146127f0576127ef8282612c74565b5b5b505050565b6128008383612cf3565b61280d6000848484612851565b61284c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284390614719565b60405180910390fd5b505050565b60006128728473ffffffffffffffffffffffffffffffffffffffff16612ec1565b156129db578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261289b611f4a565b8786866040518563ffffffff1660e01b81526004016128bd94939291906147bf565b602060405180830381600087803b1580156128d757600080fd5b505af192505050801561290857506040513d601f19601f820116820180604052508101906129059190614820565b60015b61298b573d8060008114612938576040519150601f19603f3d011682016040523d82523d6000602084013e61293d565b606091505b50600081511415612983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297a90614719565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129e0565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a43846110b4565b612a4d91906141cf565b9050600060076000848152602001908152602001600020549050818114612b32576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bb791906141cf565b9050600060096000848152602001908152602001600020549050600060088381548110612be757612be6613cd5565b5b906000526020600020015490508060088381548110612c0957612c08613cd5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c5857612c5761484d565b5b6001900381819060005260206000200160009055905550505050565b6000612c7f836110b4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5a906148c8565b60405180910390fd5b612d6c81611ede565b15612dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da390614934565b60405180910390fd5b612db8600083836126e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e089190614047565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612ee0906138ce565b90600052602060002090601f016020900481019282612f025760008555612f49565b82601f10612f1b57805160ff1916838001178555612f49565b82800160010185558215612f49579182015b82811115612f48578251825591602001919060010190612f2d565b5b509050612f569190612fe4565b5090565b828054828255906000526020600020908101928215612fd3579160200282015b82811115612fd25782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612f7a565b5b509050612fe09190612fe4565b5090565b5b80821115612ffd576000816000905550600101612fe5565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61304a81613015565b811461305557600080fd5b50565b60008135905061306781613041565b92915050565b6000602082840312156130835761308261300b565b5b600061309184828501613058565b91505092915050565b60008115159050919050565b6130af8161309a565b82525050565b60006020820190506130ca60008301846130a6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561310a5780820151818401526020810190506130ef565b83811115613119576000848401525b50505050565b6000601f19601f8301169050919050565b600061313b826130d0565b61314581856130db565b93506131558185602086016130ec565b61315e8161311f565b840191505092915050565b600060208201905081810360008301526131838184613130565b905092915050565b6000819050919050565b61319e8161318b565b81146131a957600080fd5b50565b6000813590506131bb81613195565b92915050565b6000602082840312156131d7576131d661300b565b5b60006131e5848285016131ac565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613219826131ee565b9050919050565b6132298161320e565b82525050565b60006020820190506132446000830184613220565b92915050565b6132538161320e565b811461325e57600080fd5b50565b6000813590506132708161324a565b92915050565b6000806040838503121561328d5761328c61300b565b5b600061329b85828601613261565b92505060206132ac858286016131ac565b9150509250929050565b6132bf8161318b565b82525050565b60006020820190506132da60008301846132b6565b92915050565b6000806000606084860312156132f9576132f861300b565b5b600061330786828701613261565b935050602061331886828701613261565b9250506040613329868287016131ac565b9150509250925092565b6000602082840312156133495761334861300b565b5b600061335784828501613261565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133958161318b565b82525050565b60006133a7838361338c565b60208301905092915050565b6000602082019050919050565b60006133cb82613360565b6133d5818561336b565b93506133e08361337c565b8060005b838110156134115781516133f8888261339b565b9750613403836133b3565b9250506001810190506133e4565b5085935050505092915050565b6000602082019050818103600083015261343881846133c0565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134828261311f565b810181811067ffffffffffffffff821117156134a1576134a061344a565b5b80604052505050565b60006134b4613001565b90506134c08282613479565b919050565b600067ffffffffffffffff8211156134e0576134df61344a565b5b6134e98261311f565b9050602081019050919050565b82818337600083830152505050565b6000613518613513846134c5565b6134aa565b90508281526020810184848401111561353457613533613445565b5b61353f8482856134f6565b509392505050565b600082601f83011261355c5761355b613440565b5b813561356c848260208601613505565b91505092915050565b60006020828403121561358b5761358a61300b565b5b600082013567ffffffffffffffff8111156135a9576135a8613010565b5b6135b584828501613547565b91505092915050565b6135c78161309a565b81146135d257600080fd5b50565b6000813590506135e4816135be565b92915050565b600080604083850312156136015761360061300b565b5b600061360f85828601613261565b9250506020613620858286016135d5565b9150509250929050565b600067ffffffffffffffff8211156136455761364461344a565b5b61364e8261311f565b9050602081019050919050565b600061366e6136698461362a565b6134aa565b90508281526020810184848401111561368a57613689613445565b5b6136958482856134f6565b509392505050565b600082601f8301126136b2576136b1613440565b5b81356136c284826020860161365b565b91505092915050565b600080600080608085870312156136e5576136e461300b565b5b60006136f387828801613261565b945050602061370487828801613261565b9350506040613715878288016131ac565b925050606085013567ffffffffffffffff81111561373657613735613010565b5b6137428782880161369d565b91505092959194509250565b600067ffffffffffffffff8211156137695761376861344a565b5b602082029050602081019050919050565b600080fd5b600061379261378d8461374e565b6134aa565b905080838252602082019050602084028301858111156137b5576137b461377a565b5b835b818110156137de57806137ca8882613261565b8452602084019350506020810190506137b7565b5050509392505050565b600082601f8301126137fd576137fc613440565b5b813561380d84826020860161377f565b91505092915050565b60006020828403121561382c5761382b61300b565b5b600082013567ffffffffffffffff81111561384a57613849613010565b5b613856848285016137e8565b91505092915050565b600080604083850312156138765761387561300b565b5b600061388485828601613261565b925050602061389585828601613261565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138e657607f821691505b602082108114156138fa576138f961389f565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061395c602c836130db565b915061396782613900565b604082019050919050565b6000602082019050818103600083015261398b8161394f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139c86020836130db565b91506139d382613992565b602082019050919050565b600060208201905081810360008301526139f7816139bb565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a5a6021836130db565b9150613a65826139fe565b604082019050919050565b60006020820190508181036000830152613a8981613a4d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613aec6038836130db565b9150613af782613a90565b604082019050919050565b60006020820190508181036000830152613b1b81613adf565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613b7e6031836130db565b9150613b8982613b22565b604082019050919050565b60006020820190508181036000830152613bad81613b71565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613c10602b836130db565b9150613c1b82613bb4565b604082019050919050565b60006020820190508181036000830152613c3f81613c03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613caf8261318b565b9150613cba8361318b565b925082613cca57613cc9613c46565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613d0f8261318b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d4257613d41613c75565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613da9602c836130db565b9150613db482613d4d565b604082019050919050565b60006020820190508181036000830152613dd881613d9c565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613e3b6029836130db565b9150613e4682613ddf565b604082019050919050565b60006020820190508181036000830152613e6a81613e2e565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613ecd602a836130db565b9150613ed882613e71565b604082019050919050565b60006020820190508181036000830152613efc81613ec0565b9050919050565b7f50726573616c652069736e277420616374697665000000000000000000000000600082015250565b6000613f396014836130db565b9150613f4482613f03565b602082019050919050565b60006020820190508181036000830152613f6881613f2c565b9050919050565b7f4e6f20746f6b656e7320726573657276656420666f7220616464726573730000600082015250565b6000613fa5601e836130db565b9150613fb082613f6f565b602082019050919050565b60006020820190508181036000830152613fd481613f98565b9050919050565b7f43616e2774206d696e74206d6f7265207468616e207265736572766564000000600082015250565b6000614011601d836130db565b915061401c82613fdb565b602082019050919050565b6000602082019050818103600083015261404081614004565b9050919050565b60006140528261318b565b915061405d8361318b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561409257614091613c75565b5b828201905092915050565b7f45786365656473206d6178696d756d2050616e64617320737570706c79000000600082015250565b60006140d3601d836130db565b91506140de8261409d565b602082019050919050565b60006020820190508181036000830152614102816140c6565b9050919050565b60006141148261318b565b915061411f8361318b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561415857614157613c75565b5b828202905092915050565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b60006141996019836130db565b91506141a482614163565b602082019050919050565b600060208201905081810360008301526141c88161418c565b9050919050565b60006141da8261318b565b91506141e58361318b565b9250828210156141f8576141f7613c75565b5b828203905092915050565b7f53616c65206e6f74206c69766500000000000000000000000000000000000000600082015250565b6000614239600d836130db565b915061424482614203565b602082019050919050565b600060208201905081810360008301526142688161422c565b9050919050565b7f596f752063616e206d696e742061206d6178696d756d206f662031302066616e60008201527f7461737469632050616e64617300000000000000000000000000000000000000602082015250565b60006142cb602d836130db565b91506142d68261426f565b604082019050919050565b600060208201905081810360008301526142fa816142be565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143376019836130db565b915061434282614301565b602082019050919050565b600060208201905081810360008301526143668161432a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143c9602f836130db565b91506143d48261436d565b604082019050919050565b600060208201905081810360008301526143f8816143bc565b9050919050565b600081905092915050565b6000614415826130d0565b61441f81856143ff565b935061442f8185602086016130ec565b80840191505092915050565b6000614447828561440a565b9150614453828461440a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006144bb6026836130db565b91506144c68261445f565b604082019050919050565b600060208201905081810360008301526144ea816144ae565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061454d602c836130db565b9150614558826144f1565b604082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006145df6029836130db565b91506145ea82614583565b604082019050919050565b6000602082019050818103600083015261460e816145d2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006146716024836130db565b915061467c82614615565b604082019050919050565b600060208201905081810360008301526146a081614664565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147036032836130db565b915061470e826146a7565b604082019050919050565b60006020820190508181036000830152614732816146f6565b9050919050565b60006147448261318b565b915061474f8361318b565b92508261475f5761475e613c46565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147918261476a565b61479b8185614775565b93506147ab8185602086016130ec565b6147b48161311f565b840191505092915050565b60006080820190506147d46000830187613220565b6147e16020830186613220565b6147ee60408301856132b6565b81810360608301526148008184614786565b905095945050505050565b60008151905061481a81613041565b92915050565b6000602082840312156148365761483561300b565b5b60006148448482850161480b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006148b26020836130db565b91506148bd8261487c565b602082019050919050565b600060208201905081810360008301526148e1816148a5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061491e601c836130db565b9150614929826148e8565b602082019050919050565b6000602082019050818103600083015261494d81614911565b905091905056fea2646970667358221220b1b8d6989f29ed6fa9da3404c0d416214e79390360bc9ed6368cf7c0256c6b2964736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102045760003560e01c806370a0823111610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd1461075b578063ca80014414610798578063d547cfb7146107c1578063e985e9c5146107ec578063f2fde38b1461082957610204565b8063a22cb465146106b7578063b88d4fde146106e0578063b957172114610709578063bd4a82e41461073257610204565b806391b7f5ed116100e757806391b7f5ed146105df578063928e80151461060857806395d89b4114610645578063a035b1fe14610670578063a0712d681461069b57610204565b806370a0823114610544578063715018a6146105815780637835c635146105985780638da5cb5b146105b457610204565b806323b872dd1161019b578063438b63001161016a578063438b6300146104395780634f6ccce71461047657806355f804b3146104b3578063603f4d52146104dc5780636352211e1461050757610204565b806323b872dd146103935780632f745c59146103bc5780633ccfd60b146103f957806342842e0e1461041057610204565b8063095ea7b3116101d7578063095ea7b3146102d75780631056b16d1461030057806311117fc81461032b57806318160ddd1461036857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063084c4088146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061306d565b610852565b60405161023d91906130b5565b60405180910390f35b34801561025257600080fd5b5061025b6108cc565b6040516102689190613169565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906131c1565b61095e565b6040516102a5919061322f565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906131c1565b6109e3565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190613276565b610a69565b005b34801561030c57600080fd5b50610315610b81565b60405161032291906132c5565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d91906131c1565b610b87565b60405161035f919061322f565b60405180910390f35b34801561037457600080fd5b5061037d610bc6565b60405161038a91906132c5565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b591906132e0565b610bd3565b005b3480156103c857600080fd5b506103e360048036038101906103de9190613276565b610c33565b6040516103f091906132c5565b60405180910390f35b34801561040557600080fd5b5061040e610cd8565b005b34801561041c57600080fd5b50610437600480360381019061043291906132e0565b610e27565b005b34801561044557600080fd5b50610460600480360381019061045b9190613333565b610e47565b60405161046d919061341e565b60405180910390f35b34801561048257600080fd5b5061049d600480360381019061049891906131c1565b610ef5565b6040516104aa91906132c5565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190613575565b610f66565b005b3480156104e857600080fd5b506104f1610ffc565b6040516104fe91906132c5565b60405180910390f35b34801561051357600080fd5b5061052e600480360381019061052991906131c1565b611002565b60405161053b919061322f565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190613333565b6110b4565b60405161057891906132c5565b60405180910390f35b34801561058d57600080fd5b5061059661116c565b005b6105b260048036038101906105ad91906131c1565b6111f4565b005b3480156105c057600080fd5b506105c9611437565b6040516105d6919061322f565b60405180910390f35b3480156105eb57600080fd5b50610606600480360381019061060191906131c1565b611461565b005b34801561061457600080fd5b5061062f600480360381019061062a9190613333565b6114e7565b60405161063c91906132c5565b60405180910390f35b34801561065157600080fd5b5061065a6114ff565b6040516106679190613169565b60405180910390f35b34801561067c57600080fd5b50610685611591565b60405161069291906132c5565b60405180910390f35b6106b560048036038101906106b091906131c1565b611597565b005b3480156106c357600080fd5b506106de60048036038101906106d991906135ea565b611703565b005b3480156106ec57600080fd5b50610707600480360381019061070291906136cb565b611884565b005b34801561071557600080fd5b50610730600480360381019061072b9190613816565b6118e6565b005b34801561073e57600080fd5b5061075960048036038101906107549190613816565b61197c565b005b34801561076757600080fd5b50610782600480360381019061077d91906131c1565b611a7a565b60405161078f9190613169565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba9190613276565b611b21565b005b3480156107cd57600080fd5b506107d6611be2565b6040516107e39190613169565b60405180910390f35b3480156107f857600080fd5b50610813600480360381019061080e919061385f565b611c70565b60405161082091906130b5565b60405180910390f35b34801561083557600080fd5b50610850600480360381019061084b9190613333565b611d04565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c557506108c482611dfc565b5b9050919050565b6060600080546108db906138ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610907906138ce565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905090565b600061096982611ede565b6109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f90613972565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109eb611f4a565b73ffffffffffffffffffffffffffffffffffffffff16610a09611437565b73ffffffffffffffffffffffffffffffffffffffff1614610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a56906139de565b60405180910390fd5b80600d8190555050565b6000610a7482611002565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc90613a70565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b04611f4a565b73ffffffffffffffffffffffffffffffffffffffff161480610b335750610b3281610b2d611f4a565b611c70565b5b610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990613b02565b60405180910390fd5b610b7c8383611f52565b505050565b6104b081565b600e8181548110610b9757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b610be4610bde611f4a565b8261200b565b610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90613b94565b60405180910390fd5b610c2e8383836120e9565b505050565b6000610c3e836110b4565b8210610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7690613c26565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ce0611f4a565b73ffffffffffffffffffffffffffffffffffffffff16610cfe611437565b73ffffffffffffffffffffffffffffffffffffffff1614610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b906139de565b60405180910390fd5b60004790506000600e8054905090506000811115610e23576000600e8054905083610d7f9190613ca4565b905060005b600e80549050811015610e2057600e8181548110610da557610da4613cd5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050610e0d57600080fd5b8080610e1890613d04565b915050610d84565b50505b5050565b610e4283838360405180602001604052806000815250611884565b505050565b60606000610e54836110b4565b905060008167ffffffffffffffff811115610e7257610e7161344a565b5b604051908082528060200260200182016040528015610ea05781602001602082028036833780820191505090505b50905060005b82811015610eea57610eb88582610c33565b828281518110610ecb57610eca613cd5565b5b6020026020010181815250508080610ee290613d04565b915050610ea6565b508092505050919050565b6000610eff610bc6565b8210610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790613dbf565b60405180910390fd5b60088281548110610f5457610f53613cd5565b5b90600052602060002001549050919050565b610f6e611f4a565b73ffffffffffffffffffffffffffffffffffffffff16610f8c611437565b73ffffffffffffffffffffffffffffffffffffffff1614610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd9906139de565b60405180910390fd5b80600b9080519060200190610ff8929190612ed4565b5050565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a290613e51565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90613ee3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611174611f4a565b73ffffffffffffffffffffffffffffffffffffffff16611192611437565b73ffffffffffffffffffffffffffffffffffffffff16146111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df906139de565b60405180910390fd5b6111f26000612345565b565b60006111fe610bc6565b90506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600d5411611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128090613f4f565b60405180910390fd5b600081116112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c390613fbb565b60405180910390fd5b8083111561130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690614027565b60405180910390fd5b6104b0838361131e9190614047565b111561135f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611356906140e9565b60405180910390fd5b82600c5461136d9190614109565b3410156113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a6906141af565b60405180910390fd5b82816113bb91906141cf565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b838110156114315761141e3382856114199190614047565b61240b565b808061142990613d04565b915050611401565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611469611f4a565b73ffffffffffffffffffffffffffffffffffffffff16611487611437565b73ffffffffffffffffffffffffffffffffffffffff16146114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d4906139de565b60405180910390fd5b80600c8190555050565b600f6020528060005260406000206000915090505481565b60606001805461150e906138ce565b80601f016020809104026020016040519081016040528092919081815260200182805461153a906138ce565b80156115875780601f1061155c57610100808354040283529160200191611587565b820191906000526020600020905b81548152906001019060200180831161156a57829003601f168201915b5050505050905090565b600c5481565b60006115a1610bc6565b90506001600d54116115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061424f565b60405180910390fd5b600a821061162b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611622906142e1565b60405180910390fd5b6104b0828261163a9190614047565b111561167b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611672906140e9565b60405180910390fd5b81600c546116899190614109565b3410156116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c2906141af565b60405180910390fd5b60005b828110156116fe576116eb3382846116e69190614047565b61240b565b80806116f690613d04565b9150506116ce565b505050565b61170b611f4a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117709061434d565b60405180910390fd5b8060056000611786611f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611833611f4a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161187891906130b5565b60405180910390a35050565b61189561188f611f4a565b8361200b565b6118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cb90613b94565b60405180910390fd5b6118e084848484612429565b50505050565b6118ee611f4a565b73ffffffffffffffffffffffffffffffffffffffff1661190c611437565b73ffffffffffffffffffffffffffffffffffffffff1614611962576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611959906139de565b60405180910390fd5b80600e9080519060200190611978929190612f5a565b5050565b611984611f4a565b73ffffffffffffffffffffffffffffffffffffffff166119a2611437565b73ffffffffffffffffffffffffffffffffffffffff16146119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef906139de565b60405180910390fd5b60005b8151811015611a7657600a600f6000848481518110611a1d57611a1c613cd5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611a6e90613d04565b9150506119fb565b5050565b6060611a8582611ede565b611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb906143df565b60405180910390fd5b6000611ace612485565b90506000815111611aee5760405180602001604052806000815250611b19565b80611af884612517565b604051602001611b0992919061443b565b6040516020818303038152906040525b915050919050565b611b29611f4a565b73ffffffffffffffffffffffffffffffffffffffff16611b47611437565b73ffffffffffffffffffffffffffffffffffffffff1614611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b94906139de565b60405180910390fd5b6000611ba7610bc6565b905060005b82811015611bdc57611bc9848284611bc49190614047565b61240b565b8080611bd490613d04565b915050611bac565b50505050565b600b8054611bef906138ce565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1b906138ce565b8015611c685780601f10611c3d57610100808354040283529160200191611c68565b820191906000526020600020905b815481529060010190602001808311611c4b57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d0c611f4a565b73ffffffffffffffffffffffffffffffffffffffff16611d2a611437565b73ffffffffffffffffffffffffffffffffffffffff1614611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d77906139de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de7906144d1565b60405180910390fd5b611df981612345565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ec757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ed75750611ed682612678565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611fc583611002565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061201682611ede565b612055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204c90614563565b60405180910390fd5b600061206083611002565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120cf57508373ffffffffffffffffffffffffffffffffffffffff166120b78461095e565b73ffffffffffffffffffffffffffffffffffffffff16145b806120e057506120df8185611c70565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661210982611002565b73ffffffffffffffffffffffffffffffffffffffff161461215f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612156906145f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c690614687565b60405180910390fd5b6121da8383836126e2565b6121e5600082611f52565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461223591906141cf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461228c9190614047565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124258282604051806020016040528060008152506127f6565b5050565b6124348484846120e9565b61244084848484612851565b61247f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247690614719565b60405180910390fd5b50505050565b6060600b8054612494906138ce565b80601f01602080910402602001604051908101604052809291908181526020018280546124c0906138ce565b801561250d5780601f106124e25761010080835404028352916020019161250d565b820191906000526020600020905b8154815290600101906020018083116124f057829003601f168201915b5050505050905090565b6060600082141561255f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612673565b600082905060005b6000821461259157808061257a90613d04565b915050600a8261258a9190613ca4565b9150612567565b60008167ffffffffffffffff8111156125ad576125ac61344a565b5b6040519080825280601f01601f1916602001820160405280156125df5781602001600182028036833780820191505090505b5090505b6000851461266c576001826125f891906141cf565b9150600a856126079190614739565b60306126139190614047565b60f81b81838151811061262957612628613cd5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126659190613ca4565b94506125e3565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126ed8383836129e8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127305761272b816129ed565b61276f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461276e5761276d8382612a36565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b2576127ad81612ba3565b6127f1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146127f0576127ef8282612c74565b5b5b505050565b6128008383612cf3565b61280d6000848484612851565b61284c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284390614719565b60405180910390fd5b505050565b60006128728473ffffffffffffffffffffffffffffffffffffffff16612ec1565b156129db578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261289b611f4a565b8786866040518563ffffffff1660e01b81526004016128bd94939291906147bf565b602060405180830381600087803b1580156128d757600080fd5b505af192505050801561290857506040513d601f19601f820116820180604052508101906129059190614820565b60015b61298b573d8060008114612938576040519150601f19603f3d011682016040523d82523d6000602084013e61293d565b606091505b50600081511415612983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297a90614719565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129e0565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a43846110b4565b612a4d91906141cf565b9050600060076000848152602001908152602001600020549050818114612b32576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bb791906141cf565b9050600060096000848152602001908152602001600020549050600060088381548110612be757612be6613cd5565b5b906000526020600020015490508060088381548110612c0957612c08613cd5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c5857612c5761484d565b5b6001900381819060005260206000200160009055905550505050565b6000612c7f836110b4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5a906148c8565b60405180910390fd5b612d6c81611ede565b15612dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da390614934565b60405180910390fd5b612db8600083836126e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e089190614047565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612ee0906138ce565b90600052602060002090601f016020900481019282612f025760008555612f49565b82601f10612f1b57805160ff1916838001178555612f49565b82800160010185558215612f49579182015b82811115612f48578251825591602001919060010190612f2d565b5b509050612f569190612fe4565b5090565b828054828255906000526020600020908101928215612fd3579160200282015b82811115612fd25782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612f7a565b5b509050612fe09190612fe4565b5090565b5b80821115612ffd576000816000905550600101612fe5565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61304a81613015565b811461305557600080fd5b50565b60008135905061306781613041565b92915050565b6000602082840312156130835761308261300b565b5b600061309184828501613058565b91505092915050565b60008115159050919050565b6130af8161309a565b82525050565b60006020820190506130ca60008301846130a6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561310a5780820151818401526020810190506130ef565b83811115613119576000848401525b50505050565b6000601f19601f8301169050919050565b600061313b826130d0565b61314581856130db565b93506131558185602086016130ec565b61315e8161311f565b840191505092915050565b600060208201905081810360008301526131838184613130565b905092915050565b6000819050919050565b61319e8161318b565b81146131a957600080fd5b50565b6000813590506131bb81613195565b92915050565b6000602082840312156131d7576131d661300b565b5b60006131e5848285016131ac565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613219826131ee565b9050919050565b6132298161320e565b82525050565b60006020820190506132446000830184613220565b92915050565b6132538161320e565b811461325e57600080fd5b50565b6000813590506132708161324a565b92915050565b6000806040838503121561328d5761328c61300b565b5b600061329b85828601613261565b92505060206132ac858286016131ac565b9150509250929050565b6132bf8161318b565b82525050565b60006020820190506132da60008301846132b6565b92915050565b6000806000606084860312156132f9576132f861300b565b5b600061330786828701613261565b935050602061331886828701613261565b9250506040613329868287016131ac565b9150509250925092565b6000602082840312156133495761334861300b565b5b600061335784828501613261565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133958161318b565b82525050565b60006133a7838361338c565b60208301905092915050565b6000602082019050919050565b60006133cb82613360565b6133d5818561336b565b93506133e08361337c565b8060005b838110156134115781516133f8888261339b565b9750613403836133b3565b9250506001810190506133e4565b5085935050505092915050565b6000602082019050818103600083015261343881846133c0565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134828261311f565b810181811067ffffffffffffffff821117156134a1576134a061344a565b5b80604052505050565b60006134b4613001565b90506134c08282613479565b919050565b600067ffffffffffffffff8211156134e0576134df61344a565b5b6134e98261311f565b9050602081019050919050565b82818337600083830152505050565b6000613518613513846134c5565b6134aa565b90508281526020810184848401111561353457613533613445565b5b61353f8482856134f6565b509392505050565b600082601f83011261355c5761355b613440565b5b813561356c848260208601613505565b91505092915050565b60006020828403121561358b5761358a61300b565b5b600082013567ffffffffffffffff8111156135a9576135a8613010565b5b6135b584828501613547565b91505092915050565b6135c78161309a565b81146135d257600080fd5b50565b6000813590506135e4816135be565b92915050565b600080604083850312156136015761360061300b565b5b600061360f85828601613261565b9250506020613620858286016135d5565b9150509250929050565b600067ffffffffffffffff8211156136455761364461344a565b5b61364e8261311f565b9050602081019050919050565b600061366e6136698461362a565b6134aa565b90508281526020810184848401111561368a57613689613445565b5b6136958482856134f6565b509392505050565b600082601f8301126136b2576136b1613440565b5b81356136c284826020860161365b565b91505092915050565b600080600080608085870312156136e5576136e461300b565b5b60006136f387828801613261565b945050602061370487828801613261565b9350506040613715878288016131ac565b925050606085013567ffffffffffffffff81111561373657613735613010565b5b6137428782880161369d565b91505092959194509250565b600067ffffffffffffffff8211156137695761376861344a565b5b602082029050602081019050919050565b600080fd5b600061379261378d8461374e565b6134aa565b905080838252602082019050602084028301858111156137b5576137b461377a565b5b835b818110156137de57806137ca8882613261565b8452602084019350506020810190506137b7565b5050509392505050565b600082601f8301126137fd576137fc613440565b5b813561380d84826020860161377f565b91505092915050565b60006020828403121561382c5761382b61300b565b5b600082013567ffffffffffffffff81111561384a57613849613010565b5b613856848285016137e8565b91505092915050565b600080604083850312156138765761387561300b565b5b600061388485828601613261565b925050602061389585828601613261565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138e657607f821691505b602082108114156138fa576138f961389f565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061395c602c836130db565b915061396782613900565b604082019050919050565b6000602082019050818103600083015261398b8161394f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139c86020836130db565b91506139d382613992565b602082019050919050565b600060208201905081810360008301526139f7816139bb565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a5a6021836130db565b9150613a65826139fe565b604082019050919050565b60006020820190508181036000830152613a8981613a4d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613aec6038836130db565b9150613af782613a90565b604082019050919050565b60006020820190508181036000830152613b1b81613adf565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613b7e6031836130db565b9150613b8982613b22565b604082019050919050565b60006020820190508181036000830152613bad81613b71565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613c10602b836130db565b9150613c1b82613bb4565b604082019050919050565b60006020820190508181036000830152613c3f81613c03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613caf8261318b565b9150613cba8361318b565b925082613cca57613cc9613c46565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613d0f8261318b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d4257613d41613c75565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613da9602c836130db565b9150613db482613d4d565b604082019050919050565b60006020820190508181036000830152613dd881613d9c565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613e3b6029836130db565b9150613e4682613ddf565b604082019050919050565b60006020820190508181036000830152613e6a81613e2e565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613ecd602a836130db565b9150613ed882613e71565b604082019050919050565b60006020820190508181036000830152613efc81613ec0565b9050919050565b7f50726573616c652069736e277420616374697665000000000000000000000000600082015250565b6000613f396014836130db565b9150613f4482613f03565b602082019050919050565b60006020820190508181036000830152613f6881613f2c565b9050919050565b7f4e6f20746f6b656e7320726573657276656420666f7220616464726573730000600082015250565b6000613fa5601e836130db565b9150613fb082613f6f565b602082019050919050565b60006020820190508181036000830152613fd481613f98565b9050919050565b7f43616e2774206d696e74206d6f7265207468616e207265736572766564000000600082015250565b6000614011601d836130db565b915061401c82613fdb565b602082019050919050565b6000602082019050818103600083015261404081614004565b9050919050565b60006140528261318b565b915061405d8361318b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561409257614091613c75565b5b828201905092915050565b7f45786365656473206d6178696d756d2050616e64617320737570706c79000000600082015250565b60006140d3601d836130db565b91506140de8261409d565b602082019050919050565b60006020820190508181036000830152614102816140c6565b9050919050565b60006141148261318b565b915061411f8361318b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561415857614157613c75565b5b828202905092915050565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b60006141996019836130db565b91506141a482614163565b602082019050919050565b600060208201905081810360008301526141c88161418c565b9050919050565b60006141da8261318b565b91506141e58361318b565b9250828210156141f8576141f7613c75565b5b828203905092915050565b7f53616c65206e6f74206c69766500000000000000000000000000000000000000600082015250565b6000614239600d836130db565b915061424482614203565b602082019050919050565b600060208201905081810360008301526142688161422c565b9050919050565b7f596f752063616e206d696e742061206d6178696d756d206f662031302066616e60008201527f7461737469632050616e64617300000000000000000000000000000000000000602082015250565b60006142cb602d836130db565b91506142d68261426f565b604082019050919050565b600060208201905081810360008301526142fa816142be565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143376019836130db565b915061434282614301565b602082019050919050565b600060208201905081810360008301526143668161432a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143c9602f836130db565b91506143d48261436d565b604082019050919050565b600060208201905081810360008301526143f8816143bc565b9050919050565b600081905092915050565b6000614415826130d0565b61441f81856143ff565b935061442f8185602086016130ec565b80840191505092915050565b6000614447828561440a565b9150614453828461440a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006144bb6026836130db565b91506144c68261445f565b604082019050919050565b600060208201905081810360008301526144ea816144ae565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061454d602c836130db565b9150614558826144f1565b604082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006145df6029836130db565b91506145ea82614583565b604082019050919050565b6000602082019050818103600083015261460e816145d2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006146716024836130db565b915061467c82614615565b604082019050919050565b600060208201905081810360008301526146a081614664565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147036032836130db565b915061470e826146a7565b604082019050919050565b60006020820190508181036000830152614732816146f6565b9050919050565b60006147448261318b565b915061474f8361318b565b92508261475f5761475e613c46565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147918261476a565b61479b8185614775565b93506147ab8185602086016130ec565b6147b48161311f565b840191505092915050565b60006080820190506147d46000830187613220565b6147e16020830186613220565b6147ee60408301856132b6565b81810360608301526148008184614786565b905095945050505050565b60008151905061481a81613041565b92915050565b6000602082840312156148365761483561300b565b5b60006148448482850161480b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006148b26020836130db565b91506148bd8261487c565b602082019050919050565b600060208201905081810360008301526148e1816148a5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061491e601c836130db565b9150614929826148e8565b602082019050919050565b6000602082019050818103600083015261494d81614911565b905091905056fea2646970667358221220b1b8d6989f29ed6fa9da3404c0d416214e79390360bc9ed6368cf7c0256c6b2964736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string):
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
50084:3582:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34645:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21554:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23113:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53088:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22636:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50317:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50394:26;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35285:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24003:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34953:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53297:366;;;;;;;;;;;;;:::i;:::-;;24413:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52062:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35475:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52764:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50245:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21248:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20978:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42438:94;;;;;;;;;;;;;:::i;:::-;;51389:665;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41787:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52666:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50505:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21723:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50205:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50909:472;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23406:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24669:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53196:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52483:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21898:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52873:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50172:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23772:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42687:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34645:224;34747:4;34786:35;34771:50;;;:11;:50;;;;:90;;;;34825:36;34849:11;34825:23;:36::i;:::-;34771:90;34764:97;;34645:224;;;:::o;21554:100::-;21608:13;21641:5;21634:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21554:100;:::o;23113:221::-;23189:7;23217:16;23225:7;23217;:16::i;:::-;23209:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23302:15;:24;23318:7;23302:24;;;;;;;;;;;;;;;;;;;;;23295:31;;23113:221;;;:::o;53088:100::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53170:10:::1;53158:9;:22;;;;53088:100:::0;:::o;22636:411::-;22717:13;22733:23;22748:7;22733:14;:23::i;:::-;22717:39;;22781:5;22775:11;;:2;:11;;;;22767:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22875:5;22859:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22884:37;22901:5;22908:12;:10;:12::i;:::-;22884:16;:37::i;:::-;22859:62;22837:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23018:21;23027:2;23031:7;23018:8;:21::i;:::-;22706:341;22636:411;;:::o;50317:41::-;50354:4;50317:41;:::o;50394:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35285:113::-;35346:7;35373:10;:17;;;;35366:24;;35285:113;:::o;24003:339::-;24198:41;24217:12;:10;:12::i;:::-;24231:7;24198:18;:41::i;:::-;24190:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24306:28;24316:4;24322:2;24326:7;24306:9;:28::i;:::-;24003:339;;;:::o;34953:256::-;35050:7;35086:23;35103:5;35086:16;:23::i;:::-;35078:5;:31;35070:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35175:12;:19;35188:5;35175:19;;;;;;;;;;;;;;;:26;35195:5;35175:26;;;;;;;;;;;;35168:33;;34953:256;;;;:::o;53297:366::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53345:15:::1;53363:21;53345:39;;53395:11;53409:9;:16;;;;53395:30;;53446:1;53440:3;:7;53436:220;;;53464:13;53490:9;:16;;;;53480:7;:26;;;;:::i;:::-;53464:42;;53526:9;53521:124;53545:9;:16;;;;53541:1;:20;53521:124;;;53603:9;53613:1;53603:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53595:26;;:33;53622:5;53595:33;;;;;;;;;;;;;;;;;;;;;;;53587:42;;;::::0;::::1;;53563:3;;;;;:::i;:::-;;;;53521:124;;;;53449:207;53436:220;53334:329;;53297:366::o:0;24413:185::-;24551:39;24568:4;24574:2;24578:7;24551:39;;;;;;;;;;;;:16;:39::i;:::-;24413:185;;;:::o;52062:377::-;52149:16;52183:18;52204:17;52214:6;52204:9;:17::i;:::-;52183:38;;52234:25;52276:10;52262:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52234:53;;52303:9;52298:108;52318:10;52314:1;:14;52298:108;;;52364:30;52384:6;52392:1;52364:19;:30::i;:::-;52350:8;52359:1;52350:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;52330:3;;;;;:::i;:::-;;;;52298:108;;;;52423:8;52416:15;;;;52062:377;;;:::o;35475:233::-;35550:7;35586:30;:28;:30::i;:::-;35578:5;:38;35570:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35683:10;35694:5;35683:17;;;;;;;;:::i;:::-;;;;;;;;;;35676:24;;35475:233;;;:::o;52764:101::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52850:7:::1;52835:12;:22;;;;;;;;;;;;:::i;:::-;;52764:101:::0;:::o;50245:28::-;;;;:::o;21248:239::-;21320:7;21340:13;21356:7;:16;21364:7;21356:16;;;;;;;;;;;;;;;;;;;;;21340:32;;21408:1;21391:19;;:5;:19;;;;21383:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21474:5;21467:12;;;21248:239;;;:::o;20978:208::-;21050:7;21095:1;21078:19;;:5;:19;;;;21070:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21162:9;:16;21172:5;21162:16;;;;;;;;;;;;;;;;21155:23;;20978:208;;;:::o;42438:94::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42503:21:::1;42521:1;42503:9;:21::i;:::-;42438:94::o:0;51389:665::-;51449:14;51466:13;:11;:13::i;:::-;51449:30;;51490:19;51512:15;:27;51528:10;51512:27;;;;;;;;;;;;;;;;51490:49;;51570:1;51558:9;;:13;51550:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51629:1;51615:11;:15;51607:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51691:11;51684:3;:18;;51676:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50354:4;51764:3;51755:6;:12;;;;:::i;:::-;:26;;51747:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51855:3;51847:5;;:11;;;;:::i;:::-;51834:9;:24;;51826:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51943:3;51929:11;:17;;;;:::i;:::-;51899:15;:27;51915:10;51899:27;;;;;;;;;;;;;;;:47;;;;51962:9;51957:90;51977:3;51973:1;:7;51957:90;;;52002:33;52012:10;52033:1;52024:6;:10;;;;:::i;:::-;52002:9;:33::i;:::-;51982:3;;;;;:::i;:::-;;;;51957:90;;;;51438:616;;51389:665;:::o;41787:87::-;41833:7;41860:6;;;;;;;;;;;41853:13;;41787:87;:::o;52666:90::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52739:9:::1;52731:5;:17;;;;52666:90:::0;:::o;50505:50::-;;;;;;;;;;;;;;;;;:::o;21723:104::-;21779:13;21812:7;21805:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21723:104;:::o;50205:33::-;;;;:::o;50909:472::-;50962:14;50979:13;:11;:13::i;:::-;50962:30;;51023:1;51011:9;;:13;51003:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;51067:2;51061:3;:8;51053:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50354:4;51147:3;51138:6;:12;;;;:::i;:::-;:26;;51130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51238:3;51230:5;;:11;;;;:::i;:::-;51217:9;:24;;51209:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51289:9;51284:90;51304:3;51300:1;:7;51284:90;;;51329:33;51339:10;51360:1;51351:6;:10;;;;:::i;:::-;51329:9;:33::i;:::-;51309:3;;;;;:::i;:::-;;;;51284:90;;;;50951:430;50909:472;:::o;23406:295::-;23521:12;:10;:12::i;:::-;23509:24;;:8;:24;;;;23501:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23621:8;23576:18;:32;23595:12;:10;:12::i;:::-;23576:32;;;;;;;;;;;;;;;:42;23609:8;23576:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23674:8;23645:48;;23660:12;:10;:12::i;:::-;23645:48;;;23684:8;23645:48;;;;;;:::i;:::-;;;;;;;;23406:295;;:::o;24669:328::-;24844:41;24863:12;:10;:12::i;:::-;24877:7;24844:18;:41::i;:::-;24836:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24950:39;24964:4;24970:2;24974:7;24983:5;24950:13;:39::i;:::-;24669:328;;;;:::o;53196:93::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53279:2:::1;53267:9;:14;;;;;;;;;;;;:::i;:::-;;53196:93:::0;:::o;52483:175::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52566:9:::1;52561:90;52581:2;:9;52577:1;:13;52561:90;;;52637:2;52612:15;:22;52628:2;52631:1;52628:5;;;;;;;;:::i;:::-;;;;;;;;52612:22;;;;;;;;;;;;;;;:27;;;;52592:3;;;;;:::i;:::-;;;;52561:90;;;;52483:175:::0;:::o;21898:334::-;21971:13;22005:16;22013:7;22005;:16::i;:::-;21997:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22086:21;22110:10;:8;:10::i;:::-;22086:34;;22162:1;22144:7;22138:21;:25;:86;;;;;;;;;;;;;;;;;22190:7;22199:18;:7;:16;:18::i;:::-;22173:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22138:86;22131:93;;;21898:334;;;:::o;52873:207::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52948:14:::1;52965:13;:11;:13::i;:::-;52948:30;;52994:9;52989:84;53009:4;53005:1;:8;52989:84;;;53035:26;53045:3;53059:1;53050:6;:10;;;;:::i;:::-;53035:9;:26::i;:::-;53015:3;;;;;:::i;:::-;;;;52989:84;;;;52937:143;52873:207:::0;;:::o;50172:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23772:164::-;23869:4;23893:18;:25;23912:5;23893:25;;;;;;;;;;;;;;;:35;23919:8;23893:35;;;;;;;;;;;;;;;;;;;;;;;;;23886:42;;23772:164;;;;:::o;42687:192::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42796:1:::1;42776:22;;:8;:22;;;;42768:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42852:19;42862:8;42852:9;:19::i;:::-;42687:192:::0;:::o;20609:305::-;20711:4;20763:25;20748:40;;;:11;:40;;;;:105;;;;20820:33;20805:48;;;:11;:48;;;;20748:105;:158;;;;20870:36;20894:11;20870:23;:36::i;:::-;20748:158;20728:178;;20609:305;;;:::o;26507:127::-;26572:4;26624:1;26596:30;;:7;:16;26604:7;26596:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26589:37;;26507:127;;;:::o;16043:98::-;16096:7;16123:10;16116:17;;16043:98;:::o;30489:174::-;30591:2;30564:15;:24;30580:7;30564:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30647:7;30643:2;30609:46;;30618:23;30633:7;30618:14;:23::i;:::-;30609:46;;;;;;;;;;;;30489:174;;:::o;26801:348::-;26894:4;26919:16;26927:7;26919;:16::i;:::-;26911:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26995:13;27011:23;27026:7;27011:14;:23::i;:::-;26995:39;;27064:5;27053:16;;:7;:16;;;:51;;;;27097:7;27073:31;;:20;27085:7;27073:11;:20::i;:::-;:31;;;27053:51;:87;;;;27108:32;27125:5;27132:7;27108:16;:32::i;:::-;27053:87;27045:96;;;26801:348;;;;:::o;29793:578::-;29952:4;29925:31;;:23;29940:7;29925:14;:23::i;:::-;:31;;;29917:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30035:1;30021:16;;:2;:16;;;;30013:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30091:39;30112:4;30118:2;30122:7;30091:20;:39::i;:::-;30195:29;30212:1;30216:7;30195:8;:29::i;:::-;30256:1;30237:9;:15;30247:4;30237:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30285:1;30268:9;:13;30278:2;30268:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30316:2;30297:7;:16;30305:7;30297:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30355:7;30351:2;30336:27;;30345:4;30336:27;;;;;;;;;;;;29793:578;;;:::o;42887:173::-;42943:16;42962:6;;;;;;;;;;;42943:25;;42988:8;42979:6;;:17;;;;;;;;;;;;;;;;;;43043:8;43012:40;;43033:8;43012:40;;;;;;;;;;;;42932:128;42887:173;:::o;27491:110::-;27567:26;27577:2;27581:7;27567:26;;;;;;;;;;;;:9;:26::i;:::-;27491:110;;:::o;25879:315::-;26036:28;26046:4;26052:2;26056:7;26036:9;:28::i;:::-;26083:48;26106:4;26112:2;26116:7;26125:5;26083:22;:48::i;:::-;26075:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25879:315;;;;:::o;50788:113::-;50848:13;50881:12;50874:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50788:113;:::o;16564:723::-;16620:13;16850:1;16841:5;:10;16837:53;;;16868:10;;;;;;;;;;;;;;;;;;;;;16837:53;16900:12;16915:5;16900:20;;16931:14;16956:78;16971:1;16963:4;:9;16956:78;;16989:8;;;;;:::i;:::-;;;;17020:2;17012:10;;;;;:::i;:::-;;;16956:78;;;17044:19;17076:6;17066:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17044:39;;17094:154;17110:1;17101:5;:10;17094:154;;17138:1;17128:11;;;;;:::i;:::-;;;17205:2;17197:5;:10;;;;:::i;:::-;17184:2;:24;;;;:::i;:::-;17171:39;;17154:6;17161;17154:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17234:2;17225:11;;;;;:::i;:::-;;;17094:154;;;17272:6;17258:21;;;;;16564:723;;;;:::o;19117:157::-;19202:4;19241:25;19226:40;;;:11;:40;;;;19219:47;;19117:157;;;:::o;36321:589::-;36465:45;36492:4;36498:2;36502:7;36465:26;:45::i;:::-;36543:1;36527:18;;:4;:18;;;36523:187;;;36562:40;36594:7;36562:31;:40::i;:::-;36523:187;;;36632:2;36624:10;;:4;:10;;;36620:90;;36651:47;36684:4;36690:7;36651:32;:47::i;:::-;36620:90;36523:187;36738:1;36724:16;;:2;:16;;;36720:183;;;36757:45;36794:7;36757:36;:45::i;:::-;36720:183;;;36830:4;36824:10;;:2;:10;;;36820:83;;36851:40;36879:2;36883:7;36851:27;:40::i;:::-;36820:83;36720:183;36321:589;;;:::o;27828:321::-;27958:18;27964:2;27968:7;27958:5;:18::i;:::-;28009:54;28040:1;28044:2;28048:7;28057:5;28009:22;:54::i;:::-;27987:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27828:321;;;:::o;31228:799::-;31383:4;31404:15;:2;:13;;;:15::i;:::-;31400:620;;;31456:2;31440:36;;;31477:12;:10;:12::i;:::-;31491:4;31497:7;31506:5;31440:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31436:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31699:1;31682:6;:13;:18;31678:272;;;31725:60;;;;;;;;;;:::i;:::-;;;;;;;;31678:272;31900:6;31894:13;31885:6;31881:2;31877:15;31870:38;31436:529;31573:41;;;31563:51;;;:6;:51;;;;31556:58;;;;;31400:620;32004:4;31997:11;;31228:799;;;;;;;:::o;32599:126::-;;;;:::o;37633:164::-;37737:10;:17;;;;37710:15;:24;37726:7;37710:24;;;;;;;;;;;:44;;;;37765:10;37781:7;37765:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37633:164;:::o;38424:988::-;38690:22;38740:1;38715:22;38732:4;38715:16;:22::i;:::-;:26;;;;:::i;:::-;38690:51;;38752:18;38773:17;:26;38791:7;38773:26;;;;;;;;;;;;38752:47;;38920:14;38906:10;:28;38902:328;;38951:19;38973:12;:18;38986:4;38973:18;;;;;;;;;;;;;;;:34;38992:14;38973:34;;;;;;;;;;;;38951:56;;39057:11;39024:12;:18;39037:4;39024:18;;;;;;;;;;;;;;;:30;39043:10;39024:30;;;;;;;;;;;:44;;;;39174:10;39141:17;:30;39159:11;39141:30;;;;;;;;;;;:43;;;;38936:294;38902:328;39326:17;:26;39344:7;39326:26;;;;;;;;;;;39319:33;;;39370:12;:18;39383:4;39370:18;;;;;;;;;;;;;;;:34;39389:14;39370:34;;;;;;;;;;;39363:41;;;38505:907;;38424:988;;:::o;39707:1079::-;39960:22;40005:1;39985:10;:17;;;;:21;;;;:::i;:::-;39960:46;;40017:18;40038:15;:24;40054:7;40038:24;;;;;;;;;;;;40017:45;;40389:19;40411:10;40422:14;40411:26;;;;;;;;:::i;:::-;;;;;;;;;;40389:48;;40475:11;40450:10;40461;40450:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40586:10;40555:15;:28;40571:11;40555:28;;;;;;;;;;;:41;;;;40727:15;:24;40743:7;40727:24;;;;;;;;;;;40720:31;;;40762:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39778:1008;;;39707:1079;:::o;37211:221::-;37296:14;37313:20;37330:2;37313:16;:20::i;:::-;37296:37;;37371:7;37344:12;:16;37357:2;37344:16;;;;;;;;;;;;;;;:24;37361:6;37344:24;;;;;;;;;;;:34;;;;37418:6;37389:17;:26;37407:7;37389:26;;;;;;;;;;;:35;;;;37285:147;37211:221;;:::o;28485:382::-;28579:1;28565:16;;:2;:16;;;;28557:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28638:16;28646:7;28638;:16::i;:::-;28637:17;28629:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28700:45;28729:1;28733:2;28737:7;28700:20;:45::i;:::-;28775:1;28758:9;:13;28768:2;28758:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28806:2;28787:7;:16;28795:7;28787:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28851:7;28847:2;28826:33;;28843:1;28826:33;;;;;;;;;;;;28485:382;;:::o;8091:387::-;8151:4;8359:12;8426:7;8414:20;8406:28;;8469:1;8462:4;:8;8455:15;;;8091:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:114::-;6317:6;6351:5;6345:12;6335:22;;6250:114;;;:::o;6370:184::-;6469:11;6503:6;6498:3;6491:19;6543:4;6538:3;6534:14;6519:29;;6370:184;;;;:::o;6560:132::-;6627:4;6650:3;6642:11;;6680:4;6675:3;6671:14;6663:22;;6560:132;;;:::o;6698:108::-;6775:24;6793:5;6775:24;:::i;:::-;6770:3;6763:37;6698:108;;:::o;6812:179::-;6881:10;6902:46;6944:3;6936:6;6902:46;:::i;:::-;6980:4;6975:3;6971:14;6957:28;;6812:179;;;;:::o;6997:113::-;7067:4;7099;7094:3;7090:14;7082:22;;6997:113;;;:::o;7146:732::-;7265:3;7294:54;7342:5;7294:54;:::i;:::-;7364:86;7443:6;7438:3;7364:86;:::i;:::-;7357:93;;7474:56;7524:5;7474:56;:::i;:::-;7553:7;7584:1;7569:284;7594:6;7591:1;7588:13;7569:284;;;7670:6;7664:13;7697:63;7756:3;7741:13;7697:63;:::i;:::-;7690:70;;7783:60;7836:6;7783:60;:::i;:::-;7773:70;;7629:224;7616:1;7613;7609:9;7604:14;;7569:284;;;7573:14;7869:3;7862:10;;7270:608;;;7146:732;;;;:::o;7884:373::-;8027:4;8065:2;8054:9;8050:18;8042:26;;8114:9;8108:4;8104:20;8100:1;8089:9;8085:17;8078:47;8142:108;8245:4;8236:6;8142:108;:::i;:::-;8134:116;;7884:373;;;;:::o;8263:117::-;8372:1;8369;8362:12;8386:117;8495:1;8492;8485:12;8509:180;8557:77;8554:1;8547:88;8654:4;8651:1;8644:15;8678:4;8675:1;8668:15;8695:281;8778:27;8800:4;8778:27;:::i;:::-;8770:6;8766:40;8908:6;8896:10;8893:22;8872:18;8860:10;8857:34;8854:62;8851:88;;;8919:18;;:::i;:::-;8851:88;8959:10;8955:2;8948:22;8738:238;8695:281;;:::o;8982:129::-;9016:6;9043:20;;:::i;:::-;9033:30;;9072:33;9100:4;9092:6;9072:33;:::i;:::-;8982:129;;;:::o;9117:308::-;9179:4;9269:18;9261:6;9258:30;9255:56;;;9291:18;;:::i;:::-;9255:56;9329:29;9351:6;9329:29;:::i;:::-;9321:37;;9413:4;9407;9403:15;9395:23;;9117:308;;;:::o;9431:154::-;9515:6;9510:3;9505;9492:30;9577:1;9568:6;9563:3;9559:16;9552:27;9431:154;;;:::o;9591:412::-;9669:5;9694:66;9710:49;9752:6;9710:49;:::i;:::-;9694:66;:::i;:::-;9685:75;;9783:6;9776:5;9769:21;9821:4;9814:5;9810:16;9859:3;9850:6;9845:3;9841:16;9838:25;9835:112;;;9866:79;;:::i;:::-;9835:112;9956:41;9990:6;9985:3;9980;9956:41;:::i;:::-;9675:328;9591:412;;;;;:::o;10023:340::-;10079:5;10128:3;10121:4;10113:6;10109:17;10105:27;10095:122;;10136:79;;:::i;:::-;10095:122;10253:6;10240:20;10278:79;10353:3;10345:6;10338:4;10330:6;10326:17;10278:79;:::i;:::-;10269:88;;10085:278;10023:340;;;;:::o;10369:509::-;10438:6;10487:2;10475:9;10466:7;10462:23;10458:32;10455:119;;;10493:79;;:::i;:::-;10455:119;10641:1;10630:9;10626:17;10613:31;10671:18;10663:6;10660:30;10657:117;;;10693:79;;:::i;:::-;10657:117;10798:63;10853:7;10844:6;10833:9;10829:22;10798:63;:::i;:::-;10788:73;;10584:287;10369:509;;;;:::o;10884:116::-;10954:21;10969:5;10954:21;:::i;:::-;10947:5;10944:32;10934:60;;10990:1;10987;10980:12;10934:60;10884:116;:::o;11006:133::-;11049:5;11087:6;11074:20;11065:29;;11103:30;11127:5;11103:30;:::i;:::-;11006:133;;;;:::o;11145:468::-;11210:6;11218;11267:2;11255:9;11246:7;11242:23;11238:32;11235:119;;;11273:79;;:::i;:::-;11235:119;11393:1;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11364:117;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;11145:468;;;;;:::o;11619:307::-;11680:4;11770:18;11762:6;11759:30;11756:56;;;11792:18;;:::i;:::-;11756:56;11830:29;11852:6;11830:29;:::i;:::-;11822:37;;11914:4;11908;11904:15;11896:23;;11619:307;;;:::o;11932:410::-;12009:5;12034:65;12050:48;12091:6;12050:48;:::i;:::-;12034:65;:::i;:::-;12025:74;;12122:6;12115:5;12108:21;12160:4;12153:5;12149:16;12198:3;12189:6;12184:3;12180:16;12177:25;12174:112;;;12205:79;;:::i;:::-;12174:112;12295:41;12329:6;12324:3;12319;12295:41;:::i;:::-;12015:327;11932:410;;;;;:::o;12361:338::-;12416:5;12465:3;12458:4;12450:6;12446:17;12442:27;12432:122;;12473:79;;:::i;:::-;12432:122;12590:6;12577:20;12615:78;12689:3;12681:6;12674:4;12666:6;12662:17;12615:78;:::i;:::-;12606:87;;12422:277;12361:338;;;;:::o;12705:943::-;12800:6;12808;12816;12824;12873:3;12861:9;12852:7;12848:23;12844:33;12841:120;;;12880:79;;:::i;:::-;12841:120;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;13255:2;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13226:118;13411:2;13400:9;13396:18;13383:32;13442:18;13434:6;13431:30;13428:117;;;13464:79;;:::i;:::-;13428:117;13569:62;13623:7;13614:6;13603:9;13599:22;13569:62;:::i;:::-;13559:72;;13354:287;12705:943;;;;;;;:::o;13654:311::-;13731:4;13821:18;13813:6;13810:30;13807:56;;;13843:18;;:::i;:::-;13807:56;13893:4;13885:6;13881:17;13873:25;;13953:4;13947;13943:15;13935:23;;13654:311;;;:::o;13971:117::-;14080:1;14077;14070:12;14111:710;14207:5;14232:81;14248:64;14305:6;14248:64;:::i;:::-;14232:81;:::i;:::-;14223:90;;14333:5;14362:6;14355:5;14348:21;14396:4;14389:5;14385:16;14378:23;;14449:4;14441:6;14437:17;14429:6;14425:30;14478:3;14470:6;14467:15;14464:122;;;14497:79;;:::i;:::-;14464:122;14612:6;14595:220;14629:6;14624:3;14621:15;14595:220;;;14704:3;14733:37;14766:3;14754:10;14733:37;:::i;:::-;14728:3;14721:50;14800:4;14795:3;14791:14;14784:21;;14671:144;14655:4;14650:3;14646:14;14639:21;;14595:220;;;14599:21;14213:608;;14111:710;;;;;:::o;14844:370::-;14915:5;14964:3;14957:4;14949:6;14945:17;14941:27;14931:122;;14972:79;;:::i;:::-;14931:122;15089:6;15076:20;15114:94;15204:3;15196:6;15189:4;15181:6;15177:17;15114:94;:::i;:::-;15105:103;;14921:293;14844:370;;;;:::o;15220:539::-;15304:6;15353:2;15341:9;15332:7;15328:23;15324:32;15321:119;;;15359:79;;:::i;:::-;15321:119;15507:1;15496:9;15492:17;15479:31;15537:18;15529:6;15526:30;15523:117;;;15559:79;;:::i;:::-;15523:117;15664:78;15734:7;15725:6;15714:9;15710:22;15664:78;:::i;:::-;15654:88;;15450:302;15220:539;;;;:::o;15765:474::-;15833:6;15841;15890:2;15878:9;15869:7;15865:23;15861:32;15858:119;;;15896:79;;:::i;:::-;15858:119;16016:1;16041:53;16086:7;16077:6;16066:9;16062:22;16041:53;:::i;:::-;16031:63;;15987:117;16143:2;16169:53;16214:7;16205:6;16194:9;16190:22;16169:53;:::i;:::-;16159:63;;16114:118;15765:474;;;;;:::o;16245:180::-;16293:77;16290:1;16283:88;16390:4;16387:1;16380:15;16414:4;16411:1;16404:15;16431:320;16475:6;16512:1;16506:4;16502:12;16492:22;;16559:1;16553:4;16549:12;16580:18;16570:81;;16636:4;16628:6;16624:17;16614:27;;16570:81;16698:2;16690:6;16687:14;16667:18;16664:38;16661:84;;;16717:18;;:::i;:::-;16661:84;16482:269;16431:320;;;:::o;16757:231::-;16897:34;16893:1;16885:6;16881:14;16874:58;16966:14;16961:2;16953:6;16949:15;16942:39;16757:231;:::o;16994:366::-;17136:3;17157:67;17221:2;17216:3;17157:67;:::i;:::-;17150:74;;17233:93;17322:3;17233:93;:::i;:::-;17351:2;17346:3;17342:12;17335:19;;16994:366;;;:::o;17366:419::-;17532:4;17570:2;17559:9;17555:18;17547:26;;17619:9;17613:4;17609:20;17605:1;17594:9;17590:17;17583:47;17647:131;17773:4;17647:131;:::i;:::-;17639:139;;17366:419;;;:::o;17791:182::-;17931:34;17927:1;17919:6;17915:14;17908:58;17791:182;:::o;17979:366::-;18121:3;18142:67;18206:2;18201:3;18142:67;:::i;:::-;18135:74;;18218:93;18307:3;18218:93;:::i;:::-;18336:2;18331:3;18327:12;18320:19;;17979:366;;;:::o;18351:419::-;18517:4;18555:2;18544:9;18540:18;18532:26;;18604:9;18598:4;18594:20;18590:1;18579:9;18575:17;18568:47;18632:131;18758:4;18632:131;:::i;:::-;18624:139;;18351:419;;;:::o;18776:220::-;18916:34;18912:1;18904:6;18900:14;18893:58;18985:3;18980:2;18972:6;18968:15;18961:28;18776:220;:::o;19002:366::-;19144:3;19165:67;19229:2;19224:3;19165:67;:::i;:::-;19158:74;;19241:93;19330:3;19241:93;:::i;:::-;19359:2;19354:3;19350:12;19343:19;;19002:366;;;:::o;19374:419::-;19540:4;19578:2;19567:9;19563:18;19555:26;;19627:9;19621:4;19617:20;19613:1;19602:9;19598:17;19591:47;19655:131;19781:4;19655:131;:::i;:::-;19647:139;;19374:419;;;:::o;19799:243::-;19939:34;19935:1;19927:6;19923:14;19916:58;20008:26;20003:2;19995:6;19991:15;19984:51;19799:243;:::o;20048:366::-;20190:3;20211:67;20275:2;20270:3;20211:67;:::i;:::-;20204:74;;20287:93;20376:3;20287:93;:::i;:::-;20405:2;20400:3;20396:12;20389:19;;20048:366;;;:::o;20420:419::-;20586:4;20624:2;20613:9;20609:18;20601:26;;20673:9;20667:4;20663:20;20659:1;20648:9;20644:17;20637:47;20701:131;20827:4;20701:131;:::i;:::-;20693:139;;20420:419;;;:::o;20845:236::-;20985:34;20981:1;20973:6;20969:14;20962:58;21054:19;21049:2;21041:6;21037:15;21030:44;20845:236;:::o;21087:366::-;21229:3;21250:67;21314:2;21309:3;21250:67;:::i;:::-;21243:74;;21326:93;21415:3;21326:93;:::i;:::-;21444:2;21439:3;21435:12;21428:19;;21087:366;;;:::o;21459:419::-;21625:4;21663:2;21652:9;21648:18;21640:26;;21712:9;21706:4;21702:20;21698:1;21687:9;21683:17;21676:47;21740:131;21866:4;21740:131;:::i;:::-;21732:139;;21459:419;;;:::o;21884:230::-;22024:34;22020:1;22012:6;22008:14;22001:58;22093:13;22088:2;22080:6;22076:15;22069:38;21884:230;:::o;22120:366::-;22262:3;22283:67;22347:2;22342:3;22283:67;:::i;:::-;22276:74;;22359:93;22448:3;22359:93;:::i;:::-;22477:2;22472:3;22468:12;22461:19;;22120:366;;;:::o;22492:419::-;22658:4;22696:2;22685:9;22681:18;22673:26;;22745:9;22739:4;22735:20;22731:1;22720:9;22716:17;22709:47;22773:131;22899:4;22773:131;:::i;:::-;22765:139;;22492:419;;;:::o;22917:180::-;22965:77;22962:1;22955:88;23062:4;23059:1;23052:15;23086:4;23083:1;23076:15;23103:180;23151:77;23148:1;23141:88;23248:4;23245:1;23238:15;23272:4;23269:1;23262:15;23289:185;23329:1;23346:20;23364:1;23346:20;:::i;:::-;23341:25;;23380:20;23398:1;23380:20;:::i;:::-;23375:25;;23419:1;23409:35;;23424:18;;:::i;:::-;23409:35;23466:1;23463;23459:9;23454:14;;23289:185;;;;:::o;23480:180::-;23528:77;23525:1;23518:88;23625:4;23622:1;23615:15;23649:4;23646:1;23639:15;23666:233;23705:3;23728:24;23746:5;23728:24;:::i;:::-;23719:33;;23774:66;23767:5;23764:77;23761:103;;;23844:18;;:::i;:::-;23761:103;23891:1;23884:5;23880:13;23873:20;;23666:233;;;:::o;23905:231::-;24045:34;24041:1;24033:6;24029:14;24022:58;24114:14;24109:2;24101:6;24097:15;24090:39;23905:231;:::o;24142:366::-;24284:3;24305:67;24369:2;24364:3;24305:67;:::i;:::-;24298:74;;24381:93;24470:3;24381:93;:::i;:::-;24499:2;24494:3;24490:12;24483:19;;24142:366;;;:::o;24514:419::-;24680:4;24718:2;24707:9;24703:18;24695:26;;24767:9;24761:4;24757:20;24753:1;24742:9;24738:17;24731:47;24795:131;24921:4;24795:131;:::i;:::-;24787:139;;24514:419;;;:::o;24939:228::-;25079:34;25075:1;25067:6;25063:14;25056:58;25148:11;25143:2;25135:6;25131:15;25124:36;24939:228;:::o;25173:366::-;25315:3;25336:67;25400:2;25395:3;25336:67;:::i;:::-;25329:74;;25412:93;25501:3;25412:93;:::i;:::-;25530:2;25525:3;25521:12;25514:19;;25173:366;;;:::o;25545:419::-;25711:4;25749:2;25738:9;25734:18;25726:26;;25798:9;25792:4;25788:20;25784:1;25773:9;25769:17;25762:47;25826:131;25952:4;25826:131;:::i;:::-;25818:139;;25545:419;;;:::o;25970:229::-;26110:34;26106:1;26098:6;26094:14;26087:58;26179:12;26174:2;26166:6;26162:15;26155:37;25970:229;:::o;26205:366::-;26347:3;26368:67;26432:2;26427:3;26368:67;:::i;:::-;26361:74;;26444:93;26533:3;26444:93;:::i;:::-;26562:2;26557:3;26553:12;26546:19;;26205:366;;;:::o;26577:419::-;26743:4;26781:2;26770:9;26766:18;26758:26;;26830:9;26824:4;26820:20;26816:1;26805:9;26801:17;26794:47;26858:131;26984:4;26858:131;:::i;:::-;26850:139;;26577:419;;;:::o;27002:170::-;27142:22;27138:1;27130:6;27126:14;27119:46;27002:170;:::o;27178:366::-;27320:3;27341:67;27405:2;27400:3;27341:67;:::i;:::-;27334:74;;27417:93;27506:3;27417:93;:::i;:::-;27535:2;27530:3;27526:12;27519:19;;27178:366;;;:::o;27550:419::-;27716:4;27754:2;27743:9;27739:18;27731:26;;27803:9;27797:4;27793:20;27789:1;27778:9;27774:17;27767:47;27831:131;27957:4;27831:131;:::i;:::-;27823:139;;27550:419;;;:::o;27975:180::-;28115:32;28111:1;28103:6;28099:14;28092:56;27975:180;:::o;28161:366::-;28303:3;28324:67;28388:2;28383:3;28324:67;:::i;:::-;28317:74;;28400:93;28489:3;28400:93;:::i;:::-;28518:2;28513:3;28509:12;28502:19;;28161:366;;;:::o;28533:419::-;28699:4;28737:2;28726:9;28722:18;28714:26;;28786:9;28780:4;28776:20;28772:1;28761:9;28757:17;28750:47;28814:131;28940:4;28814:131;:::i;:::-;28806:139;;28533:419;;;:::o;28958:179::-;29098:31;29094:1;29086:6;29082:14;29075:55;28958:179;:::o;29143:366::-;29285:3;29306:67;29370:2;29365:3;29306:67;:::i;:::-;29299:74;;29382:93;29471:3;29382:93;:::i;:::-;29500:2;29495:3;29491:12;29484:19;;29143:366;;;:::o;29515:419::-;29681:4;29719:2;29708:9;29704:18;29696:26;;29768:9;29762:4;29758:20;29754:1;29743:9;29739:17;29732:47;29796:131;29922:4;29796:131;:::i;:::-;29788:139;;29515:419;;;:::o;29940:305::-;29980:3;29999:20;30017:1;29999:20;:::i;:::-;29994:25;;30033:20;30051:1;30033:20;:::i;:::-;30028:25;;30187:1;30119:66;30115:74;30112:1;30109:81;30106:107;;;30193:18;;:::i;:::-;30106:107;30237:1;30234;30230:9;30223:16;;29940:305;;;;:::o;30251:179::-;30391:31;30387:1;30379:6;30375:14;30368:55;30251:179;:::o;30436:366::-;30578:3;30599:67;30663:2;30658:3;30599:67;:::i;:::-;30592:74;;30675:93;30764:3;30675:93;:::i;:::-;30793:2;30788:3;30784:12;30777:19;;30436:366;;;:::o;30808:419::-;30974:4;31012:2;31001:9;30997:18;30989:26;;31061:9;31055:4;31051:20;31047:1;31036:9;31032:17;31025:47;31089:131;31215:4;31089:131;:::i;:::-;31081:139;;30808:419;;;:::o;31233:348::-;31273:7;31296:20;31314:1;31296:20;:::i;:::-;31291:25;;31330:20;31348:1;31330:20;:::i;:::-;31325:25;;31518:1;31450:66;31446:74;31443:1;31440:81;31435:1;31428:9;31421:17;31417:105;31414:131;;;31525:18;;:::i;:::-;31414:131;31573:1;31570;31566:9;31555:20;;31233:348;;;;:::o;31587:175::-;31727:27;31723:1;31715:6;31711:14;31704:51;31587:175;:::o;31768:366::-;31910:3;31931:67;31995:2;31990:3;31931:67;:::i;:::-;31924:74;;32007:93;32096:3;32007:93;:::i;:::-;32125:2;32120:3;32116:12;32109:19;;31768:366;;;:::o;32140:419::-;32306:4;32344:2;32333:9;32329:18;32321:26;;32393:9;32387:4;32383:20;32379:1;32368:9;32364:17;32357:47;32421:131;32547:4;32421:131;:::i;:::-;32413:139;;32140:419;;;:::o;32565:191::-;32605:4;32625:20;32643:1;32625:20;:::i;:::-;32620:25;;32659:20;32677:1;32659:20;:::i;:::-;32654:25;;32698:1;32695;32692:8;32689:34;;;32703:18;;:::i;:::-;32689:34;32748:1;32745;32741:9;32733:17;;32565:191;;;;:::o;32762:163::-;32902:15;32898:1;32890:6;32886:14;32879:39;32762:163;:::o;32931:366::-;33073:3;33094:67;33158:2;33153:3;33094:67;:::i;:::-;33087:74;;33170:93;33259:3;33170:93;:::i;:::-;33288:2;33283:3;33279:12;33272:19;;32931:366;;;:::o;33303:419::-;33469:4;33507:2;33496:9;33492:18;33484:26;;33556:9;33550:4;33546:20;33542:1;33531:9;33527:17;33520:47;33584:131;33710:4;33584:131;:::i;:::-;33576:139;;33303:419;;;:::o;33728:232::-;33868:34;33864:1;33856:6;33852:14;33845:58;33937:15;33932:2;33924:6;33920:15;33913:40;33728:232;:::o;33966:366::-;34108:3;34129:67;34193:2;34188:3;34129:67;:::i;:::-;34122:74;;34205:93;34294:3;34205:93;:::i;:::-;34323:2;34318:3;34314:12;34307:19;;33966:366;;;:::o;34338:419::-;34504:4;34542:2;34531:9;34527:18;34519:26;;34591:9;34585:4;34581:20;34577:1;34566:9;34562:17;34555:47;34619:131;34745:4;34619:131;:::i;:::-;34611:139;;34338:419;;;:::o;34763:175::-;34903:27;34899:1;34891:6;34887:14;34880:51;34763:175;:::o;34944:366::-;35086:3;35107:67;35171:2;35166:3;35107:67;:::i;:::-;35100:74;;35183:93;35272:3;35183:93;:::i;:::-;35301:2;35296:3;35292:12;35285:19;;34944:366;;;:::o;35316:419::-;35482:4;35520:2;35509:9;35505:18;35497:26;;35569:9;35563:4;35559:20;35555:1;35544:9;35540:17;35533:47;35597:131;35723:4;35597:131;:::i;:::-;35589:139;;35316:419;;;:::o;35741:234::-;35881:34;35877:1;35869:6;35865:14;35858:58;35950:17;35945:2;35937:6;35933:15;35926:42;35741:234;:::o;35981:366::-;36123:3;36144:67;36208:2;36203:3;36144:67;:::i;:::-;36137:74;;36220:93;36309:3;36220:93;:::i;:::-;36338:2;36333:3;36329:12;36322:19;;35981:366;;;:::o;36353:419::-;36519:4;36557:2;36546:9;36542:18;36534:26;;36606:9;36600:4;36596:20;36592:1;36581:9;36577:17;36570:47;36634:131;36760:4;36634:131;:::i;:::-;36626:139;;36353:419;;;:::o;36778:148::-;36880:11;36917:3;36902:18;;36778:148;;;;:::o;36932:377::-;37038:3;37066:39;37099:5;37066:39;:::i;:::-;37121:89;37203:6;37198:3;37121:89;:::i;:::-;37114:96;;37219:52;37264:6;37259:3;37252:4;37245:5;37241:16;37219:52;:::i;:::-;37296:6;37291:3;37287:16;37280:23;;37042:267;36932:377;;;;:::o;37315:435::-;37495:3;37517:95;37608:3;37599:6;37517:95;:::i;:::-;37510:102;;37629:95;37720:3;37711:6;37629:95;:::i;:::-;37622:102;;37741:3;37734:10;;37315:435;;;;;:::o;37756:225::-;37896:34;37892:1;37884:6;37880:14;37873:58;37965:8;37960:2;37952:6;37948:15;37941:33;37756:225;:::o;37987:366::-;38129:3;38150:67;38214:2;38209:3;38150:67;:::i;:::-;38143:74;;38226:93;38315:3;38226:93;:::i;:::-;38344:2;38339:3;38335:12;38328:19;;37987:366;;;:::o;38359:419::-;38525:4;38563:2;38552:9;38548:18;38540:26;;38612:9;38606:4;38602:20;38598:1;38587:9;38583:17;38576:47;38640:131;38766:4;38640:131;:::i;:::-;38632:139;;38359:419;;;:::o;38784:231::-;38924:34;38920:1;38912:6;38908:14;38901:58;38993:14;38988:2;38980:6;38976:15;38969:39;38784:231;:::o;39021:366::-;39163:3;39184:67;39248:2;39243:3;39184:67;:::i;:::-;39177:74;;39260:93;39349:3;39260:93;:::i;:::-;39378:2;39373:3;39369:12;39362:19;;39021:366;;;:::o;39393:419::-;39559:4;39597:2;39586:9;39582:18;39574:26;;39646:9;39640:4;39636:20;39632:1;39621:9;39617:17;39610:47;39674:131;39800:4;39674:131;:::i;:::-;39666:139;;39393:419;;;:::o;39818:228::-;39958:34;39954:1;39946:6;39942:14;39935:58;40027:11;40022:2;40014:6;40010:15;40003:36;39818:228;:::o;40052:366::-;40194:3;40215:67;40279:2;40274:3;40215:67;:::i;:::-;40208:74;;40291:93;40380:3;40291:93;:::i;:::-;40409:2;40404:3;40400:12;40393:19;;40052:366;;;:::o;40424:419::-;40590:4;40628:2;40617:9;40613:18;40605:26;;40677:9;40671:4;40667:20;40663:1;40652:9;40648:17;40641:47;40705:131;40831:4;40705:131;:::i;:::-;40697:139;;40424:419;;;:::o;40849:223::-;40989:34;40985:1;40977:6;40973:14;40966:58;41058:6;41053:2;41045:6;41041:15;41034:31;40849:223;:::o;41078:366::-;41220:3;41241:67;41305:2;41300:3;41241:67;:::i;:::-;41234:74;;41317:93;41406:3;41317:93;:::i;:::-;41435:2;41430:3;41426:12;41419:19;;41078:366;;;:::o;41450:419::-;41616:4;41654:2;41643:9;41639:18;41631:26;;41703:9;41697:4;41693:20;41689:1;41678:9;41674:17;41667:47;41731:131;41857:4;41731:131;:::i;:::-;41723:139;;41450:419;;;:::o;41875:237::-;42015:34;42011:1;42003:6;41999:14;41992:58;42084:20;42079:2;42071:6;42067:15;42060:45;41875:237;:::o;42118:366::-;42260:3;42281:67;42345:2;42340:3;42281:67;:::i;:::-;42274:74;;42357:93;42446:3;42357:93;:::i;:::-;42475:2;42470:3;42466:12;42459:19;;42118:366;;;:::o;42490:419::-;42656:4;42694:2;42683:9;42679:18;42671:26;;42743:9;42737:4;42733:20;42729:1;42718:9;42714:17;42707:47;42771:131;42897:4;42771:131;:::i;:::-;42763:139;;42490:419;;;:::o;42915:176::-;42947:1;42964:20;42982:1;42964:20;:::i;:::-;42959:25;;42998:20;43016:1;42998:20;:::i;:::-;42993:25;;43037:1;43027:35;;43042:18;;:::i;:::-;43027:35;43083:1;43080;43076:9;43071:14;;42915:176;;;;:::o;43097:98::-;43148:6;43182:5;43176:12;43166:22;;43097:98;;;:::o;43201:168::-;43284:11;43318:6;43313:3;43306:19;43358:4;43353:3;43349:14;43334:29;;43201:168;;;;:::o;43375:360::-;43461:3;43489:38;43521:5;43489:38;:::i;:::-;43543:70;43606:6;43601:3;43543:70;:::i;:::-;43536:77;;43622:52;43667:6;43662:3;43655:4;43648:5;43644:16;43622:52;:::i;:::-;43699:29;43721:6;43699:29;:::i;:::-;43694:3;43690:39;43683:46;;43465:270;43375:360;;;;:::o;43741:640::-;43936:4;43974:3;43963:9;43959:19;43951:27;;43988:71;44056:1;44045:9;44041:17;44032:6;43988:71;:::i;:::-;44069:72;44137:2;44126:9;44122:18;44113:6;44069:72;:::i;:::-;44151;44219:2;44208:9;44204:18;44195:6;44151:72;:::i;:::-;44270:9;44264:4;44260:20;44255:2;44244:9;44240:18;44233:48;44298:76;44369:4;44360:6;44298:76;:::i;:::-;44290:84;;43741:640;;;;;;;:::o;44387:141::-;44443:5;44474:6;44468:13;44459:22;;44490:32;44516:5;44490:32;:::i;:::-;44387:141;;;;:::o;44534:349::-;44603:6;44652:2;44640:9;44631:7;44627:23;44623:32;44620:119;;;44658:79;;:::i;:::-;44620:119;44778:1;44803:63;44858:7;44849:6;44838:9;44834:22;44803:63;:::i;:::-;44793:73;;44749:127;44534:349;;;;:::o;44889:180::-;44937:77;44934:1;44927:88;45034:4;45031:1;45024:15;45058:4;45055:1;45048:15;45075:182;45215:34;45211:1;45203:6;45199:14;45192:58;45075:182;:::o;45263:366::-;45405:3;45426:67;45490:2;45485:3;45426:67;:::i;:::-;45419:74;;45502:93;45591:3;45502:93;:::i;:::-;45620:2;45615:3;45611:12;45604:19;;45263:366;;;:::o;45635:419::-;45801:4;45839:2;45828:9;45824:18;45816:26;;45888:9;45882:4;45878:20;45874:1;45863:9;45859:17;45852:47;45916:131;46042:4;45916:131;:::i;:::-;45908:139;;45635:419;;;:::o;46060:178::-;46200:30;46196:1;46188:6;46184:14;46177:54;46060:178;:::o;46244:366::-;46386:3;46407:67;46471:2;46466:3;46407:67;:::i;:::-;46400:74;;46483:93;46572:3;46483:93;:::i;:::-;46601:2;46596:3;46592:12;46585:19;;46244:366;;;:::o;46616:419::-;46782:4;46820:2;46809:9;46805:18;46797:26;;46869:9;46863:4;46859:20;46855:1;46844:9;46840:17;46833:47;46897:131;47023:4;46897:131;:::i;:::-;46889:139;;46616:419;;;:::o
Swarm Source
ipfs://b1b8d6989f29ed6fa9da3404c0d416214e79390360bc9ed6368cf7c0256c6b29
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.