ERC-721
Overview
Max Total Supply
1,418 NESTA
Holders
539
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
12 NESTALoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
ERNESTA
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-11-18 */ // Sources flattened with hardhat v2.3.0 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // 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/[email protected] 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/[email protected] 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/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] 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; // solhint-disable-next-line no-inline-assembly 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" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] 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}. 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` 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 {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] 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/[email protected] 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/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/access/[email protected] 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() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved" ); _burn(tokenId); } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } } // File contracts/ERNESTA.sol pragma solidity ^0.8.2; contract ERNESTA is ERC721, ERC721Enumerable, Pausable, Ownable, ERC721Burnable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor() ERC721("ERNESTA", "NESTA") {} ERNESTO ernesto = ERNESTO(0x3C869Af1DD2fA2ee3a6C7B3a6aD7f4350fc5F413); string public baseURI; function setBaseURI(string memory newBaseURI) public onlyOwner { baseURI = newBaseURI; } function _baseURI() internal view override returns (string memory) { return baseURI; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function interalMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId); } function safeMint(address to, uint256 tokenId) public onlyOwner { _safeMint(to, tokenId); } function claim(uint256 tokenId) public { address owner = ernesto.ownerOf(tokenId); require(owner == msg.sender, "you do not own this ERNESTO"); interalMint(msg.sender, tokenId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) whenNotPaused { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } } abstract contract ERNESTO { function ownerOf(uint256 id) public virtual returns (address); }
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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeMint","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052733c869af1dd2fa2ee3a6c7b3a6ad7f4350fc5f413600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040518060400160405280600781526020017f45524e45535441000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4e455354410000000000000000000000000000000000000000000000000000008152508160009080519060200190620000eb929190620001e1565b50806001908051906020019062000104929190620001e1565b5050506000600a60006101000a81548160ff021916908315150217905550600062000134620001d960201b60201c565b905080600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002f6565b600033905090565b828054620001ef9062000291565b90600052602060002090601f0160209004810192826200021357600085556200025f565b82601f106200022e57805160ff19168380011785556200025f565b828001600101855582156200025f579182015b828111156200025e57825182559160200191906001019062000241565b5b5090506200026e919062000272565b5090565b5b808211156200028d57600081600090555060010162000273565b5090565b60006002820490506001821680620002aa57607f821691505b60208210811415620002c157620002c0620002c7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613faa80620003066000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80635c975abb116100f957806395d89b4111610097578063b88d4fde11610071578063b88d4fde14610480578063c87b56dd1461049c578063e985e9c5146104cc578063f2fde38b146104fc576101a9565b806395d89b411461042a578063a144819414610448578063a22cb46514610464576101a9565b806370a08231116100d357806370a08231146103c8578063715018a6146103f85780638456cb59146104025780638da5cb5b1461040c576101a9565b80635c975abb1461035c5780636352211e1461037a5780636c0360eb146103aa576101a9565b80632f745c591161016657806342842e0e1161014057806342842e0e146102d857806342966c68146102f45780634f6ccce71461031057806355f804b314610340576101a9565b80632f745c5914610282578063379607f5146102b25780633f4ba83a146102ce576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806323b872dd14610266575b600080fd5b6101c860048036038101906101c39190612cbc565b610518565b6040516101d591906131e9565b60405180910390f35b6101e661052a565b6040516101f39190613204565b60405180910390f35b61021660048036038101906102119190612d5f565b6105bc565b6040516102239190613182565b60405180910390f35b61024660048036038101906102419190612c7c565b610641565b005b610250610759565b60405161025d91906134e6565b60405180910390f35b610280600480360381019061027b9190612b66565b610766565b005b61029c60048036038101906102979190612c7c565b6107c6565b6040516102a991906134e6565b60405180910390f35b6102cc60048036038101906102c79190612d5f565b61086b565b005b6102d6610998565b005b6102f260048036038101906102ed9190612b66565b610a1e565b005b61030e60048036038101906103099190612d5f565b610a3e565b005b61032a60048036038101906103259190612d5f565b610a9a565b60405161033791906134e6565b60405180910390f35b61035a60048036038101906103559190612d16565b610b0b565b005b610364610ba1565b60405161037191906131e9565b60405180910390f35b610394600480360381019061038f9190612d5f565b610bb8565b6040516103a19190613182565b60405180910390f35b6103b2610c6a565b6040516103bf9190613204565b60405180910390f35b6103e260048036038101906103dd9190612acc565b610cf8565b6040516103ef91906134e6565b60405180910390f35b610400610db0565b005b61040a610eed565b005b610414610f73565b6040516104219190613182565b60405180910390f35b610432610f9d565b60405161043f9190613204565b60405180910390f35b610462600480360381019061045d9190612c7c565b61102f565b005b61047e60048036038101906104799190612c3c565b6110b9565b005b61049a60048036038101906104959190612bb9565b61123a565b005b6104b660048036038101906104b19190612d5f565b61129c565b6040516104c39190613204565b60405180910390f35b6104e660048036038101906104e19190612b26565b611343565b6040516104f391906131e9565b60405180910390f35b61051660048036038101906105119190612acc565b6113d7565b005b600061052382611583565b9050919050565b6060600080546105399061373c565b80601f01602080910402602001604051908101604052809291908181526020018280546105659061373c565b80156105b25780601f10610587576101008083540402835291602001916105b2565b820191906000526020600020905b81548152906001019060200180831161059557829003601f168201915b5050505050905090565b60006105c7826115fd565b610606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fd906133e6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064c82610bb8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b490613466565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106dc611669565b73ffffffffffffffffffffffffffffffffffffffff16148061070b575061070a81610705611669565b611343565b5b61074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074190613366565b60405180910390fd5b6107548383611671565b505050565b6000600880549050905090565b610777610771611669565b8261172a565b6107b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ad90613486565b60405180910390fd5b6107c1838383611808565b505050565b60006107d183610cf8565b8210610812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080990613246565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016108c891906134e6565b602060405180830381600087803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190612af9565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461098a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610981906132a6565b60405180910390fd5b6109943383611a64565b5050565b6109a0611669565b73ffffffffffffffffffffffffffffffffffffffff166109be610f73565b73ffffffffffffffffffffffffffffffffffffffff1614610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b90613406565b60405180910390fd5b610a1c611a72565b565b610a398383836040518060200160405280600081525061123a565b505050565b610a4f610a49611669565b8261172a565b610a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a85906134c6565b60405180910390fd5b610a9781611b14565b50565b6000610aa4610759565b8210610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc906134a6565b60405180910390fd5b60088281548110610af957610af86138d5565b5b90600052602060002001549050919050565b610b13611669565b73ffffffffffffffffffffffffffffffffffffffff16610b31610f73565b73ffffffffffffffffffffffffffffffffffffffff1614610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90613406565b60405180910390fd5b80600d9080519060200190610b9d9291906128cb565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c58906133a6565b60405180910390fd5b80915050919050565b600d8054610c779061373c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca39061373c565b8015610cf05780601f10610cc557610100808354040283529160200191610cf0565b820191906000526020600020905b815481529060010190602001808311610cd357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6090613386565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610db8611669565b73ffffffffffffffffffffffffffffffffffffffff16610dd6610f73565b73ffffffffffffffffffffffffffffffffffffffff1614610e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2390613406565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610ef5611669565b73ffffffffffffffffffffffffffffffffffffffff16610f13610f73565b73ffffffffffffffffffffffffffffffffffffffff1614610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090613406565b60405180910390fd5b610f71611c25565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fac9061373c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd89061373c565b80156110255780601f10610ffa57610100808354040283529160200191611025565b820191906000526020600020905b81548152906001019060200180831161100857829003601f168201915b5050505050905090565b611037611669565b73ffffffffffffffffffffffffffffffffffffffff16611055610f73565b73ffffffffffffffffffffffffffffffffffffffff16146110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a290613406565b60405180910390fd5b6110b58282611cc8565b5050565b6110c1611669565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561112f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112690613306565b60405180910390fd5b806005600061113c611669565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111e9611669565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161122e91906131e9565b60405180910390a35050565b61124b611245611669565b8361172a565b61128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190613486565b60405180910390fd5b61129684848484611ce6565b50505050565b60606112a7826115fd565b6112e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dd90613446565b60405180910390fd5b60006112f0611d42565b90506000815111611310576040518060200160405280600081525061133b565b8061131a84611dd4565b60405160200161132b92919061315e565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113df611669565b73ffffffffffffffffffffffffffffffffffffffff166113fd610f73565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90613406565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90613286565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115f657506115f582611f35565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116e483610bb8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611735826115fd565b611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90613326565b60405180910390fd5b600061177f83610bb8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117ee57508373ffffffffffffffffffffffffffffffffffffffff166117d6846105bc565b73ffffffffffffffffffffffffffffffffffffffff16145b806117ff57506117fe8185611343565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661182882610bb8565b73ffffffffffffffffffffffffffffffffffffffff161461187e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187590613426565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906132e6565b60405180910390fd5b6118f9838383612017565b611904600082611671565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119549190613652565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ab91906135cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a6e8282611cc8565b5050565b611a7a610ba1565b611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090613226565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611afd611669565b604051611b0a9190613182565b60405180910390a1565b6000611b1f82610bb8565b9050611b2d81600084612017565b611b38600083611671565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b889190613652565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611c2d610ba1565b15611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490613346565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cb1611669565b604051611cbe9190613182565b60405180910390a1565b611ce282826040518060200160405280600081525061206f565b5050565b611cf1848484611808565b611cfd848484846120ca565b611d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3390613266565b60405180910390fd5b50505050565b6060600d8054611d519061373c565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7d9061373c565b8015611dca5780601f10611d9f57610100808354040283529160200191611dca565b820191906000526020600020905b815481529060010190602001808311611dad57829003601f168201915b5050505050905090565b60606000821415611e1c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f30565b600082905060005b60008214611e4e578080611e379061379f565b915050600a82611e479190613621565b9150611e24565b60008167ffffffffffffffff811115611e6a57611e69613904565b5b6040519080825280601f01601f191660200182016040528015611e9c5781602001600182028036833780820191505090505b5090505b60008514611f2957600182611eb59190613652565b9150600a85611ec491906137e8565b6030611ed091906135cb565b60f81b818381518110611ee657611ee56138d5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f229190613621565b9450611ea0565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061200057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612010575061200f82612261565b5b9050919050565b61201f610ba1565b1561205f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205690613346565b60405180910390fd5b61206a8383836122cb565b505050565b61207983836123df565b61208660008484846120ca565b6120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90613266565b60405180910390fd5b505050565b60006120eb8473ffffffffffffffffffffffffffffffffffffffff166125ad565b15612254578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612114611669565b8786866040518563ffffffff1660e01b8152600401612136949392919061319d565b602060405180830381600087803b15801561215057600080fd5b505af192505050801561218157506040513d601f19601f8201168201806040525081019061217e9190612ce9565b60015b612204573d80600081146121b1576040519150601f19603f3d011682016040523d82523d6000602084013e6121b6565b606091505b506000815114156121fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f390613266565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612259565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122d68383836125c0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561231957612314816125c5565b612358565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461235757612356838261260e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561239b576123968161277b565b6123da565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123d9576123d8828261284c565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561244f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612446906133c6565b60405180910390fd5b612458816115fd565b15612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f906132c6565b60405180910390fd5b6124a460008383612017565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f491906135cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161261b84610cf8565b6126259190613652565b905060006007600084815260200190815260200160002054905081811461270a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061278f9190613652565b90506000600960008481526020019081526020016000205490506000600883815481106127bf576127be6138d5565b5b9060005260206000200154905080600883815481106127e1576127e06138d5565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806128305761282f6138a6565b5b6001900381819060005260206000200160009055905550505050565b600061285783610cf8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546128d79061373c565b90600052602060002090601f0160209004810192826128f95760008555612940565b82601f1061291257805160ff1916838001178555612940565b82800160010185558215612940579182015b8281111561293f578251825591602001919060010190612924565b5b50905061294d9190612951565b5090565b5b8082111561296a576000816000905550600101612952565b5090565b600061298161297c84613526565b613501565b90508281526020810184848401111561299d5761299c613938565b5b6129a88482856136fa565b509392505050565b60006129c36129be84613557565b613501565b9050828152602081018484840111156129df576129de613938565b5b6129ea8482856136fa565b509392505050565b600081359050612a0181613f18565b92915050565b600081519050612a1681613f18565b92915050565b600081359050612a2b81613f2f565b92915050565b600081359050612a4081613f46565b92915050565b600081519050612a5581613f46565b92915050565b600082601f830112612a7057612a6f613933565b5b8135612a8084826020860161296e565b91505092915050565b600082601f830112612a9e57612a9d613933565b5b8135612aae8482602086016129b0565b91505092915050565b600081359050612ac681613f5d565b92915050565b600060208284031215612ae257612ae1613942565b5b6000612af0848285016129f2565b91505092915050565b600060208284031215612b0f57612b0e613942565b5b6000612b1d84828501612a07565b91505092915050565b60008060408385031215612b3d57612b3c613942565b5b6000612b4b858286016129f2565b9250506020612b5c858286016129f2565b9150509250929050565b600080600060608486031215612b7f57612b7e613942565b5b6000612b8d868287016129f2565b9350506020612b9e868287016129f2565b9250506040612baf86828701612ab7565b9150509250925092565b60008060008060808587031215612bd357612bd2613942565b5b6000612be1878288016129f2565b9450506020612bf2878288016129f2565b9350506040612c0387828801612ab7565b925050606085013567ffffffffffffffff811115612c2457612c2361393d565b5b612c3087828801612a5b565b91505092959194509250565b60008060408385031215612c5357612c52613942565b5b6000612c61858286016129f2565b9250506020612c7285828601612a1c565b9150509250929050565b60008060408385031215612c9357612c92613942565b5b6000612ca1858286016129f2565b9250506020612cb285828601612ab7565b9150509250929050565b600060208284031215612cd257612cd1613942565b5b6000612ce084828501612a31565b91505092915050565b600060208284031215612cff57612cfe613942565b5b6000612d0d84828501612a46565b91505092915050565b600060208284031215612d2c57612d2b613942565b5b600082013567ffffffffffffffff811115612d4a57612d4961393d565b5b612d5684828501612a89565b91505092915050565b600060208284031215612d7557612d74613942565b5b6000612d8384828501612ab7565b91505092915050565b612d9581613686565b82525050565b612da481613698565b82525050565b6000612db582613588565b612dbf818561359e565b9350612dcf818560208601613709565b612dd881613947565b840191505092915050565b6000612dee82613593565b612df881856135af565b9350612e08818560208601613709565b612e1181613947565b840191505092915050565b6000612e2782613593565b612e3181856135c0565b9350612e41818560208601613709565b80840191505092915050565b6000612e5a6014836135af565b9150612e6582613958565b602082019050919050565b6000612e7d602b836135af565b9150612e8882613981565b604082019050919050565b6000612ea06032836135af565b9150612eab826139d0565b604082019050919050565b6000612ec36026836135af565b9150612ece82613a1f565b604082019050919050565b6000612ee6601b836135af565b9150612ef182613a6e565b602082019050919050565b6000612f09601c836135af565b9150612f1482613a97565b602082019050919050565b6000612f2c6024836135af565b9150612f3782613ac0565b604082019050919050565b6000612f4f6019836135af565b9150612f5a82613b0f565b602082019050919050565b6000612f72602c836135af565b9150612f7d82613b38565b604082019050919050565b6000612f956010836135af565b9150612fa082613b87565b602082019050919050565b6000612fb86038836135af565b9150612fc382613bb0565b604082019050919050565b6000612fdb602a836135af565b9150612fe682613bff565b604082019050919050565b6000612ffe6029836135af565b915061300982613c4e565b604082019050919050565b60006130216020836135af565b915061302c82613c9d565b602082019050919050565b6000613044602c836135af565b915061304f82613cc6565b604082019050919050565b60006130676020836135af565b915061307282613d15565b602082019050919050565b600061308a6029836135af565b915061309582613d3e565b604082019050919050565b60006130ad602f836135af565b91506130b882613d8d565b604082019050919050565b60006130d06021836135af565b91506130db82613ddc565b604082019050919050565b60006130f36031836135af565b91506130fe82613e2b565b604082019050919050565b6000613116602c836135af565b915061312182613e7a565b604082019050919050565b60006131396030836135af565b915061314482613ec9565b604082019050919050565b613158816136f0565b82525050565b600061316a8285612e1c565b91506131768284612e1c565b91508190509392505050565b60006020820190506131976000830184612d8c565b92915050565b60006080820190506131b26000830187612d8c565b6131bf6020830186612d8c565b6131cc604083018561314f565b81810360608301526131de8184612daa565b905095945050505050565b60006020820190506131fe6000830184612d9b565b92915050565b6000602082019050818103600083015261321e8184612de3565b905092915050565b6000602082019050818103600083015261323f81612e4d565b9050919050565b6000602082019050818103600083015261325f81612e70565b9050919050565b6000602082019050818103600083015261327f81612e93565b9050919050565b6000602082019050818103600083015261329f81612eb6565b9050919050565b600060208201905081810360008301526132bf81612ed9565b9050919050565b600060208201905081810360008301526132df81612efc565b9050919050565b600060208201905081810360008301526132ff81612f1f565b9050919050565b6000602082019050818103600083015261331f81612f42565b9050919050565b6000602082019050818103600083015261333f81612f65565b9050919050565b6000602082019050818103600083015261335f81612f88565b9050919050565b6000602082019050818103600083015261337f81612fab565b9050919050565b6000602082019050818103600083015261339f81612fce565b9050919050565b600060208201905081810360008301526133bf81612ff1565b9050919050565b600060208201905081810360008301526133df81613014565b9050919050565b600060208201905081810360008301526133ff81613037565b9050919050565b6000602082019050818103600083015261341f8161305a565b9050919050565b6000602082019050818103600083015261343f8161307d565b9050919050565b6000602082019050818103600083015261345f816130a0565b9050919050565b6000602082019050818103600083015261347f816130c3565b9050919050565b6000602082019050818103600083015261349f816130e6565b9050919050565b600060208201905081810360008301526134bf81613109565b9050919050565b600060208201905081810360008301526134df8161312c565b9050919050565b60006020820190506134fb600083018461314f565b92915050565b600061350b61351c565b9050613517828261376e565b919050565b6000604051905090565b600067ffffffffffffffff82111561354157613540613904565b5b61354a82613947565b9050602081019050919050565b600067ffffffffffffffff82111561357257613571613904565b5b61357b82613947565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006135d6826136f0565b91506135e1836136f0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561361657613615613819565b5b828201905092915050565b600061362c826136f0565b9150613637836136f0565b92508261364757613646613848565b5b828204905092915050565b600061365d826136f0565b9150613668836136f0565b92508282101561367b5761367a613819565b5b828203905092915050565b6000613691826136d0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561372757808201518184015260208101905061370c565b83811115613736576000848401525b50505050565b6000600282049050600182168061375457607f821691505b6020821081141561376857613767613877565b5b50919050565b61377782613947565b810181811067ffffffffffffffff8211171561379657613795613904565b5b80604052505050565b60006137aa826136f0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137dd576137dc613819565b5b600182019050919050565b60006137f3826136f0565b91506137fe836136f0565b92508261380e5761380d613848565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f796f7520646f206e6f74206f776e20746869732045524e4553544f0000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b613f2181613686565b8114613f2c57600080fd5b50565b613f3881613698565b8114613f4357600080fd5b50565b613f4f816136a4565b8114613f5a57600080fd5b50565b613f66816136f0565b8114613f7157600080fd5b5056fea2646970667358221220aed14c69c1d67393da47fd94185b2f6d97baa14a70919874e30fddd6393368d464736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80635c975abb116100f957806395d89b4111610097578063b88d4fde11610071578063b88d4fde14610480578063c87b56dd1461049c578063e985e9c5146104cc578063f2fde38b146104fc576101a9565b806395d89b411461042a578063a144819414610448578063a22cb46514610464576101a9565b806370a08231116100d357806370a08231146103c8578063715018a6146103f85780638456cb59146104025780638da5cb5b1461040c576101a9565b80635c975abb1461035c5780636352211e1461037a5780636c0360eb146103aa576101a9565b80632f745c591161016657806342842e0e1161014057806342842e0e146102d857806342966c68146102f45780634f6ccce71461031057806355f804b314610340576101a9565b80632f745c5914610282578063379607f5146102b25780633f4ba83a146102ce576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806323b872dd14610266575b600080fd5b6101c860048036038101906101c39190612cbc565b610518565b6040516101d591906131e9565b60405180910390f35b6101e661052a565b6040516101f39190613204565b60405180910390f35b61021660048036038101906102119190612d5f565b6105bc565b6040516102239190613182565b60405180910390f35b61024660048036038101906102419190612c7c565b610641565b005b610250610759565b60405161025d91906134e6565b60405180910390f35b610280600480360381019061027b9190612b66565b610766565b005b61029c60048036038101906102979190612c7c565b6107c6565b6040516102a991906134e6565b60405180910390f35b6102cc60048036038101906102c79190612d5f565b61086b565b005b6102d6610998565b005b6102f260048036038101906102ed9190612b66565b610a1e565b005b61030e60048036038101906103099190612d5f565b610a3e565b005b61032a60048036038101906103259190612d5f565b610a9a565b60405161033791906134e6565b60405180910390f35b61035a60048036038101906103559190612d16565b610b0b565b005b610364610ba1565b60405161037191906131e9565b60405180910390f35b610394600480360381019061038f9190612d5f565b610bb8565b6040516103a19190613182565b60405180910390f35b6103b2610c6a565b6040516103bf9190613204565b60405180910390f35b6103e260048036038101906103dd9190612acc565b610cf8565b6040516103ef91906134e6565b60405180910390f35b610400610db0565b005b61040a610eed565b005b610414610f73565b6040516104219190613182565b60405180910390f35b610432610f9d565b60405161043f9190613204565b60405180910390f35b610462600480360381019061045d9190612c7c565b61102f565b005b61047e60048036038101906104799190612c3c565b6110b9565b005b61049a60048036038101906104959190612bb9565b61123a565b005b6104b660048036038101906104b19190612d5f565b61129c565b6040516104c39190613204565b60405180910390f35b6104e660048036038101906104e19190612b26565b611343565b6040516104f391906131e9565b60405180910390f35b61051660048036038101906105119190612acc565b6113d7565b005b600061052382611583565b9050919050565b6060600080546105399061373c565b80601f01602080910402602001604051908101604052809291908181526020018280546105659061373c565b80156105b25780601f10610587576101008083540402835291602001916105b2565b820191906000526020600020905b81548152906001019060200180831161059557829003601f168201915b5050505050905090565b60006105c7826115fd565b610606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fd906133e6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064c82610bb8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b490613466565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106dc611669565b73ffffffffffffffffffffffffffffffffffffffff16148061070b575061070a81610705611669565b611343565b5b61074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074190613366565b60405180910390fd5b6107548383611671565b505050565b6000600880549050905090565b610777610771611669565b8261172a565b6107b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ad90613486565b60405180910390fd5b6107c1838383611808565b505050565b60006107d183610cf8565b8210610812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080990613246565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016108c891906134e6565b602060405180830381600087803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190612af9565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461098a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610981906132a6565b60405180910390fd5b6109943383611a64565b5050565b6109a0611669565b73ffffffffffffffffffffffffffffffffffffffff166109be610f73565b73ffffffffffffffffffffffffffffffffffffffff1614610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b90613406565b60405180910390fd5b610a1c611a72565b565b610a398383836040518060200160405280600081525061123a565b505050565b610a4f610a49611669565b8261172a565b610a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a85906134c6565b60405180910390fd5b610a9781611b14565b50565b6000610aa4610759565b8210610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc906134a6565b60405180910390fd5b60088281548110610af957610af86138d5565b5b90600052602060002001549050919050565b610b13611669565b73ffffffffffffffffffffffffffffffffffffffff16610b31610f73565b73ffffffffffffffffffffffffffffffffffffffff1614610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90613406565b60405180910390fd5b80600d9080519060200190610b9d9291906128cb565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c58906133a6565b60405180910390fd5b80915050919050565b600d8054610c779061373c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca39061373c565b8015610cf05780601f10610cc557610100808354040283529160200191610cf0565b820191906000526020600020905b815481529060010190602001808311610cd357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6090613386565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610db8611669565b73ffffffffffffffffffffffffffffffffffffffff16610dd6610f73565b73ffffffffffffffffffffffffffffffffffffffff1614610e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2390613406565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610ef5611669565b73ffffffffffffffffffffffffffffffffffffffff16610f13610f73565b73ffffffffffffffffffffffffffffffffffffffff1614610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090613406565b60405180910390fd5b610f71611c25565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fac9061373c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd89061373c565b80156110255780601f10610ffa57610100808354040283529160200191611025565b820191906000526020600020905b81548152906001019060200180831161100857829003601f168201915b5050505050905090565b611037611669565b73ffffffffffffffffffffffffffffffffffffffff16611055610f73565b73ffffffffffffffffffffffffffffffffffffffff16146110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a290613406565b60405180910390fd5b6110b58282611cc8565b5050565b6110c1611669565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561112f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112690613306565b60405180910390fd5b806005600061113c611669565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111e9611669565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161122e91906131e9565b60405180910390a35050565b61124b611245611669565b8361172a565b61128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190613486565b60405180910390fd5b61129684848484611ce6565b50505050565b60606112a7826115fd565b6112e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dd90613446565b60405180910390fd5b60006112f0611d42565b90506000815111611310576040518060200160405280600081525061133b565b8061131a84611dd4565b60405160200161132b92919061315e565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113df611669565b73ffffffffffffffffffffffffffffffffffffffff166113fd610f73565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90613406565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90613286565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115f657506115f582611f35565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116e483610bb8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611735826115fd565b611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90613326565b60405180910390fd5b600061177f83610bb8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117ee57508373ffffffffffffffffffffffffffffffffffffffff166117d6846105bc565b73ffffffffffffffffffffffffffffffffffffffff16145b806117ff57506117fe8185611343565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661182882610bb8565b73ffffffffffffffffffffffffffffffffffffffff161461187e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187590613426565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906132e6565b60405180910390fd5b6118f9838383612017565b611904600082611671565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119549190613652565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ab91906135cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a6e8282611cc8565b5050565b611a7a610ba1565b611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090613226565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611afd611669565b604051611b0a9190613182565b60405180910390a1565b6000611b1f82610bb8565b9050611b2d81600084612017565b611b38600083611671565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b889190613652565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611c2d610ba1565b15611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490613346565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cb1611669565b604051611cbe9190613182565b60405180910390a1565b611ce282826040518060200160405280600081525061206f565b5050565b611cf1848484611808565b611cfd848484846120ca565b611d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3390613266565b60405180910390fd5b50505050565b6060600d8054611d519061373c565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7d9061373c565b8015611dca5780601f10611d9f57610100808354040283529160200191611dca565b820191906000526020600020905b815481529060010190602001808311611dad57829003601f168201915b5050505050905090565b60606000821415611e1c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f30565b600082905060005b60008214611e4e578080611e379061379f565b915050600a82611e479190613621565b9150611e24565b60008167ffffffffffffffff811115611e6a57611e69613904565b5b6040519080825280601f01601f191660200182016040528015611e9c5781602001600182028036833780820191505090505b5090505b60008514611f2957600182611eb59190613652565b9150600a85611ec491906137e8565b6030611ed091906135cb565b60f81b818381518110611ee657611ee56138d5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f229190613621565b9450611ea0565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061200057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612010575061200f82612261565b5b9050919050565b61201f610ba1565b1561205f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205690613346565b60405180910390fd5b61206a8383836122cb565b505050565b61207983836123df565b61208660008484846120ca565b6120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90613266565b60405180910390fd5b505050565b60006120eb8473ffffffffffffffffffffffffffffffffffffffff166125ad565b15612254578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612114611669565b8786866040518563ffffffff1660e01b8152600401612136949392919061319d565b602060405180830381600087803b15801561215057600080fd5b505af192505050801561218157506040513d601f19601f8201168201806040525081019061217e9190612ce9565b60015b612204573d80600081146121b1576040519150601f19603f3d011682016040523d82523d6000602084013e6121b6565b606091505b506000815114156121fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f390613266565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612259565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122d68383836125c0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561231957612314816125c5565b612358565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461235757612356838261260e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561239b576123968161277b565b6123da565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123d9576123d8828261284c565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561244f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612446906133c6565b60405180910390fd5b612458816115fd565b15612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f906132c6565b60405180910390fd5b6124a460008383612017565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f491906135cb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161261b84610cf8565b6126259190613652565b905060006007600084815260200190815260200160002054905081811461270a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061278f9190613652565b90506000600960008481526020019081526020016000205490506000600883815481106127bf576127be6138d5565b5b9060005260206000200154905080600883815481106127e1576127e06138d5565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806128305761282f6138a6565b5b6001900381819060005260206000200160009055905550505050565b600061285783610cf8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546128d79061373c565b90600052602060002090601f0160209004810192826128f95760008555612940565b82601f1061291257805160ff1916838001178555612940565b82800160010185558215612940579182015b8281111561293f578251825591602001919060010190612924565b5b50905061294d9190612951565b5090565b5b8082111561296a576000816000905550600101612952565b5090565b600061298161297c84613526565b613501565b90508281526020810184848401111561299d5761299c613938565b5b6129a88482856136fa565b509392505050565b60006129c36129be84613557565b613501565b9050828152602081018484840111156129df576129de613938565b5b6129ea8482856136fa565b509392505050565b600081359050612a0181613f18565b92915050565b600081519050612a1681613f18565b92915050565b600081359050612a2b81613f2f565b92915050565b600081359050612a4081613f46565b92915050565b600081519050612a5581613f46565b92915050565b600082601f830112612a7057612a6f613933565b5b8135612a8084826020860161296e565b91505092915050565b600082601f830112612a9e57612a9d613933565b5b8135612aae8482602086016129b0565b91505092915050565b600081359050612ac681613f5d565b92915050565b600060208284031215612ae257612ae1613942565b5b6000612af0848285016129f2565b91505092915050565b600060208284031215612b0f57612b0e613942565b5b6000612b1d84828501612a07565b91505092915050565b60008060408385031215612b3d57612b3c613942565b5b6000612b4b858286016129f2565b9250506020612b5c858286016129f2565b9150509250929050565b600080600060608486031215612b7f57612b7e613942565b5b6000612b8d868287016129f2565b9350506020612b9e868287016129f2565b9250506040612baf86828701612ab7565b9150509250925092565b60008060008060808587031215612bd357612bd2613942565b5b6000612be1878288016129f2565b9450506020612bf2878288016129f2565b9350506040612c0387828801612ab7565b925050606085013567ffffffffffffffff811115612c2457612c2361393d565b5b612c3087828801612a5b565b91505092959194509250565b60008060408385031215612c5357612c52613942565b5b6000612c61858286016129f2565b9250506020612c7285828601612a1c565b9150509250929050565b60008060408385031215612c9357612c92613942565b5b6000612ca1858286016129f2565b9250506020612cb285828601612ab7565b9150509250929050565b600060208284031215612cd257612cd1613942565b5b6000612ce084828501612a31565b91505092915050565b600060208284031215612cff57612cfe613942565b5b6000612d0d84828501612a46565b91505092915050565b600060208284031215612d2c57612d2b613942565b5b600082013567ffffffffffffffff811115612d4a57612d4961393d565b5b612d5684828501612a89565b91505092915050565b600060208284031215612d7557612d74613942565b5b6000612d8384828501612ab7565b91505092915050565b612d9581613686565b82525050565b612da481613698565b82525050565b6000612db582613588565b612dbf818561359e565b9350612dcf818560208601613709565b612dd881613947565b840191505092915050565b6000612dee82613593565b612df881856135af565b9350612e08818560208601613709565b612e1181613947565b840191505092915050565b6000612e2782613593565b612e3181856135c0565b9350612e41818560208601613709565b80840191505092915050565b6000612e5a6014836135af565b9150612e6582613958565b602082019050919050565b6000612e7d602b836135af565b9150612e8882613981565b604082019050919050565b6000612ea06032836135af565b9150612eab826139d0565b604082019050919050565b6000612ec36026836135af565b9150612ece82613a1f565b604082019050919050565b6000612ee6601b836135af565b9150612ef182613a6e565b602082019050919050565b6000612f09601c836135af565b9150612f1482613a97565b602082019050919050565b6000612f2c6024836135af565b9150612f3782613ac0565b604082019050919050565b6000612f4f6019836135af565b9150612f5a82613b0f565b602082019050919050565b6000612f72602c836135af565b9150612f7d82613b38565b604082019050919050565b6000612f956010836135af565b9150612fa082613b87565b602082019050919050565b6000612fb86038836135af565b9150612fc382613bb0565b604082019050919050565b6000612fdb602a836135af565b9150612fe682613bff565b604082019050919050565b6000612ffe6029836135af565b915061300982613c4e565b604082019050919050565b60006130216020836135af565b915061302c82613c9d565b602082019050919050565b6000613044602c836135af565b915061304f82613cc6565b604082019050919050565b60006130676020836135af565b915061307282613d15565b602082019050919050565b600061308a6029836135af565b915061309582613d3e565b604082019050919050565b60006130ad602f836135af565b91506130b882613d8d565b604082019050919050565b60006130d06021836135af565b91506130db82613ddc565b604082019050919050565b60006130f36031836135af565b91506130fe82613e2b565b604082019050919050565b6000613116602c836135af565b915061312182613e7a565b604082019050919050565b60006131396030836135af565b915061314482613ec9565b604082019050919050565b613158816136f0565b82525050565b600061316a8285612e1c565b91506131768284612e1c565b91508190509392505050565b60006020820190506131976000830184612d8c565b92915050565b60006080820190506131b26000830187612d8c565b6131bf6020830186612d8c565b6131cc604083018561314f565b81810360608301526131de8184612daa565b905095945050505050565b60006020820190506131fe6000830184612d9b565b92915050565b6000602082019050818103600083015261321e8184612de3565b905092915050565b6000602082019050818103600083015261323f81612e4d565b9050919050565b6000602082019050818103600083015261325f81612e70565b9050919050565b6000602082019050818103600083015261327f81612e93565b9050919050565b6000602082019050818103600083015261329f81612eb6565b9050919050565b600060208201905081810360008301526132bf81612ed9565b9050919050565b600060208201905081810360008301526132df81612efc565b9050919050565b600060208201905081810360008301526132ff81612f1f565b9050919050565b6000602082019050818103600083015261331f81612f42565b9050919050565b6000602082019050818103600083015261333f81612f65565b9050919050565b6000602082019050818103600083015261335f81612f88565b9050919050565b6000602082019050818103600083015261337f81612fab565b9050919050565b6000602082019050818103600083015261339f81612fce565b9050919050565b600060208201905081810360008301526133bf81612ff1565b9050919050565b600060208201905081810360008301526133df81613014565b9050919050565b600060208201905081810360008301526133ff81613037565b9050919050565b6000602082019050818103600083015261341f8161305a565b9050919050565b6000602082019050818103600083015261343f8161307d565b9050919050565b6000602082019050818103600083015261345f816130a0565b9050919050565b6000602082019050818103600083015261347f816130c3565b9050919050565b6000602082019050818103600083015261349f816130e6565b9050919050565b600060208201905081810360008301526134bf81613109565b9050919050565b600060208201905081810360008301526134df8161312c565b9050919050565b60006020820190506134fb600083018461314f565b92915050565b600061350b61351c565b9050613517828261376e565b919050565b6000604051905090565b600067ffffffffffffffff82111561354157613540613904565b5b61354a82613947565b9050602081019050919050565b600067ffffffffffffffff82111561357257613571613904565b5b61357b82613947565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006135d6826136f0565b91506135e1836136f0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561361657613615613819565b5b828201905092915050565b600061362c826136f0565b9150613637836136f0565b92508261364757613646613848565b5b828204905092915050565b600061365d826136f0565b9150613668836136f0565b92508282101561367b5761367a613819565b5b828203905092915050565b6000613691826136d0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561372757808201518184015260208101905061370c565b83811115613736576000848401525b50505050565b6000600282049050600182168061375457607f821691505b6020821081141561376857613767613877565b5b50919050565b61377782613947565b810181811067ffffffffffffffff8211171561379657613795613904565b5b80604052505050565b60006137aa826136f0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137dd576137dc613819565b5b600182019050919050565b60006137f3826136f0565b91506137fe836136f0565b92508261380e5761380d613848565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f796f7520646f206e6f74206f776e20746869732045524e4553544f0000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b613f2181613686565b8114613f2c57600080fd5b50565b613f3881613698565b8114613f4357600080fd5b50565b613f4f816136a4565b8114613f5a57600080fd5b50565b613f66816136f0565b8114613f7157600080fd5b5056fea2646970667358221220aed14c69c1d67393da47fd94185b2f6d97baa14a70919874e30fddd6393368d464736f6c63430008070033
Deployed Bytecode Sourcemap
49920:1685:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51390:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22903:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24485:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24008:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37569:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25544:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37150:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50864:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50570:65;;;:::i;:::-;;25991:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48255:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37759:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50283:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44252:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22510:326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50253:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22153:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47209:148;;;:::i;:::-;;50501:61;;;:::i;:::-;;46558:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23072:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50751:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24865:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26247:365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23247:468;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25263:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47512:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51390:212;51529:4;51558:36;51582:11;51558:23;:36::i;:::-;51551:43;;51390:212;;;:::o;22903:100::-;22957:13;22990:5;22983:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22903:100;:::o;24485:308::-;24606:7;24653:16;24661:7;24653;:16::i;:::-;24631:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24761:15;:24;24777:7;24761:24;;;;;;;;;;;;;;;;;;;;;24754:31;;24485:308;;;:::o;24008:411::-;24089:13;24105:23;24120:7;24105:14;:23::i;:::-;24089:39;;24153:5;24147:11;;:2;:11;;;;24139:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24247:5;24231:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24256:37;24273:5;24280:12;:10;:12::i;:::-;24256:16;:37::i;:::-;24231:62;24209:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24390:21;24399:2;24403:7;24390:8;:21::i;:::-;24078:341;24008:411;;:::o;37569:113::-;37630:7;37657:10;:17;;;;37650:24;;37569:113;:::o;25544:376::-;25753:41;25772:12;:10;:12::i;:::-;25786:7;25753:18;:41::i;:::-;25731:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;25884:28;25894:4;25900:2;25904:7;25884:9;:28::i;:::-;25544:376;;;:::o;37150:343::-;37292:7;37347:23;37364:5;37347:16;:23::i;:::-;37339:5;:31;37317:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37459:12;:19;37472:5;37459:19;;;;;;;;;;;;;;;:26;37479:5;37459:26;;;;;;;;;;;;37452:33;;37150:343;;;;:::o;50864:211::-;50914:13;50930:7;;;;;;;;;;;:15;;;50946:7;50930:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50914:40;;50982:10;50973:19;;:5;:19;;;50965:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51035:32;51047:10;51059:7;51035:11;:32::i;:::-;50903:172;50864:211;:::o;50570:65::-;46789:12;:10;:12::i;:::-;46778:23;;:7;:5;:7::i;:::-;:23;;;46770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50617:10:::1;:8;:10::i;:::-;50570:65::o:0;25991:185::-;26129:39;26146:4;26152:2;26156:7;26129:39;;;;;;;;;;;;:16;:39::i;:::-;25991:185;;;:::o;48255:282::-;48387:41;48406:12;:10;:12::i;:::-;48420:7;48387:18;:41::i;:::-;48365:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;48515:14;48521:7;48515:5;:14::i;:::-;48255:282;:::o;37759:320::-;37879:7;37934:30;:28;:30::i;:::-;37926:5;:38;37904:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;38054:10;38065:5;38054:17;;;;;;;;:::i;:::-;;;;;;;;;;38047:24;;37759:320;;;:::o;50283:102::-;46789:12;:10;:12::i;:::-;46778:23;;:7;:5;:7::i;:::-;:23;;;46770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50367:10:::1;50357:7;:20;;;;;;;;;;;;:::i;:::-;;50283:102:::0;:::o;44252:86::-;44299:4;44323:7;;;;;;;;;;;44316:14;;44252:86;:::o;22510:326::-;22627:7;22652:13;22668:7;:16;22676:7;22668:16;;;;;;;;;;;;;;;;;;;;;22652:32;;22734:1;22717:19;;:5;:19;;;;22695:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;22823:5;22816:12;;;22510:326;;;:::o;50253:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22153:295::-;22270:7;22334:1;22317:19;;:5;:19;;;;22295:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22424:9;:16;22434:5;22424:16;;;;;;;;;;;;;;;;22417:23;;22153:295;;;:::o;47209:148::-;46789:12;:10;:12::i;:::-;46778:23;;:7;:5;:7::i;:::-;:23;;;46770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47316:1:::1;47279:40;;47300:6;;;;;;;;;;;47279:40;;;;;;;;;;;;47347:1;47330:6;;:19;;;;;;;;;;;;;;;;;;47209:148::o:0;50501:61::-;46789:12;:10;:12::i;:::-;46778:23;;:7;:5;:7::i;:::-;:23;;;46770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50546:8:::1;:6;:8::i;:::-;50501:61::o:0;46558:87::-;46604:7;46631:6;;;;;;;;;;;46624:13;;46558:87;:::o;23072:104::-;23128:13;23161:7;23154:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23072:104;:::o;50751:105::-;46789:12;:10;:12::i;:::-;46778:23;;:7;:5;:7::i;:::-;:23;;;46770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50826:22:::1;50836:2;50840:7;50826:9;:22::i;:::-;50751:105:::0;;:::o;24865:327::-;25012:12;:10;:12::i;:::-;25000:24;;:8;:24;;;;24992:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25112:8;25067:18;:32;25086:12;:10;:12::i;:::-;25067:32;;;;;;;;;;;;;;;:42;25100:8;25067:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25165:8;25136:48;;25151:12;:10;:12::i;:::-;25136:48;;;25175:8;25136:48;;;;;;:::i;:::-;;;;;;;;24865:327;;:::o;26247:365::-;26436:41;26455:12;:10;:12::i;:::-;26469:7;26436:18;:41::i;:::-;26414:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26565:39;26579:4;26585:2;26589:7;26598:5;26565:13;:39::i;:::-;26247:365;;;;:::o;23247:468::-;23365:13;23418:16;23426:7;23418;:16::i;:::-;23396:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;23522:21;23546:10;:8;:10::i;:::-;23522:34;;23611:1;23593:7;23587:21;:25;:120;;;;;;;;;;;;;;;;;23656:7;23665:18;:7;:16;:18::i;:::-;23639:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23587:120;23567:140;;;23247:468;;;:::o;25263:214::-;25405:4;25434:18;:25;25453:5;25434:25;;;;;;;;;;;;;;;:35;25460:8;25434:35;;;;;;;;;;;;;;;;;;;;;;;;;25427:42;;25263:214;;;;:::o;47512:281::-;46789:12;:10;:12::i;:::-;46778:23;;:7;:5;:7::i;:::-;:23;;;46770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47635:1:::1;47615:22;;:8;:22;;;;47593:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;47748:8;47719:38;;47740:6;;;;;;;;;;;47719:38;;;;;;;;;;;;47777:8;47768:6;;:17;;;;;;;;;;;;;;;;;;47512:281:::0;:::o;36766:300::-;36913:4;36970:35;36955:50;;;:11;:50;;;;:103;;;;37022:36;37046:11;37022:23;:36::i;:::-;36955:103;36935:123;;36766:300;;;:::o;28159:127::-;28224:4;28276:1;28248:30;;:7;:16;28256:7;28248:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28241:37;;28159:127;;;:::o;16958:98::-;17011:7;17038:10;17031:17;;16958:98;:::o;32282:174::-;32384:2;32357:15;:24;32373:7;32357:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32440:7;32436:2;32402:46;;32411:23;32426:7;32411:14;:23::i;:::-;32402:46;;;;;;;;;;;;32282:174;;:::o;28453:452::-;28582:4;28626:16;28634:7;28626;:16::i;:::-;28604:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28725:13;28741:23;28756:7;28741:14;:23::i;:::-;28725:39;;28794:5;28783:16;;:7;:16;;;:64;;;;28840:7;28816:31;;:20;28828:7;28816:11;:20::i;:::-;:31;;;28783:64;:113;;;;28864:32;28881:5;28888:7;28864:16;:32::i;:::-;28783:113;28775:122;;;28453:452;;;;:::o;31549:615::-;31722:4;31695:31;;:23;31710:7;31695:14;:23::i;:::-;:31;;;31673:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;31828:1;31814:16;;:2;:16;;;;31806:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31884:39;31905:4;31911:2;31915:7;31884:20;:39::i;:::-;31988:29;32005:1;32009:7;31988:8;:29::i;:::-;32049:1;32030:9;:15;32040:4;32030:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32078:1;32061:9;:13;32071:2;32061:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32109:2;32090:7;:16;32098:7;32090:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32148:7;32144:2;32129:27;;32138:4;32129:27;;;;;;;;;;;;31549:615;;;:::o;50643:100::-;50713:22;50723:2;50727:7;50713:9;:22::i;:::-;50643:100;;:::o;45311:120::-;44855:8;:6;:8::i;:::-;44847:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;45380:5:::1;45370:7;;:15;;;;;;;;;;;;;;;;;;45401:22;45410:12;:10;:12::i;:::-;45401:22;;;;;;:::i;:::-;;;;;;;;45311:120::o:0;30852:360::-;30912:13;30928:23;30943:7;30928:14;:23::i;:::-;30912:39;;30964:48;30985:5;31000:1;31004:7;30964:20;:48::i;:::-;31053:29;31070:1;31074:7;31053:8;:29::i;:::-;31115:1;31095:9;:16;31105:5;31095:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;31134:7;:16;31142:7;31134:16;;;;;;;;;;;;31127:23;;;;;;;;;;;31196:7;31192:1;31168:36;;31177:5;31168:36;;;;;;;;;;;;30901:311;30852:360;:::o;45052:118::-;44578:8;:6;:8::i;:::-;44577:9;44569:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45122:4:::1;45112:7;;:14;;;;;;;;;;;;;;;;;;45142:20;45149:12;:10;:12::i;:::-;45142:20;;;;;;:::i;:::-;;;;;;;;45052:118::o:0;29247:110::-;29323:26;29333:2;29337:7;29323:26;;;;;;;;;;;;:9;:26::i;:::-;29247:110;;:::o;27494:352::-;27651:28;27661:4;27667:2;27671:7;27651:9;:28::i;:::-;27712:48;27735:4;27741:2;27745:7;27754:5;27712:22;:48::i;:::-;27690:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27494:352;;;;:::o;50393:100::-;50445:13;50478:7;50471:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50393:100;:::o;17615:723::-;17671:13;17901:1;17892:5;:10;17888:53;;;17919:10;;;;;;;;;;;;;;;;;;;;;17888:53;17951:12;17966:5;17951:20;;17982:14;18007:78;18022:1;18014:4;:9;18007:78;;18040:8;;;;;:::i;:::-;;;;18071:2;18063:10;;;;;:::i;:::-;;;18007:78;;;18095:19;18127:6;18117:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18095:39;;18145:154;18161:1;18152:5;:10;18145:154;;18189:1;18179:11;;;;;:::i;:::-;;;18256:2;18248:5;:10;;;;:::i;:::-;18235:2;:24;;;;:::i;:::-;18222:39;;18205:6;18212;18205:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18285:2;18276:11;;;;;:::i;:::-;;;18145:154;;;18323:6;18309:21;;;;;17615:723;;;;:::o;21734:355::-;21881:4;21938:25;21923:40;;;:11;:40;;;;:105;;;;21995:33;21980:48;;;:11;:48;;;;21923:105;:158;;;;22045:36;22069:11;22045:23;:36::i;:::-;21923:158;21903:178;;21734:355;;;:::o;51083:229::-;44578:8;:6;:8::i;:::-;44577:9;44569:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51259:45:::1;51286:4;51292:2;51296:7;51259:26;:45::i;:::-;51083:229:::0;;;:::o;29584:321::-;29714:18;29720:2;29724:7;29714:5;:18::i;:::-;29765:54;29796:1;29800:2;29804:7;29813:5;29765:22;:54::i;:::-;29743:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29584:321;;;:::o;33021:1053::-;33176:4;33197:15;:2;:13;;;:15::i;:::-;33193:874;;;33266:2;33250:36;;;33309:12;:10;:12::i;:::-;33344:4;33371:7;33401:5;33250:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33229:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33629:1;33612:6;:13;:18;33608:389;;;33655:108;;;;;;;;;;:::i;:::-;;;;;;;;33608:389;33947:6;33941:13;33932:6;33928:2;33924:15;33917:38;33229:783;33499:45;;;33489:55;;;:6;:55;;;;33482:62;;;;;33193:874;34051:4;34044:11;;33021:1053;;;;;;;:::o;20200:207::-;20330:4;20374:25;20359:40;;;:11;:40;;;;20352:47;;20200:207;;;:::o;38692:589::-;38836:45;38863:4;38869:2;38873:7;38836:26;:45::i;:::-;38914:1;38898:18;;:4;:18;;;38894:187;;;38933:40;38965:7;38933:31;:40::i;:::-;38894:187;;;39003:2;38995:10;;:4;:10;;;38991:90;;39022:47;39055:4;39061:7;39022:32;:47::i;:::-;38991:90;38894:187;39109:1;39095:16;;:2;:16;;;39091:183;;;39128:45;39165:7;39128:36;:45::i;:::-;39091:183;;;39201:4;39195:10;;:2;:10;;;39191:83;;39222:40;39250:2;39254:7;39222:27;:40::i;:::-;39191:83;39091:183;38692:589;;;:::o;30241:382::-;30335:1;30321:16;;:2;:16;;;;30313:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30394:16;30402:7;30394;:16::i;:::-;30393:17;30385:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30456:45;30485:1;30489:2;30493:7;30456:20;:45::i;:::-;30531:1;30514:9;:13;30524:2;30514:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30562:2;30543:7;:16;30551:7;30543:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30607:7;30603:2;30582:33;;30599:1;30582:33;;;;;;;;;;;;30241:382;;:::o;8372:444::-;8432:4;8640:12;8764:7;8752:20;8744:28;;8807:1;8800:4;:8;8793:15;;;8372:444;;;:::o;34687:126::-;;;;:::o;40004:164::-;40108:10;:17;;;;40081:15;:24;40097:7;40081:24;;;;;;;;;;;:44;;;;40136:10;40152:7;40136:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40004:164;:::o;40795:1002::-;41075:22;41125:1;41100:22;41117:4;41100:16;:22::i;:::-;:26;;;;:::i;:::-;41075:51;;41137:18;41158:17;:26;41176:7;41158:26;;;;;;;;;;;;41137:47;;41305:14;41291:10;:28;41287:328;;41336:19;41358:12;:18;41371:4;41358:18;;;;;;;;;;;;;;;:34;41377:14;41358:34;;;;;;;;;;;;41336:56;;41442:11;41409:12;:18;41422:4;41409:18;;;;;;;;;;;;;;;:30;41428:10;41409:30;;;;;;;;;;;:44;;;;41559:10;41526:17;:30;41544:11;41526:30;;;;;;;;;;;:43;;;;41321:294;41287:328;41711:17;:26;41729:7;41711:26;;;;;;;;;;;41704:33;;;41755:12;:18;41768:4;41755:18;;;;;;;;;;;;;;;:34;41774:14;41755:34;;;;;;;;;;;41748:41;;;40890:907;;40795:1002;;:::o;42092:1079::-;42345:22;42390:1;42370:10;:17;;;;:21;;;;:::i;:::-;42345:46;;42402:18;42423:15;:24;42439:7;42423:24;;;;;;;;;;;;42402:45;;42774:19;42796:10;42807:14;42796:26;;;;;;;;:::i;:::-;;;;;;;;;;42774:48;;42860:11;42835:10;42846;42835:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42971:10;42940:15;:28;42956:11;42940:28;;;;;;;;;;;:41;;;;43112:15;:24;43128:7;43112:24;;;;;;;;;;;43105:31;;;43147:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42163:1008;;;42092:1079;:::o;39582:221::-;39667:14;39684:20;39701:2;39684:16;:20::i;:::-;39667:37;;39742:7;39715:12;:16;39728:2;39715:16;;;;;;;;;;;;;;;:24;39732:6;39715:24;;;;;;;;;;;:34;;;;39789:6;39760:17;:26;39778:7;39760:26;;;;;;;;;;;:35;;;;39656:147;39582:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;986:143;;;;:::o;1135:133::-;1178:5;1216:6;1203:20;1194:29;;1232:30;1256:5;1232:30;:::i;:::-;1135:133;;;;:::o;1274:137::-;1319:5;1357:6;1344:20;1335:29;;1373:32;1399:5;1373:32;:::i;:::-;1274:137;;;;:::o;1417:141::-;1473:5;1504:6;1498:13;1489:22;;1520:32;1546:5;1520:32;:::i;:::-;1417:141;;;;:::o;1577:338::-;1632:5;1681:3;1674:4;1666:6;1662:17;1658:27;1648:122;;1689:79;;:::i;:::-;1648:122;1806:6;1793:20;1831:78;1905:3;1897:6;1890:4;1882:6;1878:17;1831:78;:::i;:::-;1822:87;;1638:277;1577:338;;;;:::o;1935:340::-;1991:5;2040:3;2033:4;2025:6;2021:17;2017:27;2007:122;;2048:79;;:::i;:::-;2007:122;2165:6;2152:20;2190:79;2265:3;2257:6;2250:4;2242:6;2238:17;2190:79;:::i;:::-;2181:88;;1997:278;1935:340;;;;:::o;2281:139::-;2327:5;2365:6;2352:20;2343:29;;2381:33;2408:5;2381:33;:::i;:::-;2281:139;;;;:::o;2426:329::-;2485:6;2534:2;2522:9;2513:7;2509:23;2505:32;2502:119;;;2540:79;;:::i;:::-;2502:119;2660:1;2685:53;2730:7;2721:6;2710:9;2706:22;2685:53;:::i;:::-;2675:63;;2631:117;2426:329;;;;:::o;2761:351::-;2831:6;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:64;3087:7;3078:6;3067:9;3063:22;3031:64;:::i;:::-;3021:74;;2977:128;2761:351;;;;:::o;3118:474::-;3186:6;3194;3243:2;3231:9;3222:7;3218:23;3214:32;3211:119;;;3249:79;;:::i;:::-;3211:119;3369:1;3394:53;3439:7;3430:6;3419:9;3415:22;3394:53;:::i;:::-;3384:63;;3340:117;3496:2;3522:53;3567:7;3558:6;3547:9;3543:22;3522:53;:::i;:::-;3512:63;;3467:118;3118:474;;;;;:::o;3598:619::-;3675:6;3683;3691;3740:2;3728:9;3719:7;3715:23;3711:32;3708:119;;;3746:79;;:::i;:::-;3708:119;3866:1;3891:53;3936:7;3927:6;3916:9;3912:22;3891:53;:::i;:::-;3881:63;;3837:117;3993:2;4019:53;4064:7;4055:6;4044:9;4040:22;4019:53;:::i;:::-;4009:63;;3964:118;4121:2;4147:53;4192:7;4183:6;4172:9;4168:22;4147:53;:::i;:::-;4137:63;;4092:118;3598:619;;;;;:::o;4223:943::-;4318:6;4326;4334;4342;4391:3;4379:9;4370:7;4366:23;4362:33;4359:120;;;4398:79;;:::i;:::-;4359:120;4518:1;4543:53;4588:7;4579:6;4568:9;4564:22;4543:53;:::i;:::-;4533:63;;4489:117;4645:2;4671:53;4716:7;4707:6;4696:9;4692:22;4671:53;:::i;:::-;4661:63;;4616:118;4773:2;4799:53;4844:7;4835:6;4824:9;4820:22;4799:53;:::i;:::-;4789:63;;4744:118;4929:2;4918:9;4914:18;4901:32;4960:18;4952:6;4949:30;4946:117;;;4982:79;;:::i;:::-;4946:117;5087:62;5141:7;5132:6;5121:9;5117:22;5087:62;:::i;:::-;5077:72;;4872:287;4223:943;;;;;;;:::o;5172:468::-;5237:6;5245;5294:2;5282:9;5273:7;5269:23;5265:32;5262:119;;;5300:79;;:::i;:::-;5262:119;5420:1;5445:53;5490:7;5481:6;5470:9;5466:22;5445:53;:::i;:::-;5435:63;;5391:117;5547:2;5573:50;5615:7;5606:6;5595:9;5591:22;5573:50;:::i;:::-;5563:60;;5518:115;5172:468;;;;;:::o;5646:474::-;5714:6;5722;5771:2;5759:9;5750:7;5746:23;5742:32;5739:119;;;5777:79;;:::i;:::-;5739:119;5897:1;5922:53;5967:7;5958:6;5947:9;5943:22;5922:53;:::i;:::-;5912:63;;5868:117;6024:2;6050:53;6095:7;6086:6;6075:9;6071:22;6050:53;:::i;:::-;6040:63;;5995:118;5646:474;;;;;:::o;6126:327::-;6184:6;6233:2;6221:9;6212:7;6208:23;6204:32;6201:119;;;6239:79;;:::i;:::-;6201:119;6359:1;6384:52;6428:7;6419:6;6408:9;6404:22;6384:52;:::i;:::-;6374:62;;6330:116;6126:327;;;;:::o;6459:349::-;6528:6;6577:2;6565:9;6556:7;6552:23;6548:32;6545:119;;;6583:79;;:::i;:::-;6545:119;6703:1;6728:63;6783:7;6774:6;6763:9;6759:22;6728:63;:::i;:::-;6718:73;;6674:127;6459:349;;;;:::o;6814:509::-;6883:6;6932:2;6920:9;6911:7;6907:23;6903:32;6900:119;;;6938:79;;:::i;:::-;6900:119;7086:1;7075:9;7071:17;7058:31;7116:18;7108:6;7105:30;7102:117;;;7138:79;;:::i;:::-;7102:117;7243:63;7298:7;7289:6;7278:9;7274:22;7243:63;:::i;:::-;7233:73;;7029:287;6814:509;;;;:::o;7329:329::-;7388:6;7437:2;7425:9;7416:7;7412:23;7408:32;7405:119;;;7443:79;;:::i;:::-;7405:119;7563:1;7588:53;7633:7;7624:6;7613:9;7609:22;7588:53;:::i;:::-;7578:63;;7534:117;7329:329;;;;:::o;7664:118::-;7751:24;7769:5;7751:24;:::i;:::-;7746:3;7739:37;7664:118;;:::o;7788:109::-;7869:21;7884:5;7869:21;:::i;:::-;7864:3;7857:34;7788:109;;:::o;7903:360::-;7989:3;8017:38;8049:5;8017:38;:::i;:::-;8071:70;8134:6;8129:3;8071:70;:::i;:::-;8064:77;;8150:52;8195:6;8190:3;8183:4;8176:5;8172:16;8150:52;:::i;:::-;8227:29;8249:6;8227:29;:::i;:::-;8222:3;8218:39;8211:46;;7993:270;7903:360;;;;:::o;8269:364::-;8357:3;8385:39;8418:5;8385:39;:::i;:::-;8440:71;8504:6;8499:3;8440:71;:::i;:::-;8433:78;;8520:52;8565:6;8560:3;8553:4;8546:5;8542:16;8520:52;:::i;:::-;8597:29;8619:6;8597:29;:::i;:::-;8592:3;8588:39;8581:46;;8361:272;8269:364;;;;:::o;8639:377::-;8745:3;8773:39;8806:5;8773:39;:::i;:::-;8828:89;8910:6;8905:3;8828:89;:::i;:::-;8821:96;;8926:52;8971:6;8966:3;8959:4;8952:5;8948:16;8926:52;:::i;:::-;9003:6;8998:3;8994:16;8987:23;;8749:267;8639:377;;;;:::o;9022:366::-;9164:3;9185:67;9249:2;9244:3;9185:67;:::i;:::-;9178:74;;9261:93;9350:3;9261:93;:::i;:::-;9379:2;9374:3;9370:12;9363:19;;9022:366;;;:::o;9394:::-;9536:3;9557:67;9621:2;9616:3;9557:67;:::i;:::-;9550:74;;9633:93;9722:3;9633:93;:::i;:::-;9751:2;9746:3;9742:12;9735:19;;9394:366;;;:::o;9766:::-;9908:3;9929:67;9993:2;9988:3;9929:67;:::i;:::-;9922:74;;10005:93;10094:3;10005:93;:::i;:::-;10123:2;10118:3;10114:12;10107:19;;9766:366;;;:::o;10138:::-;10280:3;10301:67;10365:2;10360:3;10301:67;:::i;:::-;10294:74;;10377:93;10466:3;10377:93;:::i;:::-;10495:2;10490:3;10486:12;10479:19;;10138:366;;;:::o;10510:::-;10652:3;10673:67;10737:2;10732:3;10673:67;:::i;:::-;10666:74;;10749:93;10838:3;10749:93;:::i;:::-;10867:2;10862:3;10858:12;10851:19;;10510:366;;;:::o;10882:::-;11024:3;11045:67;11109:2;11104:3;11045:67;:::i;:::-;11038:74;;11121:93;11210:3;11121:93;:::i;:::-;11239:2;11234:3;11230:12;11223:19;;10882:366;;;:::o;11254:::-;11396:3;11417:67;11481:2;11476:3;11417:67;:::i;:::-;11410:74;;11493:93;11582:3;11493:93;:::i;:::-;11611:2;11606:3;11602:12;11595:19;;11254:366;;;:::o;11626:::-;11768:3;11789:67;11853:2;11848:3;11789:67;:::i;:::-;11782:74;;11865:93;11954:3;11865:93;:::i;:::-;11983:2;11978:3;11974:12;11967:19;;11626:366;;;:::o;11998:::-;12140:3;12161:67;12225:2;12220:3;12161:67;:::i;:::-;12154:74;;12237:93;12326:3;12237:93;:::i;:::-;12355:2;12350:3;12346:12;12339:19;;11998:366;;;:::o;12370:::-;12512:3;12533:67;12597:2;12592:3;12533:67;:::i;:::-;12526:74;;12609:93;12698:3;12609:93;:::i;:::-;12727:2;12722:3;12718:12;12711:19;;12370:366;;;:::o;12742:::-;12884:3;12905:67;12969:2;12964:3;12905:67;:::i;:::-;12898:74;;12981:93;13070:3;12981:93;:::i;:::-;13099:2;13094:3;13090:12;13083:19;;12742:366;;;:::o;13114:::-;13256:3;13277:67;13341:2;13336:3;13277:67;:::i;:::-;13270:74;;13353:93;13442:3;13353:93;:::i;:::-;13471:2;13466:3;13462:12;13455:19;;13114:366;;;:::o;13486:::-;13628:3;13649:67;13713:2;13708:3;13649:67;:::i;:::-;13642:74;;13725:93;13814:3;13725:93;:::i;:::-;13843:2;13838:3;13834:12;13827:19;;13486:366;;;:::o;13858:::-;14000:3;14021:67;14085:2;14080:3;14021:67;:::i;:::-;14014:74;;14097:93;14186:3;14097:93;:::i;:::-;14215:2;14210:3;14206:12;14199:19;;13858:366;;;:::o;14230:::-;14372:3;14393:67;14457:2;14452:3;14393:67;:::i;:::-;14386:74;;14469:93;14558:3;14469:93;:::i;:::-;14587:2;14582:3;14578:12;14571:19;;14230:366;;;:::o;14602:::-;14744:3;14765:67;14829:2;14824:3;14765:67;:::i;:::-;14758:74;;14841:93;14930:3;14841:93;:::i;:::-;14959:2;14954:3;14950:12;14943:19;;14602:366;;;:::o;14974:::-;15116:3;15137:67;15201:2;15196:3;15137:67;:::i;:::-;15130:74;;15213:93;15302:3;15213:93;:::i;:::-;15331:2;15326:3;15322:12;15315:19;;14974:366;;;:::o;15346:::-;15488:3;15509:67;15573:2;15568:3;15509:67;:::i;:::-;15502:74;;15585:93;15674:3;15585:93;:::i;:::-;15703:2;15698:3;15694:12;15687:19;;15346:366;;;:::o;15718:::-;15860:3;15881:67;15945:2;15940:3;15881:67;:::i;:::-;15874:74;;15957:93;16046:3;15957:93;:::i;:::-;16075:2;16070:3;16066:12;16059:19;;15718:366;;;:::o;16090:::-;16232:3;16253:67;16317:2;16312:3;16253:67;:::i;:::-;16246:74;;16329:93;16418:3;16329:93;:::i;:::-;16447:2;16442:3;16438:12;16431:19;;16090:366;;;:::o;16462:::-;16604:3;16625:67;16689:2;16684:3;16625:67;:::i;:::-;16618:74;;16701:93;16790:3;16701:93;:::i;:::-;16819:2;16814:3;16810:12;16803:19;;16462:366;;;:::o;16834:::-;16976:3;16997:67;17061:2;17056:3;16997:67;:::i;:::-;16990:74;;17073:93;17162:3;17073:93;:::i;:::-;17191:2;17186:3;17182:12;17175:19;;16834:366;;;:::o;17206:118::-;17293:24;17311:5;17293:24;:::i;:::-;17288:3;17281:37;17206:118;;:::o;17330:435::-;17510:3;17532:95;17623:3;17614:6;17532:95;:::i;:::-;17525:102;;17644:95;17735:3;17726:6;17644:95;:::i;:::-;17637:102;;17756:3;17749:10;;17330:435;;;;;:::o;17771:222::-;17864:4;17902:2;17891:9;17887:18;17879:26;;17915:71;17983:1;17972:9;17968:17;17959:6;17915:71;:::i;:::-;17771:222;;;;:::o;17999:640::-;18194:4;18232:3;18221:9;18217:19;18209:27;;18246:71;18314:1;18303:9;18299:17;18290:6;18246:71;:::i;:::-;18327:72;18395:2;18384:9;18380:18;18371:6;18327:72;:::i;:::-;18409;18477:2;18466:9;18462:18;18453:6;18409:72;:::i;:::-;18528:9;18522:4;18518:20;18513:2;18502:9;18498:18;18491:48;18556:76;18627:4;18618:6;18556:76;:::i;:::-;18548:84;;17999:640;;;;;;;:::o;18645:210::-;18732:4;18770:2;18759:9;18755:18;18747:26;;18783:65;18845:1;18834:9;18830:17;18821:6;18783:65;:::i;:::-;18645:210;;;;:::o;18861:313::-;18974:4;19012:2;19001:9;18997:18;18989:26;;19061:9;19055:4;19051:20;19047:1;19036:9;19032:17;19025:47;19089:78;19162:4;19153:6;19089:78;:::i;:::-;19081:86;;18861:313;;;;:::o;19180:419::-;19346:4;19384:2;19373:9;19369:18;19361:26;;19433:9;19427:4;19423:20;19419:1;19408:9;19404:17;19397:47;19461:131;19587:4;19461:131;:::i;:::-;19453:139;;19180:419;;;:::o;19605:::-;19771:4;19809:2;19798:9;19794:18;19786:26;;19858:9;19852:4;19848:20;19844:1;19833:9;19829:17;19822:47;19886:131;20012:4;19886:131;:::i;:::-;19878:139;;19605:419;;;:::o;20030:::-;20196:4;20234:2;20223:9;20219:18;20211:26;;20283:9;20277:4;20273:20;20269:1;20258:9;20254:17;20247:47;20311:131;20437:4;20311:131;:::i;:::-;20303:139;;20030:419;;;:::o;20455:::-;20621:4;20659:2;20648:9;20644:18;20636:26;;20708:9;20702:4;20698:20;20694:1;20683:9;20679:17;20672:47;20736:131;20862:4;20736:131;:::i;:::-;20728:139;;20455:419;;;:::o;20880:::-;21046:4;21084:2;21073:9;21069:18;21061:26;;21133:9;21127:4;21123:20;21119:1;21108:9;21104:17;21097:47;21161:131;21287:4;21161:131;:::i;:::-;21153:139;;20880:419;;;:::o;21305:::-;21471:4;21509:2;21498:9;21494:18;21486:26;;21558:9;21552:4;21548:20;21544:1;21533:9;21529:17;21522:47;21586:131;21712:4;21586:131;:::i;:::-;21578:139;;21305:419;;;:::o;21730:::-;21896:4;21934:2;21923:9;21919:18;21911:26;;21983:9;21977:4;21973:20;21969:1;21958:9;21954:17;21947:47;22011:131;22137:4;22011:131;:::i;:::-;22003:139;;21730:419;;;:::o;22155:::-;22321:4;22359:2;22348:9;22344:18;22336:26;;22408:9;22402:4;22398:20;22394:1;22383:9;22379:17;22372:47;22436:131;22562:4;22436:131;:::i;:::-;22428:139;;22155:419;;;:::o;22580:::-;22746:4;22784:2;22773:9;22769:18;22761:26;;22833:9;22827:4;22823:20;22819:1;22808:9;22804:17;22797:47;22861:131;22987:4;22861:131;:::i;:::-;22853:139;;22580:419;;;:::o;23005:::-;23171:4;23209:2;23198:9;23194:18;23186:26;;23258:9;23252:4;23248:20;23244:1;23233:9;23229:17;23222:47;23286:131;23412:4;23286:131;:::i;:::-;23278:139;;23005:419;;;:::o;23430:::-;23596:4;23634:2;23623:9;23619:18;23611:26;;23683:9;23677:4;23673:20;23669:1;23658:9;23654:17;23647:47;23711:131;23837:4;23711:131;:::i;:::-;23703:139;;23430:419;;;:::o;23855:::-;24021:4;24059:2;24048:9;24044:18;24036:26;;24108:9;24102:4;24098:20;24094:1;24083:9;24079:17;24072:47;24136:131;24262:4;24136:131;:::i;:::-;24128:139;;23855:419;;;:::o;24280:::-;24446:4;24484:2;24473:9;24469:18;24461:26;;24533:9;24527:4;24523:20;24519:1;24508:9;24504:17;24497:47;24561:131;24687:4;24561:131;:::i;:::-;24553:139;;24280:419;;;:::o;24705:::-;24871:4;24909:2;24898:9;24894:18;24886:26;;24958:9;24952:4;24948:20;24944:1;24933:9;24929:17;24922:47;24986:131;25112:4;24986:131;:::i;:::-;24978:139;;24705:419;;;:::o;25130:::-;25296:4;25334:2;25323:9;25319:18;25311:26;;25383:9;25377:4;25373:20;25369:1;25358:9;25354:17;25347:47;25411:131;25537:4;25411:131;:::i;:::-;25403:139;;25130:419;;;:::o;25555:::-;25721:4;25759:2;25748:9;25744:18;25736:26;;25808:9;25802:4;25798:20;25794:1;25783:9;25779:17;25772:47;25836:131;25962:4;25836:131;:::i;:::-;25828:139;;25555:419;;;:::o;25980:::-;26146:4;26184:2;26173:9;26169:18;26161:26;;26233:9;26227:4;26223:20;26219:1;26208:9;26204:17;26197:47;26261:131;26387:4;26261:131;:::i;:::-;26253:139;;25980:419;;;:::o;26405:::-;26571:4;26609:2;26598:9;26594:18;26586:26;;26658:9;26652:4;26648:20;26644:1;26633:9;26629:17;26622:47;26686:131;26812:4;26686:131;:::i;:::-;26678:139;;26405:419;;;:::o;26830:::-;26996:4;27034:2;27023:9;27019:18;27011:26;;27083:9;27077:4;27073:20;27069:1;27058:9;27054:17;27047:47;27111:131;27237:4;27111:131;:::i;:::-;27103:139;;26830:419;;;:::o;27255:::-;27421:4;27459:2;27448:9;27444:18;27436:26;;27508:9;27502:4;27498:20;27494:1;27483:9;27479:17;27472:47;27536:131;27662:4;27536:131;:::i;:::-;27528:139;;27255:419;;;:::o;27680:::-;27846:4;27884:2;27873:9;27869:18;27861:26;;27933:9;27927:4;27923:20;27919:1;27908:9;27904:17;27897:47;27961:131;28087:4;27961:131;:::i;:::-;27953:139;;27680:419;;;:::o;28105:::-;28271:4;28309:2;28298:9;28294:18;28286:26;;28358:9;28352:4;28348:20;28344:1;28333:9;28329:17;28322:47;28386:131;28512:4;28386:131;:::i;:::-;28378:139;;28105:419;;;:::o;28530:222::-;28623:4;28661:2;28650:9;28646:18;28638:26;;28674:71;28742:1;28731:9;28727:17;28718:6;28674:71;:::i;:::-;28530:222;;;;:::o;28758:129::-;28792:6;28819:20;;:::i;:::-;28809:30;;28848:33;28876:4;28868:6;28848:33;:::i;:::-;28758:129;;;:::o;28893:75::-;28926:6;28959:2;28953:9;28943:19;;28893:75;:::o;28974:307::-;29035:4;29125:18;29117:6;29114:30;29111:56;;;29147:18;;:::i;:::-;29111:56;29185:29;29207:6;29185:29;:::i;:::-;29177:37;;29269:4;29263;29259:15;29251:23;;28974:307;;;:::o;29287:308::-;29349:4;29439:18;29431:6;29428:30;29425:56;;;29461:18;;:::i;:::-;29425:56;29499:29;29521:6;29499:29;:::i;:::-;29491:37;;29583:4;29577;29573:15;29565:23;;29287:308;;;:::o;29601:98::-;29652:6;29686:5;29680:12;29670:22;;29601:98;;;:::o;29705:99::-;29757:6;29791:5;29785:12;29775:22;;29705:99;;;:::o;29810:168::-;29893:11;29927:6;29922:3;29915:19;29967:4;29962:3;29958:14;29943:29;;29810:168;;;;:::o;29984:169::-;30068:11;30102:6;30097:3;30090:19;30142:4;30137:3;30133:14;30118:29;;29984:169;;;;:::o;30159:148::-;30261:11;30298:3;30283:18;;30159:148;;;;:::o;30313:305::-;30353:3;30372:20;30390:1;30372:20;:::i;:::-;30367:25;;30406:20;30424:1;30406:20;:::i;:::-;30401:25;;30560:1;30492:66;30488:74;30485:1;30482:81;30479:107;;;30566:18;;:::i;:::-;30479:107;30610:1;30607;30603:9;30596:16;;30313:305;;;;:::o;30624:185::-;30664:1;30681:20;30699:1;30681:20;:::i;:::-;30676:25;;30715:20;30733:1;30715:20;:::i;:::-;30710:25;;30754:1;30744:35;;30759:18;;:::i;:::-;30744:35;30801:1;30798;30794:9;30789:14;;30624:185;;;;:::o;30815:191::-;30855:4;30875:20;30893:1;30875:20;:::i;:::-;30870:25;;30909:20;30927:1;30909:20;:::i;:::-;30904:25;;30948:1;30945;30942:8;30939:34;;;30953:18;;:::i;:::-;30939:34;30998:1;30995;30991:9;30983:17;;30815:191;;;;:::o;31012:96::-;31049:7;31078:24;31096:5;31078:24;:::i;:::-;31067:35;;31012:96;;;:::o;31114:90::-;31148:7;31191:5;31184:13;31177:21;31166:32;;31114:90;;;:::o;31210:149::-;31246:7;31286:66;31279:5;31275:78;31264:89;;31210:149;;;:::o;31365:126::-;31402:7;31442:42;31435:5;31431:54;31420:65;;31365:126;;;:::o;31497:77::-;31534:7;31563:5;31552:16;;31497:77;;;:::o;31580:154::-;31664:6;31659:3;31654;31641:30;31726:1;31717:6;31712:3;31708:16;31701:27;31580:154;;;:::o;31740:307::-;31808:1;31818:113;31832:6;31829:1;31826:13;31818:113;;;31917:1;31912:3;31908:11;31902:18;31898:1;31893:3;31889:11;31882:39;31854:2;31851:1;31847:10;31842:15;;31818:113;;;31949:6;31946:1;31943:13;31940:101;;;32029:1;32020:6;32015:3;32011:16;32004:27;31940:101;31789:258;31740:307;;;:::o;32053:320::-;32097:6;32134:1;32128:4;32124:12;32114:22;;32181:1;32175:4;32171:12;32202:18;32192:81;;32258:4;32250:6;32246:17;32236:27;;32192:81;32320:2;32312:6;32309:14;32289:18;32286:38;32283:84;;;32339:18;;:::i;:::-;32283:84;32104:269;32053:320;;;:::o;32379:281::-;32462:27;32484:4;32462:27;:::i;:::-;32454:6;32450:40;32592:6;32580:10;32577:22;32556:18;32544:10;32541:34;32538:62;32535:88;;;32603:18;;:::i;:::-;32535:88;32643:10;32639:2;32632:22;32422:238;32379:281;;:::o;32666:233::-;32705:3;32728:24;32746:5;32728:24;:::i;:::-;32719:33;;32774:66;32767:5;32764:77;32761:103;;;32844:18;;:::i;:::-;32761:103;32891:1;32884:5;32880:13;32873:20;;32666:233;;;:::o;32905:176::-;32937:1;32954:20;32972:1;32954:20;:::i;:::-;32949:25;;32988:20;33006:1;32988:20;:::i;:::-;32983:25;;33027:1;33017:35;;33032:18;;:::i;:::-;33017:35;33073:1;33070;33066:9;33061:14;;32905:176;;;;:::o;33087:180::-;33135:77;33132:1;33125:88;33232:4;33229:1;33222:15;33256:4;33253:1;33246:15;33273:180;33321:77;33318:1;33311:88;33418:4;33415:1;33408:15;33442:4;33439:1;33432:15;33459:180;33507:77;33504:1;33497:88;33604:4;33601:1;33594:15;33628:4;33625:1;33618:15;33645:180;33693:77;33690:1;33683:88;33790:4;33787:1;33780:15;33814:4;33811:1;33804:15;33831:180;33879:77;33876:1;33869:88;33976:4;33973:1;33966:15;34000:4;33997:1;33990:15;34017:180;34065:77;34062:1;34055:88;34162:4;34159:1;34152:15;34186:4;34183:1;34176:15;34203:117;34312:1;34309;34302:12;34326:117;34435:1;34432;34425:12;34449:117;34558:1;34555;34548:12;34572:117;34681:1;34678;34671:12;34695:102;34736:6;34787:2;34783:7;34778:2;34771:5;34767:14;34763:28;34753:38;;34695:102;;;:::o;34803:170::-;34943:22;34939:1;34931:6;34927:14;34920:46;34803:170;:::o;34979:230::-;35119:34;35115:1;35107:6;35103:14;35096:58;35188:13;35183:2;35175:6;35171:15;35164:38;34979:230;:::o;35215:237::-;35355:34;35351:1;35343:6;35339:14;35332:58;35424:20;35419:2;35411:6;35407:15;35400:45;35215:237;:::o;35458:225::-;35598:34;35594:1;35586:6;35582:14;35575:58;35667:8;35662:2;35654:6;35650:15;35643:33;35458:225;:::o;35689:177::-;35829:29;35825:1;35817:6;35813:14;35806:53;35689:177;:::o;35872:178::-;36012:30;36008:1;36000:6;35996:14;35989:54;35872:178;:::o;36056:223::-;36196:34;36192:1;36184:6;36180:14;36173:58;36265:6;36260:2;36252:6;36248:15;36241:31;36056:223;:::o;36285:175::-;36425:27;36421:1;36413:6;36409:14;36402:51;36285:175;:::o;36466:231::-;36606:34;36602:1;36594:6;36590:14;36583:58;36675:14;36670:2;36662:6;36658:15;36651:39;36466:231;:::o;36703:166::-;36843:18;36839:1;36831:6;36827:14;36820:42;36703:166;:::o;36875:243::-;37015:34;37011:1;37003:6;36999:14;36992:58;37084:26;37079:2;37071:6;37067:15;37060:51;36875:243;:::o;37124:229::-;37264:34;37260:1;37252:6;37248:14;37241:58;37333:12;37328:2;37320:6;37316:15;37309:37;37124:229;:::o;37359:228::-;37499:34;37495:1;37487:6;37483:14;37476:58;37568:11;37563:2;37555:6;37551:15;37544:36;37359:228;:::o;37593:182::-;37733:34;37729:1;37721:6;37717:14;37710:58;37593:182;:::o;37781:231::-;37921:34;37917:1;37909:6;37905:14;37898:58;37990:14;37985:2;37977:6;37973:15;37966:39;37781:231;:::o;38018:182::-;38158:34;38154:1;38146:6;38142:14;38135:58;38018:182;:::o;38206:228::-;38346:34;38342:1;38334:6;38330:14;38323:58;38415:11;38410:2;38402:6;38398:15;38391:36;38206:228;:::o;38440:234::-;38580:34;38576:1;38568:6;38564:14;38557:58;38649:17;38644:2;38636:6;38632:15;38625:42;38440:234;:::o;38680:220::-;38820:34;38816:1;38808:6;38804:14;38797:58;38889:3;38884:2;38876:6;38872:15;38865:28;38680:220;:::o;38906:236::-;39046:34;39042:1;39034:6;39030:14;39023:58;39115:19;39110:2;39102:6;39098:15;39091:44;38906:236;:::o;39148:231::-;39288:34;39284:1;39276:6;39272:14;39265:58;39357:14;39352:2;39344:6;39340:15;39333:39;39148:231;:::o;39385:235::-;39525:34;39521:1;39513:6;39509:14;39502:58;39594:18;39589:2;39581:6;39577:15;39570:43;39385:235;:::o;39626:122::-;39699:24;39717:5;39699:24;:::i;:::-;39692:5;39689:35;39679:63;;39738:1;39735;39728:12;39679:63;39626:122;:::o;39754:116::-;39824:21;39839:5;39824:21;:::i;:::-;39817:5;39814:32;39804:60;;39860:1;39857;39850:12;39804:60;39754:116;:::o;39876:120::-;39948:23;39965:5;39948:23;:::i;:::-;39941:5;39938:34;39928:62;;39986:1;39983;39976:12;39928:62;39876:120;:::o;40002:122::-;40075:24;40093:5;40075:24;:::i;:::-;40068:5;40065:35;40055:63;;40114:1;40111;40104:12;40055:63;40002:122;:::o
Swarm Source
ipfs://aed14c69c1d67393da47fd94185b2f6d97baa14a70919874e30fddd6393368d4
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.