ERC-721
Overview
Max Total Supply
2,047 GSAL
Holders
866
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 GSALLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-29 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; string private baseExtension = ".json"; // 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() , baseExtension)) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity >=0.7.0 <0.9.0; contract NFT is ERC721Enumerable, Ownable { string public baseExtension = ".json"; uint256 public constant maxAirdrop = 20; uint256 public constant freeSupply = 888; uint256 public constant paidSupply = 8000; uint256 public constant maxMintTx = 10; uint256 public constant maxSupply = freeSupply + paidSupply; uint256 public constant price = 30000000000000000; // 0.030000000000000000 ETH string private tokenUri; uint256 public freeMint = 2; uint256 public maxMintWallet = 20; uint256 public minted = 0; uint256 public totalAirdrop = 0; mapping(address => uint256) public addressMint; bool public paused = false; address[] public listedAirdrop; constructor() ERC721("Genetically Spliced Ape Labs", "GSAL") { } function totalSupply() public view override returns (uint256) { return minted; } function airdrop() external onlyOwner { require(totalAirdrop + listedAirdrop.length <= maxAirdrop, "Limit Airdrop"); uint256 lastTotalSupply = totalSupply(); totalAirdrop += listedAirdrop.length; for (uint256 i = 0; i < listedAirdrop.length; i++) { _mint(listedAirdrop[i], ++lastTotalSupply); minted += lastTotalSupply; } } function isAirdrop(address _user) public view returns (bool) { for (uint i = 0; i < listedAirdrop.length; i++) { if (listedAirdrop[i] == _user) { return true; } } return false; } function airdropUsers(address[] calldata _users) public onlyOwner { delete listedAirdrop; listedAirdrop = _users; } function pause(bool _state) public onlyOwner { paused = _state; } function mint(uint256 amount) external payable { require(!paused, "the contract is paused"); if (minted < freeSupply) { require(minted + amount <= freeSupply, "Free Mint Closed"); require(addressMint[msg.sender] + amount <= freeMint,"Limit"); } else { require(amount <= maxMintTx,"Max 10 Amount"); require(minted + amount <= maxSupply, "Sold Out"); require(addressMint[msg.sender] + amount <= maxMintWallet,"Limit"); require(msg.value >= price * amount, "Out of ETH"); } uint256 lastTotalSupply = totalSupply(); minted += amount; addressMint[msg.sender] += amount; for (uint256 i = 0; i < amount; i++) { _mint(msg.sender, ++lastTotalSupply); } } function _baseURI() internal view override(ERC721) returns (string memory) { return tokenUri; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function withdrawAll() external onlyOwner { require(address(this).balance > 0, "No balance"); payable(msg.sender).transfer(address(this).balance); } function setMaxFreeMint(uint256 amount) external onlyOwner { freeMint = amount; } function setMaxWalletMint(uint256 amount) external onlyOwner { maxMintWallet = amount; } function setBaseURI(string calldata URI) external onlyOwner { tokenUri = URI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"airdropUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listedAirdrop","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAirdrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"paidSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletMint","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":"totalAirdrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600090805190602001906200005192919062000271565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200009f92919062000271565b506002600e556014600f55600060105560006011556000601360006101000a81548160ff021916908315150217905550348015620000dc57600080fd5b506040518060400160405280601c81526020017f47656e65746963616c6c792053706c6963656420417065204c616273000000008152506040518060400160405280600481526020017f4753414c0000000000000000000000000000000000000000000000000000000081525081600190805190602001906200016192919062000271565b5080600290805190602001906200017a92919062000271565b5050506200019d62000191620001a360201b60201c565b620001ab60201b60201c565b62000386565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027f9062000321565b90600052602060002090601f016020900481019282620002a35760008555620002ef565b82601f10620002be57805160ff1916838001178555620002ef565b82800160010185558215620002ef579182015b82811115620002ee578251825591602001919060010190620002d1565b5b509050620002fe919062000302565b5090565b5b808211156200031d57600081600090555060010162000303565b5090565b600060028204905060018216806200033a57607f821691505b6020821081141562000351576200035062000357565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614cd480620003966000396000f3fe60806040526004361061025c5760003560e01c806370a0823111610144578063a22cb465116100b6578063d5abeb011161007a578063d5abeb01146108dd578063d9d2408414610908578063da3ef23f14610945578063e985e9c51461096e578063f2fde38b146109ab578063f39d1007146109d45761025c565b8063a22cb465146107fa578063b88d4fde14610823578063bb9dba921461084c578063c668286214610875578063c87b56dd146108a05761025c565b8063853828b611610108578063853828b61461071b5780638da5cb5b1461073257806395d89b411461075d578063995456e114610788578063a035b1fe146107b3578063a0712d68146107de5761025c565b806370a0823114610624578063715018a6146106615780637294e1ef14610678578063742a4c9b146106b557806374acb5d6146106de5761025c565b80633884d635116101dd5780635b70ea9f116101a15780635b70ea9f146105105780635c975abb1461053b5780635ce97dbb14610566578063631525c3146105915780636352211e146105bc57806363869a5d146105f95761025c565b80633884d6351461043f57806342842e0e146104565780634f02c4201461047f5780634f6ccce7146104aa57806355f804b3146104e75761025c565b8063095ea7b311610224578063095ea7b31461035a57806318160ddd1461038357806323b872dd146103ae57806324a6ab0c146103d75780632f745c59146104025761025c565b806301ffc9a71461026157806302329a291461029e57806305d5c595146102c757806306fdde03146102f2578063081812fc1461031d575b600080fd5b34801561026d57600080fd5b506102886004803603810190610283919061370a565b6109fd565b6040516102959190613d9c565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c091906136dd565b610a77565b005b3480156102d357600080fd5b506102dc610b10565b6040516102e99190614119565b60405180910390f35b3480156102fe57600080fd5b50610307610b15565b6040516103149190613db7565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f91906137fa565b610ba7565b6040516103519190613d35565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613650565b610c2c565b005b34801561038f57600080fd5b50610398610d44565b6040516103a59190614119565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d0919061353a565b610d4e565b005b3480156103e357600080fd5b506103ec610dae565b6040516103f99190614119565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190613650565b610db4565b6040516104369190614119565b60405180910390f35b34801561044b57600080fd5b50610454610e59565b005b34801561046257600080fd5b5061047d6004803603810190610478919061353a565b610fe8565b005b34801561048b57600080fd5b50610494611008565b6040516104a19190614119565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc91906137fa565b61100e565b6040516104de9190614119565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190613764565b61107f565b005b34801561051c57600080fd5b50610525611111565b6040516105329190614119565b60405180910390f35b34801561054757600080fd5b50610550611117565b60405161055d9190613d9c565b60405180910390f35b34801561057257600080fd5b5061057b61112a565b6040516105889190614119565b60405180910390f35b34801561059d57600080fd5b506105a6611130565b6040516105b39190614119565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de91906137fa565b611136565b6040516105f09190613d35565b60405180910390f35b34801561060557600080fd5b5061060e6111e8565b60405161061b9190614119565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906134cd565b6111ed565b6040516106589190614119565b60405180910390f35b34801561066d57600080fd5b506106766112a5565b005b34801561068457600080fd5b5061069f600480360381019061069a91906134cd565b61132d565b6040516106ac9190614119565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d791906137fa565b611345565b005b3480156106ea57600080fd5b50610705600480360381019061070091906134cd565b6113cb565b6040516107129190613d9c565b60405180910390f35b34801561072757600080fd5b5061073061147a565b005b34801561073e57600080fd5b50610747611582565b6040516107549190613d35565b60405180910390f35b34801561076957600080fd5b506107726115ac565b60405161077f9190613db7565b60405180910390f35b34801561079457600080fd5b5061079d61163e565b6040516107aa9190614119565b60405180910390f35b3480156107bf57600080fd5b506107c8611644565b6040516107d59190614119565b60405180910390f35b6107f860048036038101906107f391906137fa565b61164f565b005b34801561080657600080fd5b50610821600480360381019061081c9190613610565b6119cd565b005b34801561082f57600080fd5b5061084a6004803603810190610845919061358d565b611b4e565b005b34801561085857600080fd5b50610873600480360381019061086e9190613690565b611bb0565b005b34801561088157600080fd5b5061088a611c50565b6040516108979190613db7565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c291906137fa565b611cde565b6040516108d49190613db7565b60405180910390f35b3480156108e957600080fd5b506108f2611d88565b6040516108ff9190614119565b60405180910390f35b34801561091457600080fd5b5061092f600480360381019061092a91906137fa565b611d9b565b60405161093c9190613d35565b60405180910390f35b34801561095157600080fd5b5061096c600480360381019061096791906137b1565b611dda565b005b34801561097a57600080fd5b50610995600480360381019061099091906134fa565b611e70565b6040516109a29190613d9c565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd91906134cd565b611f04565b005b3480156109e057600080fd5b506109fb60048036038101906109f691906137fa565b611ffc565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a705750610a6f82612082565b5b9050919050565b610a7f612164565b73ffffffffffffffffffffffffffffffffffffffff16610a9d611582565b73ffffffffffffffffffffffffffffffffffffffff1614610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea90613fd9565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b601481565b606060018054610b24906143de565b80601f0160208091040260200160405190810160405280929190818152602001828054610b50906143de565b8015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b820191906000526020600020905b815481529060010190602001808311610b8057829003601f168201915b5050505050905090565b6000610bb28261216c565b610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be890613fb9565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3782611136565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f90614079565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc7612164565b73ffffffffffffffffffffffffffffffffffffffff161480610cf65750610cf581610cf0612164565b611e70565b5b610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c90613f39565b60405180910390fd5b610d3f83836121d8565b505050565b6000601054905090565b610d5f610d59612164565b82612291565b610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d95906140b9565b60405180910390fd5b610da983838361236f565b505050565b61037881565b6000610dbf836111ed565b8210610e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df790613df9565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e61612164565b73ffffffffffffffffffffffffffffffffffffffff16610e7f611582565b73ffffffffffffffffffffffffffffffffffffffff1614610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613fd9565b60405180910390fd5b60148080549050601154610ee99190614213565b1115610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2190613f19565b60405180910390fd5b6000610f34610d44565b905060148054905060116000828254610f4d9190614213565b9250508190555060005b601480549050811015610fe457610fb860148281548110610f7b57610f7a614577565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610fb090614441565b9350836125cb565b8160106000828254610fca9190614213565b925050819055508080610fdc90614441565b915050610f57565b5050565b61100383838360405180602001604052806000815250611b4e565b505050565b60105481565b6000611018612799565b8210611059576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611050906140d9565b60405180910390fd5b6009828154811061106d5761106c614577565b5b90600052602060002001549050919050565b611087612164565b73ffffffffffffffffffffffffffffffffffffffff166110a5611582565b73ffffffffffffffffffffffffffffffffffffffff16146110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290613fd9565b60405180910390fd5b8181600d919061110c9291906130ee565b505050565b600e5481565b601360009054906101000a900460ff1681565b60115481565b611f4081565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d690613f79565b60405180910390fd5b80915050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613f59565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112ad612164565b73ffffffffffffffffffffffffffffffffffffffff166112cb611582565b73ffffffffffffffffffffffffffffffffffffffff1614611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890613fd9565b60405180910390fd5b61132b60006127a6565b565b60126020528060005260406000206000915090505481565b61134d612164565b73ffffffffffffffffffffffffffffffffffffffff1661136b611582565b73ffffffffffffffffffffffffffffffffffffffff16146113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890613fd9565b60405180910390fd5b80600e8190555050565b600080600090505b60148054905081101561146f578273ffffffffffffffffffffffffffffffffffffffff166014828154811061140b5761140a614577565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561145c576001915050611475565b808061146790614441565b9150506113d3565b50600090505b919050565b611482612164565b73ffffffffffffffffffffffffffffffffffffffff166114a0611582565b73ffffffffffffffffffffffffffffffffffffffff16146114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed90613fd9565b60405180910390fd5b60004711611539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153090613e99565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561157f573d6000803e3d6000fd5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115bb906143de565b80601f01602080910402602001604051908101604052809291908181526020018280546115e7906143de565b80156116345780601f1061160957610100808354040283529160200191611634565b820191906000526020600020905b81548152906001019060200180831161161757829003601f168201915b5050505050905090565b600f5481565b666a94d74f43000081565b601360009054906101000a900460ff161561169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169690613ff9565b60405180910390fd5b610378601054101561179157610378816010546116bc9190614213565b11156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490614099565b60405180910390fd5b600e5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174b9190614213565b111561178c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611783906140f9565b60405180910390fd5b611919565b600a8111156117d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cc90613dd9565b60405180910390fd5b611f406103786117e59190614213565b816010546117f39190614213565b1115611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613e39565b60405180910390fd5b600f5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118829190614213565b11156118c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ba906140f9565b60405180910390fd5b80666a94d74f4300006118d6919061429a565b341015611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90614059565b60405180910390fd5b5b6000611923610d44565b905081601060008282546119379190614213565b9250508190555081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198d9190614213565b9250508190555060005b828110156119c8576119b533836119ad90614441565b9350836125cb565b80806119c090614441565b915050611997565b505050565b6119d5612164565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a90613ed9565b60405180910390fd5b8060066000611a50612164565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611afd612164565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b429190613d9c565b60405180910390a35050565b611b5f611b59612164565b83612291565b611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b95906140b9565b60405180910390fd5b611baa8484848461286c565b50505050565b611bb8612164565b73ffffffffffffffffffffffffffffffffffffffff16611bd6611582565b73ffffffffffffffffffffffffffffffffffffffff1614611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390613fd9565b60405180910390fd5b60146000611c3a9190613174565b818160149190611c4b929190613195565b505050565b600c8054611c5d906143de565b80601f0160208091040260200160405190810160405280929190818152602001828054611c89906143de565b8015611cd65780601f10611cab57610100808354040283529160200191611cd6565b820191906000526020600020905b815481529060010190602001808311611cb957829003601f168201915b505050505081565b6060611ce98261216c565b611d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1f90614039565b60405180910390fd5b6000611d326128c8565b90506000815111611d525760405180602001604052806000815250611d80565b80611d5c8461295a565b6000604051602001611d7093929190613d04565b6040516020818303038152906040525b915050919050565b611f40610378611d989190614213565b81565b60148181548110611dab57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611de2612164565b73ffffffffffffffffffffffffffffffffffffffff16611e00611582565b73ffffffffffffffffffffffffffffffffffffffff1614611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90613fd9565b60405180910390fd5b80600c9080519060200190611e6c929190613235565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f0c612164565b73ffffffffffffffffffffffffffffffffffffffff16611f2a611582565b73ffffffffffffffffffffffffffffffffffffffff1614611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790613fd9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe790613e59565b60405180910390fd5b611ff9816127a6565b50565b612004612164565b73ffffffffffffffffffffffffffffffffffffffff16612022611582565b73ffffffffffffffffffffffffffffffffffffffff1614612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90613fd9565b60405180910390fd5b80600f8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061215d575061215c82612abb565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661224b83611136565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061229c8261216c565b6122db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d290613ef9565b60405180910390fd5b60006122e683611136565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061235557508373ffffffffffffffffffffffffffffffffffffffff1661233d84610ba7565b73ffffffffffffffffffffffffffffffffffffffff16145b8061236657506123658185611e70565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661238f82611136565b73ffffffffffffffffffffffffffffffffffffffff16146123e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123dc90614019565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90613eb9565b60405180910390fd5b612460838383612b25565b61246b6000826121d8565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124bb91906142f4565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125129190614213565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263290613f99565b60405180910390fd5b6126448161216c565b15612684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267b90613e79565b60405180910390fd5b61269060008383612b25565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e09190614213565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600980549050905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61287784848461236f565b61288384848484612c39565b6128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b990613e19565b60405180910390fd5b50505050565b6060600d80546128d7906143de565b80601f0160208091040260200160405190810160405280929190818152602001828054612903906143de565b80156129505780601f1061292557610100808354040283529160200191612950565b820191906000526020600020905b81548152906001019060200180831161293357829003601f168201915b5050505050905090565b606060008214156129a2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ab6565b600082905060005b600082146129d45780806129bd90614441565b915050600a826129cd9190614269565b91506129aa565b60008167ffffffffffffffff8111156129f0576129ef6145a6565b5b6040519080825280601f01601f191660200182016040528015612a225781602001600182028036833780820191505090505b5090505b60008514612aaf57600182612a3b91906142f4565b9150600a85612a4a919061448a565b6030612a569190614213565b60f81b818381518110612a6c57612a6b614577565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612aa89190614269565b9450612a26565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b30838383612dd0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b7357612b6e81612dd5565b612bb2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bb157612bb08382612e1e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf557612bf081612f8b565b612c34565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3357612c32828261305c565b5b5b505050565b6000612c5a8473ffffffffffffffffffffffffffffffffffffffff166130db565b15612dc3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c83612164565b8786866040518563ffffffff1660e01b8152600401612ca59493929190613d50565b602060405180830381600087803b158015612cbf57600080fd5b505af1925050508015612cf057506040513d601f19601f82011682018060405250810190612ced9190613737565b60015b612d73573d8060008114612d20576040519150601f19603f3d011682016040523d82523d6000602084013e612d25565b606091505b50600081511415612d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6290613e19565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612dc8565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e2b846111ed565b612e3591906142f4565b9050600060086000848152602001908152602001600020549050818114612f1a576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612f9f91906142f4565b90506000600a6000848152602001908152602001600020549050600060098381548110612fcf57612fce614577565b5b906000526020600020015490508060098381548110612ff157612ff0614577565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806130405761303f614548565b5b6001900381819060005260206000200160009055905550505050565b6000613067836111ed565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546130fa906143de565b90600052602060002090601f01602090048101928261311c5760008555613163565b82601f1061313557803560ff1916838001178555613163565b82800160010185558215613163579182015b82811115613162578235825591602001919060010190613147565b5b50905061317091906132bb565b5090565b508054600082559060005260206000209081019061319291906132bb565b50565b828054828255906000526020600020908101928215613224579160200282015b8281111561322357823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906131b5565b5b50905061323191906132bb565b5090565b828054613241906143de565b90600052602060002090601f01602090048101928261326357600085556132aa565b82601f1061327c57805160ff19168380011785556132aa565b828001600101855582156132aa579182015b828111156132a957825182559160200191906001019061328e565b5b5090506132b791906132bb565b5090565b5b808211156132d45760008160009055506001016132bc565b5090565b60006132eb6132e684614159565b614134565b905082815260208101848484011115613307576133066145e4565b5b61331284828561439c565b509392505050565b600061332d6133288461418a565b614134565b905082815260208101848484011115613349576133486145e4565b5b61335484828561439c565b509392505050565b60008135905061336b81614c42565b92915050565b60008083601f840112613387576133866145da565b5b8235905067ffffffffffffffff8111156133a4576133a36145d5565b5b6020830191508360208202830111156133c0576133bf6145df565b5b9250929050565b6000813590506133d681614c59565b92915050565b6000813590506133eb81614c70565b92915050565b60008151905061340081614c70565b92915050565b600082601f83011261341b5761341a6145da565b5b813561342b8482602086016132d8565b91505092915050565b60008083601f84011261344a576134496145da565b5b8235905067ffffffffffffffff811115613467576134666145d5565b5b602083019150836001820283011115613483576134826145df565b5b9250929050565b600082601f83011261349f5761349e6145da565b5b81356134af84826020860161331a565b91505092915050565b6000813590506134c781614c87565b92915050565b6000602082840312156134e3576134e26145ee565b5b60006134f18482850161335c565b91505092915050565b60008060408385031215613511576135106145ee565b5b600061351f8582860161335c565b92505060206135308582860161335c565b9150509250929050565b600080600060608486031215613553576135526145ee565b5b60006135618682870161335c565b93505060206135728682870161335c565b9250506040613583868287016134b8565b9150509250925092565b600080600080608085870312156135a7576135a66145ee565b5b60006135b58782880161335c565b94505060206135c68782880161335c565b93505060406135d7878288016134b8565b925050606085013567ffffffffffffffff8111156135f8576135f76145e9565b5b61360487828801613406565b91505092959194509250565b60008060408385031215613627576136266145ee565b5b60006136358582860161335c565b9250506020613646858286016133c7565b9150509250929050565b60008060408385031215613667576136666145ee565b5b60006136758582860161335c565b9250506020613686858286016134b8565b9150509250929050565b600080602083850312156136a7576136a66145ee565b5b600083013567ffffffffffffffff8111156136c5576136c46145e9565b5b6136d185828601613371565b92509250509250929050565b6000602082840312156136f3576136f26145ee565b5b6000613701848285016133c7565b91505092915050565b6000602082840312156137205761371f6145ee565b5b600061372e848285016133dc565b91505092915050565b60006020828403121561374d5761374c6145ee565b5b600061375b848285016133f1565b91505092915050565b6000806020838503121561377b5761377a6145ee565b5b600083013567ffffffffffffffff811115613799576137986145e9565b5b6137a585828601613434565b92509250509250929050565b6000602082840312156137c7576137c66145ee565b5b600082013567ffffffffffffffff8111156137e5576137e46145e9565b5b6137f18482850161348a565b91505092915050565b6000602082840312156138105761380f6145ee565b5b600061381e848285016134b8565b91505092915050565b61383081614328565b82525050565b61383f8161433a565b82525050565b6000613850826141d0565b61385a81856141e6565b935061386a8185602086016143ab565b613873816145f3565b840191505092915050565b6000613889826141db565b61389381856141f7565b93506138a38185602086016143ab565b6138ac816145f3565b840191505092915050565b60006138c2826141db565b6138cc8185614208565b93506138dc8185602086016143ab565b80840191505092915050565b600081546138f5816143de565b6138ff8186614208565b9450600182166000811461391a576001811461392b5761395e565b60ff1983168652818601935061395e565b613934856141bb565b60005b8381101561395657815481890152600182019150602081019050613937565b838801955050505b50505092915050565b6000613974600d836141f7565b915061397f82614604565b602082019050919050565b6000613997602b836141f7565b91506139a28261462d565b604082019050919050565b60006139ba6032836141f7565b91506139c58261467c565b604082019050919050565b60006139dd6008836141f7565b91506139e8826146cb565b602082019050919050565b6000613a006026836141f7565b9150613a0b826146f4565b604082019050919050565b6000613a23601c836141f7565b9150613a2e82614743565b602082019050919050565b6000613a46600a836141f7565b9150613a518261476c565b602082019050919050565b6000613a696024836141f7565b9150613a7482614795565b604082019050919050565b6000613a8c6019836141f7565b9150613a97826147e4565b602082019050919050565b6000613aaf602c836141f7565b9150613aba8261480d565b604082019050919050565b6000613ad2600d836141f7565b9150613add8261485c565b602082019050919050565b6000613af56038836141f7565b9150613b0082614885565b604082019050919050565b6000613b18602a836141f7565b9150613b23826148d4565b604082019050919050565b6000613b3b6029836141f7565b9150613b4682614923565b604082019050919050565b6000613b5e6020836141f7565b9150613b6982614972565b602082019050919050565b6000613b81602c836141f7565b9150613b8c8261499b565b604082019050919050565b6000613ba46020836141f7565b9150613baf826149ea565b602082019050919050565b6000613bc76016836141f7565b9150613bd282614a13565b602082019050919050565b6000613bea6029836141f7565b9150613bf582614a3c565b604082019050919050565b6000613c0d602f836141f7565b9150613c1882614a8b565b604082019050919050565b6000613c30600a836141f7565b9150613c3b82614ada565b602082019050919050565b6000613c536021836141f7565b9150613c5e82614b03565b604082019050919050565b6000613c766010836141f7565b9150613c8182614b52565b602082019050919050565b6000613c996031836141f7565b9150613ca482614b7b565b604082019050919050565b6000613cbc602c836141f7565b9150613cc782614bca565b604082019050919050565b6000613cdf6005836141f7565b9150613cea82614c19565b602082019050919050565b613cfe81614392565b82525050565b6000613d1082866138b7565b9150613d1c82856138b7565b9150613d2882846138e8565b9150819050949350505050565b6000602082019050613d4a6000830184613827565b92915050565b6000608082019050613d656000830187613827565b613d726020830186613827565b613d7f6040830185613cf5565b8181036060830152613d918184613845565b905095945050505050565b6000602082019050613db16000830184613836565b92915050565b60006020820190508181036000830152613dd1818461387e565b905092915050565b60006020820190508181036000830152613df281613967565b9050919050565b60006020820190508181036000830152613e128161398a565b9050919050565b60006020820190508181036000830152613e32816139ad565b9050919050565b60006020820190508181036000830152613e52816139d0565b9050919050565b60006020820190508181036000830152613e72816139f3565b9050919050565b60006020820190508181036000830152613e9281613a16565b9050919050565b60006020820190508181036000830152613eb281613a39565b9050919050565b60006020820190508181036000830152613ed281613a5c565b9050919050565b60006020820190508181036000830152613ef281613a7f565b9050919050565b60006020820190508181036000830152613f1281613aa2565b9050919050565b60006020820190508181036000830152613f3281613ac5565b9050919050565b60006020820190508181036000830152613f5281613ae8565b9050919050565b60006020820190508181036000830152613f7281613b0b565b9050919050565b60006020820190508181036000830152613f9281613b2e565b9050919050565b60006020820190508181036000830152613fb281613b51565b9050919050565b60006020820190508181036000830152613fd281613b74565b9050919050565b60006020820190508181036000830152613ff281613b97565b9050919050565b6000602082019050818103600083015261401281613bba565b9050919050565b6000602082019050818103600083015261403281613bdd565b9050919050565b6000602082019050818103600083015261405281613c00565b9050919050565b6000602082019050818103600083015261407281613c23565b9050919050565b6000602082019050818103600083015261409281613c46565b9050919050565b600060208201905081810360008301526140b281613c69565b9050919050565b600060208201905081810360008301526140d281613c8c565b9050919050565b600060208201905081810360008301526140f281613caf565b9050919050565b6000602082019050818103600083015261411281613cd2565b9050919050565b600060208201905061412e6000830184613cf5565b92915050565b600061413e61414f565b905061414a8282614410565b919050565b6000604051905090565b600067ffffffffffffffff821115614174576141736145a6565b5b61417d826145f3565b9050602081019050919050565b600067ffffffffffffffff8211156141a5576141a46145a6565b5b6141ae826145f3565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061421e82614392565b915061422983614392565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561425e5761425d6144bb565b5b828201905092915050565b600061427482614392565b915061427f83614392565b92508261428f5761428e6144ea565b5b828204905092915050565b60006142a582614392565b91506142b083614392565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142e9576142e86144bb565b5b828202905092915050565b60006142ff82614392565b915061430a83614392565b92508282101561431d5761431c6144bb565b5b828203905092915050565b600061433382614372565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143c95780820151818401526020810190506143ae565b838111156143d8576000848401525b50505050565b600060028204905060018216806143f657607f821691505b6020821081141561440a57614409614519565b5b50919050565b614419826145f3565b810181811067ffffffffffffffff82111715614438576144376145a6565b5b80604052505050565b600061444c82614392565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561447f5761447e6144bb565b5b600182019050919050565b600061449582614392565b91506144a083614392565b9250826144b0576144af6144ea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d617820313020416d6f756e7400000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f2062616c616e636500000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4c696d69742041697264726f7000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f7574206f662045544800000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f46726565204d696e7420436c6f73656400000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4c696d6974000000000000000000000000000000000000000000000000000000600082015250565b614c4b81614328565b8114614c5657600080fd5b50565b614c628161433a565b8114614c6d57600080fd5b50565b614c7981614346565b8114614c8457600080fd5b50565b614c9081614392565b8114614c9b57600080fd5b5056fea26469706673582212208bf1d02ccb4ac079029a44590107e34ee738331134f7b5ff4da9eaa3866c4f9c64736f6c63430008070033
Deployed Bytecode
0x60806040526004361061025c5760003560e01c806370a0823111610144578063a22cb465116100b6578063d5abeb011161007a578063d5abeb01146108dd578063d9d2408414610908578063da3ef23f14610945578063e985e9c51461096e578063f2fde38b146109ab578063f39d1007146109d45761025c565b8063a22cb465146107fa578063b88d4fde14610823578063bb9dba921461084c578063c668286214610875578063c87b56dd146108a05761025c565b8063853828b611610108578063853828b61461071b5780638da5cb5b1461073257806395d89b411461075d578063995456e114610788578063a035b1fe146107b3578063a0712d68146107de5761025c565b806370a0823114610624578063715018a6146106615780637294e1ef14610678578063742a4c9b146106b557806374acb5d6146106de5761025c565b80633884d635116101dd5780635b70ea9f116101a15780635b70ea9f146105105780635c975abb1461053b5780635ce97dbb14610566578063631525c3146105915780636352211e146105bc57806363869a5d146105f95761025c565b80633884d6351461043f57806342842e0e146104565780634f02c4201461047f5780634f6ccce7146104aa57806355f804b3146104e75761025c565b8063095ea7b311610224578063095ea7b31461035a57806318160ddd1461038357806323b872dd146103ae57806324a6ab0c146103d75780632f745c59146104025761025c565b806301ffc9a71461026157806302329a291461029e57806305d5c595146102c757806306fdde03146102f2578063081812fc1461031d575b600080fd5b34801561026d57600080fd5b506102886004803603810190610283919061370a565b6109fd565b6040516102959190613d9c565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c091906136dd565b610a77565b005b3480156102d357600080fd5b506102dc610b10565b6040516102e99190614119565b60405180910390f35b3480156102fe57600080fd5b50610307610b15565b6040516103149190613db7565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f91906137fa565b610ba7565b6040516103519190613d35565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613650565b610c2c565b005b34801561038f57600080fd5b50610398610d44565b6040516103a59190614119565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d0919061353a565b610d4e565b005b3480156103e357600080fd5b506103ec610dae565b6040516103f99190614119565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190613650565b610db4565b6040516104369190614119565b60405180910390f35b34801561044b57600080fd5b50610454610e59565b005b34801561046257600080fd5b5061047d6004803603810190610478919061353a565b610fe8565b005b34801561048b57600080fd5b50610494611008565b6040516104a19190614119565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc91906137fa565b61100e565b6040516104de9190614119565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190613764565b61107f565b005b34801561051c57600080fd5b50610525611111565b6040516105329190614119565b60405180910390f35b34801561054757600080fd5b50610550611117565b60405161055d9190613d9c565b60405180910390f35b34801561057257600080fd5b5061057b61112a565b6040516105889190614119565b60405180910390f35b34801561059d57600080fd5b506105a6611130565b6040516105b39190614119565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de91906137fa565b611136565b6040516105f09190613d35565b60405180910390f35b34801561060557600080fd5b5061060e6111e8565b60405161061b9190614119565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906134cd565b6111ed565b6040516106589190614119565b60405180910390f35b34801561066d57600080fd5b506106766112a5565b005b34801561068457600080fd5b5061069f600480360381019061069a91906134cd565b61132d565b6040516106ac9190614119565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d791906137fa565b611345565b005b3480156106ea57600080fd5b50610705600480360381019061070091906134cd565b6113cb565b6040516107129190613d9c565b60405180910390f35b34801561072757600080fd5b5061073061147a565b005b34801561073e57600080fd5b50610747611582565b6040516107549190613d35565b60405180910390f35b34801561076957600080fd5b506107726115ac565b60405161077f9190613db7565b60405180910390f35b34801561079457600080fd5b5061079d61163e565b6040516107aa9190614119565b60405180910390f35b3480156107bf57600080fd5b506107c8611644565b6040516107d59190614119565b60405180910390f35b6107f860048036038101906107f391906137fa565b61164f565b005b34801561080657600080fd5b50610821600480360381019061081c9190613610565b6119cd565b005b34801561082f57600080fd5b5061084a6004803603810190610845919061358d565b611b4e565b005b34801561085857600080fd5b50610873600480360381019061086e9190613690565b611bb0565b005b34801561088157600080fd5b5061088a611c50565b6040516108979190613db7565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c291906137fa565b611cde565b6040516108d49190613db7565b60405180910390f35b3480156108e957600080fd5b506108f2611d88565b6040516108ff9190614119565b60405180910390f35b34801561091457600080fd5b5061092f600480360381019061092a91906137fa565b611d9b565b60405161093c9190613d35565b60405180910390f35b34801561095157600080fd5b5061096c600480360381019061096791906137b1565b611dda565b005b34801561097a57600080fd5b50610995600480360381019061099091906134fa565b611e70565b6040516109a29190613d9c565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd91906134cd565b611f04565b005b3480156109e057600080fd5b506109fb60048036038101906109f691906137fa565b611ffc565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a705750610a6f82612082565b5b9050919050565b610a7f612164565b73ffffffffffffffffffffffffffffffffffffffff16610a9d611582565b73ffffffffffffffffffffffffffffffffffffffff1614610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea90613fd9565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b601481565b606060018054610b24906143de565b80601f0160208091040260200160405190810160405280929190818152602001828054610b50906143de565b8015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b820191906000526020600020905b815481529060010190602001808311610b8057829003601f168201915b5050505050905090565b6000610bb28261216c565b610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be890613fb9565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3782611136565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f90614079565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc7612164565b73ffffffffffffffffffffffffffffffffffffffff161480610cf65750610cf581610cf0612164565b611e70565b5b610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c90613f39565b60405180910390fd5b610d3f83836121d8565b505050565b6000601054905090565b610d5f610d59612164565b82612291565b610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d95906140b9565b60405180910390fd5b610da983838361236f565b505050565b61037881565b6000610dbf836111ed565b8210610e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df790613df9565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e61612164565b73ffffffffffffffffffffffffffffffffffffffff16610e7f611582565b73ffffffffffffffffffffffffffffffffffffffff1614610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613fd9565b60405180910390fd5b60148080549050601154610ee99190614213565b1115610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2190613f19565b60405180910390fd5b6000610f34610d44565b905060148054905060116000828254610f4d9190614213565b9250508190555060005b601480549050811015610fe457610fb860148281548110610f7b57610f7a614577565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610fb090614441565b9350836125cb565b8160106000828254610fca9190614213565b925050819055508080610fdc90614441565b915050610f57565b5050565b61100383838360405180602001604052806000815250611b4e565b505050565b60105481565b6000611018612799565b8210611059576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611050906140d9565b60405180910390fd5b6009828154811061106d5761106c614577565b5b90600052602060002001549050919050565b611087612164565b73ffffffffffffffffffffffffffffffffffffffff166110a5611582565b73ffffffffffffffffffffffffffffffffffffffff16146110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290613fd9565b60405180910390fd5b8181600d919061110c9291906130ee565b505050565b600e5481565b601360009054906101000a900460ff1681565b60115481565b611f4081565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d690613f79565b60405180910390fd5b80915050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613f59565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112ad612164565b73ffffffffffffffffffffffffffffffffffffffff166112cb611582565b73ffffffffffffffffffffffffffffffffffffffff1614611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890613fd9565b60405180910390fd5b61132b60006127a6565b565b60126020528060005260406000206000915090505481565b61134d612164565b73ffffffffffffffffffffffffffffffffffffffff1661136b611582565b73ffffffffffffffffffffffffffffffffffffffff16146113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890613fd9565b60405180910390fd5b80600e8190555050565b600080600090505b60148054905081101561146f578273ffffffffffffffffffffffffffffffffffffffff166014828154811061140b5761140a614577565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561145c576001915050611475565b808061146790614441565b9150506113d3565b50600090505b919050565b611482612164565b73ffffffffffffffffffffffffffffffffffffffff166114a0611582565b73ffffffffffffffffffffffffffffffffffffffff16146114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed90613fd9565b60405180910390fd5b60004711611539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153090613e99565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561157f573d6000803e3d6000fd5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115bb906143de565b80601f01602080910402602001604051908101604052809291908181526020018280546115e7906143de565b80156116345780601f1061160957610100808354040283529160200191611634565b820191906000526020600020905b81548152906001019060200180831161161757829003601f168201915b5050505050905090565b600f5481565b666a94d74f43000081565b601360009054906101000a900460ff161561169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169690613ff9565b60405180910390fd5b610378601054101561179157610378816010546116bc9190614213565b11156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490614099565b60405180910390fd5b600e5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174b9190614213565b111561178c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611783906140f9565b60405180910390fd5b611919565b600a8111156117d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cc90613dd9565b60405180910390fd5b611f406103786117e59190614213565b816010546117f39190614213565b1115611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613e39565b60405180910390fd5b600f5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118829190614213565b11156118c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ba906140f9565b60405180910390fd5b80666a94d74f4300006118d6919061429a565b341015611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90614059565b60405180910390fd5b5b6000611923610d44565b905081601060008282546119379190614213565b9250508190555081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198d9190614213565b9250508190555060005b828110156119c8576119b533836119ad90614441565b9350836125cb565b80806119c090614441565b915050611997565b505050565b6119d5612164565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a90613ed9565b60405180910390fd5b8060066000611a50612164565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611afd612164565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b429190613d9c565b60405180910390a35050565b611b5f611b59612164565b83612291565b611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b95906140b9565b60405180910390fd5b611baa8484848461286c565b50505050565b611bb8612164565b73ffffffffffffffffffffffffffffffffffffffff16611bd6611582565b73ffffffffffffffffffffffffffffffffffffffff1614611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390613fd9565b60405180910390fd5b60146000611c3a9190613174565b818160149190611c4b929190613195565b505050565b600c8054611c5d906143de565b80601f0160208091040260200160405190810160405280929190818152602001828054611c89906143de565b8015611cd65780601f10611cab57610100808354040283529160200191611cd6565b820191906000526020600020905b815481529060010190602001808311611cb957829003601f168201915b505050505081565b6060611ce98261216c565b611d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1f90614039565b60405180910390fd5b6000611d326128c8565b90506000815111611d525760405180602001604052806000815250611d80565b80611d5c8461295a565b6000604051602001611d7093929190613d04565b6040516020818303038152906040525b915050919050565b611f40610378611d989190614213565b81565b60148181548110611dab57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611de2612164565b73ffffffffffffffffffffffffffffffffffffffff16611e00611582565b73ffffffffffffffffffffffffffffffffffffffff1614611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90613fd9565b60405180910390fd5b80600c9080519060200190611e6c929190613235565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f0c612164565b73ffffffffffffffffffffffffffffffffffffffff16611f2a611582565b73ffffffffffffffffffffffffffffffffffffffff1614611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790613fd9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe790613e59565b60405180910390fd5b611ff9816127a6565b50565b612004612164565b73ffffffffffffffffffffffffffffffffffffffff16612022611582565b73ffffffffffffffffffffffffffffffffffffffff1614612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90613fd9565b60405180910390fd5b80600f8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061215d575061215c82612abb565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661224b83611136565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061229c8261216c565b6122db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d290613ef9565b60405180910390fd5b60006122e683611136565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061235557508373ffffffffffffffffffffffffffffffffffffffff1661233d84610ba7565b73ffffffffffffffffffffffffffffffffffffffff16145b8061236657506123658185611e70565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661238f82611136565b73ffffffffffffffffffffffffffffffffffffffff16146123e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123dc90614019565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90613eb9565b60405180910390fd5b612460838383612b25565b61246b6000826121d8565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124bb91906142f4565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125129190614213565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263290613f99565b60405180910390fd5b6126448161216c565b15612684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267b90613e79565b60405180910390fd5b61269060008383612b25565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e09190614213565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600980549050905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61287784848461236f565b61288384848484612c39565b6128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b990613e19565b60405180910390fd5b50505050565b6060600d80546128d7906143de565b80601f0160208091040260200160405190810160405280929190818152602001828054612903906143de565b80156129505780601f1061292557610100808354040283529160200191612950565b820191906000526020600020905b81548152906001019060200180831161293357829003601f168201915b5050505050905090565b606060008214156129a2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ab6565b600082905060005b600082146129d45780806129bd90614441565b915050600a826129cd9190614269565b91506129aa565b60008167ffffffffffffffff8111156129f0576129ef6145a6565b5b6040519080825280601f01601f191660200182016040528015612a225781602001600182028036833780820191505090505b5090505b60008514612aaf57600182612a3b91906142f4565b9150600a85612a4a919061448a565b6030612a569190614213565b60f81b818381518110612a6c57612a6b614577565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612aa89190614269565b9450612a26565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b30838383612dd0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b7357612b6e81612dd5565b612bb2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bb157612bb08382612e1e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf557612bf081612f8b565b612c34565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3357612c32828261305c565b5b5b505050565b6000612c5a8473ffffffffffffffffffffffffffffffffffffffff166130db565b15612dc3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c83612164565b8786866040518563ffffffff1660e01b8152600401612ca59493929190613d50565b602060405180830381600087803b158015612cbf57600080fd5b505af1925050508015612cf057506040513d601f19601f82011682018060405250810190612ced9190613737565b60015b612d73573d8060008114612d20576040519150601f19603f3d011682016040523d82523d6000602084013e612d25565b606091505b50600081511415612d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6290613e19565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612dc8565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e2b846111ed565b612e3591906142f4565b9050600060086000848152602001908152602001600020549050818114612f1a576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612f9f91906142f4565b90506000600a6000848152602001908152602001600020549050600060098381548110612fcf57612fce614577565b5b906000526020600020015490508060098381548110612ff157612ff0614577565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806130405761303f614548565b5b6001900381819060005260206000200160009055905550505050565b6000613067836111ed565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546130fa906143de565b90600052602060002090601f01602090048101928261311c5760008555613163565b82601f1061313557803560ff1916838001178555613163565b82800160010185558215613163579182015b82811115613162578235825591602001919060010190613147565b5b50905061317091906132bb565b5090565b508054600082559060005260206000209081019061319291906132bb565b50565b828054828255906000526020600020908101928215613224579160200282015b8281111561322357823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906131b5565b5b50905061323191906132bb565b5090565b828054613241906143de565b90600052602060002090601f01602090048101928261326357600085556132aa565b82601f1061327c57805160ff19168380011785556132aa565b828001600101855582156132aa579182015b828111156132a957825182559160200191906001019061328e565b5b5090506132b791906132bb565b5090565b5b808211156132d45760008160009055506001016132bc565b5090565b60006132eb6132e684614159565b614134565b905082815260208101848484011115613307576133066145e4565b5b61331284828561439c565b509392505050565b600061332d6133288461418a565b614134565b905082815260208101848484011115613349576133486145e4565b5b61335484828561439c565b509392505050565b60008135905061336b81614c42565b92915050565b60008083601f840112613387576133866145da565b5b8235905067ffffffffffffffff8111156133a4576133a36145d5565b5b6020830191508360208202830111156133c0576133bf6145df565b5b9250929050565b6000813590506133d681614c59565b92915050565b6000813590506133eb81614c70565b92915050565b60008151905061340081614c70565b92915050565b600082601f83011261341b5761341a6145da565b5b813561342b8482602086016132d8565b91505092915050565b60008083601f84011261344a576134496145da565b5b8235905067ffffffffffffffff811115613467576134666145d5565b5b602083019150836001820283011115613483576134826145df565b5b9250929050565b600082601f83011261349f5761349e6145da565b5b81356134af84826020860161331a565b91505092915050565b6000813590506134c781614c87565b92915050565b6000602082840312156134e3576134e26145ee565b5b60006134f18482850161335c565b91505092915050565b60008060408385031215613511576135106145ee565b5b600061351f8582860161335c565b92505060206135308582860161335c565b9150509250929050565b600080600060608486031215613553576135526145ee565b5b60006135618682870161335c565b93505060206135728682870161335c565b9250506040613583868287016134b8565b9150509250925092565b600080600080608085870312156135a7576135a66145ee565b5b60006135b58782880161335c565b94505060206135c68782880161335c565b93505060406135d7878288016134b8565b925050606085013567ffffffffffffffff8111156135f8576135f76145e9565b5b61360487828801613406565b91505092959194509250565b60008060408385031215613627576136266145ee565b5b60006136358582860161335c565b9250506020613646858286016133c7565b9150509250929050565b60008060408385031215613667576136666145ee565b5b60006136758582860161335c565b9250506020613686858286016134b8565b9150509250929050565b600080602083850312156136a7576136a66145ee565b5b600083013567ffffffffffffffff8111156136c5576136c46145e9565b5b6136d185828601613371565b92509250509250929050565b6000602082840312156136f3576136f26145ee565b5b6000613701848285016133c7565b91505092915050565b6000602082840312156137205761371f6145ee565b5b600061372e848285016133dc565b91505092915050565b60006020828403121561374d5761374c6145ee565b5b600061375b848285016133f1565b91505092915050565b6000806020838503121561377b5761377a6145ee565b5b600083013567ffffffffffffffff811115613799576137986145e9565b5b6137a585828601613434565b92509250509250929050565b6000602082840312156137c7576137c66145ee565b5b600082013567ffffffffffffffff8111156137e5576137e46145e9565b5b6137f18482850161348a565b91505092915050565b6000602082840312156138105761380f6145ee565b5b600061381e848285016134b8565b91505092915050565b61383081614328565b82525050565b61383f8161433a565b82525050565b6000613850826141d0565b61385a81856141e6565b935061386a8185602086016143ab565b613873816145f3565b840191505092915050565b6000613889826141db565b61389381856141f7565b93506138a38185602086016143ab565b6138ac816145f3565b840191505092915050565b60006138c2826141db565b6138cc8185614208565b93506138dc8185602086016143ab565b80840191505092915050565b600081546138f5816143de565b6138ff8186614208565b9450600182166000811461391a576001811461392b5761395e565b60ff1983168652818601935061395e565b613934856141bb565b60005b8381101561395657815481890152600182019150602081019050613937565b838801955050505b50505092915050565b6000613974600d836141f7565b915061397f82614604565b602082019050919050565b6000613997602b836141f7565b91506139a28261462d565b604082019050919050565b60006139ba6032836141f7565b91506139c58261467c565b604082019050919050565b60006139dd6008836141f7565b91506139e8826146cb565b602082019050919050565b6000613a006026836141f7565b9150613a0b826146f4565b604082019050919050565b6000613a23601c836141f7565b9150613a2e82614743565b602082019050919050565b6000613a46600a836141f7565b9150613a518261476c565b602082019050919050565b6000613a696024836141f7565b9150613a7482614795565b604082019050919050565b6000613a8c6019836141f7565b9150613a97826147e4565b602082019050919050565b6000613aaf602c836141f7565b9150613aba8261480d565b604082019050919050565b6000613ad2600d836141f7565b9150613add8261485c565b602082019050919050565b6000613af56038836141f7565b9150613b0082614885565b604082019050919050565b6000613b18602a836141f7565b9150613b23826148d4565b604082019050919050565b6000613b3b6029836141f7565b9150613b4682614923565b604082019050919050565b6000613b5e6020836141f7565b9150613b6982614972565b602082019050919050565b6000613b81602c836141f7565b9150613b8c8261499b565b604082019050919050565b6000613ba46020836141f7565b9150613baf826149ea565b602082019050919050565b6000613bc76016836141f7565b9150613bd282614a13565b602082019050919050565b6000613bea6029836141f7565b9150613bf582614a3c565b604082019050919050565b6000613c0d602f836141f7565b9150613c1882614a8b565b604082019050919050565b6000613c30600a836141f7565b9150613c3b82614ada565b602082019050919050565b6000613c536021836141f7565b9150613c5e82614b03565b604082019050919050565b6000613c766010836141f7565b9150613c8182614b52565b602082019050919050565b6000613c996031836141f7565b9150613ca482614b7b565b604082019050919050565b6000613cbc602c836141f7565b9150613cc782614bca565b604082019050919050565b6000613cdf6005836141f7565b9150613cea82614c19565b602082019050919050565b613cfe81614392565b82525050565b6000613d1082866138b7565b9150613d1c82856138b7565b9150613d2882846138e8565b9150819050949350505050565b6000602082019050613d4a6000830184613827565b92915050565b6000608082019050613d656000830187613827565b613d726020830186613827565b613d7f6040830185613cf5565b8181036060830152613d918184613845565b905095945050505050565b6000602082019050613db16000830184613836565b92915050565b60006020820190508181036000830152613dd1818461387e565b905092915050565b60006020820190508181036000830152613df281613967565b9050919050565b60006020820190508181036000830152613e128161398a565b9050919050565b60006020820190508181036000830152613e32816139ad565b9050919050565b60006020820190508181036000830152613e52816139d0565b9050919050565b60006020820190508181036000830152613e72816139f3565b9050919050565b60006020820190508181036000830152613e9281613a16565b9050919050565b60006020820190508181036000830152613eb281613a39565b9050919050565b60006020820190508181036000830152613ed281613a5c565b9050919050565b60006020820190508181036000830152613ef281613a7f565b9050919050565b60006020820190508181036000830152613f1281613aa2565b9050919050565b60006020820190508181036000830152613f3281613ac5565b9050919050565b60006020820190508181036000830152613f5281613ae8565b9050919050565b60006020820190508181036000830152613f7281613b0b565b9050919050565b60006020820190508181036000830152613f9281613b2e565b9050919050565b60006020820190508181036000830152613fb281613b51565b9050919050565b60006020820190508181036000830152613fd281613b74565b9050919050565b60006020820190508181036000830152613ff281613b97565b9050919050565b6000602082019050818103600083015261401281613bba565b9050919050565b6000602082019050818103600083015261403281613bdd565b9050919050565b6000602082019050818103600083015261405281613c00565b9050919050565b6000602082019050818103600083015261407281613c23565b9050919050565b6000602082019050818103600083015261409281613c46565b9050919050565b600060208201905081810360008301526140b281613c69565b9050919050565b600060208201905081810360008301526140d281613c8c565b9050919050565b600060208201905081810360008301526140f281613caf565b9050919050565b6000602082019050818103600083015261411281613cd2565b9050919050565b600060208201905061412e6000830184613cf5565b92915050565b600061413e61414f565b905061414a8282614410565b919050565b6000604051905090565b600067ffffffffffffffff821115614174576141736145a6565b5b61417d826145f3565b9050602081019050919050565b600067ffffffffffffffff8211156141a5576141a46145a6565b5b6141ae826145f3565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061421e82614392565b915061422983614392565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561425e5761425d6144bb565b5b828201905092915050565b600061427482614392565b915061427f83614392565b92508261428f5761428e6144ea565b5b828204905092915050565b60006142a582614392565b91506142b083614392565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142e9576142e86144bb565b5b828202905092915050565b60006142ff82614392565b915061430a83614392565b92508282101561431d5761431c6144bb565b5b828203905092915050565b600061433382614372565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143c95780820151818401526020810190506143ae565b838111156143d8576000848401525b50505050565b600060028204905060018216806143f657607f821691505b6020821081141561440a57614409614519565b5b50919050565b614419826145f3565b810181811067ffffffffffffffff82111715614438576144376145a6565b5b80604052505050565b600061444c82614392565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561447f5761447e6144bb565b5b600182019050919050565b600061449582614392565b91506144a083614392565b9250826144b0576144af6144ea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d617820313020416d6f756e7400000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f2062616c616e636500000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4c696d69742041697264726f7000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f7574206f662045544800000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f46726565204d696e7420436c6f73656400000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4c696d6974000000000000000000000000000000000000000000000000000000600082015250565b614c4b81614328565b8114614c5657600080fd5b50565b614c628161433a565b8114614c6d57600080fd5b50565b614c7981614346565b8114614c8457600080fd5b50565b614c9081614392565b8114614c9b57600080fd5b5056fea26469706673582212208bf1d02ccb4ac079029a44590107e34ee738331134f7b5ff4da9eaa3866c4f9c64736f6c63430008070033
Deployed Bytecode Sourcemap
43184:3372:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34729:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44893:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43277:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22605:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24180:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23703:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43989:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25070:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43323:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35037:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44091:401;;;;;;;;;;;;;:::i;:::-;;25480:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43717:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35559:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46458:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43643:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43840:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43749:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43370:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22299:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43418:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22029:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42518:94;;;;;;;;;;;;;:::i;:::-;;43787:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46247:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44500:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46068:171;;;;;;;;;;;;;:::i;:::-;;41867:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22774:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43677:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43529:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44982:831;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24473:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25736:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44747:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43233:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22949:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43463:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43873:30;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45934:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24839:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42767:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46348:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34729:224;34831:4;34870:35;34855:50;;;:11;:50;;;;:90;;;;34909:36;34933:11;34909:23;:36::i;:::-;34855:90;34848:97;;34729:224;;;:::o;44893:79::-;42098:12;:10;:12::i;:::-;42087:23;;:7;:5;:7::i;:::-;:23;;;42079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44958:6:::1;44949;;:15;;;;;;;;;;;;;;;;;;44893:79:::0;:::o;43277:39::-;43314:2;43277:39;:::o;22605:100::-;22659:13;22692:5;22685:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22605:100;:::o;24180:221::-;24256:7;24284:16;24292:7;24284;:16::i;:::-;24276:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24369:15;:24;24385:7;24369:24;;;;;;;;;;;;;;;;;;;;;24362:31;;24180:221;;;:::o;23703:411::-;23784:13;23800:23;23815:7;23800:14;:23::i;:::-;23784:39;;23848:5;23842:11;;:2;:11;;;;23834:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23942:5;23926:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23951:37;23968:5;23975:12;:10;:12::i;:::-;23951:16;:37::i;:::-;23926:62;23904:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24085:21;24094:2;24098:7;24085:8;:21::i;:::-;23773:341;23703:411;;:::o;43989:94::-;44042:7;44069:6;;44062:13;;43989:94;:::o;25070:339::-;25265:41;25284:12;:10;:12::i;:::-;25298:7;25265:18;:41::i;:::-;25257:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25373:28;25383:4;25389:2;25393:7;25373:9;:28::i;:::-;25070:339;;;:::o;43323:40::-;43360:3;43323:40;:::o;35037:256::-;35134:7;35170:23;35187:5;35170:16;:23::i;:::-;35162:5;:31;35154:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35259:12;:19;35272:5;35259:19;;;;;;;;;;;;;;;:26;35279:5;35259:26;;;;;;;;;;;;35252:33;;35037:256;;;;:::o;44091:401::-;42098:12;:10;:12::i;:::-;42087:23;;:7;:5;:7::i;:::-;:23;;;42079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43314:2:::1;44163:13:::0;:20:::1;;;;44148:12;;:35;;;;:::i;:::-;:49;;44140:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;44228:23;44254:13;:11;:13::i;:::-;44228:39;;44294:13;:20;;;;44278:12;;:36;;;;;;;:::i;:::-;;;;;;;;44330:9;44325:160;44349:13;:20;;;;44345:1;:24;44325:160;;;44391:42;44397:13;44411:1;44397:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44415:17;;;;:::i;:::-;;;;44391:5;:42::i;:::-;44458:15;44448:6;;:25;;;;;;;:::i;:::-;;;;;;;;44371:3;;;;;:::i;:::-;;;;44325:160;;;;44129:363;44091:401::o:0;25480:185::-;25618:39;25635:4;25641:2;25645:7;25618:39;;;;;;;;;;;;:16;:39::i;:::-;25480:185;;;:::o;43717:25::-;;;;:::o;35559:233::-;35634:7;35670:30;:28;:30::i;:::-;35662:5;:38;35654:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35767:10;35778:5;35767:17;;;;;;;;:::i;:::-;;;;;;;;;;35760:24;;35559:233;;;:::o;46458:93::-;42098:12;:10;:12::i;:::-;42087:23;;:7;:5;:7::i;:::-;:23;;;42079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46540:3:::1;;46529:8;:14;;;;;;;:::i;:::-;;46458:93:::0;;:::o;43643:27::-;;;;:::o;43840:26::-;;;;;;;;;;;;;:::o;43749:31::-;;;;:::o;43370:41::-;43407:4;43370:41;:::o;22299:239::-;22371:7;22391:13;22407:7;:16;22415:7;22407:16;;;;;;;;;;;;;;;;;;;;;22391:32;;22459:1;22442:19;;:5;:19;;;;22434:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22525:5;22518:12;;;22299:239;;;:::o;43418:38::-;43454:2;43418:38;:::o;22029:208::-;22101:7;22146:1;22129:19;;:5;:19;;;;22121:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22213:9;:16;22223:5;22213:16;;;;;;;;;;;;;;;;22206:23;;22029:208;;;:::o;42518:94::-;42098:12;:10;:12::i;:::-;42087:23;;:7;:5;:7::i;:::-;:23;;;42079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42583:21:::1;42601:1;42583:9;:21::i;:::-;42518:94::o:0;43787:46::-;;;;;;;;;;;;;;;;;:::o;46247:95::-;42098:12;:10;:12::i;:::-;42087:23;;:7;:5;:7::i;:::-;:23;;;42079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46328:6:::1;46317:8;:17;;;;46247:95:::0;:::o;44500:241::-;44555:4;44577:6;44586:1;44577:10;;44572:139;44593:13;:20;;;;44589:1;:24;44572:139;;;44655:5;44635:25;;:13;44649:1;44635:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:25;;;44631:69;;;44684:4;44677:11;;;;;44631:69;44615:3;;;;;:::i;:::-;;;;44572:139;;;;44728:5;44721:12;;44500:241;;;;:::o;46068:171::-;42098:12;:10;:12::i;:::-;42087:23;;:7;:5;:7::i;:::-;:23;;;42079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46153:1:::1;46129:21;:25;46121:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;46188:10;46180:28;;:51;46209:21;46180:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46068:171::o:0;41867:87::-;41913:7;41940:6;;;;;;;;;;;41933:13;;41867:87;:::o;22774:104::-;22830:13;22863:7;22856:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22774:104;:::o;43677:33::-;;;;:::o;43529:49::-;43561:17;43529:49;:::o;44982:831::-;45049:6;;;;;;;;;;;45048:7;45040:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;43360:3;45097:6;;:19;45093:482;;;43360:3;45150:6;45141;;:15;;;;:::i;:::-;:29;;45133:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45250:8;;45240:6;45214:11;:23;45226:10;45214:23;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:44;;45206:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45093:482;;;43454:2;45317:6;:19;;45309:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;43407:4;43360:3;43499:23;;;;:::i;:::-;45385:6;45376;;:15;;;;:::i;:::-;:28;;45368:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;45476:13;;45466:6;45440:11;:23;45452:10;45440:23;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:49;;45432:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45542:6;43561:17;45534:14;;;;:::i;:::-;45521:9;:27;;45513:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;45093:482;45585:23;45611:13;:11;:13::i;:::-;45585:39;;45645:6;45635;;:16;;;;;;;:::i;:::-;;;;;;;;45689:6;45662:11;:23;45674:10;45662:23;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;45711:9;45706:100;45730:6;45726:1;:10;45706:100;;;45758:36;45764:10;45776:17;;;;:::i;:::-;;;;45758:5;:36::i;:::-;45738:3;;;;;:::i;:::-;;;;45706:100;;;;45029:784;44982:831;:::o;24473:295::-;24588:12;:10;:12::i;:::-;24576:24;;:8;:24;;;;24568:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24688:8;24643:18;:32;24662:12;:10;:12::i;:::-;24643:32;;;;;;;;;;;;;;;:42;24676:8;24643:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24741:8;24712:48;;24727:12;:10;:12::i;:::-;24712:48;;;24751:8;24712:48;;;;;;:::i;:::-;;;;;;;;24473:295;;:::o;25736:328::-;25911:41;25930:12;:10;:12::i;:::-;25944:7;25911:18;:41::i;:::-;25903:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26017:39;26031:4;26037:2;26041:7;26050:5;26017:13;:39::i;:::-;25736:328;;;;:::o;44747:138::-;42098:12;:10;:12::i;:::-;42087:23;;:7;:5;:7::i;:::-;:23;;;42079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44831:13:::1;;44824:20;;;;:::i;:::-;44871:6;;44855:13;:22;;;;;;;:::i;:::-;;44747:138:::0;;:::o;43233:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22949:350::-;23022:13;23056:16;23064:7;23056;:16::i;:::-;23048:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23137:21;23161:10;:8;:10::i;:::-;23137:34;;23213:1;23195:7;23189:21;:25;:102;;;;;;;;;;;;;;;;;23241:7;23250:18;:7;:16;:18::i;:::-;23271:13;23224:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23189:102;23182:109;;;22949:350;;;:::o;43463:59::-;43407:4;43360:3;43499:23;;;;:::i;:::-;43463:59;:::o;43873:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45934:128::-;42098:12;:10;:12::i;:::-;42087:23;;:7;:5;:7::i;:::-;:23;;;42079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46037:17:::1;46021:13;:33;;;;;;;;;;;;:::i;:::-;;45934:128:::0;:::o;24839:164::-;24936:4;24960:18;:25;24979:5;24960:25;;;;;;;;;;;;;;;:35;24986:8;24960:35;;;;;;;;;;;;;;;;;;;;;;;;;24953:42;;24839:164;;;;:::o;42767:192::-;42098:12;:10;:12::i;:::-;42087:23;;:7;:5;:7::i;:::-;:23;;;42079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42876:1:::1;42856:22;;:8;:22;;;;42848:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42932:19;42942:8;42932:9;:19::i;:::-;42767:192:::0;:::o;46348:102::-;42098:12;:10;:12::i;:::-;42087:23;;:7;:5;:7::i;:::-;:23;;;42079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46436:6:::1;46420:13;:22;;;;46348:102:::0;:::o;21660:305::-;21762:4;21814:25;21799:40;;;:11;:40;;;;:105;;;;21871:33;21856:48;;;:11;:48;;;;21799:105;:158;;;;21921:36;21945:11;21921:23;:36::i;:::-;21799:158;21779:178;;21660:305;;;:::o;20085:98::-;20138:7;20165:10;20158:17;;20085:98;:::o;27574:127::-;27639:4;27691:1;27663:30;;:7;:16;27671:7;27663:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27656:37;;27574:127;;;:::o;31556:174::-;31658:2;31631:15;:24;31647:7;31631:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31714:7;31710:2;31676:46;;31685:23;31700:7;31685:14;:23::i;:::-;31676:46;;;;;;;;;;;;31556:174;;:::o;27868:348::-;27961:4;27986:16;27994:7;27986;:16::i;:::-;27978:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28062:13;28078:23;28093:7;28078:14;:23::i;:::-;28062:39;;28131:5;28120:16;;:7;:16;;;:51;;;;28164:7;28140:31;;:20;28152:7;28140:11;:20::i;:::-;:31;;;28120:51;:87;;;;28175:32;28192:5;28199:7;28175:16;:32::i;:::-;28120:87;28112:96;;;27868:348;;;;:::o;30860:578::-;31019:4;30992:31;;:23;31007:7;30992:14;:23::i;:::-;:31;;;30984:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31102:1;31088:16;;:2;:16;;;;31080:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31158:39;31179:4;31185:2;31189:7;31158:20;:39::i;:::-;31262:29;31279:1;31283:7;31262:8;:29::i;:::-;31323:1;31304:9;:15;31314:4;31304:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31352:1;31335:9;:13;31345:2;31335:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31383:2;31364:7;:16;31372:7;31364:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31422:7;31418:2;31403:27;;31412:4;31403:27;;;;;;;;;;;;30860:578;;;:::o;29552:382::-;29646:1;29632:16;;:2;:16;;;;29624:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29705:16;29713:7;29705;:16::i;:::-;29704:17;29696:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29767:45;29796:1;29800:2;29804:7;29767:20;:45::i;:::-;29842:1;29825:9;:13;29835:2;29825:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29873:2;29854:7;:16;29862:7;29854:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29918:7;29914:2;29893:33;;29910:1;29893:33;;;;;;;;;;;;29552:382;;:::o;35369:113::-;35430:7;35457:10;:17;;;;35450:24;;35369:113;:::o;42967:173::-;43023:16;43042:6;;;;;;;;;;;43023:25;;43068:8;43059:6;;:17;;;;;;;;;;;;;;;;;;43123:8;43092:40;;43113:8;43092:40;;;;;;;;;;;;43012:128;42967:173;:::o;26946:315::-;27103:28;27113:4;27119:2;27123:7;27103:9;:28::i;:::-;27150:48;27173:4;27179:2;27183:7;27192:5;27150:22;:48::i;:::-;27142:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26946:315;;;;:::o;45819:109::-;45879:13;45912:8;45905:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45819:109;:::o;7917:723::-;7973:13;8203:1;8194:5;:10;8190:53;;;8221:10;;;;;;;;;;;;;;;;;;;;;8190:53;8253:12;8268:5;8253:20;;8284:14;8309:78;8324:1;8316:4;:9;8309:78;;8342:8;;;;;:::i;:::-;;;;8373:2;8365:10;;;;;:::i;:::-;;;8309:78;;;8397:19;8429:6;8419:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8397:39;;8447:154;8463:1;8454:5;:10;8447:154;;8491:1;8481:11;;;;;:::i;:::-;;;8558:2;8550:5;:10;;;;:::i;:::-;8537:2;:24;;;;:::i;:::-;8524:39;;8507:6;8514;8507:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8587:2;8578:11;;;;;:::i;:::-;;;8447:154;;;8625:6;8611:21;;;;;7917:723;;;;:::o;7442:157::-;7527:4;7566:25;7551:40;;;:11;:40;;;;7544:47;;7442:157;;;:::o;36405:589::-;36549:45;36576:4;36582:2;36586:7;36549:26;:45::i;:::-;36627:1;36611:18;;:4;:18;;;36607:187;;;36646:40;36678:7;36646:31;:40::i;:::-;36607:187;;;36716:2;36708:10;;:4;:10;;;36704:90;;36735:47;36768:4;36774:7;36735:32;:47::i;:::-;36704:90;36607:187;36822:1;36808:16;;:2;:16;;;36804:183;;;36841:45;36878:7;36841:36;:45::i;:::-;36804:183;;;36914:4;36908:10;;:2;:10;;;36904:83;;36935:40;36963:2;36967:7;36935:27;:40::i;:::-;36904:83;36804:183;36405:589;;;:::o;32295:799::-;32450:4;32471:15;:2;:13;;;:15::i;:::-;32467:620;;;32523:2;32507:36;;;32544:12;:10;:12::i;:::-;32558:4;32564:7;32573:5;32507:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32503:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32766:1;32749:6;:13;:18;32745:272;;;32792:60;;;;;;;;;;:::i;:::-;;;;;;;;32745:272;32967:6;32961:13;32952:6;32948:2;32944:15;32937:38;32503:529;32640:41;;;32630:51;;;:6;:51;;;;32623:58;;;;;32467:620;33071:4;33064:11;;32295:799;;;;;;;:::o;33666:126::-;;;;:::o;37717:164::-;37821:10;:17;;;;37794:15;:24;37810:7;37794:24;;;;;;;;;;;:44;;;;37849:10;37865:7;37849:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37717:164;:::o;38508:988::-;38774:22;38824:1;38799:22;38816:4;38799:16;:22::i;:::-;:26;;;;:::i;:::-;38774:51;;38836:18;38857:17;:26;38875:7;38857:26;;;;;;;;;;;;38836:47;;39004:14;38990:10;:28;38986:328;;39035:19;39057:12;:18;39070:4;39057:18;;;;;;;;;;;;;;;:34;39076:14;39057:34;;;;;;;;;;;;39035:56;;39141:11;39108:12;:18;39121:4;39108:18;;;;;;;;;;;;;;;:30;39127:10;39108:30;;;;;;;;;;;:44;;;;39258:10;39225:17;:30;39243:11;39225:30;;;;;;;;;;;:43;;;;39020:294;38986:328;39410:17;:26;39428:7;39410:26;;;;;;;;;;;39403:33;;;39454:12;:18;39467:4;39454:18;;;;;;;;;;;;;;;:34;39473:14;39454:34;;;;;;;;;;;39447:41;;;38589:907;;38508:988;;:::o;39791:1079::-;40044:22;40089:1;40069:10;:17;;;;:21;;;;:::i;:::-;40044:46;;40101:18;40122:15;:24;40138:7;40122:24;;;;;;;;;;;;40101:45;;40473:19;40495:10;40506:14;40495:26;;;;;;;;:::i;:::-;;;;;;;;;;40473:48;;40559:11;40534:10;40545;40534:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40670:10;40639:15;:28;40655:11;40639:28;;;;;;;;;;;:41;;;;40811:15;:24;40827:7;40811:24;;;;;;;;;;;40804:31;;;40846:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39862:1008;;;39791:1079;:::o;37295:221::-;37380:14;37397:20;37414:2;37397:16;:20::i;:::-;37380:37;;37455:7;37428:12;:16;37441:2;37428:16;;;;;;;;;;;;;;;:24;37445:6;37428:24;;;;;;;;;;;:34;;;;37502:6;37473:17;:26;37491:7;37473:26;;;;;;;;;;;:35;;;;37369:147;37295:221;;:::o;10442:387::-;10502:4;10710:12;10777:7;10765:20;10757:28;;10820:1;10813:4;:8;10806:15;;;10442:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::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;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:553::-;2435:8;2445:6;2495:3;2488:4;2480:6;2476:17;2472:27;2462:122;;2503:79;;:::i;:::-;2462:122;2616:6;2603:20;2593:30;;2646:18;2638:6;2635:30;2632:117;;;2668:79;;:::i;:::-;2632:117;2782:4;2774:6;2770:17;2758:29;;2836:3;2828:4;2820:6;2816:17;2806:8;2802:32;2799:41;2796:128;;;2843:79;;:::i;:::-;2796:128;2377:553;;;;;:::o;2950:340::-;3006:5;3055:3;3048:4;3040:6;3036:17;3032:27;3022:122;;3063:79;;:::i;:::-;3022:122;3180:6;3167:20;3205:79;3280:3;3272:6;3265:4;3257:6;3253:17;3205:79;:::i;:::-;3196:88;;3012:278;2950:340;;;;:::o;3296:139::-;3342:5;3380:6;3367:20;3358:29;;3396:33;3423:5;3396:33;:::i;:::-;3296:139;;;;:::o;3441:329::-;3500:6;3549:2;3537:9;3528:7;3524:23;3520:32;3517:119;;;3555:79;;:::i;:::-;3517:119;3675:1;3700:53;3745:7;3736:6;3725:9;3721:22;3700:53;:::i;:::-;3690:63;;3646:117;3441:329;;;;:::o;3776:474::-;3844:6;3852;3901:2;3889:9;3880:7;3876:23;3872:32;3869:119;;;3907:79;;:::i;:::-;3869:119;4027:1;4052:53;4097:7;4088:6;4077:9;4073:22;4052:53;:::i;:::-;4042:63;;3998:117;4154:2;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4125:118;3776:474;;;;;:::o;4256:619::-;4333:6;4341;4349;4398:2;4386:9;4377:7;4373:23;4369:32;4366:119;;;4404:79;;:::i;:::-;4366:119;4524:1;4549:53;4594:7;4585:6;4574:9;4570:22;4549:53;:::i;:::-;4539:63;;4495:117;4651:2;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4622:118;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4256:619;;;;;:::o;4881:943::-;4976:6;4984;4992;5000;5049:3;5037:9;5028:7;5024:23;5020:33;5017:120;;;5056:79;;:::i;:::-;5017:120;5176:1;5201:53;5246:7;5237:6;5226:9;5222:22;5201:53;:::i;:::-;5191:63;;5147:117;5303:2;5329:53;5374:7;5365:6;5354:9;5350:22;5329:53;:::i;:::-;5319:63;;5274:118;5431:2;5457:53;5502:7;5493:6;5482:9;5478:22;5457:53;:::i;:::-;5447:63;;5402:118;5587:2;5576:9;5572:18;5559:32;5618:18;5610:6;5607:30;5604:117;;;5640:79;;:::i;:::-;5604:117;5745:62;5799:7;5790:6;5779:9;5775:22;5745:62;:::i;:::-;5735:72;;5530:287;4881:943;;;;;;;:::o;5830:468::-;5895:6;5903;5952:2;5940:9;5931:7;5927:23;5923:32;5920:119;;;5958:79;;:::i;:::-;5920:119;6078:1;6103:53;6148:7;6139:6;6128:9;6124:22;6103:53;:::i;:::-;6093:63;;6049:117;6205:2;6231:50;6273:7;6264:6;6253:9;6249:22;6231:50;:::i;:::-;6221:60;;6176:115;5830:468;;;;;:::o;6304:474::-;6372:6;6380;6429:2;6417:9;6408:7;6404:23;6400:32;6397:119;;;6435:79;;:::i;:::-;6397:119;6555:1;6580:53;6625:7;6616:6;6605:9;6601:22;6580:53;:::i;:::-;6570:63;;6526:117;6682:2;6708:53;6753:7;6744:6;6733:9;6729:22;6708:53;:::i;:::-;6698:63;;6653:118;6304:474;;;;;:::o;6784:559::-;6870:6;6878;6927:2;6915:9;6906:7;6902:23;6898:32;6895:119;;;6933:79;;:::i;:::-;6895:119;7081:1;7070:9;7066:17;7053:31;7111:18;7103:6;7100:30;7097:117;;;7133:79;;:::i;:::-;7097:117;7246:80;7318:7;7309:6;7298:9;7294:22;7246:80;:::i;:::-;7228:98;;;;7024:312;6784:559;;;;;:::o;7349:323::-;7405:6;7454:2;7442:9;7433:7;7429:23;7425:32;7422:119;;;7460:79;;:::i;:::-;7422:119;7580:1;7605:50;7647:7;7638:6;7627:9;7623:22;7605:50;:::i;:::-;7595:60;;7551:114;7349:323;;;;:::o;7678:327::-;7736:6;7785:2;7773:9;7764:7;7760:23;7756:32;7753:119;;;7791:79;;:::i;:::-;7753:119;7911:1;7936:52;7980:7;7971:6;7960:9;7956:22;7936:52;:::i;:::-;7926:62;;7882:116;7678:327;;;;:::o;8011:349::-;8080:6;8129:2;8117:9;8108:7;8104:23;8100:32;8097:119;;;8135:79;;:::i;:::-;8097:119;8255:1;8280:63;8335:7;8326:6;8315:9;8311:22;8280:63;:::i;:::-;8270:73;;8226:127;8011:349;;;;:::o;8366:529::-;8437:6;8445;8494:2;8482:9;8473:7;8469:23;8465:32;8462:119;;;8500:79;;:::i;:::-;8462:119;8648:1;8637:9;8633:17;8620:31;8678:18;8670:6;8667:30;8664:117;;;8700:79;;:::i;:::-;8664:117;8813:65;8870:7;8861:6;8850:9;8846:22;8813:65;:::i;:::-;8795:83;;;;8591:297;8366:529;;;;;:::o;8901:509::-;8970:6;9019:2;9007:9;8998:7;8994:23;8990:32;8987:119;;;9025:79;;:::i;:::-;8987:119;9173:1;9162:9;9158:17;9145:31;9203:18;9195:6;9192:30;9189:117;;;9225:79;;:::i;:::-;9189:117;9330:63;9385:7;9376:6;9365:9;9361:22;9330:63;:::i;:::-;9320:73;;9116:287;8901:509;;;;:::o;9416:329::-;9475:6;9524:2;9512:9;9503:7;9499:23;9495:32;9492:119;;;9530:79;;:::i;:::-;9492:119;9650:1;9675:53;9720:7;9711:6;9700:9;9696:22;9675:53;:::i;:::-;9665:63;;9621:117;9416:329;;;;:::o;9751:118::-;9838:24;9856:5;9838:24;:::i;:::-;9833:3;9826:37;9751:118;;:::o;9875:109::-;9956:21;9971:5;9956:21;:::i;:::-;9951:3;9944:34;9875:109;;:::o;9990:360::-;10076:3;10104:38;10136:5;10104:38;:::i;:::-;10158:70;10221:6;10216:3;10158:70;:::i;:::-;10151:77;;10237:52;10282:6;10277:3;10270:4;10263:5;10259:16;10237:52;:::i;:::-;10314:29;10336:6;10314:29;:::i;:::-;10309:3;10305:39;10298:46;;10080:270;9990:360;;;;:::o;10356:364::-;10444:3;10472:39;10505:5;10472:39;:::i;:::-;10527:71;10591:6;10586:3;10527:71;:::i;:::-;10520:78;;10607:52;10652:6;10647:3;10640:4;10633:5;10629:16;10607:52;:::i;:::-;10684:29;10706:6;10684:29;:::i;:::-;10679:3;10675:39;10668:46;;10448:272;10356:364;;;;:::o;10726:377::-;10832:3;10860:39;10893:5;10860:39;:::i;:::-;10915:89;10997:6;10992:3;10915:89;:::i;:::-;10908:96;;11013:52;11058:6;11053:3;11046:4;11039:5;11035:16;11013:52;:::i;:::-;11090:6;11085:3;11081:16;11074:23;;10836:267;10726:377;;;;:::o;11133:845::-;11236:3;11273:5;11267:12;11302:36;11328:9;11302:36;:::i;:::-;11354:89;11436:6;11431:3;11354:89;:::i;:::-;11347:96;;11474:1;11463:9;11459:17;11490:1;11485:137;;;;11636:1;11631:341;;;;11452:520;;11485:137;11569:4;11565:9;11554;11550:25;11545:3;11538:38;11605:6;11600:3;11596:16;11589:23;;11485:137;;11631:341;11698:38;11730:5;11698:38;:::i;:::-;11758:1;11772:154;11786:6;11783:1;11780:13;11772:154;;;11860:7;11854:14;11850:1;11845:3;11841:11;11834:35;11910:1;11901:7;11897:15;11886:26;;11808:4;11805:1;11801:12;11796:17;;11772:154;;;11955:6;11950:3;11946:16;11939:23;;11638:334;;11452:520;;11240:738;;11133:845;;;;:::o;11984:366::-;12126:3;12147:67;12211:2;12206:3;12147:67;:::i;:::-;12140:74;;12223:93;12312:3;12223:93;:::i;:::-;12341:2;12336:3;12332:12;12325:19;;11984:366;;;:::o;12356:::-;12498:3;12519:67;12583:2;12578:3;12519:67;:::i;:::-;12512:74;;12595:93;12684:3;12595:93;:::i;:::-;12713:2;12708:3;12704:12;12697:19;;12356:366;;;:::o;12728:::-;12870:3;12891:67;12955:2;12950:3;12891:67;:::i;:::-;12884:74;;12967:93;13056:3;12967:93;:::i;:::-;13085:2;13080:3;13076:12;13069:19;;12728:366;;;:::o;13100:365::-;13242:3;13263:66;13327:1;13322:3;13263:66;:::i;:::-;13256:73;;13338:93;13427:3;13338:93;:::i;:::-;13456:2;13451:3;13447:12;13440:19;;13100:365;;;:::o;13471:366::-;13613:3;13634:67;13698:2;13693:3;13634:67;:::i;:::-;13627:74;;13710:93;13799:3;13710:93;:::i;:::-;13828:2;13823:3;13819:12;13812:19;;13471:366;;;:::o;13843:::-;13985:3;14006:67;14070:2;14065:3;14006:67;:::i;:::-;13999:74;;14082:93;14171:3;14082:93;:::i;:::-;14200:2;14195:3;14191:12;14184:19;;13843:366;;;:::o;14215:::-;14357:3;14378:67;14442:2;14437:3;14378:67;:::i;:::-;14371:74;;14454:93;14543:3;14454:93;:::i;:::-;14572:2;14567:3;14563:12;14556:19;;14215:366;;;:::o;14587:::-;14729:3;14750:67;14814:2;14809:3;14750:67;:::i;:::-;14743:74;;14826:93;14915:3;14826:93;:::i;:::-;14944:2;14939:3;14935:12;14928:19;;14587:366;;;:::o;14959:::-;15101:3;15122:67;15186:2;15181:3;15122:67;:::i;:::-;15115:74;;15198:93;15287:3;15198:93;:::i;:::-;15316:2;15311:3;15307:12;15300:19;;14959:366;;;:::o;15331:::-;15473:3;15494:67;15558:2;15553:3;15494:67;:::i;:::-;15487:74;;15570:93;15659:3;15570:93;:::i;:::-;15688:2;15683:3;15679:12;15672:19;;15331:366;;;:::o;15703:::-;15845:3;15866:67;15930:2;15925:3;15866:67;:::i;:::-;15859:74;;15942:93;16031:3;15942:93;:::i;:::-;16060:2;16055:3;16051:12;16044:19;;15703:366;;;:::o;16075:::-;16217:3;16238:67;16302:2;16297:3;16238:67;:::i;:::-;16231:74;;16314:93;16403:3;16314:93;:::i;:::-;16432:2;16427:3;16423:12;16416:19;;16075:366;;;:::o;16447:::-;16589:3;16610:67;16674:2;16669:3;16610:67;:::i;:::-;16603:74;;16686:93;16775:3;16686:93;:::i;:::-;16804:2;16799:3;16795:12;16788:19;;16447:366;;;:::o;16819:::-;16961:3;16982:67;17046:2;17041:3;16982:67;:::i;:::-;16975:74;;17058:93;17147:3;17058:93;:::i;:::-;17176:2;17171:3;17167:12;17160:19;;16819:366;;;:::o;17191:::-;17333:3;17354:67;17418:2;17413:3;17354:67;:::i;:::-;17347:74;;17430:93;17519:3;17430:93;:::i;:::-;17548:2;17543:3;17539:12;17532:19;;17191:366;;;:::o;17563:::-;17705:3;17726:67;17790:2;17785:3;17726:67;:::i;:::-;17719:74;;17802:93;17891:3;17802:93;:::i;:::-;17920:2;17915:3;17911:12;17904:19;;17563:366;;;:::o;17935:::-;18077:3;18098:67;18162:2;18157:3;18098:67;:::i;:::-;18091:74;;18174:93;18263:3;18174:93;:::i;:::-;18292:2;18287:3;18283:12;18276:19;;17935:366;;;:::o;18307:::-;18449:3;18470:67;18534:2;18529:3;18470:67;:::i;:::-;18463:74;;18546:93;18635:3;18546:93;:::i;:::-;18664:2;18659:3;18655:12;18648:19;;18307:366;;;:::o;18679:::-;18821:3;18842:67;18906:2;18901:3;18842:67;:::i;:::-;18835:74;;18918:93;19007:3;18918:93;:::i;:::-;19036:2;19031:3;19027:12;19020:19;;18679:366;;;:::o;19051:::-;19193:3;19214:67;19278:2;19273:3;19214:67;:::i;:::-;19207:74;;19290:93;19379:3;19290:93;:::i;:::-;19408:2;19403:3;19399:12;19392:19;;19051:366;;;:::o;19423:::-;19565:3;19586:67;19650:2;19645:3;19586:67;:::i;:::-;19579:74;;19662:93;19751:3;19662:93;:::i;:::-;19780:2;19775:3;19771:12;19764:19;;19423:366;;;:::o;19795:::-;19937:3;19958:67;20022:2;20017:3;19958:67;:::i;:::-;19951:74;;20034:93;20123:3;20034:93;:::i;:::-;20152:2;20147:3;20143:12;20136:19;;19795:366;;;:::o;20167:::-;20309:3;20330:67;20394:2;20389:3;20330:67;:::i;:::-;20323:74;;20406:93;20495:3;20406:93;:::i;:::-;20524:2;20519:3;20515:12;20508:19;;20167:366;;;:::o;20539:::-;20681:3;20702:67;20766:2;20761:3;20702:67;:::i;:::-;20695:74;;20778:93;20867:3;20778:93;:::i;:::-;20896:2;20891:3;20887:12;20880:19;;20539:366;;;:::o;20911:::-;21053:3;21074:67;21138:2;21133:3;21074:67;:::i;:::-;21067:74;;21150:93;21239:3;21150:93;:::i;:::-;21268:2;21263:3;21259:12;21252:19;;20911:366;;;:::o;21283:365::-;21425:3;21446:66;21510:1;21505:3;21446:66;:::i;:::-;21439:73;;21521:93;21610:3;21521:93;:::i;:::-;21639:2;21634:3;21630:12;21623:19;;21283:365;;;:::o;21654:118::-;21741:24;21759:5;21741:24;:::i;:::-;21736:3;21729:37;21654:118;;:::o;21778:589::-;22003:3;22025:95;22116:3;22107:6;22025:95;:::i;:::-;22018:102;;22137:95;22228:3;22219:6;22137:95;:::i;:::-;22130:102;;22249:92;22337:3;22328:6;22249:92;:::i;:::-;22242:99;;22358:3;22351:10;;21778:589;;;;;;:::o;22373:222::-;22466:4;22504:2;22493:9;22489:18;22481:26;;22517:71;22585:1;22574:9;22570:17;22561:6;22517:71;:::i;:::-;22373:222;;;;:::o;22601:640::-;22796:4;22834:3;22823:9;22819:19;22811:27;;22848:71;22916:1;22905:9;22901:17;22892:6;22848:71;:::i;:::-;22929:72;22997:2;22986:9;22982:18;22973:6;22929:72;:::i;:::-;23011;23079:2;23068:9;23064:18;23055:6;23011:72;:::i;:::-;23130:9;23124:4;23120:20;23115:2;23104:9;23100:18;23093:48;23158:76;23229:4;23220:6;23158:76;:::i;:::-;23150:84;;22601:640;;;;;;;:::o;23247:210::-;23334:4;23372:2;23361:9;23357:18;23349:26;;23385:65;23447:1;23436:9;23432:17;23423:6;23385:65;:::i;:::-;23247:210;;;;:::o;23463:313::-;23576:4;23614:2;23603:9;23599:18;23591:26;;23663:9;23657:4;23653:20;23649:1;23638:9;23634:17;23627:47;23691:78;23764:4;23755:6;23691:78;:::i;:::-;23683:86;;23463:313;;;;:::o;23782:419::-;23948:4;23986:2;23975:9;23971:18;23963:26;;24035:9;24029:4;24025:20;24021:1;24010:9;24006:17;23999:47;24063:131;24189:4;24063:131;:::i;:::-;24055:139;;23782:419;;;:::o;24207:::-;24373:4;24411:2;24400:9;24396:18;24388:26;;24460:9;24454:4;24450:20;24446:1;24435:9;24431:17;24424:47;24488:131;24614:4;24488:131;:::i;:::-;24480:139;;24207:419;;;:::o;24632:::-;24798:4;24836:2;24825:9;24821:18;24813:26;;24885:9;24879:4;24875:20;24871:1;24860:9;24856:17;24849:47;24913:131;25039:4;24913:131;:::i;:::-;24905:139;;24632:419;;;:::o;25057:::-;25223:4;25261:2;25250:9;25246:18;25238:26;;25310:9;25304:4;25300:20;25296:1;25285:9;25281:17;25274:47;25338:131;25464:4;25338:131;:::i;:::-;25330:139;;25057:419;;;:::o;25482:::-;25648:4;25686:2;25675:9;25671:18;25663:26;;25735:9;25729:4;25725:20;25721:1;25710:9;25706:17;25699:47;25763:131;25889:4;25763:131;:::i;:::-;25755:139;;25482:419;;;:::o;25907:::-;26073:4;26111:2;26100:9;26096:18;26088:26;;26160:9;26154:4;26150:20;26146:1;26135:9;26131:17;26124:47;26188:131;26314:4;26188:131;:::i;:::-;26180:139;;25907:419;;;:::o;26332:::-;26498:4;26536:2;26525:9;26521:18;26513:26;;26585:9;26579:4;26575:20;26571:1;26560:9;26556:17;26549:47;26613:131;26739:4;26613:131;:::i;:::-;26605:139;;26332:419;;;:::o;26757:::-;26923:4;26961:2;26950:9;26946:18;26938:26;;27010:9;27004:4;27000:20;26996:1;26985:9;26981:17;26974:47;27038:131;27164:4;27038:131;:::i;:::-;27030:139;;26757:419;;;:::o;27182:::-;27348:4;27386:2;27375:9;27371:18;27363:26;;27435:9;27429:4;27425:20;27421:1;27410:9;27406:17;27399:47;27463:131;27589:4;27463:131;:::i;:::-;27455:139;;27182:419;;;:::o;27607:::-;27773:4;27811:2;27800:9;27796:18;27788:26;;27860:9;27854:4;27850:20;27846:1;27835:9;27831:17;27824:47;27888:131;28014:4;27888:131;:::i;:::-;27880:139;;27607:419;;;:::o;28032:::-;28198:4;28236:2;28225:9;28221:18;28213:26;;28285:9;28279:4;28275:20;28271:1;28260:9;28256:17;28249:47;28313:131;28439:4;28313:131;:::i;:::-;28305:139;;28032:419;;;:::o;28457:::-;28623:4;28661:2;28650:9;28646:18;28638:26;;28710:9;28704:4;28700:20;28696:1;28685:9;28681:17;28674:47;28738:131;28864:4;28738:131;:::i;:::-;28730:139;;28457:419;;;:::o;28882:::-;29048:4;29086:2;29075:9;29071:18;29063:26;;29135:9;29129:4;29125:20;29121:1;29110:9;29106:17;29099:47;29163:131;29289:4;29163:131;:::i;:::-;29155:139;;28882:419;;;:::o;29307:::-;29473:4;29511:2;29500:9;29496:18;29488:26;;29560:9;29554:4;29550:20;29546:1;29535:9;29531:17;29524:47;29588:131;29714:4;29588:131;:::i;:::-;29580:139;;29307:419;;;:::o;29732:::-;29898:4;29936:2;29925:9;29921:18;29913:26;;29985:9;29979:4;29975:20;29971:1;29960:9;29956:17;29949:47;30013:131;30139:4;30013:131;:::i;:::-;30005:139;;29732:419;;;:::o;30157:::-;30323:4;30361:2;30350:9;30346:18;30338:26;;30410:9;30404:4;30400:20;30396:1;30385:9;30381:17;30374:47;30438:131;30564:4;30438:131;:::i;:::-;30430:139;;30157:419;;;:::o;30582:::-;30748:4;30786:2;30775:9;30771:18;30763:26;;30835:9;30829:4;30825:20;30821:1;30810:9;30806:17;30799:47;30863:131;30989:4;30863:131;:::i;:::-;30855:139;;30582:419;;;:::o;31007:::-;31173:4;31211:2;31200:9;31196:18;31188:26;;31260:9;31254:4;31250:20;31246:1;31235:9;31231:17;31224:47;31288:131;31414:4;31288:131;:::i;:::-;31280:139;;31007:419;;;:::o;31432:::-;31598:4;31636:2;31625:9;31621:18;31613:26;;31685:9;31679:4;31675:20;31671:1;31660:9;31656:17;31649:47;31713:131;31839:4;31713:131;:::i;:::-;31705:139;;31432:419;;;:::o;31857:::-;32023:4;32061:2;32050:9;32046:18;32038:26;;32110:9;32104:4;32100:20;32096:1;32085:9;32081:17;32074:47;32138:131;32264:4;32138:131;:::i;:::-;32130:139;;31857:419;;;:::o;32282:::-;32448:4;32486:2;32475:9;32471:18;32463:26;;32535:9;32529:4;32525:20;32521:1;32510:9;32506:17;32499:47;32563:131;32689:4;32563:131;:::i;:::-;32555:139;;32282:419;;;:::o;32707:::-;32873:4;32911:2;32900:9;32896:18;32888:26;;32960:9;32954:4;32950:20;32946:1;32935:9;32931:17;32924:47;32988:131;33114:4;32988:131;:::i;:::-;32980:139;;32707:419;;;:::o;33132:::-;33298:4;33336:2;33325:9;33321:18;33313:26;;33385:9;33379:4;33375:20;33371:1;33360:9;33356:17;33349:47;33413:131;33539:4;33413:131;:::i;:::-;33405:139;;33132:419;;;:::o;33557:::-;33723:4;33761:2;33750:9;33746:18;33738:26;;33810:9;33804:4;33800:20;33796:1;33785:9;33781:17;33774:47;33838:131;33964:4;33838:131;:::i;:::-;33830:139;;33557:419;;;:::o;33982:::-;34148:4;34186:2;34175:9;34171:18;34163:26;;34235:9;34229:4;34225:20;34221:1;34210:9;34206:17;34199:47;34263:131;34389:4;34263:131;:::i;:::-;34255:139;;33982:419;;;:::o;34407:::-;34573:4;34611:2;34600:9;34596:18;34588:26;;34660:9;34654:4;34650:20;34646:1;34635:9;34631:17;34624:47;34688:131;34814:4;34688:131;:::i;:::-;34680:139;;34407:419;;;:::o;34832:222::-;34925:4;34963:2;34952:9;34948:18;34940:26;;34976:71;35044:1;35033:9;35029:17;35020:6;34976:71;:::i;:::-;34832:222;;;;:::o;35060:129::-;35094:6;35121:20;;:::i;:::-;35111:30;;35150:33;35178:4;35170:6;35150:33;:::i;:::-;35060:129;;;:::o;35195:75::-;35228:6;35261:2;35255:9;35245:19;;35195:75;:::o;35276:307::-;35337:4;35427:18;35419:6;35416:30;35413:56;;;35449:18;;:::i;:::-;35413:56;35487:29;35509:6;35487:29;:::i;:::-;35479:37;;35571:4;35565;35561:15;35553:23;;35276:307;;;:::o;35589:308::-;35651:4;35741:18;35733:6;35730:30;35727:56;;;35763:18;;:::i;:::-;35727:56;35801:29;35823:6;35801:29;:::i;:::-;35793:37;;35885:4;35879;35875:15;35867:23;;35589:308;;;:::o;35903:141::-;35952:4;35975:3;35967:11;;35998:3;35995:1;35988:14;36032:4;36029:1;36019:18;36011:26;;35903:141;;;:::o;36050:98::-;36101:6;36135:5;36129:12;36119:22;;36050:98;;;:::o;36154:99::-;36206:6;36240:5;36234:12;36224:22;;36154:99;;;:::o;36259:168::-;36342:11;36376:6;36371:3;36364:19;36416:4;36411:3;36407:14;36392:29;;36259:168;;;;:::o;36433:169::-;36517:11;36551:6;36546:3;36539:19;36591:4;36586:3;36582:14;36567:29;;36433:169;;;;:::o;36608:148::-;36710:11;36747:3;36732:18;;36608:148;;;;:::o;36762:305::-;36802:3;36821:20;36839:1;36821:20;:::i;:::-;36816:25;;36855:20;36873:1;36855:20;:::i;:::-;36850:25;;37009:1;36941:66;36937:74;36934:1;36931:81;36928:107;;;37015:18;;:::i;:::-;36928:107;37059:1;37056;37052:9;37045:16;;36762:305;;;;:::o;37073:185::-;37113:1;37130:20;37148:1;37130:20;:::i;:::-;37125:25;;37164:20;37182:1;37164:20;:::i;:::-;37159:25;;37203:1;37193:35;;37208:18;;:::i;:::-;37193:35;37250:1;37247;37243:9;37238:14;;37073:185;;;;:::o;37264:348::-;37304:7;37327:20;37345:1;37327:20;:::i;:::-;37322:25;;37361:20;37379:1;37361:20;:::i;:::-;37356:25;;37549:1;37481:66;37477:74;37474:1;37471:81;37466:1;37459:9;37452:17;37448:105;37445:131;;;37556:18;;:::i;:::-;37445:131;37604:1;37601;37597:9;37586:20;;37264:348;;;;:::o;37618:191::-;37658:4;37678:20;37696:1;37678:20;:::i;:::-;37673:25;;37712:20;37730:1;37712:20;:::i;:::-;37707:25;;37751:1;37748;37745:8;37742:34;;;37756:18;;:::i;:::-;37742:34;37801:1;37798;37794:9;37786:17;;37618:191;;;;:::o;37815:96::-;37852:7;37881:24;37899:5;37881:24;:::i;:::-;37870:35;;37815:96;;;:::o;37917:90::-;37951:7;37994:5;37987:13;37980:21;37969:32;;37917:90;;;:::o;38013:149::-;38049:7;38089:66;38082:5;38078:78;38067:89;;38013:149;;;:::o;38168:126::-;38205:7;38245:42;38238:5;38234:54;38223:65;;38168:126;;;:::o;38300:77::-;38337:7;38366:5;38355:16;;38300:77;;;:::o;38383:154::-;38467:6;38462:3;38457;38444:30;38529:1;38520:6;38515:3;38511:16;38504:27;38383:154;;;:::o;38543:307::-;38611:1;38621:113;38635:6;38632:1;38629:13;38621:113;;;38720:1;38715:3;38711:11;38705:18;38701:1;38696:3;38692:11;38685:39;38657:2;38654:1;38650:10;38645:15;;38621:113;;;38752:6;38749:1;38746:13;38743:101;;;38832:1;38823:6;38818:3;38814:16;38807:27;38743:101;38592:258;38543:307;;;:::o;38856:320::-;38900:6;38937:1;38931:4;38927:12;38917:22;;38984:1;38978:4;38974:12;39005:18;38995:81;;39061:4;39053:6;39049:17;39039:27;;38995:81;39123:2;39115:6;39112:14;39092:18;39089:38;39086:84;;;39142:18;;:::i;:::-;39086:84;38907:269;38856:320;;;:::o;39182:281::-;39265:27;39287:4;39265:27;:::i;:::-;39257:6;39253:40;39395:6;39383:10;39380:22;39359:18;39347:10;39344:34;39341:62;39338:88;;;39406:18;;:::i;:::-;39338:88;39446:10;39442:2;39435:22;39225:238;39182:281;;:::o;39469:233::-;39508:3;39531:24;39549:5;39531:24;:::i;:::-;39522:33;;39577:66;39570:5;39567:77;39564:103;;;39647:18;;:::i;:::-;39564:103;39694:1;39687:5;39683:13;39676:20;;39469:233;;;:::o;39708:176::-;39740:1;39757:20;39775:1;39757:20;:::i;:::-;39752:25;;39791:20;39809:1;39791:20;:::i;:::-;39786:25;;39830:1;39820:35;;39835:18;;:::i;:::-;39820:35;39876:1;39873;39869:9;39864:14;;39708:176;;;;:::o;39890:180::-;39938:77;39935:1;39928:88;40035:4;40032:1;40025:15;40059:4;40056:1;40049:15;40076:180;40124:77;40121:1;40114:88;40221:4;40218:1;40211:15;40245:4;40242:1;40235:15;40262:180;40310:77;40307:1;40300:88;40407:4;40404:1;40397:15;40431:4;40428:1;40421:15;40448:180;40496:77;40493:1;40486:88;40593:4;40590:1;40583:15;40617:4;40614:1;40607:15;40634:180;40682:77;40679:1;40672:88;40779:4;40776:1;40769:15;40803:4;40800:1;40793:15;40820:180;40868:77;40865:1;40858:88;40965:4;40962:1;40955:15;40989:4;40986:1;40979:15;41006:117;41115:1;41112;41105:12;41129:117;41238:1;41235;41228:12;41252:117;41361:1;41358;41351:12;41375:117;41484:1;41481;41474:12;41498:117;41607:1;41604;41597:12;41621:117;41730:1;41727;41720:12;41744:102;41785:6;41836:2;41832:7;41827:2;41820:5;41816:14;41812:28;41802:38;;41744:102;;;:::o;41852:163::-;41992:15;41988:1;41980:6;41976:14;41969:39;41852:163;:::o;42021:230::-;42161:34;42157:1;42149:6;42145:14;42138:58;42230:13;42225:2;42217:6;42213:15;42206:38;42021:230;:::o;42257:237::-;42397:34;42393:1;42385:6;42381:14;42374:58;42466:20;42461:2;42453:6;42449:15;42442:45;42257:237;:::o;42500:158::-;42640:10;42636:1;42628:6;42624:14;42617:34;42500:158;:::o;42664:225::-;42804:34;42800:1;42792:6;42788:14;42781:58;42873:8;42868:2;42860:6;42856:15;42849:33;42664:225;:::o;42895:178::-;43035:30;43031:1;43023:6;43019:14;43012:54;42895:178;:::o;43079:160::-;43219:12;43215:1;43207:6;43203:14;43196:36;43079:160;:::o;43245:223::-;43385:34;43381:1;43373:6;43369:14;43362:58;43454:6;43449:2;43441:6;43437:15;43430:31;43245:223;:::o;43474:175::-;43614:27;43610:1;43602:6;43598:14;43591:51;43474:175;:::o;43655:231::-;43795:34;43791:1;43783:6;43779:14;43772:58;43864:14;43859:2;43851:6;43847:15;43840:39;43655:231;:::o;43892:163::-;44032:15;44028:1;44020:6;44016:14;44009:39;43892:163;:::o;44061:243::-;44201:34;44197:1;44189:6;44185:14;44178:58;44270:26;44265:2;44257:6;44253:15;44246:51;44061:243;:::o;44310:229::-;44450:34;44446:1;44438:6;44434:14;44427:58;44519:12;44514:2;44506:6;44502:15;44495:37;44310:229;:::o;44545:228::-;44685:34;44681:1;44673:6;44669:14;44662:58;44754:11;44749:2;44741:6;44737:15;44730:36;44545:228;:::o;44779:182::-;44919:34;44915:1;44907:6;44903:14;44896:58;44779:182;:::o;44967:231::-;45107:34;45103:1;45095:6;45091:14;45084:58;45176:14;45171:2;45163:6;45159:15;45152:39;44967:231;:::o;45204:182::-;45344:34;45340:1;45332:6;45328:14;45321:58;45204:182;:::o;45392:172::-;45532:24;45528:1;45520:6;45516:14;45509:48;45392:172;:::o;45570:228::-;45710:34;45706:1;45698:6;45694:14;45687:58;45779:11;45774:2;45766:6;45762:15;45755:36;45570:228;:::o;45804:234::-;45944:34;45940:1;45932:6;45928:14;45921:58;46013:17;46008:2;46000:6;45996:15;45989:42;45804:234;:::o;46044:160::-;46184:12;46180:1;46172:6;46168:14;46161:36;46044:160;:::o;46210:220::-;46350:34;46346:1;46338:6;46334:14;46327:58;46419:3;46414:2;46406:6;46402:15;46395:28;46210:220;:::o;46436:166::-;46576:18;46572:1;46564:6;46560:14;46553:42;46436:166;:::o;46608:236::-;46748:34;46744:1;46736:6;46732:14;46725:58;46817:19;46812:2;46804:6;46800:15;46793:44;46608:236;:::o;46850:231::-;46990:34;46986:1;46978:6;46974:14;46967:58;47059:14;47054:2;47046:6;47042:15;47035:39;46850:231;:::o;47087:155::-;47227:7;47223:1;47215:6;47211:14;47204:31;47087:155;:::o;47248:122::-;47321:24;47339:5;47321:24;:::i;:::-;47314:5;47311:35;47301:63;;47360:1;47357;47350:12;47301:63;47248:122;:::o;47376:116::-;47446:21;47461:5;47446:21;:::i;:::-;47439:5;47436:32;47426:60;;47482:1;47479;47472:12;47426:60;47376:116;:::o;47498:120::-;47570:23;47587:5;47570:23;:::i;:::-;47563:5;47560:34;47550:62;;47608:1;47605;47598:12;47550:62;47498:120;:::o;47624:122::-;47697:24;47715:5;47697:24;:::i;:::-;47690:5;47687:35;47677:63;;47736:1;47733;47726:12;47677:63;47624:122;:::o
Swarm Source
ipfs://8bf1d02ccb4ac079029a44590107e34ee738331134f7b5ff4da9eaa3866c4f9c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.