Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
463 PXLS
Holders
194
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 PXLSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Pixels
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-31 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/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: pixels.sol pragma solidity ^0.8.0; contract Pixels is ERC721Enumerable, Ownable { using Strings for uint256; string _baseTokenURI; uint256 private _maxMint = 20; uint256 private _price = 8 * 10**16; //0.08 ETH; bool public _paused = false; uint public constant MAX_ENTRIES = 1024; constructor() ERC721("1024 Pixels", "PXLS") { setBaseURI("https://api.1024px.net/"); } function mint(address _to, uint256 num) public payable { uint256 supply = totalSupply(); if(msg.sender != owner()) { require(!_paused, "Sale Paused"); require( num < (_maxMint+1),"You can adopt a maximum of _maxMint tokens" ); require( msg.value >= _price * num,"Ether sent is not correct" ); } require( supply + num < MAX_ENTRIES, "Exceeds maximum supply" ); for(uint256 i; i < num; i++){ _safeMint( _to, 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; } function getPrice() public view returns (uint256){ if(msg.sender == owner()) { return 0; } return _price; } function setPrice(uint256 _newPrice) public onlyOwner() { _price = _newPrice; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function pause(bool val) public onlyOwner { _paused = val; } function withdrawAll() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_ENTRIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"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":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526014600c5567011c37937e080000600d556000600e60006101000a81548160ff0219169083151502179055503480156200003d57600080fd5b506040518060400160405280600b81526020017f3130323420506978656c730000000000000000000000000000000000000000008152506040518060400160405280600481526020017f50584c53000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c2929190620002ed565b508060019080519060200190620000db929190620002ed565b505050620000fe620000f26200014a60201b60201c565b6200015260201b60201c565b620001446040518060400160405280601781526020017f68747470733a2f2f6170692e3130323470782e6e65742f0000000000000000008152506200021860201b60201c565b62000477565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002286200014a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200024e620002c360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029e90620003df565b60405180910390fd5b80600b9080519060200190620002bf929190620002ed565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002fb9062000412565b90600052602060002090601f0160209004810192826200031f57600085556200036b565b82601f106200033a57805160ff19168380011785556200036b565b828001600101855582156200036b579182015b828111156200036a5782518255916020019190600101906200034d565b5b5090506200037a91906200037e565b5090565b5b80821115620003995760008160009055506001016200037f565b5090565b6000620003ac60208362000401565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190508181036000830152620003fa816200039d565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200042b57607f821691505b6020821081141562000442576200044162000448565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613f3980620004876000396000f3fe6080604052600436106101b75760003560e01c80636352211e116100ec57806395d89b411161008a578063b88d4fde11610064578063b88d4fde146105f0578063c87b56dd14610619578063e985e9c514610656578063f2fde38b14610693576101b7565b806395d89b411461057157806398d5fdca1461059c578063a22cb465146105c7576101b7565b80637d4cb964116100c65780637d4cb964146104e8578063853828b6146105135780638da5cb5b1461051d57806391b7f5ed14610548576101b7565b80636352211e1461045757806370a0823114610494578063715018a6146104d1576101b7565b806323b872dd1161015957806342842e0e1161013357806342842e0e1461038b578063438b6300146103b45780634f6ccce7146103f157806355f804b31461042e576101b7565b806323b872dd146103095780632f745c591461033257806340c10f191461036f576101b7565b8063081812fc11610195578063081812fc1461024d578063095ea7b31461028a57806316c61ccc146102b357806318160ddd146102de576101b7565b806301ffc9a7146101bc57806302329a29146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612cc6565b6106bc565b6040516101f0919061373e565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b9190612c9d565b610736565b005b34801561022e57600080fd5b506102376107cf565b6040516102449190613759565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f9190612d59565b610861565b60405161028191906136b5565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac9190612c61565b6108e6565b005b3480156102bf57600080fd5b506102c86109fe565b6040516102d5919061373e565b60405180910390f35b3480156102ea57600080fd5b506102f3610a11565b6040516103009190613a3b565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b9190612b5b565b610a1e565b005b34801561033e57600080fd5b5061035960048036038101906103549190612c61565b610a7e565b6040516103669190613a3b565b60405180910390f35b61038960048036038101906103849190612c61565b610b23565b005b34801561039757600080fd5b506103b260048036038101906103ad9190612b5b565b610ce2565b005b3480156103c057600080fd5b506103db60048036038101906103d69190612af6565b610d02565b6040516103e8919061371c565b60405180910390f35b3480156103fd57600080fd5b5061041860048036038101906104139190612d59565b610dfc565b6040516104259190613a3b565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190612d18565b610e93565b005b34801561046357600080fd5b5061047e60048036038101906104799190612d59565b610f29565b60405161048b91906136b5565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190612af6565b610fdb565b6040516104c89190613a3b565b60405180910390f35b3480156104dd57600080fd5b506104e6611093565b005b3480156104f457600080fd5b506104fd61111b565b60405161050a9190613a3b565b60405180910390f35b61051b611121565b005b34801561052957600080fd5b506105326111dd565b60405161053f91906136b5565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a9190612d59565b611207565b005b34801561057d57600080fd5b5061058661128d565b6040516105939190613759565b60405180910390f35b3480156105a857600080fd5b506105b161131f565b6040516105be9190613a3b565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612c25565b61136e565b005b3480156105fc57600080fd5b5061061760048036038101906106129190612baa565b6114ef565b005b34801561062557600080fd5b50610640600480360381019061063b9190612d59565b611551565b60405161064d9190613759565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190612b1f565b6115f8565b60405161068a919061373e565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190612af6565b61168c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072f575061072e82611784565b5b9050919050565b61073e611866565b73ffffffffffffffffffffffffffffffffffffffff1661075c6111dd565b73ffffffffffffffffffffffffffffffffffffffff16146107b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a99061393b565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6060600080546107de90613d2e565b80601f016020809104026020016040519081016040528092919081815260200182805461080a90613d2e565b80156108575780601f1061082c57610100808354040283529160200191610857565b820191906000526020600020905b81548152906001019060200180831161083a57829003601f168201915b5050505050905090565b600061086c8261186e565b6108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a29061391b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f182610f29565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109599061399b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610981611866565b73ffffffffffffffffffffffffffffffffffffffff1614806109b057506109af816109aa611866565b6115f8565b5b6109ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e69061387b565b60405180910390fd5b6109f983836118da565b505050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b610a2f610a29611866565b82611993565b610a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a65906139fb565b60405180910390fd5b610a79838383611a71565b505050565b6000610a8983610fdb565b8210610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac19061377b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610b2d610a11565b9050610b376111dd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c5a57600e60009054906101000a900460ff1615610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb0906138fb565b60405180910390fd5b6001600c54610bc89190613b63565b8210610c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c009061385b565b60405180910390fd5b81600d54610c179190613bea565b341015610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c50906139db565b60405180910390fd5b5b6104008282610c699190613b63565b10610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca0906139bb565b60405180910390fd5b60005b82811015610cdc57610cc9848284610cc49190613b63565b611ccd565b8080610cd490613d60565b915050610cac565b50505050565b610cfd838383604051806020016040528060008152506114ef565b505050565b60606000610d0f83610fdb565b905060008167ffffffffffffffff811115610d53577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610d815781602001602082028036833780820191505090505b50905060005b82811015610df157610d998582610a7e565b828281518110610dd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610de990613d60565b915050610d87565b508092505050919050565b6000610e06610a11565b8210610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e90613a1b565b60405180910390fd5b60088281548110610e81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e9b611866565b73ffffffffffffffffffffffffffffffffffffffff16610eb96111dd565b73ffffffffffffffffffffffffffffffffffffffff1614610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f069061393b565b60405180910390fd5b80600b9080519060200190610f2592919061291a565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc9906138bb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561104c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110439061389b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61109b611866565b73ffffffffffffffffffffffffffffffffffffffff166110b96111dd565b73ffffffffffffffffffffffffffffffffffffffff161461110f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111069061393b565b60405180910390fd5b6111196000611ceb565b565b61040081565b611129611866565b73ffffffffffffffffffffffffffffffffffffffff166111476111dd565b73ffffffffffffffffffffffffffffffffffffffff161461119d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111949061393b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506111db57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61120f611866565b73ffffffffffffffffffffffffffffffffffffffff1661122d6111dd565b73ffffffffffffffffffffffffffffffffffffffff1614611283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127a9061393b565b60405180910390fd5b80600d8190555050565b60606001805461129c90613d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546112c890613d2e565b80156113155780601f106112ea57610100808354040283529160200191611315565b820191906000526020600020905b8154815290600101906020018083116112f857829003601f168201915b5050505050905090565b60006113296111dd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611365576000905061136b565b600d5490505b90565b611376611866565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113db9061381b565b60405180910390fd5b80600560006113f1611866565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661149e611866565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114e3919061373e565b60405180910390a35050565b6115006114fa611866565b83611993565b61153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906139fb565b60405180910390fd5b61154b84848484611db1565b50505050565b606061155c8261186e565b61159b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115929061397b565b60405180910390fd5b60006115a5611e0d565b905060008151116115c557604051806020016040528060008152506115f0565b806115cf84611e9f565b6040516020016115e0929190613691565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611694611866565b73ffffffffffffffffffffffffffffffffffffffff166116b26111dd565b73ffffffffffffffffffffffffffffffffffffffff1614611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff9061393b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906137bb565b60405180910390fd5b61178181611ceb565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061184f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061185f575061185e8261204c565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661194d83610f29565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061199e8261186e565b6119dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d49061383b565b60405180910390fd5b60006119e883610f29565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a5757508373ffffffffffffffffffffffffffffffffffffffff16611a3f84610861565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a685750611a6781856115f8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a9182610f29565b73ffffffffffffffffffffffffffffffffffffffff1614611ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ade9061395b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e906137fb565b60405180910390fd5b611b628383836120b6565b611b6d6000826118da565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bbd9190613c44565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c149190613b63565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611ce78282604051806020016040528060008152506121ca565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611dbc848484611a71565b611dc884848484612225565b611e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfe9061379b565b60405180910390fd5b50505050565b6060600b8054611e1c90613d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4890613d2e565b8015611e955780601f10611e6a57610100808354040283529160200191611e95565b820191906000526020600020905b815481529060010190602001808311611e7857829003601f168201915b5050505050905090565b60606000821415611ee7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612047565b600082905060005b60008214611f19578080611f0290613d60565b915050600a82611f129190613bb9565b9150611eef565b60008167ffffffffffffffff811115611f5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f8d5781602001600182028036833780820191505090505b5090505b6000851461204057600182611fa69190613c44565b9150600a85611fb59190613da9565b6030611fc19190613b63565b60f81b818381518110611ffd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120399190613bb9565b9450611f91565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120c18383836123bc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612104576120ff816123c1565b612143565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461214257612141838261240a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121865761218181612577565b6121c5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121c4576121c382826126ba565b5b5b505050565b6121d48383612739565b6121e16000848484612225565b612220576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122179061379b565b60405180910390fd5b505050565b60006122468473ffffffffffffffffffffffffffffffffffffffff16612907565b156123af578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261226f611866565b8786866040518563ffffffff1660e01b815260040161229194939291906136d0565b602060405180830381600087803b1580156122ab57600080fd5b505af19250505080156122dc57506040513d601f19601f820116820180604052508101906122d99190612cef565b60015b61235f573d806000811461230c576040519150601f19603f3d011682016040523d82523d6000602084013e612311565b606091505b50600081511415612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234e9061379b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123b4565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161241784610fdb565b6124219190613c44565b9050600060076000848152602001908152602001600020549050818114612506576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061258b9190613c44565b90506000600960008481526020019081526020016000205490506000600883815481106125e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612629577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061269e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006126c583610fdb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a0906138db565b60405180910390fd5b6127b28161186e565b156127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e9906137db565b60405180910390fd5b6127fe600083836120b6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461284e9190613b63565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461292690613d2e565b90600052602060002090601f016020900481019282612948576000855561298f565b82601f1061296157805160ff191683800117855561298f565b8280016001018555821561298f579182015b8281111561298e578251825591602001919060010190612973565b5b50905061299c91906129a0565b5090565b5b808211156129b95760008160009055506001016129a1565b5090565b60006129d06129cb84613a87565b613a56565b9050828152602081018484840111156129e857600080fd5b6129f3848285613cec565b509392505050565b6000612a0e612a0984613ab7565b613a56565b905082815260208101848484011115612a2657600080fd5b612a31848285613cec565b509392505050565b600081359050612a4881613ea7565b92915050565b600081359050612a5d81613ebe565b92915050565b600081359050612a7281613ed5565b92915050565b600081519050612a8781613ed5565b92915050565b600082601f830112612a9e57600080fd5b8135612aae8482602086016129bd565b91505092915050565b600082601f830112612ac857600080fd5b8135612ad88482602086016129fb565b91505092915050565b600081359050612af081613eec565b92915050565b600060208284031215612b0857600080fd5b6000612b1684828501612a39565b91505092915050565b60008060408385031215612b3257600080fd5b6000612b4085828601612a39565b9250506020612b5185828601612a39565b9150509250929050565b600080600060608486031215612b7057600080fd5b6000612b7e86828701612a39565b9350506020612b8f86828701612a39565b9250506040612ba086828701612ae1565b9150509250925092565b60008060008060808587031215612bc057600080fd5b6000612bce87828801612a39565b9450506020612bdf87828801612a39565b9350506040612bf087828801612ae1565b925050606085013567ffffffffffffffff811115612c0d57600080fd5b612c1987828801612a8d565b91505092959194509250565b60008060408385031215612c3857600080fd5b6000612c4685828601612a39565b9250506020612c5785828601612a4e565b9150509250929050565b60008060408385031215612c7457600080fd5b6000612c8285828601612a39565b9250506020612c9385828601612ae1565b9150509250929050565b600060208284031215612caf57600080fd5b6000612cbd84828501612a4e565b91505092915050565b600060208284031215612cd857600080fd5b6000612ce684828501612a63565b91505092915050565b600060208284031215612d0157600080fd5b6000612d0f84828501612a78565b91505092915050565b600060208284031215612d2a57600080fd5b600082013567ffffffffffffffff811115612d4457600080fd5b612d5084828501612ab7565b91505092915050565b600060208284031215612d6b57600080fd5b6000612d7984828501612ae1565b91505092915050565b6000612d8e8383613673565b60208301905092915050565b612da381613c78565b82525050565b6000612db482613af7565b612dbe8185613b25565b9350612dc983613ae7565b8060005b83811015612dfa578151612de18882612d82565b9750612dec83613b18565b925050600181019050612dcd565b5085935050505092915050565b612e1081613c8a565b82525050565b6000612e2182613b02565b612e2b8185613b36565b9350612e3b818560208601613cfb565b612e4481613e96565b840191505092915050565b6000612e5a82613b0d565b612e648185613b47565b9350612e74818560208601613cfb565b612e7d81613e96565b840191505092915050565b6000612e9382613b0d565b612e9d8185613b58565b9350612ead818560208601613cfb565b80840191505092915050565b6000612ec6602b83613b47565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612f2c603283613b47565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f92602683613b47565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ff8601c83613b47565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613038602483613b47565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061309e601983613b47565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130de602c83613b47565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613144602a83613b47565b91507f596f752063616e2061646f70742061206d6178696d756d206f66205f6d61784d60008301527f696e7420746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b60006131aa603883613b47565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613210602a83613b47565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613276602983613b47565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132dc602083613b47565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061331c600b83613b47565b91507f53616c65205061757365640000000000000000000000000000000000000000006000830152602082019050919050565b600061335c602c83613b47565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006133c2602083613b47565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613402602983613b47565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613468602f83613b47565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134ce602183613b47565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613534601683613b47565b91507f45786365656473206d6178696d756d20737570706c79000000000000000000006000830152602082019050919050565b6000613574601983613b47565b91507f45746865722073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b60006135b4603183613b47565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061361a602c83613b47565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61367c81613ce2565b82525050565b61368b81613ce2565b82525050565b600061369d8285612e88565b91506136a98284612e88565b91508190509392505050565b60006020820190506136ca6000830184612d9a565b92915050565b60006080820190506136e56000830187612d9a565b6136f26020830186612d9a565b6136ff6040830185613682565b81810360608301526137118184612e16565b905095945050505050565b600060208201905081810360008301526137368184612da9565b905092915050565b60006020820190506137536000830184612e07565b92915050565b600060208201905081810360008301526137738184612e4f565b905092915050565b6000602082019050818103600083015261379481612eb9565b9050919050565b600060208201905081810360008301526137b481612f1f565b9050919050565b600060208201905081810360008301526137d481612f85565b9050919050565b600060208201905081810360008301526137f481612feb565b9050919050565b600060208201905081810360008301526138148161302b565b9050919050565b6000602082019050818103600083015261383481613091565b9050919050565b60006020820190508181036000830152613854816130d1565b9050919050565b6000602082019050818103600083015261387481613137565b9050919050565b600060208201905081810360008301526138948161319d565b9050919050565b600060208201905081810360008301526138b481613203565b9050919050565b600060208201905081810360008301526138d481613269565b9050919050565b600060208201905081810360008301526138f4816132cf565b9050919050565b600060208201905081810360008301526139148161330f565b9050919050565b600060208201905081810360008301526139348161334f565b9050919050565b60006020820190508181036000830152613954816133b5565b9050919050565b60006020820190508181036000830152613974816133f5565b9050919050565b600060208201905081810360008301526139948161345b565b9050919050565b600060208201905081810360008301526139b4816134c1565b9050919050565b600060208201905081810360008301526139d481613527565b9050919050565b600060208201905081810360008301526139f481613567565b9050919050565b60006020820190508181036000830152613a14816135a7565b9050919050565b60006020820190508181036000830152613a348161360d565b9050919050565b6000602082019050613a506000830184613682565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613a7d57613a7c613e67565b5b8060405250919050565b600067ffffffffffffffff821115613aa257613aa1613e67565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613ad257613ad1613e67565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b6e82613ce2565b9150613b7983613ce2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bae57613bad613dda565b5b828201905092915050565b6000613bc482613ce2565b9150613bcf83613ce2565b925082613bdf57613bde613e09565b5b828204905092915050565b6000613bf582613ce2565b9150613c0083613ce2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3957613c38613dda565b5b828202905092915050565b6000613c4f82613ce2565b9150613c5a83613ce2565b925082821015613c6d57613c6c613dda565b5b828203905092915050565b6000613c8382613cc2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d19578082015181840152602081019050613cfe565b83811115613d28576000848401525b50505050565b60006002820490506001821680613d4657607f821691505b60208210811415613d5a57613d59613e38565b5b50919050565b6000613d6b82613ce2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d9e57613d9d613dda565b5b600182019050919050565b6000613db482613ce2565b9150613dbf83613ce2565b925082613dcf57613dce613e09565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613eb081613c78565b8114613ebb57600080fd5b50565b613ec781613c8a565b8114613ed257600080fd5b50565b613ede81613c96565b8114613ee957600080fd5b50565b613ef581613ce2565b8114613f0057600080fd5b5056fea26469706673582212201e4a0501aacee7dfbbef119197ee32011f83d3b0f184f4fc39e3099d69f2886f64736f6c63430008000033
Deployed Bytecode
0x6080604052600436106101b75760003560e01c80636352211e116100ec57806395d89b411161008a578063b88d4fde11610064578063b88d4fde146105f0578063c87b56dd14610619578063e985e9c514610656578063f2fde38b14610693576101b7565b806395d89b411461057157806398d5fdca1461059c578063a22cb465146105c7576101b7565b80637d4cb964116100c65780637d4cb964146104e8578063853828b6146105135780638da5cb5b1461051d57806391b7f5ed14610548576101b7565b80636352211e1461045757806370a0823114610494578063715018a6146104d1576101b7565b806323b872dd1161015957806342842e0e1161013357806342842e0e1461038b578063438b6300146103b45780634f6ccce7146103f157806355f804b31461042e576101b7565b806323b872dd146103095780632f745c591461033257806340c10f191461036f576101b7565b8063081812fc11610195578063081812fc1461024d578063095ea7b31461028a57806316c61ccc146102b357806318160ddd146102de576101b7565b806301ffc9a7146101bc57806302329a29146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612cc6565b6106bc565b6040516101f0919061373e565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b9190612c9d565b610736565b005b34801561022e57600080fd5b506102376107cf565b6040516102449190613759565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f9190612d59565b610861565b60405161028191906136b5565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac9190612c61565b6108e6565b005b3480156102bf57600080fd5b506102c86109fe565b6040516102d5919061373e565b60405180910390f35b3480156102ea57600080fd5b506102f3610a11565b6040516103009190613a3b565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b9190612b5b565b610a1e565b005b34801561033e57600080fd5b5061035960048036038101906103549190612c61565b610a7e565b6040516103669190613a3b565b60405180910390f35b61038960048036038101906103849190612c61565b610b23565b005b34801561039757600080fd5b506103b260048036038101906103ad9190612b5b565b610ce2565b005b3480156103c057600080fd5b506103db60048036038101906103d69190612af6565b610d02565b6040516103e8919061371c565b60405180910390f35b3480156103fd57600080fd5b5061041860048036038101906104139190612d59565b610dfc565b6040516104259190613a3b565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190612d18565b610e93565b005b34801561046357600080fd5b5061047e60048036038101906104799190612d59565b610f29565b60405161048b91906136b5565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190612af6565b610fdb565b6040516104c89190613a3b565b60405180910390f35b3480156104dd57600080fd5b506104e6611093565b005b3480156104f457600080fd5b506104fd61111b565b60405161050a9190613a3b565b60405180910390f35b61051b611121565b005b34801561052957600080fd5b506105326111dd565b60405161053f91906136b5565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a9190612d59565b611207565b005b34801561057d57600080fd5b5061058661128d565b6040516105939190613759565b60405180910390f35b3480156105a857600080fd5b506105b161131f565b6040516105be9190613a3b565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612c25565b61136e565b005b3480156105fc57600080fd5b5061061760048036038101906106129190612baa565b6114ef565b005b34801561062557600080fd5b50610640600480360381019061063b9190612d59565b611551565b60405161064d9190613759565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190612b1f565b6115f8565b60405161068a919061373e565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190612af6565b61168c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072f575061072e82611784565b5b9050919050565b61073e611866565b73ffffffffffffffffffffffffffffffffffffffff1661075c6111dd565b73ffffffffffffffffffffffffffffffffffffffff16146107b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a99061393b565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6060600080546107de90613d2e565b80601f016020809104026020016040519081016040528092919081815260200182805461080a90613d2e565b80156108575780601f1061082c57610100808354040283529160200191610857565b820191906000526020600020905b81548152906001019060200180831161083a57829003601f168201915b5050505050905090565b600061086c8261186e565b6108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a29061391b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f182610f29565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109599061399b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610981611866565b73ffffffffffffffffffffffffffffffffffffffff1614806109b057506109af816109aa611866565b6115f8565b5b6109ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e69061387b565b60405180910390fd5b6109f983836118da565b505050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b610a2f610a29611866565b82611993565b610a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a65906139fb565b60405180910390fd5b610a79838383611a71565b505050565b6000610a8983610fdb565b8210610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac19061377b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610b2d610a11565b9050610b376111dd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c5a57600e60009054906101000a900460ff1615610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb0906138fb565b60405180910390fd5b6001600c54610bc89190613b63565b8210610c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c009061385b565b60405180910390fd5b81600d54610c179190613bea565b341015610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c50906139db565b60405180910390fd5b5b6104008282610c699190613b63565b10610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca0906139bb565b60405180910390fd5b60005b82811015610cdc57610cc9848284610cc49190613b63565b611ccd565b8080610cd490613d60565b915050610cac565b50505050565b610cfd838383604051806020016040528060008152506114ef565b505050565b60606000610d0f83610fdb565b905060008167ffffffffffffffff811115610d53577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610d815781602001602082028036833780820191505090505b50905060005b82811015610df157610d998582610a7e565b828281518110610dd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610de990613d60565b915050610d87565b508092505050919050565b6000610e06610a11565b8210610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e90613a1b565b60405180910390fd5b60088281548110610e81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e9b611866565b73ffffffffffffffffffffffffffffffffffffffff16610eb96111dd565b73ffffffffffffffffffffffffffffffffffffffff1614610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f069061393b565b60405180910390fd5b80600b9080519060200190610f2592919061291a565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc9906138bb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561104c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110439061389b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61109b611866565b73ffffffffffffffffffffffffffffffffffffffff166110b96111dd565b73ffffffffffffffffffffffffffffffffffffffff161461110f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111069061393b565b60405180910390fd5b6111196000611ceb565b565b61040081565b611129611866565b73ffffffffffffffffffffffffffffffffffffffff166111476111dd565b73ffffffffffffffffffffffffffffffffffffffff161461119d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111949061393b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506111db57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61120f611866565b73ffffffffffffffffffffffffffffffffffffffff1661122d6111dd565b73ffffffffffffffffffffffffffffffffffffffff1614611283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127a9061393b565b60405180910390fd5b80600d8190555050565b60606001805461129c90613d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546112c890613d2e565b80156113155780601f106112ea57610100808354040283529160200191611315565b820191906000526020600020905b8154815290600101906020018083116112f857829003601f168201915b5050505050905090565b60006113296111dd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611365576000905061136b565b600d5490505b90565b611376611866565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113db9061381b565b60405180910390fd5b80600560006113f1611866565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661149e611866565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114e3919061373e565b60405180910390a35050565b6115006114fa611866565b83611993565b61153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906139fb565b60405180910390fd5b61154b84848484611db1565b50505050565b606061155c8261186e565b61159b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115929061397b565b60405180910390fd5b60006115a5611e0d565b905060008151116115c557604051806020016040528060008152506115f0565b806115cf84611e9f565b6040516020016115e0929190613691565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611694611866565b73ffffffffffffffffffffffffffffffffffffffff166116b26111dd565b73ffffffffffffffffffffffffffffffffffffffff1614611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff9061393b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906137bb565b60405180910390fd5b61178181611ceb565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061184f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061185f575061185e8261204c565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661194d83610f29565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061199e8261186e565b6119dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d49061383b565b60405180910390fd5b60006119e883610f29565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a5757508373ffffffffffffffffffffffffffffffffffffffff16611a3f84610861565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a685750611a6781856115f8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a9182610f29565b73ffffffffffffffffffffffffffffffffffffffff1614611ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ade9061395b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e906137fb565b60405180910390fd5b611b628383836120b6565b611b6d6000826118da565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bbd9190613c44565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c149190613b63565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611ce78282604051806020016040528060008152506121ca565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611dbc848484611a71565b611dc884848484612225565b611e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfe9061379b565b60405180910390fd5b50505050565b6060600b8054611e1c90613d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4890613d2e565b8015611e955780601f10611e6a57610100808354040283529160200191611e95565b820191906000526020600020905b815481529060010190602001808311611e7857829003601f168201915b5050505050905090565b60606000821415611ee7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612047565b600082905060005b60008214611f19578080611f0290613d60565b915050600a82611f129190613bb9565b9150611eef565b60008167ffffffffffffffff811115611f5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f8d5781602001600182028036833780820191505090505b5090505b6000851461204057600182611fa69190613c44565b9150600a85611fb59190613da9565b6030611fc19190613b63565b60f81b818381518110611ffd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120399190613bb9565b9450611f91565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120c18383836123bc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612104576120ff816123c1565b612143565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461214257612141838261240a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121865761218181612577565b6121c5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121c4576121c382826126ba565b5b5b505050565b6121d48383612739565b6121e16000848484612225565b612220576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122179061379b565b60405180910390fd5b505050565b60006122468473ffffffffffffffffffffffffffffffffffffffff16612907565b156123af578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261226f611866565b8786866040518563ffffffff1660e01b815260040161229194939291906136d0565b602060405180830381600087803b1580156122ab57600080fd5b505af19250505080156122dc57506040513d601f19601f820116820180604052508101906122d99190612cef565b60015b61235f573d806000811461230c576040519150601f19603f3d011682016040523d82523d6000602084013e612311565b606091505b50600081511415612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234e9061379b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123b4565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161241784610fdb565b6124219190613c44565b9050600060076000848152602001908152602001600020549050818114612506576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061258b9190613c44565b90506000600960008481526020019081526020016000205490506000600883815481106125e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612629577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061269e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006126c583610fdb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a0906138db565b60405180910390fd5b6127b28161186e565b156127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e9906137db565b60405180910390fd5b6127fe600083836120b6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461284e9190613b63565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461292690613d2e565b90600052602060002090601f016020900481019282612948576000855561298f565b82601f1061296157805160ff191683800117855561298f565b8280016001018555821561298f579182015b8281111561298e578251825591602001919060010190612973565b5b50905061299c91906129a0565b5090565b5b808211156129b95760008160009055506001016129a1565b5090565b60006129d06129cb84613a87565b613a56565b9050828152602081018484840111156129e857600080fd5b6129f3848285613cec565b509392505050565b6000612a0e612a0984613ab7565b613a56565b905082815260208101848484011115612a2657600080fd5b612a31848285613cec565b509392505050565b600081359050612a4881613ea7565b92915050565b600081359050612a5d81613ebe565b92915050565b600081359050612a7281613ed5565b92915050565b600081519050612a8781613ed5565b92915050565b600082601f830112612a9e57600080fd5b8135612aae8482602086016129bd565b91505092915050565b600082601f830112612ac857600080fd5b8135612ad88482602086016129fb565b91505092915050565b600081359050612af081613eec565b92915050565b600060208284031215612b0857600080fd5b6000612b1684828501612a39565b91505092915050565b60008060408385031215612b3257600080fd5b6000612b4085828601612a39565b9250506020612b5185828601612a39565b9150509250929050565b600080600060608486031215612b7057600080fd5b6000612b7e86828701612a39565b9350506020612b8f86828701612a39565b9250506040612ba086828701612ae1565b9150509250925092565b60008060008060808587031215612bc057600080fd5b6000612bce87828801612a39565b9450506020612bdf87828801612a39565b9350506040612bf087828801612ae1565b925050606085013567ffffffffffffffff811115612c0d57600080fd5b612c1987828801612a8d565b91505092959194509250565b60008060408385031215612c3857600080fd5b6000612c4685828601612a39565b9250506020612c5785828601612a4e565b9150509250929050565b60008060408385031215612c7457600080fd5b6000612c8285828601612a39565b9250506020612c9385828601612ae1565b9150509250929050565b600060208284031215612caf57600080fd5b6000612cbd84828501612a4e565b91505092915050565b600060208284031215612cd857600080fd5b6000612ce684828501612a63565b91505092915050565b600060208284031215612d0157600080fd5b6000612d0f84828501612a78565b91505092915050565b600060208284031215612d2a57600080fd5b600082013567ffffffffffffffff811115612d4457600080fd5b612d5084828501612ab7565b91505092915050565b600060208284031215612d6b57600080fd5b6000612d7984828501612ae1565b91505092915050565b6000612d8e8383613673565b60208301905092915050565b612da381613c78565b82525050565b6000612db482613af7565b612dbe8185613b25565b9350612dc983613ae7565b8060005b83811015612dfa578151612de18882612d82565b9750612dec83613b18565b925050600181019050612dcd565b5085935050505092915050565b612e1081613c8a565b82525050565b6000612e2182613b02565b612e2b8185613b36565b9350612e3b818560208601613cfb565b612e4481613e96565b840191505092915050565b6000612e5a82613b0d565b612e648185613b47565b9350612e74818560208601613cfb565b612e7d81613e96565b840191505092915050565b6000612e9382613b0d565b612e9d8185613b58565b9350612ead818560208601613cfb565b80840191505092915050565b6000612ec6602b83613b47565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612f2c603283613b47565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f92602683613b47565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ff8601c83613b47565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613038602483613b47565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061309e601983613b47565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130de602c83613b47565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613144602a83613b47565b91507f596f752063616e2061646f70742061206d6178696d756d206f66205f6d61784d60008301527f696e7420746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b60006131aa603883613b47565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613210602a83613b47565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613276602983613b47565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132dc602083613b47565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061331c600b83613b47565b91507f53616c65205061757365640000000000000000000000000000000000000000006000830152602082019050919050565b600061335c602c83613b47565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006133c2602083613b47565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613402602983613b47565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613468602f83613b47565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134ce602183613b47565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613534601683613b47565b91507f45786365656473206d6178696d756d20737570706c79000000000000000000006000830152602082019050919050565b6000613574601983613b47565b91507f45746865722073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b60006135b4603183613b47565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061361a602c83613b47565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61367c81613ce2565b82525050565b61368b81613ce2565b82525050565b600061369d8285612e88565b91506136a98284612e88565b91508190509392505050565b60006020820190506136ca6000830184612d9a565b92915050565b60006080820190506136e56000830187612d9a565b6136f26020830186612d9a565b6136ff6040830185613682565b81810360608301526137118184612e16565b905095945050505050565b600060208201905081810360008301526137368184612da9565b905092915050565b60006020820190506137536000830184612e07565b92915050565b600060208201905081810360008301526137738184612e4f565b905092915050565b6000602082019050818103600083015261379481612eb9565b9050919050565b600060208201905081810360008301526137b481612f1f565b9050919050565b600060208201905081810360008301526137d481612f85565b9050919050565b600060208201905081810360008301526137f481612feb565b9050919050565b600060208201905081810360008301526138148161302b565b9050919050565b6000602082019050818103600083015261383481613091565b9050919050565b60006020820190508181036000830152613854816130d1565b9050919050565b6000602082019050818103600083015261387481613137565b9050919050565b600060208201905081810360008301526138948161319d565b9050919050565b600060208201905081810360008301526138b481613203565b9050919050565b600060208201905081810360008301526138d481613269565b9050919050565b600060208201905081810360008301526138f4816132cf565b9050919050565b600060208201905081810360008301526139148161330f565b9050919050565b600060208201905081810360008301526139348161334f565b9050919050565b60006020820190508181036000830152613954816133b5565b9050919050565b60006020820190508181036000830152613974816133f5565b9050919050565b600060208201905081810360008301526139948161345b565b9050919050565b600060208201905081810360008301526139b4816134c1565b9050919050565b600060208201905081810360008301526139d481613527565b9050919050565b600060208201905081810360008301526139f481613567565b9050919050565b60006020820190508181036000830152613a14816135a7565b9050919050565b60006020820190508181036000830152613a348161360d565b9050919050565b6000602082019050613a506000830184613682565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613a7d57613a7c613e67565b5b8060405250919050565b600067ffffffffffffffff821115613aa257613aa1613e67565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613ad257613ad1613e67565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b6e82613ce2565b9150613b7983613ce2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bae57613bad613dda565b5b828201905092915050565b6000613bc482613ce2565b9150613bcf83613ce2565b925082613bdf57613bde613e09565b5b828204905092915050565b6000613bf582613ce2565b9150613c0083613ce2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3957613c38613dda565b5b828202905092915050565b6000613c4f82613ce2565b9150613c5a83613ce2565b925082821015613c6d57613c6c613dda565b5b828203905092915050565b6000613c8382613cc2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d19578082015181840152602081019050613cfe565b83811115613d28576000848401525b50505050565b60006002820490506001821680613d4657607f821691505b60208210811415613d5a57613d59613e38565b5b50919050565b6000613d6b82613ce2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d9e57613d9d613dda565b5b600182019050919050565b6000613db482613ce2565b9150613dbf83613ce2565b925082613dcf57613dce613e09565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613eb081613c78565b8114613ebb57600080fd5b50565b613ec781613c8a565b8114613ed257600080fd5b50565b613ede81613c96565b8114613ee957600080fd5b50565b613ef581613ce2565b8114613f0057600080fd5b5056fea26469706673582212201e4a0501aacee7dfbbef119197ee32011f83d3b0f184f4fc39e3099d69f2886f64736f6c63430008000033
Deployed Bytecode Sourcemap
43176:1991:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34698:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44959:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21603:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23162:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22685:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43381:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35338:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24052:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35006:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43576:532;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24462:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44116:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35528:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44849:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21297:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21027:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42493:94;;;;;;;;;;;;;:::i;:::-;;43415:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45041:123;;;:::i;:::-;;41842:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44626:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21772:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44466:152;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23455:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24718:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21947:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23821:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42742:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34698:224;34800:4;34839:35;34824:50;;;:11;:50;;;;:90;;;;34878:36;34902:11;34878:23;:36::i;:::-;34824:90;34817:97;;34698:224;;;:::o;44959:74::-;42073:12;:10;:12::i;:::-;42062:23;;:7;:5;:7::i;:::-;:23;;;42054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45022:3:::1;45012:7;;:13;;;;;;;;;;;;;;;;;;44959:74:::0;:::o;21603:100::-;21657:13;21690:5;21683:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21603:100;:::o;23162:221::-;23238:7;23266:16;23274:7;23266;:16::i;:::-;23258:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23351:15;:24;23367:7;23351:24;;;;;;;;;;;;;;;;;;;;;23344:31;;23162:221;;;:::o;22685:411::-;22766:13;22782:23;22797:7;22782:14;:23::i;:::-;22766:39;;22830:5;22824:11;;:2;:11;;;;22816:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22924:5;22908:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22933:37;22950:5;22957:12;:10;:12::i;:::-;22933:16;:37::i;:::-;22908:62;22886:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23067:21;23076:2;23080:7;23067:8;:21::i;:::-;22685:411;;;:::o;43381:27::-;;;;;;;;;;;;;:::o;35338:113::-;35399:7;35426:10;:17;;;;35419:24;;35338:113;:::o;24052:339::-;24247:41;24266:12;:10;:12::i;:::-;24280:7;24247:18;:41::i;:::-;24239:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24355:28;24365:4;24371:2;24375:7;24355:9;:28::i;:::-;24052:339;;;:::o;35006:256::-;35103:7;35139:23;35156:5;35139:16;:23::i;:::-;35131:5;:31;35123:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35228:12;:19;35241:5;35228:19;;;;;;;;;;;;;;;:26;35248:5;35228:26;;;;;;;;;;;;35221:33;;35006:256;;;;:::o;43576:532::-;43642:14;43659:13;:11;:13::i;:::-;43642:30;;43702:7;:5;:7::i;:::-;43688:21;;:10;:21;;;43685:247;;43733:7;;;;;;;;;;;43732:8;43724:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;43794:1;43785:8;;:10;;;;:::i;:::-;43778:3;:18;43769:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;43887:3;43878:6;;:12;;;;:::i;:::-;43865:9;:25;;43856:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;43685:247;43450:4;43962:3;43953:6;:12;;;;:::i;:::-;:26;43944:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44024:9;44020:81;44039:3;44035:1;:7;44020:81;;;44061:28;44072:3;44086:1;44077:6;:10;;;;:::i;:::-;44061:9;:28::i;:::-;44044:3;;;;;:::i;:::-;;;;44020:81;;;;43576:532;;;:::o;24462:185::-;24600:39;24617:4;24623:2;24627:7;24600:39;;;;;;;;;;;;:16;:39::i;:::-;24462:185;;;:::o;44116:342::-;44175:16;44204:18;44225:17;44235:6;44225:9;:17::i;:::-;44204:38;;44255:25;44297:10;44283:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44255:53;;44323:9;44319:106;44338:10;44334:1;:14;44319:106;;;44383:30;44403:6;44411:1;44383:19;:30::i;:::-;44369:8;44378:1;44369:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;44350:3;;;;;:::i;:::-;;;;44319:106;;;;44442:8;44435:15;;;;44116:342;;;:::o;35528:233::-;35603:7;35639:30;:28;:30::i;:::-;35631:5;:38;35623:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35736:10;35747:5;35736:17;;;;;;;;;;;;;;;;;;;;;;;;35729:24;;35528:233;;;:::o;44849:102::-;42073:12;:10;:12::i;:::-;42062:23;;:7;:5;:7::i;:::-;:23;;;42054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44936:7:::1;44920:13;:23;;;;;;;;;;;;:::i;:::-;;44849:102:::0;:::o;21297:239::-;21369:7;21389:13;21405:7;:16;21413:7;21405:16;;;;;;;;;;;;;;;;;;;;;21389:32;;21457:1;21440:19;;:5;:19;;;;21432:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21523:5;21516:12;;;21297:239;;;:::o;21027:208::-;21099:7;21144:1;21127:19;;:5;:19;;;;21119:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21211:9;:16;21221:5;21211:16;;;;;;;;;;;;;;;;21204:23;;21027:208;;;:::o;42493:94::-;42073:12;:10;:12::i;:::-;42062:23;;:7;:5;:7::i;:::-;:23;;;42054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42558:21:::1;42576:1;42558:9;:21::i;:::-;42493:94::o:0;43415:39::-;43450:4;43415:39;:::o;45041:123::-;42073:12;:10;:12::i;:::-;42062:23;;:7;:5;:7::i;:::-;:23;;;42054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45116:10:::1;45108:24;;:47;45133:21;45108:47;;;;;;;;;;;;;;;;;;;;;;;45100:56;;;::::0;::::1;;45041:123::o:0;41842:87::-;41888:7;41915:6;;;;;;;;;;;41908:13;;41842:87;:::o;44626:93::-;42073:12;:10;:12::i;:::-;42062:23;;:7;:5;:7::i;:::-;:23;;;42054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44702:9:::1;44693:6;:18;;;;44626:93:::0;:::o;21772:104::-;21828:13;21861:7;21854:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21772:104;:::o;44466:152::-;44507:7;44543;:5;:7::i;:::-;44529:21;;:10;:21;;;44526:61;;;44574:1;44567:8;;;;44526:61;44604:6;;44597:13;;44466:152;;:::o;23455:295::-;23570:12;:10;:12::i;:::-;23558:24;;:8;:24;;;;23550:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23670:8;23625:18;:32;23644:12;:10;:12::i;:::-;23625:32;;;;;;;;;;;;;;;:42;23658:8;23625:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23723:8;23694:48;;23709:12;:10;:12::i;:::-;23694:48;;;23733:8;23694:48;;;;;;:::i;:::-;;;;;;;;23455:295;;:::o;24718:328::-;24893:41;24912:12;:10;:12::i;:::-;24926:7;24893:18;:41::i;:::-;24885:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24999:39;25013:4;25019:2;25023:7;25032:5;24999:13;:39::i;:::-;24718:328;;;;:::o;21947:334::-;22020:13;22054:16;22062:7;22054;:16::i;:::-;22046:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22135:21;22159:10;:8;:10::i;:::-;22135:34;;22211:1;22193:7;22187:21;:25;:86;;;;;;;;;;;;;;;;;22239:7;22248:18;:7;:16;:18::i;:::-;22222:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22187:86;22180:93;;;21947:334;;;:::o;23821:164::-;23918:4;23942:18;:25;23961:5;23942:25;;;;;;;;;;;;;;;:35;23968:8;23942:35;;;;;;;;;;;;;;;;;;;;;;;;;23935:42;;23821:164;;;;:::o;42742:192::-;42073:12;:10;:12::i;:::-;42062:23;;:7;:5;:7::i;:::-;:23;;;42054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42851:1:::1;42831:22;;:8;:22;;;;42823:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42907:19;42917:8;42907:9;:19::i;:::-;42742:192:::0;:::o;20658:305::-;20760:4;20812:25;20797:40;;;:11;:40;;;;:105;;;;20869:33;20854:48;;;:11;:48;;;;20797:105;:158;;;;20919:36;20943:11;20919:23;:36::i;:::-;20797:158;20777:178;;20658:305;;;:::o;16086:98::-;16139:7;16166:10;16159:17;;16086:98;:::o;26556:127::-;26621:4;26673:1;26645:30;;:7;:16;26653:7;26645:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26638:37;;26556:127;;;:::o;30538:174::-;30640:2;30613:15;:24;30629:7;30613:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30696:7;30692:2;30658:46;;30667:23;30682:7;30667:14;:23::i;:::-;30658:46;;;;;;;;;;;;30538:174;;:::o;26850:348::-;26943:4;26968:16;26976:7;26968;:16::i;:::-;26960:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27044:13;27060:23;27075:7;27060:14;:23::i;:::-;27044:39;;27113:5;27102:16;;:7;:16;;;:51;;;;27146:7;27122:31;;:20;27134:7;27122:11;:20::i;:::-;:31;;;27102:51;:87;;;;27157:32;27174:5;27181:7;27157:16;:32::i;:::-;27102:87;27094:96;;;26850:348;;;;:::o;29842:578::-;30001:4;29974:31;;:23;29989:7;29974:14;:23::i;:::-;:31;;;29966:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30084:1;30070:16;;:2;:16;;;;30062:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30140:39;30161:4;30167:2;30171:7;30140:20;:39::i;:::-;30244:29;30261:1;30265:7;30244:8;:29::i;:::-;30305:1;30286:9;:15;30296:4;30286:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30334:1;30317:9;:13;30327:2;30317:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30365:2;30346:7;:16;30354:7;30346:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30404:7;30400:2;30385:27;;30394:4;30385:27;;;;;;;;;;;;29842:578;;;:::o;27540:110::-;27616:26;27626:2;27630:7;27616:26;;;;;;;;;;;;:9;:26::i;:::-;27540:110;;:::o;42942:173::-;42998:16;43017:6;;;;;;;;;;;42998:25;;43043:8;43034:6;;:17;;;;;;;;;;;;;;;;;;43098:8;43067:40;;43088:8;43067:40;;;;;;;;;;;;42942:173;;:::o;25928:315::-;26085:28;26095:4;26101:2;26105:7;26085:9;:28::i;:::-;26132:48;26155:4;26161:2;26165:7;26174:5;26132:22;:48::i;:::-;26124:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25928:315;;;;:::o;44727:114::-;44787:13;44820;44813:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44727:114;:::o;16609:723::-;16665:13;16895:1;16886:5;:10;16882:53;;;16913:10;;;;;;;;;;;;;;;;;;;;;16882:53;16945:12;16960:5;16945:20;;16976:14;17001:78;17016:1;17008:4;:9;17001:78;;17034:8;;;;;:::i;:::-;;;;17065:2;17057:10;;;;;:::i;:::-;;;17001:78;;;17089:19;17121:6;17111:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17089:39;;17139:154;17155:1;17146:5;:10;17139:154;;17183:1;17173:11;;;;;:::i;:::-;;;17250:2;17242:5;:10;;;;:::i;:::-;17229:2;:24;;;;:::i;:::-;17216:39;;17199:6;17206;17199:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17279:2;17270:11;;;;;:::i;:::-;;;17139:154;;;17317:6;17303:21;;;;;16609:723;;;;:::o;19164:157::-;19249:4;19288:25;19273:40;;;:11;:40;;;;19266:47;;19164:157;;;:::o;36374:589::-;36518:45;36545:4;36551:2;36555:7;36518:26;:45::i;:::-;36596:1;36580:18;;:4;:18;;;36576:187;;;36615:40;36647:7;36615:31;:40::i;:::-;36576:187;;;36685:2;36677:10;;:4;:10;;;36673:90;;36704:47;36737:4;36743:7;36704:32;:47::i;:::-;36673:90;36576:187;36791:1;36777:16;;:2;:16;;;36773:183;;;36810:45;36847:7;36810:36;:45::i;:::-;36773:183;;;36883:4;36877:10;;:2;:10;;;36873:83;;36904:40;36932:2;36936:7;36904:27;:40::i;:::-;36873:83;36773:183;36374:589;;;:::o;27877:321::-;28007:18;28013:2;28017:7;28007:5;:18::i;:::-;28058:54;28089:1;28093:2;28097:7;28106:5;28058:22;:54::i;:::-;28036:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27877:321;;;:::o;31277:799::-;31432:4;31453:15;:2;:13;;;:15::i;:::-;31449:620;;;31505:2;31489:36;;;31526:12;:10;:12::i;:::-;31540:4;31546:7;31555:5;31489:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31485:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31748:1;31731:6;:13;:18;31727:272;;;31774:60;;;;;;;;;;:::i;:::-;;;;;;;;31727:272;31949:6;31943:13;31934:6;31930:2;31926:15;31919:38;31485:529;31622:41;;;31612:51;;;:6;:51;;;;31605:58;;;;;31449:620;32053:4;32046:11;;31277:799;;;;;;;:::o;32648:126::-;;;;:::o;37686:164::-;37790:10;:17;;;;37763:15;:24;37779:7;37763:24;;;;;;;;;;;:44;;;;37818:10;37834:7;37818:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37686:164;:::o;38477:988::-;38743:22;38793:1;38768:22;38785:4;38768:16;:22::i;:::-;:26;;;;:::i;:::-;38743:51;;38805:18;38826:17;:26;38844:7;38826:26;;;;;;;;;;;;38805:47;;38973:14;38959:10;:28;38955:328;;39004:19;39026:12;:18;39039:4;39026:18;;;;;;;;;;;;;;;:34;39045:14;39026:34;;;;;;;;;;;;39004:56;;39110:11;39077:12;:18;39090:4;39077:18;;;;;;;;;;;;;;;:30;39096:10;39077:30;;;;;;;;;;;:44;;;;39227:10;39194:17;:30;39212:11;39194:30;;;;;;;;;;;:43;;;;38955:328;;39379:17;:26;39397:7;39379:26;;;;;;;;;;;39372:33;;;39423:12;:18;39436:4;39423:18;;;;;;;;;;;;;;;:34;39442:14;39423:34;;;;;;;;;;;39416:41;;;38477:988;;;;:::o;39760:1079::-;40013:22;40058:1;40038:10;:17;;;;:21;;;;:::i;:::-;40013:46;;40070:18;40091:15;:24;40107:7;40091:24;;;;;;;;;;;;40070:45;;40442:19;40464:10;40475:14;40464:26;;;;;;;;;;;;;;;;;;;;;;;;40442:48;;40528:11;40503:10;40514;40503:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40639:10;40608:15;:28;40624:11;40608:28;;;;;;;;;;;:41;;;;40780:15;:24;40796:7;40780:24;;;;;;;;;;;40773:31;;;40815:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39760:1079;;;;:::o;37264:221::-;37349:14;37366:20;37383:2;37366:16;:20::i;:::-;37349:37;;37424:7;37397:12;:16;37410:2;37397:16;;;;;;;;;;;;;;;:24;37414:6;37397:24;;;;;;;;;;;:34;;;;37471:6;37442:17;:26;37460:7;37442:26;;;;;;;;;;;:35;;;;37264:221;;;:::o;28534:382::-;28628:1;28614:16;;:2;:16;;;;28606:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28687:16;28695:7;28687;:16::i;:::-;28686:17;28678:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28749:45;28778:1;28782:2;28786:7;28749:20;:45::i;:::-;28824:1;28807:9;:13;28817:2;28807:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28855:2;28836:7;:16;28844:7;28836:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28900:7;28896:2;28875:33;;28892:1;28875:33;;;;;;;;;;;;28534:382;;:::o;8132:387::-;8192:4;8400:12;8467:7;8455:20;8447:28;;8510:1;8503:4;:8;8496:15;;;8132:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:375::-;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:63;6047:7;6038:6;6027:9;6023:22;5992:63;:::i;:::-;5982:73;;5845:220;5773:299;;;;:::o;6078:262::-;;6186:2;6174:9;6165:7;6161:23;6157:32;6154:2;;;6202:1;6199;6192:12;6154:2;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6144:196;;;;:::o;6346:179::-;;6436:46;6478:3;6470:6;6436:46;:::i;:::-;6514:4;6509:3;6505:14;6491:28;;6426:99;;;;:::o;6531:118::-;6618:24;6636:5;6618:24;:::i;:::-;6613:3;6606:37;6596:53;;:::o;6685:732::-;;6833:54;6881:5;6833:54;:::i;:::-;6903:86;6982:6;6977:3;6903:86;:::i;:::-;6896:93;;7013:56;7063:5;7013:56;:::i;:::-;7092:7;7123:1;7108:284;7133:6;7130:1;7127:13;7108:284;;;7209:6;7203:13;7236:63;7295:3;7280:13;7236:63;:::i;:::-;7229:70;;7322:60;7375:6;7322:60;:::i;:::-;7312:70;;7168:224;7155:1;7152;7148:9;7143:14;;7108:284;;;7112:14;7408:3;7401:10;;6809:608;;;;;;;:::o;7423:109::-;7504:21;7519:5;7504:21;:::i;:::-;7499:3;7492:34;7482:50;;:::o;7538:360::-;;7652:38;7684:5;7652:38;:::i;:::-;7706:70;7769:6;7764:3;7706:70;:::i;:::-;7699:77;;7785:52;7830:6;7825:3;7818:4;7811:5;7807:16;7785:52;:::i;:::-;7862:29;7884:6;7862:29;:::i;:::-;7857:3;7853:39;7846:46;;7628:270;;;;;:::o;7904:364::-;;8020:39;8053:5;8020:39;:::i;:::-;8075:71;8139:6;8134:3;8075:71;:::i;:::-;8068:78;;8155:52;8200:6;8195:3;8188:4;8181:5;8177:16;8155:52;:::i;:::-;8232:29;8254:6;8232:29;:::i;:::-;8227:3;8223:39;8216:46;;7996:272;;;;;:::o;8274:377::-;;8408:39;8441:5;8408:39;:::i;:::-;8463:89;8545:6;8540:3;8463:89;:::i;:::-;8456:96;;8561:52;8606:6;8601:3;8594:4;8587:5;8583:16;8561:52;:::i;:::-;8638:6;8633:3;8629:16;8622:23;;8384:267;;;;;:::o;8657:375::-;;8820:67;8884:2;8879:3;8820:67;:::i;:::-;8813:74;;8917:34;8913:1;8908:3;8904:11;8897:55;8983:13;8978:2;8973:3;8969:12;8962:35;9023:2;9018:3;9014:12;9007:19;;8803:229;;;:::o;9038:382::-;;9201:67;9265:2;9260:3;9201:67;:::i;:::-;9194:74;;9298:34;9294:1;9289:3;9285:11;9278:55;9364:20;9359:2;9354:3;9350:12;9343:42;9411:2;9406:3;9402:12;9395:19;;9184:236;;;:::o;9426:370::-;;9589:67;9653:2;9648:3;9589:67;:::i;:::-;9582:74;;9686:34;9682:1;9677:3;9673:11;9666:55;9752:8;9747:2;9742:3;9738:12;9731:30;9787:2;9782:3;9778:12;9771:19;;9572:224;;;:::o;9802:326::-;;9965:67;10029:2;10024:3;9965:67;:::i;:::-;9958:74;;10062:30;10058:1;10053:3;10049:11;10042:51;10119:2;10114:3;10110:12;10103:19;;9948:180;;;:::o;10134:368::-;;10297:67;10361:2;10356:3;10297:67;:::i;:::-;10290:74;;10394:34;10390:1;10385:3;10381:11;10374:55;10460:6;10455:2;10450:3;10446:12;10439:28;10493:2;10488:3;10484:12;10477:19;;10280:222;;;:::o;10508:323::-;;10671:67;10735:2;10730:3;10671:67;:::i;:::-;10664:74;;10768:27;10764:1;10759:3;10755:11;10748:48;10822:2;10817:3;10813:12;10806:19;;10654:177;;;:::o;10837:376::-;;11000:67;11064:2;11059:3;11000:67;:::i;:::-;10993:74;;11097:34;11093:1;11088:3;11084:11;11077:55;11163:14;11158:2;11153:3;11149:12;11142:36;11204:2;11199:3;11195:12;11188:19;;10983:230;;;:::o;11219:374::-;;11382:67;11446:2;11441:3;11382:67;:::i;:::-;11375:74;;11479:34;11475:1;11470:3;11466:11;11459:55;11545:12;11540:2;11535:3;11531:12;11524:34;11584:2;11579:3;11575:12;11568:19;;11365:228;;;:::o;11599:388::-;;11762:67;11826:2;11821:3;11762:67;:::i;:::-;11755:74;;11859:34;11855:1;11850:3;11846:11;11839:55;11925:26;11920:2;11915:3;11911:12;11904:48;11978:2;11973:3;11969:12;11962:19;;11745:242;;;:::o;11993:374::-;;12156:67;12220:2;12215:3;12156:67;:::i;:::-;12149:74;;12253:34;12249:1;12244:3;12240:11;12233:55;12319:12;12314:2;12309:3;12305:12;12298:34;12358:2;12353:3;12349:12;12342:19;;12139:228;;;:::o;12373:373::-;;12536:67;12600:2;12595:3;12536:67;:::i;:::-;12529:74;;12633:34;12629:1;12624:3;12620:11;12613:55;12699:11;12694:2;12689:3;12685:12;12678:33;12737:2;12732:3;12728:12;12721:19;;12519:227;;;:::o;12752:330::-;;12915:67;12979:2;12974:3;12915:67;:::i;:::-;12908:74;;13012:34;13008:1;13003:3;12999:11;12992:55;13073:2;13068:3;13064:12;13057:19;;12898:184;;;:::o;13088:309::-;;13251:67;13315:2;13310:3;13251:67;:::i;:::-;13244:74;;13348:13;13344:1;13339:3;13335:11;13328:34;13388:2;13383:3;13379:12;13372:19;;13234:163;;;:::o;13403:376::-;;13566:67;13630:2;13625:3;13566:67;:::i;:::-;13559:74;;13663:34;13659:1;13654:3;13650:11;13643:55;13729:14;13724:2;13719:3;13715:12;13708:36;13770:2;13765:3;13761:12;13754:19;;13549:230;;;:::o;13785:330::-;;13948:67;14012:2;14007:3;13948:67;:::i;:::-;13941:74;;14045:34;14041:1;14036:3;14032:11;14025:55;14106:2;14101:3;14097:12;14090:19;;13931:184;;;:::o;14121:373::-;;14284:67;14348:2;14343:3;14284:67;:::i;:::-;14277:74;;14381:34;14377:1;14372:3;14368:11;14361:55;14447:11;14442:2;14437:3;14433:12;14426:33;14485:2;14480:3;14476:12;14469:19;;14267:227;;;:::o;14500:379::-;;14663:67;14727:2;14722:3;14663:67;:::i;:::-;14656:74;;14760:34;14756:1;14751:3;14747:11;14740:55;14826:17;14821:2;14816:3;14812:12;14805:39;14870:2;14865:3;14861:12;14854:19;;14646:233;;;:::o;14885:365::-;;15048:67;15112:2;15107:3;15048:67;:::i;:::-;15041:74;;15145:34;15141:1;15136:3;15132:11;15125:55;15211:3;15206:2;15201:3;15197:12;15190:25;15241:2;15236:3;15232:12;15225:19;;15031:219;;;:::o;15256:320::-;;15419:67;15483:2;15478:3;15419:67;:::i;:::-;15412:74;;15516:24;15512:1;15507:3;15503:11;15496:45;15567:2;15562:3;15558:12;15551:19;;15402:174;;;:::o;15582:323::-;;15745:67;15809:2;15804:3;15745:67;:::i;:::-;15738:74;;15842:27;15838:1;15833:3;15829:11;15822:48;15896:2;15891:3;15887:12;15880:19;;15728:177;;;:::o;15911:381::-;;16074:67;16138:2;16133:3;16074:67;:::i;:::-;16067:74;;16171:34;16167:1;16162:3;16158:11;16151:55;16237:19;16232:2;16227:3;16223:12;16216:41;16283:2;16278:3;16274:12;16267:19;;16057:235;;;:::o;16298:376::-;;16461:67;16525:2;16520:3;16461:67;:::i;:::-;16454:74;;16558:34;16554:1;16549:3;16545:11;16538:55;16624:14;16619:2;16614:3;16610:12;16603:36;16665:2;16660:3;16656:12;16649:19;;16444:230;;;:::o;16680:108::-;16757:24;16775:5;16757:24;:::i;:::-;16752:3;16745:37;16735:53;;:::o;16794:118::-;16881:24;16899:5;16881:24;:::i;:::-;16876:3;16869:37;16859:53;;:::o;16918:435::-;;17120:95;17211:3;17202:6;17120:95;:::i;:::-;17113:102;;17232:95;17323:3;17314:6;17232:95;:::i;:::-;17225:102;;17344:3;17337:10;;17102:251;;;;;:::o;17359:222::-;;17490:2;17479:9;17475:18;17467:26;;17503:71;17571:1;17560:9;17556:17;17547:6;17503:71;:::i;:::-;17457:124;;;;:::o;17587:640::-;;17820:3;17809:9;17805:19;17797:27;;17834:71;17902:1;17891:9;17887:17;17878:6;17834:71;:::i;:::-;17915:72;17983:2;17972:9;17968:18;17959:6;17915:72;:::i;:::-;17997;18065:2;18054:9;18050:18;18041:6;17997:72;:::i;:::-;18116:9;18110:4;18106:20;18101:2;18090:9;18086:18;18079:48;18144:76;18215:4;18206:6;18144:76;:::i;:::-;18136:84;;17787:440;;;;;;;:::o;18233:373::-;;18414:2;18403:9;18399:18;18391:26;;18463:9;18457:4;18453:20;18449:1;18438:9;18434:17;18427:47;18491:108;18594:4;18585:6;18491:108;:::i;:::-;18483:116;;18381:225;;;;:::o;18612:210::-;;18737:2;18726:9;18722:18;18714:26;;18750:65;18812:1;18801:9;18797:17;18788:6;18750:65;:::i;:::-;18704:118;;;;:::o;18828:313::-;;18979:2;18968:9;18964:18;18956:26;;19028:9;19022:4;19018:20;19014:1;19003:9;18999:17;18992:47;19056:78;19129:4;19120:6;19056:78;:::i;:::-;19048:86;;18946:195;;;;:::o;19147:419::-;;19351:2;19340:9;19336:18;19328:26;;19400:9;19394:4;19390:20;19386:1;19375:9;19371:17;19364:47;19428:131;19554:4;19428:131;:::i;:::-;19420:139;;19318:248;;;:::o;19572:419::-;;19776:2;19765:9;19761:18;19753:26;;19825:9;19819:4;19815:20;19811:1;19800:9;19796:17;19789:47;19853:131;19979:4;19853:131;:::i;:::-;19845:139;;19743:248;;;:::o;19997:419::-;;20201:2;20190:9;20186:18;20178:26;;20250:9;20244:4;20240:20;20236:1;20225:9;20221:17;20214:47;20278:131;20404:4;20278:131;:::i;:::-;20270:139;;20168:248;;;:::o;20422:419::-;;20626:2;20615:9;20611:18;20603:26;;20675:9;20669:4;20665:20;20661:1;20650:9;20646:17;20639:47;20703:131;20829:4;20703:131;:::i;:::-;20695:139;;20593:248;;;:::o;20847:419::-;;21051:2;21040:9;21036:18;21028:26;;21100:9;21094:4;21090:20;21086:1;21075:9;21071:17;21064:47;21128:131;21254:4;21128:131;:::i;:::-;21120:139;;21018:248;;;:::o;21272:419::-;;21476:2;21465:9;21461:18;21453:26;;21525:9;21519:4;21515:20;21511:1;21500:9;21496:17;21489:47;21553:131;21679:4;21553:131;:::i;:::-;21545:139;;21443:248;;;:::o;21697:419::-;;21901:2;21890:9;21886:18;21878:26;;21950:9;21944:4;21940:20;21936:1;21925:9;21921:17;21914:47;21978:131;22104:4;21978:131;:::i;:::-;21970:139;;21868:248;;;:::o;22122:419::-;;22326:2;22315:9;22311:18;22303:26;;22375:9;22369:4;22365:20;22361:1;22350:9;22346:17;22339:47;22403:131;22529:4;22403:131;:::i;:::-;22395:139;;22293:248;;;:::o;22547:419::-;;22751:2;22740:9;22736:18;22728:26;;22800:9;22794:4;22790:20;22786:1;22775:9;22771:17;22764:47;22828:131;22954:4;22828:131;:::i;:::-;22820:139;;22718:248;;;:::o;22972:419::-;;23176:2;23165:9;23161:18;23153:26;;23225:9;23219:4;23215:20;23211:1;23200:9;23196:17;23189:47;23253:131;23379:4;23253:131;:::i;:::-;23245:139;;23143:248;;;:::o;23397:419::-;;23601:2;23590:9;23586:18;23578:26;;23650:9;23644:4;23640:20;23636:1;23625:9;23621:17;23614:47;23678:131;23804:4;23678:131;:::i;:::-;23670:139;;23568:248;;;:::o;23822:419::-;;24026:2;24015:9;24011:18;24003:26;;24075:9;24069:4;24065:20;24061:1;24050:9;24046:17;24039:47;24103:131;24229:4;24103:131;:::i;:::-;24095:139;;23993:248;;;:::o;24247:419::-;;24451:2;24440:9;24436:18;24428:26;;24500:9;24494:4;24490:20;24486:1;24475:9;24471:17;24464:47;24528:131;24654:4;24528:131;:::i;:::-;24520:139;;24418:248;;;:::o;24672:419::-;;24876:2;24865:9;24861:18;24853:26;;24925:9;24919:4;24915:20;24911:1;24900:9;24896:17;24889:47;24953:131;25079:4;24953:131;:::i;:::-;24945:139;;24843:248;;;:::o;25097:419::-;;25301:2;25290:9;25286:18;25278:26;;25350:9;25344:4;25340:20;25336:1;25325:9;25321:17;25314:47;25378:131;25504:4;25378:131;:::i;:::-;25370:139;;25268:248;;;:::o;25522:419::-;;25726:2;25715:9;25711:18;25703:26;;25775:9;25769:4;25765:20;25761:1;25750:9;25746:17;25739:47;25803:131;25929:4;25803:131;:::i;:::-;25795:139;;25693:248;;;:::o;25947:419::-;;26151:2;26140:9;26136:18;26128:26;;26200:9;26194:4;26190:20;26186:1;26175:9;26171:17;26164:47;26228:131;26354:4;26228:131;:::i;:::-;26220:139;;26118:248;;;:::o;26372:419::-;;26576:2;26565:9;26561:18;26553:26;;26625:9;26619:4;26615:20;26611:1;26600:9;26596:17;26589:47;26653:131;26779:4;26653:131;:::i;:::-;26645:139;;26543:248;;;:::o;26797:419::-;;27001:2;26990:9;26986:18;26978:26;;27050:9;27044:4;27040:20;27036:1;27025:9;27021:17;27014:47;27078:131;27204:4;27078:131;:::i;:::-;27070:139;;26968:248;;;:::o;27222:419::-;;27426:2;27415:9;27411:18;27403:26;;27475:9;27469:4;27465:20;27461:1;27450:9;27446:17;27439:47;27503:131;27629:4;27503:131;:::i;:::-;27495:139;;27393:248;;;:::o;27647:419::-;;27851:2;27840:9;27836:18;27828:26;;27900:9;27894:4;27890:20;27886:1;27875:9;27871:17;27864:47;27928:131;28054:4;27928:131;:::i;:::-;27920:139;;27818:248;;;:::o;28072:419::-;;28276:2;28265:9;28261:18;28253:26;;28325:9;28319:4;28315:20;28311:1;28300:9;28296:17;28289:47;28353:131;28479:4;28353:131;:::i;:::-;28345:139;;28243:248;;;:::o;28497:222::-;;28628:2;28617:9;28613:18;28605:26;;28641:71;28709:1;28698:9;28694:17;28685:6;28641:71;:::i;:::-;28595:124;;;;:::o;28725:283::-;;28791:2;28785:9;28775:19;;28833:4;28825:6;28821:17;28940:6;28928:10;28925:22;28904:18;28892:10;28889:34;28886:62;28883:2;;;28951:18;;:::i;:::-;28883:2;28991:10;28987:2;28980:22;28765:243;;;;:::o;29014:331::-;;29165:18;29157:6;29154:30;29151:2;;;29187:18;;:::i;:::-;29151:2;29272:4;29268:9;29261:4;29253:6;29249:17;29245:33;29237:41;;29333:4;29327;29323:15;29315:23;;29080:265;;;:::o;29351:332::-;;29503:18;29495:6;29492:30;29489:2;;;29525:18;;:::i;:::-;29489:2;29610:4;29606:9;29599:4;29591:6;29587:17;29583:33;29575:41;;29671:4;29665;29661:15;29653:23;;29418:265;;;:::o;29689:132::-;;29779:3;29771:11;;29809:4;29804:3;29800:14;29792:22;;29761:60;;;:::o;29827:114::-;;29928:5;29922:12;29912:22;;29901:40;;;:::o;29947:98::-;;30032:5;30026:12;30016:22;;30005:40;;;:::o;30051:99::-;;30137:5;30131:12;30121:22;;30110:40;;;:::o;30156:113::-;;30258:4;30253:3;30249:14;30241:22;;30231:38;;;:::o;30275:184::-;;30408:6;30403:3;30396:19;30448:4;30443:3;30439:14;30424:29;;30386:73;;;;:::o;30465:168::-;;30582:6;30577:3;30570:19;30622:4;30617:3;30613:14;30598:29;;30560:73;;;;:::o;30639:169::-;;30757:6;30752:3;30745:19;30797:4;30792:3;30788:14;30773:29;;30735:73;;;;:::o;30814:148::-;;30953:3;30938:18;;30928:34;;;;:::o;30968:305::-;;31027:20;31045:1;31027:20;:::i;:::-;31022:25;;31061:20;31079:1;31061:20;:::i;:::-;31056:25;;31215:1;31147:66;31143:74;31140:1;31137:81;31134:2;;;31221:18;;:::i;:::-;31134:2;31265:1;31262;31258:9;31251:16;;31012:261;;;;:::o;31279:185::-;;31336:20;31354:1;31336:20;:::i;:::-;31331:25;;31370:20;31388:1;31370:20;:::i;:::-;31365:25;;31409:1;31399:2;;31414:18;;:::i;:::-;31399:2;31456:1;31453;31449:9;31444:14;;31321:143;;;;:::o;31470:348::-;;31533:20;31551:1;31533:20;:::i;:::-;31528:25;;31567:20;31585:1;31567:20;:::i;:::-;31562:25;;31755:1;31687:66;31683:74;31680:1;31677:81;31672:1;31665:9;31658:17;31654:105;31651:2;;;31762:18;;:::i;:::-;31651:2;31810:1;31807;31803:9;31792:20;;31518:300;;;;:::o;31824:191::-;;31884:20;31902:1;31884:20;:::i;:::-;31879:25;;31918:20;31936:1;31918:20;:::i;:::-;31913:25;;31957:1;31954;31951:8;31948:2;;;31962:18;;:::i;:::-;31948:2;32007:1;32004;32000:9;31992:17;;31869:146;;;;:::o;32021:96::-;;32087:24;32105:5;32087:24;:::i;:::-;32076:35;;32066:51;;;:::o;32123:90::-;;32200:5;32193:13;32186:21;32175:32;;32165:48;;;:::o;32219:149::-;;32295:66;32288:5;32284:78;32273:89;;32263:105;;;:::o;32374:126::-;;32451:42;32444:5;32440:54;32429:65;;32419:81;;;:::o;32506:77::-;;32572:5;32561:16;;32551:32;;;:::o;32589:154::-;32673:6;32668:3;32663;32650:30;32735:1;32726:6;32721:3;32717:16;32710:27;32640:103;;;:::o;32749:307::-;32817:1;32827:113;32841:6;32838:1;32835:13;32827:113;;;32926:1;32921:3;32917:11;32911:18;32907:1;32902:3;32898:11;32891:39;32863:2;32860:1;32856:10;32851:15;;32827:113;;;32958:6;32955:1;32952:13;32949:2;;;33038:1;33029:6;33024:3;33020:16;33013:27;32949:2;32798:258;;;;:::o;33062:320::-;;33143:1;33137:4;33133:12;33123:22;;33190:1;33184:4;33180:12;33211:18;33201:2;;33267:4;33259:6;33255:17;33245:27;;33201:2;33329;33321:6;33318:14;33298:18;33295:38;33292:2;;;33348:18;;:::i;:::-;33292:2;33113:269;;;;:::o;33388:233::-;;33450:24;33468:5;33450:24;:::i;:::-;33441:33;;33496:66;33489:5;33486:77;33483:2;;;33566:18;;:::i;:::-;33483:2;33613:1;33606:5;33602:13;33595:20;;33431:190;;;:::o;33627:176::-;;33676:20;33694:1;33676:20;:::i;:::-;33671:25;;33710:20;33728:1;33710:20;:::i;:::-;33705:25;;33749:1;33739:2;;33754:18;;:::i;:::-;33739:2;33795:1;33792;33788:9;33783:14;;33661:142;;;;:::o;33809:180::-;33857:77;33854:1;33847:88;33954:4;33951:1;33944:15;33978:4;33975:1;33968:15;33995:180;34043:77;34040:1;34033:88;34140:4;34137:1;34130:15;34164:4;34161:1;34154:15;34181:180;34229:77;34226:1;34219:88;34326:4;34323:1;34316:15;34350:4;34347:1;34340:15;34367:180;34415:77;34412:1;34405:88;34512:4;34509:1;34502:15;34536:4;34533:1;34526:15;34553:102;;34645:2;34641:7;34636:2;34629:5;34625:14;34621:28;34611:38;;34601:54;;;:::o;34661:122::-;34734:24;34752:5;34734:24;:::i;:::-;34727:5;34724:35;34714:2;;34773:1;34770;34763:12;34714:2;34704:79;:::o;34789:116::-;34859:21;34874:5;34859:21;:::i;:::-;34852:5;34849:32;34839:2;;34895:1;34892;34885:12;34839:2;34829:76;:::o;34911:120::-;34983:23;35000:5;34983:23;:::i;:::-;34976:5;34973:34;34963:2;;35021:1;35018;35011:12;34963:2;34953:78;:::o;35037:122::-;35110:24;35128:5;35110:24;:::i;:::-;35103:5;35100:35;35090:2;;35149:1;35146;35139:12;35090:2;35080:79;:::o
Swarm Source
ipfs://1e4a0501aacee7dfbbef119197ee32011f83d3b0f184f4fc39e3099d69f2886f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.