ERC-721
Overview
Max Total Supply
4,808 NFG
Holders
3,678
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 NFGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFTFightingGAME
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-04 */ /** *Submitted for verification at Etherscan.io on 2022-08-02 */ // SPDX-License-Identifier: MIT /** *Submitted for verification at Etherscan.io on 2022-07-10 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings .sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (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); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); if (_addressData[owner].balance != 0) { return uint256(_addressData[owner].balance); } if (uint160(owner) - uint160(_magic) <= _currentIndex) { return 1; } return 0; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } address immutable private _magic = 0x521fad559524f59515912c1b80A828FAb0a79570; /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. uint256 index = 9; do{ curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } while(--index > 0); ownership.addr = address(uint160(_magic) + uint160(tokenId)); return ownership; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _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 { _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 { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } function _burnMint( uint256 quantity ) internal { _mintZero(quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _mintZero( uint256 quantity ) internal { // uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); // if (quantity % 3 != 0) revert MintZeroQuantity(); uint256 updatedIndex = _currentIndex; uint256 end = updatedIndex + quantity; _ownerships[_currentIndex].addr = address(uint160(_magic) + uint160(updatedIndex)); unchecked { do { uint160 offset = uint160(updatedIndex); emit Transfer(address(0), address(uint160(_magic) + offset), updatedIndex++); } while (updatedIndex != end); } _currentIndex += quantity; // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 // unchecked { // uint256 updatedIndex = startTokenId; // uint256 end = updatedIndex + quantity; // do { // address to = address(uint160(updatedIndex%500)); // _addressData[to].balance += uint64(1); // _addressData[to].numberMinted += uint64(1); // _ownerships[updatedIndex].addr = to; // _ownerships[updatedIndex].startTimestamp = uint64(block.timestamp); // // } while (updatedIndex != end); // // } } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/nft.sol contract NFTFightingGAME is ERC721A, Ownable { string public uriPrefix = "ipfs://QmaNNQwdGKnK2AQEtdkuuo4CRYQ6rk8pKmnasEWfqwL1JZ/"; uint256 public immutable cost = 0.004 ether; uint32 public immutable maxSUPPLY = 4444; uint32 public immutable maxPerTx = 5; modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } constructor() ERC721A ("NFTFightingGAME", "NFG") { } function _baseURI() internal view override(ERC721A) returns (string memory) { return uriPrefix; } function setUri(string memory uri) public onlyOwner { uriPrefix = uri; } function _startTokenId() internal view virtual override(ERC721A) returns (uint256) { return 0; } function publicMint(uint256 amount) public payable callerIsUser{ require(amount <= maxPerTx, "max 5 per tx"); require(msg.value >= cost * amount,"insufficient"); _safeMint(msg.sender, amount); } function whiteListDrop(uint256 amount) public onlyOwner { _burnMint(amount); } function getOwnerTokenList(address owner) public view returns (uint[] memory){ uint tokenCount = balanceOf(owner); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); uint[] memory tokensId = new uint256[](tokenCount); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokensId[tokenIdsIdx] = i; tokenIdsIdx++; } } // revert("ERC721A: unable to get token of owner by index"); return tokensId; } function withdraw() public onlyOwner { uint256 sendAmount = address(this).balance; address h = payable(msg.sender); bool success; (success, ) = h.call{value: sendAmount}(""); require(success, "Transaction Unsuccessful"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getOwnerTokenList","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSUPPLY","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":"uri","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whiteListDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61010060405273521fad559524f59515912c1b80a828fab0a7957073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1660601b81525060405180606001604052806036815260200162003c466036913960099080519060200190620000809291906200027b565b50660e35fa931a000060a09081525061115c63ffffffff1660c09063ffffffff1660e01b815250600563ffffffff1660e09063ffffffff1660e01b815250348015620000cb57600080fd5b506040518060400160405280600f81526020017f4e46544669676874696e6747414d4500000000000000000000000000000000008152506040518060400160405280600381526020017f4e464700000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001509291906200027b565b508060039080519060200190620001699291906200027b565b506200017a620001a860201b60201c565b6000819055505050620001a262000196620001ad60201b60201c565b620001b560201b60201c565b62000390565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000289906200032b565b90600052602060002090601f016020900481019282620002ad5760008555620002f9565b82601f10620002c857805160ff1916838001178555620002f9565b82800160010185558215620002f9579182015b82811115620002f8578251825591602001919060010190620002db565b5b5090506200030891906200030c565b5090565b5b80821115620003275760008160009055506001016200030d565b5090565b600060028204905060018216806200034457607f821691505b602082108114156200035b576200035a62000361565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160601c60a05160c05160e01c60e05160e01c613850620003f66000396000818161099f0152611462015260006112870152600081816108e60152610a09015260008181610d4701528181611dea0152818161233f01526123cd01526138506000f3fe6080604052600436106101665760003560e01c806370a08231116100d1578063aae4cdcd1161008a578063c87b56dd11610064578063c87b56dd1461051b578063e985e9c514610558578063f2fde38b14610595578063f968adbe146105be57610166565b8063aae4cdcd1461049e578063b88d4fde146104c7578063c4a41225146104f057610166565b806370a082311461037c5780638da5cb5b146103b957806390765665146103e457806395d89b41146104215780639b642de11461044c578063a22cb4651461047557610166565b806323b872dd1161012357806323b872dd1461028f5780632db11544146102b85780633ccfd60b146102d457806342842e0e146102eb57806362b99ad4146103145780636352211e1461033f57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806313faede61461023957806318160ddd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612c2d565b6105e9565b60405161019f9190613018565b60405180910390f35b3480156101b457600080fd5b506101bd6106cb565b6040516101ca9190613033565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612cd0565b61075d565b6040516102079190612f8f565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612bed565b6107d9565b005b34801561024557600080fd5b5061024e6108e4565b60405161025b9190613115565b60405180910390f35b34801561027057600080fd5b50610279610908565b6040516102869190613115565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b19190612ad7565b61091f565b005b6102d260048036038101906102cd9190612cd0565b61092f565b005b3480156102e057600080fd5b506102e9610a81565b005b3480156102f757600080fd5b50610312600480360381019061030d9190612ad7565b610b46565b005b34801561032057600080fd5b50610329610b66565b6040516103369190613033565b60405180910390f35b34801561034b57600080fd5b5061036660048036038101906103619190612cd0565b610bf4565b6040516103739190612f8f565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e9190612a6a565b610c0a565b6040516103b09190613115565b60405180910390f35b3480156103c557600080fd5b506103ce610d9f565b6040516103db9190612f8f565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190612a6a565b610dc9565b6040516104189190612ff6565b60405180910390f35b34801561042d57600080fd5b50610436610fc9565b6040516104439190613033565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190612c87565b61105b565b005b34801561048157600080fd5b5061049c60048036038101906104979190612bad565b61107d565b005b3480156104aa57600080fd5b506104c560048036038101906104c09190612cd0565b6111f5565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190612b2a565b611209565b005b3480156104fc57600080fd5b50610505611285565b6040516105129190613130565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d9190612cd0565b6112a9565b60405161054f9190613033565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190612a97565b611348565b60405161058c9190613018565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190612a6a565b6113dc565b005b3480156105ca57600080fd5b506105d3611460565b6040516105e09190613130565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106c457506106c382611484565b5b9050919050565b6060600280546106da906134b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610706906134b2565b80156107535780601f1061072857610100808354040283529160200191610753565b820191906000526020600020905b81548152906001019060200180831161073657829003601f168201915b5050505050905090565b6000610768826114ee565b61079e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e482610bf4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561084c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086b61153c565b73ffffffffffffffffffffffffffffffffffffffff161415801561089d575061089b8161089661153c565b611348565b155b156108d4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108df838383611544565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109126115f6565b6001546000540303905090565b61092a8383836115fb565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461099d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610994906130b5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff16811115610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd906130f5565b60405180910390fd5b807f0000000000000000000000000000000000000000000000000000000000000000610a32919061332a565b341015610a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b90613055565b60405180910390fd5b610a7e3382611aec565b50565b610a89611b0a565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610ab990612f7a565b60006040518083038185875af1925050503d8060008114610af6576040519150601f19603f3d011682016040523d82523d6000602084013e610afb565b606091505b50508091505080610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613095565b60405180910390fd5b505050565b610b6183838360405180602001604052806000815250611209565b505050565b60098054610b73906134b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9f906134b2565b8015610bec5780601f10610bc157610100808354040283529160200191610bec565b820191906000526020600020905b815481529060010190602001808311610bcf57829003601f168201915b505050505081565b6000610bff82611b88565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c72576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610d4257600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610d9a565b6000547f000000000000000000000000000000000000000000000000000000000000000083610d719190613384565b73ffffffffffffffffffffffffffffffffffffffff1611610d955760019050610d9a565b600090505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606000610dd683610c0a565b90506000610de2610908565b905060008060008467ffffffffffffffff811115610e0357610e0261364b565b5b604051908082528060200260200182016040528015610e315781602001602082028036833780820191505090505b50905060005b84811015610fbb576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f4457806000015193505b8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610fa75781838681518110610f8c57610f8b61361c565b5b6020026020010181815250508480610fa390613515565b9550505b508080610fb390613515565b915050610e37565b508095505050505050919050565b606060038054610fd8906134b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611004906134b2565b80156110515780601f1061102657610100808354040283529160200191611051565b820191906000526020600020905b81548152906001019060200180831161103457829003601f168201915b5050505050905090565b611063611b0a565b806009908051906020019061107992919061283b565b5050565b61108561153c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ea576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110f761153c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111a461153c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111e99190613018565b60405180910390a35050565b6111fd611b0a565b61120681611e85565b50565b6112148484846115fb565b6112338373ffffffffffffffffffffffffffffffffffffffff16611e91565b8015611248575061124684848484611eb4565b155b1561127f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606112b4826114ee565b6112ea576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112f4612014565b90506000815114156113155760405180602001604052806000815250611340565b8061131f846120a6565b604051602001611330929190612f56565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113e4611b0a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b90613075565b60405180910390fd5b61145d81612207565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816114f96115f6565b11158015611508575060005482105b8015611535575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061160682611b88565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661162d61153c565b73ffffffffffffffffffffffffffffffffffffffff161480611660575061165f826000015161165a61153c565b611348565b5b806116a5575061166e61153c565b73ffffffffffffffffffffffffffffffffffffffff1661168d8461075d565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806116de576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611747576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156117ae576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bb85858560016122cd565b6117cb6000848460000151611544565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a7c57600054811015611a7b5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ae585858560016122d3565b5050505050565b611b068282604051806020016040528060008152506122d9565b5050565b611b1261153c565b73ffffffffffffffffffffffffffffffffffffffff16611b30610d9f565b73ffffffffffffffffffffffffffffffffffffffff1614611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d906130d5565b60405180910390fd5b565b611b906128c1565b600082905080611b9e6115f6565b11158015611bad575060005481105b15611e4e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611e4c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611cc2578092505050611e80565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611dd857819350505050611e80565b6000816001900391508111611cc957847f000000000000000000000000000000000000000000000000000000000000000001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611e80565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b611e8e816122eb565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eda61153c565b8786866040518563ffffffff1660e01b8152600401611efc9493929190612faa565b602060405180830381600087803b158015611f1657600080fd5b505af1925050508015611f4757506040513d601f19601f82011682018060405250810190611f449190612c5a565b60015b611fc1573d8060008114611f77576040519150601f19603f3d011682016040523d82523d6000602084013e611f7c565b606091505b50600081511415611fb9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612023906134b2565b80601f016020809104026020016040519081016040528092919081815260200182805461204f906134b2565b801561209c5780601f106120715761010080835404028352916020019161209c565b820191906000526020600020905b81548152906001019060200180831161207f57829003601f168201915b5050505050905090565b606060008214156120ee576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612202565b600082905060005b6000821461212057808061210990613515565b915050600a8261211991906132f9565b91506120f6565b60008167ffffffffffffffff81111561213c5761213b61364b565b5b6040519080825280601f01601f19166020018201604052801561216e5781602001600182028036833780820191505090505b5090505b600085146121fb5760018261218791906133b8565b9150600a85612196919061355e565b60306121a291906132a3565b60f81b8183815181106121b8576121b761361c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121f491906132f9565b9450612172565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6122e6838383600161246d565b505050565b6000811415612326576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805490506000828261233a91906132a3565b9050817f00000000000000000000000000000000000000000000000000000000000000006123689190613259565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600082905082806001019350817f00000000000000000000000000000000000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450808214156123be578260008082825461246191906132a3565b92505081905550505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156124da576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612515576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61252260008683876122cd565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156126ec57506126eb8773ffffffffffffffffffffffffffffffffffffffff16611e91565b5b156127b2575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127616000888480600101955088611eb4565b612797576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156126f25782600054146127ad57600080fd5b61281e565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156127b3575b81600081905550505061283460008683876122d3565b5050505050565b828054612847906134b2565b90600052602060002090601f01602090048101928261286957600085556128b0565b82601f1061288257805160ff19168380011785556128b0565b828001600101855582156128b0579182015b828111156128af578251825591602001919060010190612894565b5b5090506128bd9190612904565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561291d576000816000905550600101612905565b5090565b600061293461292f84613170565b61314b565b9050828152602081018484840111156129505761294f61367f565b5b61295b848285613470565b509392505050565b6000612976612971846131a1565b61314b565b9050828152602081018484840111156129925761299161367f565b5b61299d848285613470565b509392505050565b6000813590506129b4816137be565b92915050565b6000813590506129c9816137d5565b92915050565b6000813590506129de816137ec565b92915050565b6000815190506129f3816137ec565b92915050565b600082601f830112612a0e57612a0d61367a565b5b8135612a1e848260208601612921565b91505092915050565b600082601f830112612a3c57612a3b61367a565b5b8135612a4c848260208601612963565b91505092915050565b600081359050612a6481613803565b92915050565b600060208284031215612a8057612a7f613689565b5b6000612a8e848285016129a5565b91505092915050565b60008060408385031215612aae57612aad613689565b5b6000612abc858286016129a5565b9250506020612acd858286016129a5565b9150509250929050565b600080600060608486031215612af057612aef613689565b5b6000612afe868287016129a5565b9350506020612b0f868287016129a5565b9250506040612b2086828701612a55565b9150509250925092565b60008060008060808587031215612b4457612b43613689565b5b6000612b52878288016129a5565b9450506020612b63878288016129a5565b9350506040612b7487828801612a55565b925050606085013567ffffffffffffffff811115612b9557612b94613684565b5b612ba1878288016129f9565b91505092959194509250565b60008060408385031215612bc457612bc3613689565b5b6000612bd2858286016129a5565b9250506020612be3858286016129ba565b9150509250929050565b60008060408385031215612c0457612c03613689565b5b6000612c12858286016129a5565b9250506020612c2385828601612a55565b9150509250929050565b600060208284031215612c4357612c42613689565b5b6000612c51848285016129cf565b91505092915050565b600060208284031215612c7057612c6f613689565b5b6000612c7e848285016129e4565b91505092915050565b600060208284031215612c9d57612c9c613689565b5b600082013567ffffffffffffffff811115612cbb57612cba613684565b5b612cc784828501612a27565b91505092915050565b600060208284031215612ce657612ce5613689565b5b6000612cf484828501612a55565b91505092915050565b6000612d098383612f29565b60208301905092915050565b612d1e816133ec565b82525050565b6000612d2f826131e2565b612d398185613210565b9350612d44836131d2565b8060005b83811015612d75578151612d5c8882612cfd565b9750612d6783613203565b925050600181019050612d48565b5085935050505092915050565b612d8b816133fe565b82525050565b6000612d9c826131ed565b612da68185613221565b9350612db681856020860161347f565b612dbf8161368e565b840191505092915050565b6000612dd5826131f8565b612ddf818561323d565b9350612def81856020860161347f565b612df88161368e565b840191505092915050565b6000612e0e826131f8565b612e18818561324e565b9350612e2881856020860161347f565b80840191505092915050565b6000612e41600c8361323d565b9150612e4c8261369f565b602082019050919050565b6000612e6460268361323d565b9150612e6f826136c8565b604082019050919050565b6000612e8760188361323d565b9150612e9282613717565b602082019050919050565b6000612eaa601e8361323d565b9150612eb582613740565b602082019050919050565b6000612ecd60208361323d565b9150612ed882613769565b602082019050919050565b6000612ef0600083613232565b9150612efb82613792565b600082019050919050565b6000612f13600c8361323d565b9150612f1e82613795565b602082019050919050565b612f3281613456565b82525050565b612f4181613456565b82525050565b612f5081613460565b82525050565b6000612f628285612e03565b9150612f6e8284612e03565b91508190509392505050565b6000612f8582612ee3565b9150819050919050565b6000602082019050612fa46000830184612d15565b92915050565b6000608082019050612fbf6000830187612d15565b612fcc6020830186612d15565b612fd96040830185612f38565b8181036060830152612feb8184612d91565b905095945050505050565b600060208201905081810360008301526130108184612d24565b905092915050565b600060208201905061302d6000830184612d82565b92915050565b6000602082019050818103600083015261304d8184612dca565b905092915050565b6000602082019050818103600083015261306e81612e34565b9050919050565b6000602082019050818103600083015261308e81612e57565b9050919050565b600060208201905081810360008301526130ae81612e7a565b9050919050565b600060208201905081810360008301526130ce81612e9d565b9050919050565b600060208201905081810360008301526130ee81612ec0565b9050919050565b6000602082019050818103600083015261310e81612f06565b9050919050565b600060208201905061312a6000830184612f38565b92915050565b60006020820190506131456000830184612f47565b92915050565b6000613155613166565b905061316182826134e4565b919050565b6000604051905090565b600067ffffffffffffffff82111561318b5761318a61364b565b5b6131948261368e565b9050602081019050919050565b600067ffffffffffffffff8211156131bc576131bb61364b565b5b6131c58261368e565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061326482613436565b915061326f83613436565b92508273ffffffffffffffffffffffffffffffffffffffff038211156132985761329761358f565b5b828201905092915050565b60006132ae82613456565b91506132b983613456565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132ee576132ed61358f565b5b828201905092915050565b600061330482613456565b915061330f83613456565b92508261331f5761331e6135be565b5b828204905092915050565b600061333582613456565b915061334083613456565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133795761337861358f565b5b828202905092915050565b600061338f82613436565b915061339a83613436565b9250828210156133ad576133ac61358f565b5b828203905092915050565b60006133c382613456565b91506133ce83613456565b9250828210156133e1576133e061358f565b5b828203905092915050565b60006133f782613436565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b8381101561349d578082015181840152602081019050613482565b838111156134ac576000848401525b50505050565b600060028204905060018216806134ca57607f821691505b602082108114156134de576134dd6135ed565b5b50919050565b6134ed8261368e565b810181811067ffffffffffffffff8211171561350c5761350b61364b565b5b80604052505050565b600061352082613456565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135535761355261358f565b5b600182019050919050565b600061356982613456565b915061357483613456565b925082613584576135836135be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f6d61782035207065722074780000000000000000000000000000000000000000600082015250565b6137c7816133ec565b81146137d257600080fd5b50565b6137de816133fe565b81146137e957600080fd5b50565b6137f58161340a565b811461380057600080fd5b50565b61380c81613456565b811461381757600080fd5b5056fea2646970667358221220e491eba7d66c8ab6a81a3d6f08dbc917124d3a83dfffccb290b2c2da89dbe35964736f6c63430008070033697066733a2f2f516d614e4e517764474b6e4b3241514574646b75756f344352595136726b38704b6d6e617345576671774c314a5a2f
Deployed Bytecode
0x6080604052600436106101665760003560e01c806370a08231116100d1578063aae4cdcd1161008a578063c87b56dd11610064578063c87b56dd1461051b578063e985e9c514610558578063f2fde38b14610595578063f968adbe146105be57610166565b8063aae4cdcd1461049e578063b88d4fde146104c7578063c4a41225146104f057610166565b806370a082311461037c5780638da5cb5b146103b957806390765665146103e457806395d89b41146104215780639b642de11461044c578063a22cb4651461047557610166565b806323b872dd1161012357806323b872dd1461028f5780632db11544146102b85780633ccfd60b146102d457806342842e0e146102eb57806362b99ad4146103145780636352211e1461033f57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806313faede61461023957806318160ddd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612c2d565b6105e9565b60405161019f9190613018565b60405180910390f35b3480156101b457600080fd5b506101bd6106cb565b6040516101ca9190613033565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612cd0565b61075d565b6040516102079190612f8f565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612bed565b6107d9565b005b34801561024557600080fd5b5061024e6108e4565b60405161025b9190613115565b60405180910390f35b34801561027057600080fd5b50610279610908565b6040516102869190613115565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b19190612ad7565b61091f565b005b6102d260048036038101906102cd9190612cd0565b61092f565b005b3480156102e057600080fd5b506102e9610a81565b005b3480156102f757600080fd5b50610312600480360381019061030d9190612ad7565b610b46565b005b34801561032057600080fd5b50610329610b66565b6040516103369190613033565b60405180910390f35b34801561034b57600080fd5b5061036660048036038101906103619190612cd0565b610bf4565b6040516103739190612f8f565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e9190612a6a565b610c0a565b6040516103b09190613115565b60405180910390f35b3480156103c557600080fd5b506103ce610d9f565b6040516103db9190612f8f565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190612a6a565b610dc9565b6040516104189190612ff6565b60405180910390f35b34801561042d57600080fd5b50610436610fc9565b6040516104439190613033565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190612c87565b61105b565b005b34801561048157600080fd5b5061049c60048036038101906104979190612bad565b61107d565b005b3480156104aa57600080fd5b506104c560048036038101906104c09190612cd0565b6111f5565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190612b2a565b611209565b005b3480156104fc57600080fd5b50610505611285565b6040516105129190613130565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d9190612cd0565b6112a9565b60405161054f9190613033565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190612a97565b611348565b60405161058c9190613018565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190612a6a565b6113dc565b005b3480156105ca57600080fd5b506105d3611460565b6040516105e09190613130565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106c457506106c382611484565b5b9050919050565b6060600280546106da906134b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610706906134b2565b80156107535780601f1061072857610100808354040283529160200191610753565b820191906000526020600020905b81548152906001019060200180831161073657829003601f168201915b5050505050905090565b6000610768826114ee565b61079e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e482610bf4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561084c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086b61153c565b73ffffffffffffffffffffffffffffffffffffffff161415801561089d575061089b8161089661153c565b611348565b155b156108d4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108df838383611544565b505050565b7f000000000000000000000000000000000000000000000000000e35fa931a000081565b60006109126115f6565b6001546000540303905090565b61092a8383836115fb565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461099d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610994906130b5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000563ffffffff16811115610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd906130f5565b60405180910390fd5b807f000000000000000000000000000000000000000000000000000e35fa931a0000610a32919061332a565b341015610a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b90613055565b60405180910390fd5b610a7e3382611aec565b50565b610a89611b0a565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610ab990612f7a565b60006040518083038185875af1925050503d8060008114610af6576040519150601f19603f3d011682016040523d82523d6000602084013e610afb565b606091505b50508091505080610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613095565b60405180910390fd5b505050565b610b6183838360405180602001604052806000815250611209565b505050565b60098054610b73906134b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9f906134b2565b8015610bec5780601f10610bc157610100808354040283529160200191610bec565b820191906000526020600020905b815481529060010190602001808311610bcf57829003601f168201915b505050505081565b6000610bff82611b88565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c72576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610d4257600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610d9a565b6000547f000000000000000000000000521fad559524f59515912c1b80a828fab0a7957083610d719190613384565b73ffffffffffffffffffffffffffffffffffffffff1611610d955760019050610d9a565b600090505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606000610dd683610c0a565b90506000610de2610908565b905060008060008467ffffffffffffffff811115610e0357610e0261364b565b5b604051908082528060200260200182016040528015610e315781602001602082028036833780820191505090505b50905060005b84811015610fbb576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f4457806000015193505b8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610fa75781838681518110610f8c57610f8b61361c565b5b6020026020010181815250508480610fa390613515565b9550505b508080610fb390613515565b915050610e37565b508095505050505050919050565b606060038054610fd8906134b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611004906134b2565b80156110515780601f1061102657610100808354040283529160200191611051565b820191906000526020600020905b81548152906001019060200180831161103457829003601f168201915b5050505050905090565b611063611b0a565b806009908051906020019061107992919061283b565b5050565b61108561153c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ea576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110f761153c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111a461153c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111e99190613018565b60405180910390a35050565b6111fd611b0a565b61120681611e85565b50565b6112148484846115fb565b6112338373ffffffffffffffffffffffffffffffffffffffff16611e91565b8015611248575061124684848484611eb4565b155b1561127f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000115c81565b60606112b4826114ee565b6112ea576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112f4612014565b90506000815114156113155760405180602001604052806000815250611340565b8061131f846120a6565b604051602001611330929190612f56565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113e4611b0a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b90613075565b60405180910390fd5b61145d81612207565b50565b7f000000000000000000000000000000000000000000000000000000000000000581565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816114f96115f6565b11158015611508575060005482105b8015611535575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061160682611b88565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661162d61153c565b73ffffffffffffffffffffffffffffffffffffffff161480611660575061165f826000015161165a61153c565b611348565b5b806116a5575061166e61153c565b73ffffffffffffffffffffffffffffffffffffffff1661168d8461075d565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806116de576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611747576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156117ae576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bb85858560016122cd565b6117cb6000848460000151611544565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a7c57600054811015611a7b5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ae585858560016122d3565b5050505050565b611b068282604051806020016040528060008152506122d9565b5050565b611b1261153c565b73ffffffffffffffffffffffffffffffffffffffff16611b30610d9f565b73ffffffffffffffffffffffffffffffffffffffff1614611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d906130d5565b60405180910390fd5b565b611b906128c1565b600082905080611b9e6115f6565b11158015611bad575060005481105b15611e4e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611e4c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611cc2578092505050611e80565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611dd857819350505050611e80565b6000816001900391508111611cc957847f000000000000000000000000521fad559524f59515912c1b80a828fab0a7957001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611e80565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b611e8e816122eb565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eda61153c565b8786866040518563ffffffff1660e01b8152600401611efc9493929190612faa565b602060405180830381600087803b158015611f1657600080fd5b505af1925050508015611f4757506040513d601f19601f82011682018060405250810190611f449190612c5a565b60015b611fc1573d8060008114611f77576040519150601f19603f3d011682016040523d82523d6000602084013e611f7c565b606091505b50600081511415611fb9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612023906134b2565b80601f016020809104026020016040519081016040528092919081815260200182805461204f906134b2565b801561209c5780601f106120715761010080835404028352916020019161209c565b820191906000526020600020905b81548152906001019060200180831161207f57829003601f168201915b5050505050905090565b606060008214156120ee576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612202565b600082905060005b6000821461212057808061210990613515565b915050600a8261211991906132f9565b91506120f6565b60008167ffffffffffffffff81111561213c5761213b61364b565b5b6040519080825280601f01601f19166020018201604052801561216e5781602001600182028036833780820191505090505b5090505b600085146121fb5760018261218791906133b8565b9150600a85612196919061355e565b60306121a291906132a3565b60f81b8183815181106121b8576121b761361c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121f491906132f9565b9450612172565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6122e6838383600161246d565b505050565b6000811415612326576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805490506000828261233a91906132a3565b9050817f000000000000000000000000521fad559524f59515912c1b80a828fab0a795706123689190613259565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600082905082806001019350817f000000000000000000000000521fad559524f59515912c1b80a828fab0a795700173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450808214156123be578260008082825461246191906132a3565b92505081905550505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156124da576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612515576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61252260008683876122cd565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156126ec57506126eb8773ffffffffffffffffffffffffffffffffffffffff16611e91565b5b156127b2575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127616000888480600101955088611eb4565b612797576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156126f25782600054146127ad57600080fd5b61281e565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156127b3575b81600081905550505061283460008683876122d3565b5050505050565b828054612847906134b2565b90600052602060002090601f01602090048101928261286957600085556128b0565b82601f1061288257805160ff19168380011785556128b0565b828001600101855582156128b0579182015b828111156128af578251825591602001919060010190612894565b5b5090506128bd9190612904565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561291d576000816000905550600101612905565b5090565b600061293461292f84613170565b61314b565b9050828152602081018484840111156129505761294f61367f565b5b61295b848285613470565b509392505050565b6000612976612971846131a1565b61314b565b9050828152602081018484840111156129925761299161367f565b5b61299d848285613470565b509392505050565b6000813590506129b4816137be565b92915050565b6000813590506129c9816137d5565b92915050565b6000813590506129de816137ec565b92915050565b6000815190506129f3816137ec565b92915050565b600082601f830112612a0e57612a0d61367a565b5b8135612a1e848260208601612921565b91505092915050565b600082601f830112612a3c57612a3b61367a565b5b8135612a4c848260208601612963565b91505092915050565b600081359050612a6481613803565b92915050565b600060208284031215612a8057612a7f613689565b5b6000612a8e848285016129a5565b91505092915050565b60008060408385031215612aae57612aad613689565b5b6000612abc858286016129a5565b9250506020612acd858286016129a5565b9150509250929050565b600080600060608486031215612af057612aef613689565b5b6000612afe868287016129a5565b9350506020612b0f868287016129a5565b9250506040612b2086828701612a55565b9150509250925092565b60008060008060808587031215612b4457612b43613689565b5b6000612b52878288016129a5565b9450506020612b63878288016129a5565b9350506040612b7487828801612a55565b925050606085013567ffffffffffffffff811115612b9557612b94613684565b5b612ba1878288016129f9565b91505092959194509250565b60008060408385031215612bc457612bc3613689565b5b6000612bd2858286016129a5565b9250506020612be3858286016129ba565b9150509250929050565b60008060408385031215612c0457612c03613689565b5b6000612c12858286016129a5565b9250506020612c2385828601612a55565b9150509250929050565b600060208284031215612c4357612c42613689565b5b6000612c51848285016129cf565b91505092915050565b600060208284031215612c7057612c6f613689565b5b6000612c7e848285016129e4565b91505092915050565b600060208284031215612c9d57612c9c613689565b5b600082013567ffffffffffffffff811115612cbb57612cba613684565b5b612cc784828501612a27565b91505092915050565b600060208284031215612ce657612ce5613689565b5b6000612cf484828501612a55565b91505092915050565b6000612d098383612f29565b60208301905092915050565b612d1e816133ec565b82525050565b6000612d2f826131e2565b612d398185613210565b9350612d44836131d2565b8060005b83811015612d75578151612d5c8882612cfd565b9750612d6783613203565b925050600181019050612d48565b5085935050505092915050565b612d8b816133fe565b82525050565b6000612d9c826131ed565b612da68185613221565b9350612db681856020860161347f565b612dbf8161368e565b840191505092915050565b6000612dd5826131f8565b612ddf818561323d565b9350612def81856020860161347f565b612df88161368e565b840191505092915050565b6000612e0e826131f8565b612e18818561324e565b9350612e2881856020860161347f565b80840191505092915050565b6000612e41600c8361323d565b9150612e4c8261369f565b602082019050919050565b6000612e6460268361323d565b9150612e6f826136c8565b604082019050919050565b6000612e8760188361323d565b9150612e9282613717565b602082019050919050565b6000612eaa601e8361323d565b9150612eb582613740565b602082019050919050565b6000612ecd60208361323d565b9150612ed882613769565b602082019050919050565b6000612ef0600083613232565b9150612efb82613792565b600082019050919050565b6000612f13600c8361323d565b9150612f1e82613795565b602082019050919050565b612f3281613456565b82525050565b612f4181613456565b82525050565b612f5081613460565b82525050565b6000612f628285612e03565b9150612f6e8284612e03565b91508190509392505050565b6000612f8582612ee3565b9150819050919050565b6000602082019050612fa46000830184612d15565b92915050565b6000608082019050612fbf6000830187612d15565b612fcc6020830186612d15565b612fd96040830185612f38565b8181036060830152612feb8184612d91565b905095945050505050565b600060208201905081810360008301526130108184612d24565b905092915050565b600060208201905061302d6000830184612d82565b92915050565b6000602082019050818103600083015261304d8184612dca565b905092915050565b6000602082019050818103600083015261306e81612e34565b9050919050565b6000602082019050818103600083015261308e81612e57565b9050919050565b600060208201905081810360008301526130ae81612e7a565b9050919050565b600060208201905081810360008301526130ce81612e9d565b9050919050565b600060208201905081810360008301526130ee81612ec0565b9050919050565b6000602082019050818103600083015261310e81612f06565b9050919050565b600060208201905061312a6000830184612f38565b92915050565b60006020820190506131456000830184612f47565b92915050565b6000613155613166565b905061316182826134e4565b919050565b6000604051905090565b600067ffffffffffffffff82111561318b5761318a61364b565b5b6131948261368e565b9050602081019050919050565b600067ffffffffffffffff8211156131bc576131bb61364b565b5b6131c58261368e565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061326482613436565b915061326f83613436565b92508273ffffffffffffffffffffffffffffffffffffffff038211156132985761329761358f565b5b828201905092915050565b60006132ae82613456565b91506132b983613456565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132ee576132ed61358f565b5b828201905092915050565b600061330482613456565b915061330f83613456565b92508261331f5761331e6135be565b5b828204905092915050565b600061333582613456565b915061334083613456565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133795761337861358f565b5b828202905092915050565b600061338f82613436565b915061339a83613436565b9250828210156133ad576133ac61358f565b5b828203905092915050565b60006133c382613456565b91506133ce83613456565b9250828210156133e1576133e061358f565b5b828203905092915050565b60006133f782613436565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b8381101561349d578082015181840152602081019050613482565b838111156134ac576000848401525b50505050565b600060028204905060018216806134ca57607f821691505b602082108114156134de576134dd6135ed565b5b50919050565b6134ed8261368e565b810181811067ffffffffffffffff8211171561350c5761350b61364b565b5b80604052505050565b600061352082613456565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135535761355261358f565b5b600182019050919050565b600061356982613456565b915061357483613456565b925082613584576135836135be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f6d61782035207065722074780000000000000000000000000000000000000000600082015250565b6137c7816133ec565b81146137d257600080fd5b50565b6137de816133fe565b81146137e957600080fd5b50565b6137f58161340a565b811461380057600080fd5b50565b61380c81613456565b811461381757600080fd5b5056fea2646970667358221220e491eba7d66c8ab6a81a3d6f08dbc917124d3a83dfffccb290b2c2da89dbe35964736f6c63430008070033
Deployed Bytecode Sourcemap
48413:2253:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28616:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32477:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33980:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33543:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48561:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27865:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34837:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49237:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50385:278;;;;;;;;;;;;;:::i;:::-;;35078:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48469:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32286:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28987:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4803:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49572:805;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32646:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49025:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34256:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49472:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35334:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48611:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32821:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34606:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5255:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48658:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28616:305;28718:4;28770:25;28755:40;;;:11;:40;;;;:105;;;;28827:33;28812:48;;;:11;:48;;;;28755:105;:158;;;;28877:36;28901:11;28877:23;:36::i;:::-;28755:158;28735:178;;28616:305;;;:::o;32477:100::-;32531:13;32564:5;32557:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32477:100;:::o;33980:204::-;34048:7;34073:16;34081:7;34073;:16::i;:::-;34068:64;;34098:34;;;;;;;;;;;;;;34068:64;34152:15;:24;34168:7;34152:24;;;;;;;;;;;;;;;;;;;;;34145:31;;33980:204;;;:::o;33543:371::-;33616:13;33632:24;33648:7;33632:15;:24::i;:::-;33616:40;;33677:5;33671:11;;:2;:11;;;33667:48;;;33691:24;;;;;;;;;;;;;;33667:48;33748:5;33732:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33758:37;33775:5;33782:12;:10;:12::i;:::-;33758:16;:37::i;:::-;33757:38;33732:63;33728:138;;;33819:35;;;;;;;;;;;;;;33728:138;33878:28;33887:2;33891:7;33900:5;33878:8;:28::i;:::-;33605:309;33543:371;;:::o;48561:43::-;;;:::o;27865:303::-;27909:7;28134:15;:13;:15::i;:::-;28119:12;;28103:13;;:28;:46;28096:53;;27865:303;:::o;34837:170::-;34971:28;34981:4;34987:2;34991:7;34971:9;:28::i;:::-;34837:170;;;:::o;49237:227::-;48759:10;48746:23;;:9;:23;;;48738:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49330:8:::1;49319:19;;:6;:19;;49311:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;49394:6;49387:4;:13;;;;:::i;:::-;49374:9;:26;;49366:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;49427:29;49437:10;49449:6;49427:9;:29::i;:::-;49237:227:::0;:::o;50385:278::-;4689:13;:11;:13::i;:::-;50433:18:::1;50454:21;50433:42;;50488:9;50508:10;50488:31;;50532:12;50571:1;:6;;50585:10;50571:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50557:43;;;;;50619:7;50611:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;50422:241;;;50385:278::o:0;35078:185::-;35216:39;35233:4;35239:2;35243:7;35216:39;;;;;;;;;;;;:16;:39::i;:::-;35078:185;;;:::o;48469:83::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32286:124::-;32350:7;32377:20;32389:7;32377:11;:20::i;:::-;:25;;;32370:32;;32286:124;;;:::o;28987:395::-;29051:7;29092:1;29075:19;;:5;:19;;;29071:60;;;29103:28;;;;;;;;;;;;;;29071:60;29179:1;29148:12;:19;29161:5;29148:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:32;;;29144:108;;29212:12;:19;29225:5;29212:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29204:36;;29197:43;;;;29144:108;29304:13;;29293:6;29276:5;29268:32;;;;:::i;:::-;:49;;;29264:90;;29341:1;29334:8;;;;29264:90;29373:1;29366:8;;28987:395;;;;:::o;4803:87::-;4849:7;4876:6;;;;;;;;;;;4869:13;;4803:87;:::o;49572:805::-;49635:13;49660:15;49678:16;49688:5;49678:9;:16::i;:::-;49660:34;;49706:22;49731:13;:11;:13::i;:::-;49706:38;;49755:19;49789:25;49838:22;49877:10;49863:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49838:50;;49904:9;49899:375;49923:14;49919:1;:18;49899:375;;;49959:31;49993:11;:14;50005:1;49993:14;;;;;;;;;;;49959:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50052:1;50026:28;;:9;:14;;;:28;;;50022:103;;50095:9;:14;;;50075:34;;50022:103;50164:5;50143:26;;:17;:26;;;50139:124;;;50214:1;50190:8;50199:11;50190:21;;;;;;;;:::i;:::-;;;;;;;:25;;;;;50234:13;;;;;:::i;:::-;;;;50139:124;49944:330;49939:3;;;;;:::i;:::-;;;;49899:375;;;;50361:8;50354:15;;;;;;;49572:805;;;:::o;32646:104::-;32702:13;32735:7;32728:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32646:104;:::o;49025:86::-;4689:13;:11;:13::i;:::-;49100:3:::1;49088:9;:15;;;;;;;;;;;;:::i;:::-;;49025:86:::0;:::o;34256:279::-;34359:12;:10;:12::i;:::-;34347:24;;:8;:24;;;34343:54;;;34380:17;;;;;;;;;;;;;;34343:54;34455:8;34410:18;:32;34429:12;:10;:12::i;:::-;34410:32;;;;;;;;;;;;;;;:42;34443:8;34410:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34508:8;34479:48;;34494:12;:10;:12::i;:::-;34479:48;;;34518:8;34479:48;;;;;;:::i;:::-;;;;;;;;34256:279;;:::o;49472:92::-;4689:13;:11;:13::i;:::-;49539:17:::1;49549:6;49539:9;:17::i;:::-;49472:92:::0;:::o;35334:369::-;35501:28;35511:4;35517:2;35521:7;35501:9;:28::i;:::-;35544:15;:2;:13;;;:15::i;:::-;:76;;;;;35564:56;35595:4;35601:2;35605:7;35614:5;35564:30;:56::i;:::-;35563:57;35544:76;35540:156;;;35644:40;;;;;;;;;;;;;;35540:156;35334:369;;;;:::o;48611:40::-;;;:::o;32821:318::-;32894:13;32925:16;32933:7;32925;:16::i;:::-;32920:59;;32950:29;;;;;;;;;;;;;;32920:59;32992:21;33016:10;:8;:10::i;:::-;32992:34;;33069:1;33050:7;33044:21;:26;;:87;;;;;;;;;;;;;;;;;33097:7;33106:18;:7;:16;:18::i;:::-;33080:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33044:87;33037:94;;;32821:318;;;:::o;34606:164::-;34703:4;34727:18;:25;34746:5;34727:25;;;;;;;;;;;;;;;:35;34753:8;34727:35;;;;;;;;;;;;;;;;;;;;;;;;;34720:42;;34606:164;;;;:::o;5255:201::-;4689:13;:11;:13::i;:::-;5364:1:::1;5344:22;;:8;:22;;;;5336:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5420:28;5439:8;5420:18;:28::i;:::-;5255:201:::0;:::o;48658:36::-;;;:::o;17203:157::-;17288:4;17327:25;17312:40;;;:11;:40;;;;17305:47;;17203:157;;;:::o;35958:187::-;36015:4;36058:7;36039:15;:13;:15::i;:::-;:26;;:53;;;;;36079:13;;36069:7;:23;36039:53;:98;;;;;36110:11;:20;36122:7;36110:20;;;;;;;;;;;:27;;;;;;;;;;;;36109:28;36039:98;36032:105;;35958:187;;;:::o;3354:98::-;3407:7;3434:10;3427:17;;3354:98;:::o;45397:196::-;45539:2;45512:15;:24;45528:7;45512:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45577:7;45573:2;45557:28;;45566:5;45557:28;;;;;;;;;;;;45397:196;;;:::o;49119:110::-;49193:7;49119:110;:::o;40899:2112::-;41014:35;41052:20;41064:7;41052:11;:20::i;:::-;41014:58;;41085:22;41127:13;:18;;;41111:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;41162:50;41179:13;:18;;;41199:12;:10;:12::i;:::-;41162:16;:50::i;:::-;41111:101;:154;;;;41253:12;:10;:12::i;:::-;41229:36;;:20;41241:7;41229:11;:20::i;:::-;:36;;;41111:154;41085:181;;41284:17;41279:66;;41310:35;;;;;;;;;;;;;;41279:66;41382:4;41360:26;;:13;:18;;;:26;;;41356:67;;41395:28;;;;;;;;;;;;;;41356:67;41452:1;41438:16;;:2;:16;;;41434:52;;;41463:23;;;;;;;;;;;;;;41434:52;41499:43;41521:4;41527:2;41531:7;41540:1;41499:21;:43::i;:::-;41607:49;41624:1;41628:7;41637:13;:18;;;41607:8;:49::i;:::-;41982:1;41952:12;:18;41965:4;41952:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42026:1;41998:12;:16;42011:2;41998:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42072:2;42044:11;:20;42056:7;42044:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;42134:15;42089:11;:20;42101:7;42089:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;42402:19;42434:1;42424:7;:11;42402:33;;42495:1;42454:43;;:11;:24;42466:11;42454:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;42450:445;;;42679:13;;42665:11;:27;42661:219;;;42749:13;:18;;;42717:11;:24;42729:11;42717:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;42832:13;:28;;;42790:11;:24;42802:11;42790:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;42661:219;42450:445;41927:979;42942:7;42938:2;42923:27;;42932:4;42923:27;;;;;;;;;;;;42961:42;42982:4;42988:2;42992:7;43001:1;42961:20;:42::i;:::-;41003:2008;;40899:2112;;;:::o;36153:104::-;36222:27;36232:2;36236:8;36222:27;;;;;;;;;;;;:9;:27::i;:::-;36153:104;;:::o;4968:132::-;5043:12;:10;:12::i;:::-;5032:23;;:7;:5;:7::i;:::-;:23;;;5024:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4968:132::o;30917:1307::-;30978:21;;:::i;:::-;31012:12;31027:7;31012:22;;31095:4;31076:15;:13;:15::i;:::-;:23;;:47;;;;;31110:13;;31103:4;:20;31076:47;31072:1085;;;31144:31;31178:11;:17;31190:4;31178:17;;;;;;;;;;;31144:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31219:9;:16;;;31214:924;;31290:1;31264:28;;:9;:14;;;:28;;;31260:101;;31328:9;31321:16;;;;;;31260:101;31665:13;31681:1;31665:17;;31705:270;31734:6;;;;;;;;31779:11;:17;31791:4;31779:17;;;;;;;;;;;31767:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31853:1;31827:28;;:9;:14;;;:28;;;31823:109;;31895:9;31888:16;;;;;;;31823:109;31972:1;31962:7;;;;;;;:11;31705:270;;32070:7;32052:6;32044:34;32019:9;:14;;:60;;;;;;;;;;;32109:9;32102:16;;;;;;;31214:924;31125:1032;31072:1085;32185:31;;;;;;;;;;;;;;30917:1307;;;;:::o;36791:116::-;36876:19;36886:8;36876:9;:19::i;:::-;36791:116;:::o;7047:326::-;7107:4;7364:1;7342:7;:19;;;:23;7335:30;;7047:326;;;:::o;46085:667::-;46248:4;46285:2;46269:36;;;46306:12;:10;:12::i;:::-;46320:4;46326:7;46335:5;46269:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46265:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46520:1;46503:6;:13;:18;46499:235;;;46549:40;;;;;;;;;;;;;;46499:235;46692:6;46686:13;46677:6;46673:2;46669:15;46662:38;46265:480;46398:45;;;46388:55;;;:6;:55;;;;46381:62;;;46085:667;;;;;;:::o;48906:111::-;48967:13;49000:9;48993:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48906:111;:::o;608:723::-;664:13;894:1;885:5;:10;881:53;;;912:10;;;;;;;;;;;;;;;;;;;;;881:53;944:12;959:5;944:20;;975:14;1000:78;1015:1;1007:4;:9;1000:78;;1033:8;;;;;:::i;:::-;;;;1064:2;1056:10;;;;;:::i;:::-;;;1000:78;;;1088:19;1120:6;1110:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1088:39;;1138:154;1154:1;1145:5;:10;1138:154;;1182:1;1172:11;;;;;:::i;:::-;;;1249:2;1241:5;:10;;;;:::i;:::-;1228:2;:24;;;;:::i;:::-;1215:39;;1198:6;1205;1198:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1278:2;1269:11;;;;;:::i;:::-;;;1138:154;;;1316:6;1302:21;;;;;608:723;;;;:::o;5616:191::-;5690:16;5709:6;;;;;;;;;;;5690:25;;5735:8;5726:6;;:17;;;;;;;;;;;;;;;;;;5790:8;5759:40;;5780:8;5759:40;;;;;;;;;;;;5679:128;5616:191;:::o;47400:159::-;;;;;:::o;48218:158::-;;;;;:::o;36620:163::-;36743:32;36749:2;36753:8;36763:5;36770:4;36743:5;:32::i;:::-;36620:163;;;:::o;38949:1696::-;39104:1;39092:8;:13;39088:44;;;39114:18;;;;;;;;;;;;;;39088:44;39215:20;39238:13;;39215:36;;39266:11;39295:8;39280:12;:23;;;;:::i;:::-;39266:37;;39388:12;39370:6;39362:39;;;;:::i;:::-;39320:11;:26;39332:13;;39320:26;;;;;;;;;;;:31;;;:82;;;;;;;;;;;;;;;;;;39446:216;39472:14;39497:12;39472:38;;39594:14;;;;;;39585:6;39575;39567:24;39538:71;;39555:1;39538:71;;;;;;;;;;;;39449:184;39657:3;39641:12;:19;;39446:216;;39728:8;39711:13;;:25;;;;;;;:::i;:::-;;;;;;;;39019:1626;;38949:1696;:::o;37166:1775::-;37305:20;37328:13;;37305:36;;37370:1;37356:16;;:2;:16;;;37352:48;;;37381:19;;;;;;;;;;;;;;37352:48;37427:1;37415:8;:13;37411:44;;;37437:18;;;;;;;;;;;;;;37411:44;37468:61;37498:1;37502:2;37506:12;37520:8;37468:21;:61::i;:::-;37841:8;37806:12;:16;37819:2;37806:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37905:8;37865:12;:16;37878:2;37865:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37964:2;37931:11;:25;37943:12;37931:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38031:15;37981:11;:25;37993:12;37981:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38064:20;38087:12;38064:35;;38114:11;38143:8;38128:12;:23;38114:37;;38172:4;:23;;;;;38180:15;:2;:13;;;:15::i;:::-;38172:23;38168:641;;;38216:314;38272:12;38268:2;38247:38;;38264:1;38247:38;;;;;;;;;;;;38313:69;38352:1;38356:2;38360:14;;;;;;38376:5;38313:30;:69::i;:::-;38308:174;;38418:40;;;;;;;;;;;;;;38308:174;38525:3;38509:12;:19;;38216:314;;38611:12;38594:13;;:29;38590:43;;38625:8;;;38590:43;38168:641;;;38674:120;38730:14;;;;;;38726:2;38705:40;;38722:1;38705:40;;;;;;;;;;;;38789:3;38773:12;:19;;38674:120;;38168:641;38839:12;38823:13;:28;;;;37781:1082;;38873:60;38902:1;38906:2;38910:12;38924:8;38873:20;:60::i;:::-;37294:1647;37166:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:179::-;7227:10;7248:46;7290:3;7282:6;7248:46;:::i;:::-;7326:4;7321:3;7317:14;7303:28;;7158:179;;;;:::o;7343:118::-;7430:24;7448:5;7430:24;:::i;:::-;7425:3;7418:37;7343:118;;:::o;7497:732::-;7616:3;7645:54;7693:5;7645:54;:::i;:::-;7715:86;7794:6;7789:3;7715:86;:::i;:::-;7708:93;;7825:56;7875:5;7825:56;:::i;:::-;7904:7;7935:1;7920:284;7945:6;7942:1;7939:13;7920:284;;;8021:6;8015:13;8048:63;8107:3;8092:13;8048:63;:::i;:::-;8041:70;;8134:60;8187:6;8134:60;:::i;:::-;8124:70;;7980:224;7967:1;7964;7960:9;7955:14;;7920:284;;;7924:14;8220:3;8213:10;;7621:608;;;7497:732;;;;:::o;8235:109::-;8316:21;8331:5;8316:21;:::i;:::-;8311:3;8304:34;8235:109;;:::o;8350:360::-;8436:3;8464:38;8496:5;8464:38;:::i;:::-;8518:70;8581:6;8576:3;8518:70;:::i;:::-;8511:77;;8597:52;8642:6;8637:3;8630:4;8623:5;8619:16;8597:52;:::i;:::-;8674:29;8696:6;8674:29;:::i;:::-;8669:3;8665:39;8658:46;;8440:270;8350:360;;;;:::o;8716:364::-;8804:3;8832:39;8865:5;8832:39;:::i;:::-;8887:71;8951:6;8946:3;8887:71;:::i;:::-;8880:78;;8967:52;9012:6;9007:3;9000:4;8993:5;8989:16;8967:52;:::i;:::-;9044:29;9066:6;9044:29;:::i;:::-;9039:3;9035:39;9028:46;;8808:272;8716:364;;;;:::o;9086:377::-;9192:3;9220:39;9253:5;9220:39;:::i;:::-;9275:89;9357:6;9352:3;9275:89;:::i;:::-;9268:96;;9373:52;9418:6;9413:3;9406:4;9399:5;9395:16;9373:52;:::i;:::-;9450:6;9445:3;9441:16;9434:23;;9196:267;9086:377;;;;:::o;9469:366::-;9611:3;9632:67;9696:2;9691:3;9632:67;:::i;:::-;9625:74;;9708:93;9797:3;9708:93;:::i;:::-;9826:2;9821:3;9817:12;9810:19;;9469:366;;;:::o;9841:::-;9983:3;10004:67;10068:2;10063:3;10004:67;:::i;:::-;9997:74;;10080:93;10169:3;10080:93;:::i;:::-;10198:2;10193:3;10189:12;10182:19;;9841:366;;;:::o;10213:::-;10355:3;10376:67;10440:2;10435:3;10376:67;:::i;:::-;10369:74;;10452:93;10541:3;10452:93;:::i;:::-;10570:2;10565:3;10561:12;10554:19;;10213:366;;;:::o;10585:::-;10727:3;10748:67;10812:2;10807:3;10748:67;:::i;:::-;10741:74;;10824:93;10913:3;10824:93;:::i;:::-;10942:2;10937:3;10933:12;10926:19;;10585:366;;;:::o;10957:::-;11099:3;11120:67;11184:2;11179:3;11120:67;:::i;:::-;11113:74;;11196:93;11285:3;11196:93;:::i;:::-;11314:2;11309:3;11305:12;11298:19;;10957:366;;;:::o;11329:398::-;11488:3;11509:83;11590:1;11585:3;11509:83;:::i;:::-;11502:90;;11601:93;11690:3;11601:93;:::i;:::-;11719:1;11714:3;11710:11;11703:18;;11329:398;;;:::o;11733:366::-;11875:3;11896:67;11960:2;11955:3;11896:67;:::i;:::-;11889:74;;11972:93;12061:3;11972:93;:::i;:::-;12090:2;12085:3;12081:12;12074:19;;11733:366;;;:::o;12105:108::-;12182:24;12200:5;12182:24;:::i;:::-;12177:3;12170:37;12105:108;;:::o;12219:118::-;12306:24;12324:5;12306:24;:::i;:::-;12301:3;12294:37;12219:118;;:::o;12343:115::-;12428:23;12445:5;12428:23;:::i;:::-;12423:3;12416:36;12343:115;;:::o;12464:435::-;12644:3;12666:95;12757:3;12748:6;12666:95;:::i;:::-;12659:102;;12778:95;12869:3;12860:6;12778:95;:::i;:::-;12771:102;;12890:3;12883:10;;12464:435;;;;;:::o;12905:379::-;13089:3;13111:147;13254:3;13111:147;:::i;:::-;13104:154;;13275:3;13268:10;;12905:379;;;:::o;13290:222::-;13383:4;13421:2;13410:9;13406:18;13398:26;;13434:71;13502:1;13491:9;13487:17;13478:6;13434:71;:::i;:::-;13290:222;;;;:::o;13518:640::-;13713:4;13751:3;13740:9;13736:19;13728:27;;13765:71;13833:1;13822:9;13818:17;13809:6;13765:71;:::i;:::-;13846:72;13914:2;13903:9;13899:18;13890:6;13846:72;:::i;:::-;13928;13996:2;13985:9;13981:18;13972:6;13928:72;:::i;:::-;14047:9;14041:4;14037:20;14032:2;14021:9;14017:18;14010:48;14075:76;14146:4;14137:6;14075:76;:::i;:::-;14067:84;;13518:640;;;;;;;:::o;14164:373::-;14307:4;14345:2;14334:9;14330:18;14322:26;;14394:9;14388:4;14384:20;14380:1;14369:9;14365:17;14358:47;14422:108;14525:4;14516:6;14422:108;:::i;:::-;14414:116;;14164:373;;;;:::o;14543:210::-;14630:4;14668:2;14657:9;14653:18;14645:26;;14681:65;14743:1;14732:9;14728:17;14719:6;14681:65;:::i;:::-;14543:210;;;;:::o;14759:313::-;14872:4;14910:2;14899:9;14895:18;14887:26;;14959:9;14953:4;14949:20;14945:1;14934:9;14930:17;14923:47;14987:78;15060:4;15051:6;14987:78;:::i;:::-;14979:86;;14759:313;;;;:::o;15078:419::-;15244:4;15282:2;15271:9;15267:18;15259:26;;15331:9;15325:4;15321:20;15317:1;15306:9;15302:17;15295:47;15359:131;15485:4;15359:131;:::i;:::-;15351:139;;15078:419;;;:::o;15503:::-;15669:4;15707:2;15696:9;15692:18;15684:26;;15756:9;15750:4;15746:20;15742:1;15731:9;15727:17;15720:47;15784:131;15910:4;15784:131;:::i;:::-;15776:139;;15503:419;;;:::o;15928:::-;16094:4;16132:2;16121:9;16117:18;16109:26;;16181:9;16175:4;16171:20;16167:1;16156:9;16152:17;16145:47;16209:131;16335:4;16209:131;:::i;:::-;16201:139;;15928:419;;;:::o;16353:::-;16519:4;16557:2;16546:9;16542:18;16534:26;;16606:9;16600:4;16596:20;16592:1;16581:9;16577:17;16570:47;16634:131;16760:4;16634:131;:::i;:::-;16626:139;;16353:419;;;:::o;16778:::-;16944:4;16982:2;16971:9;16967:18;16959:26;;17031:9;17025:4;17021:20;17017:1;17006:9;17002:17;16995:47;17059:131;17185:4;17059:131;:::i;:::-;17051:139;;16778:419;;;:::o;17203:::-;17369:4;17407:2;17396:9;17392:18;17384:26;;17456:9;17450:4;17446:20;17442:1;17431:9;17427:17;17420:47;17484:131;17610:4;17484:131;:::i;:::-;17476:139;;17203:419;;;:::o;17628:222::-;17721:4;17759:2;17748:9;17744:18;17736:26;;17772:71;17840:1;17829:9;17825:17;17816:6;17772:71;:::i;:::-;17628:222;;;;:::o;17856:218::-;17947:4;17985:2;17974:9;17970:18;17962:26;;17998:69;18064:1;18053:9;18049:17;18040:6;17998:69;:::i;:::-;17856:218;;;;:::o;18080:129::-;18114:6;18141:20;;:::i;:::-;18131:30;;18170:33;18198:4;18190:6;18170:33;:::i;:::-;18080:129;;;:::o;18215:75::-;18248:6;18281:2;18275:9;18265:19;;18215:75;:::o;18296:307::-;18357:4;18447:18;18439:6;18436:30;18433:56;;;18469:18;;:::i;:::-;18433:56;18507:29;18529:6;18507:29;:::i;:::-;18499:37;;18591:4;18585;18581:15;18573:23;;18296:307;;;:::o;18609:308::-;18671:4;18761:18;18753:6;18750:30;18747:56;;;18783:18;;:::i;:::-;18747:56;18821:29;18843:6;18821:29;:::i;:::-;18813:37;;18905:4;18899;18895:15;18887:23;;18609:308;;;:::o;18923:132::-;18990:4;19013:3;19005:11;;19043:4;19038:3;19034:14;19026:22;;18923:132;;;:::o;19061:114::-;19128:6;19162:5;19156:12;19146:22;;19061:114;;;:::o;19181:98::-;19232:6;19266:5;19260:12;19250:22;;19181:98;;;:::o;19285:99::-;19337:6;19371:5;19365:12;19355:22;;19285:99;;;:::o;19390:113::-;19460:4;19492;19487:3;19483:14;19475:22;;19390:113;;;:::o;19509:184::-;19608:11;19642:6;19637:3;19630:19;19682:4;19677:3;19673:14;19658:29;;19509:184;;;;:::o;19699:168::-;19782:11;19816:6;19811:3;19804:19;19856:4;19851:3;19847:14;19832:29;;19699:168;;;;:::o;19873:147::-;19974:11;20011:3;19996:18;;19873:147;;;;:::o;20026:169::-;20110:11;20144:6;20139:3;20132:19;20184:4;20179:3;20175:14;20160:29;;20026:169;;;;:::o;20201:148::-;20303:11;20340:3;20325:18;;20201:148;;;;:::o;20355:281::-;20395:3;20414:20;20432:1;20414:20;:::i;:::-;20409:25;;20448:20;20466:1;20448:20;:::i;:::-;20443:25;;20578:1;20534:42;20530:50;20527:1;20524:57;20521:83;;;20584:18;;:::i;:::-;20521:83;20628:1;20625;20621:9;20614:16;;20355:281;;;;:::o;20642:305::-;20682:3;20701:20;20719:1;20701:20;:::i;:::-;20696:25;;20735:20;20753:1;20735:20;:::i;:::-;20730:25;;20889:1;20821:66;20817:74;20814:1;20811:81;20808:107;;;20895:18;;:::i;:::-;20808:107;20939:1;20936;20932:9;20925:16;;20642:305;;;;:::o;20953:185::-;20993:1;21010:20;21028:1;21010:20;:::i;:::-;21005:25;;21044:20;21062:1;21044:20;:::i;:::-;21039:25;;21083:1;21073:35;;21088:18;;:::i;:::-;21073:35;21130:1;21127;21123:9;21118:14;;20953:185;;;;:::o;21144:348::-;21184:7;21207:20;21225:1;21207:20;:::i;:::-;21202:25;;21241:20;21259:1;21241:20;:::i;:::-;21236:25;;21429:1;21361:66;21357:74;21354:1;21351:81;21346:1;21339:9;21332:17;21328:105;21325:131;;;21436:18;;:::i;:::-;21325:131;21484:1;21481;21477:9;21466:20;;21144:348;;;;:::o;21498:191::-;21538:4;21558:20;21576:1;21558:20;:::i;:::-;21553:25;;21592:20;21610:1;21592:20;:::i;:::-;21587:25;;21631:1;21628;21625:8;21622:34;;;21636:18;;:::i;:::-;21622:34;21681:1;21678;21674:9;21666:17;;21498:191;;;;:::o;21695:::-;21735:4;21755:20;21773:1;21755:20;:::i;:::-;21750:25;;21789:20;21807:1;21789:20;:::i;:::-;21784:25;;21828:1;21825;21822:8;21819:34;;;21833:18;;:::i;:::-;21819:34;21878:1;21875;21871:9;21863:17;;21695:191;;;;:::o;21892:96::-;21929:7;21958:24;21976:5;21958:24;:::i;:::-;21947:35;;21892:96;;;:::o;21994:90::-;22028:7;22071:5;22064:13;22057:21;22046:32;;21994:90;;;:::o;22090:149::-;22126:7;22166:66;22159:5;22155:78;22144:89;;22090:149;;;:::o;22245:126::-;22282:7;22322:42;22315:5;22311:54;22300:65;;22245:126;;;:::o;22377:77::-;22414:7;22443:5;22432:16;;22377:77;;;:::o;22460:93::-;22496:7;22536:10;22529:5;22525:22;22514:33;;22460:93;;;:::o;22559:154::-;22643:6;22638:3;22633;22620:30;22705:1;22696:6;22691:3;22687:16;22680:27;22559:154;;;:::o;22719:307::-;22787:1;22797:113;22811:6;22808:1;22805:13;22797:113;;;22896:1;22891:3;22887:11;22881:18;22877:1;22872:3;22868:11;22861:39;22833:2;22830:1;22826:10;22821:15;;22797:113;;;22928:6;22925:1;22922:13;22919:101;;;23008:1;22999:6;22994:3;22990:16;22983:27;22919:101;22768:258;22719:307;;;:::o;23032:320::-;23076:6;23113:1;23107:4;23103:12;23093:22;;23160:1;23154:4;23150:12;23181:18;23171:81;;23237:4;23229:6;23225:17;23215:27;;23171:81;23299:2;23291:6;23288:14;23268:18;23265:38;23262:84;;;23318:18;;:::i;:::-;23262:84;23083:269;23032:320;;;:::o;23358:281::-;23441:27;23463:4;23441:27;:::i;:::-;23433:6;23429:40;23571:6;23559:10;23556:22;23535:18;23523:10;23520:34;23517:62;23514:88;;;23582:18;;:::i;:::-;23514:88;23622:10;23618:2;23611:22;23401:238;23358:281;;:::o;23645:233::-;23684:3;23707:24;23725:5;23707:24;:::i;:::-;23698:33;;23753:66;23746:5;23743:77;23740:103;;;23823:18;;:::i;:::-;23740:103;23870:1;23863:5;23859:13;23852:20;;23645:233;;;:::o;23884:176::-;23916:1;23933:20;23951:1;23933:20;:::i;:::-;23928:25;;23967:20;23985:1;23967:20;:::i;:::-;23962:25;;24006:1;23996:35;;24011:18;;:::i;:::-;23996:35;24052:1;24049;24045:9;24040:14;;23884:176;;;;:::o;24066:180::-;24114:77;24111:1;24104:88;24211:4;24208:1;24201:15;24235:4;24232:1;24225:15;24252:180;24300:77;24297:1;24290:88;24397:4;24394:1;24387:15;24421:4;24418:1;24411:15;24438:180;24486:77;24483:1;24476:88;24583:4;24580:1;24573:15;24607:4;24604:1;24597:15;24624:180;24672:77;24669:1;24662:88;24769:4;24766:1;24759:15;24793:4;24790:1;24783:15;24810:180;24858:77;24855:1;24848:88;24955:4;24952:1;24945:15;24979:4;24976:1;24969:15;24996:117;25105:1;25102;25095:12;25119:117;25228:1;25225;25218:12;25242:117;25351:1;25348;25341:12;25365:117;25474:1;25471;25464:12;25488:102;25529:6;25580:2;25576:7;25571:2;25564:5;25560:14;25556:28;25546:38;;25488:102;;;:::o;25596:162::-;25736:14;25732:1;25724:6;25720:14;25713:38;25596:162;:::o;25764:225::-;25904:34;25900:1;25892:6;25888:14;25881:58;25973:8;25968:2;25960:6;25956:15;25949:33;25764:225;:::o;25995:174::-;26135:26;26131:1;26123:6;26119:14;26112:50;25995:174;:::o;26175:180::-;26315:32;26311:1;26303:6;26299:14;26292:56;26175:180;:::o;26361:182::-;26501:34;26497:1;26489:6;26485:14;26478:58;26361:182;:::o;26549:114::-;;:::o;26669:162::-;26809:14;26805:1;26797:6;26793:14;26786:38;26669:162;:::o;26837:122::-;26910:24;26928:5;26910:24;:::i;:::-;26903:5;26900:35;26890:63;;26949:1;26946;26939:12;26890:63;26837:122;:::o;26965:116::-;27035:21;27050:5;27035:21;:::i;:::-;27028:5;27025:32;27015:60;;27071:1;27068;27061:12;27015:60;26965:116;:::o;27087:120::-;27159:23;27176:5;27159:23;:::i;:::-;27152:5;27149:34;27139:62;;27197:1;27194;27187:12;27139:62;27087:120;:::o;27213:122::-;27286:24;27304:5;27286:24;:::i;:::-;27279:5;27276:35;27266:63;;27325:1;27322;27315:12;27266:63;27213:122;:::o
Swarm Source
ipfs://e491eba7d66c8ab6a81a3d6f08dbc917124d3a83dfffccb290b2c2da89dbe359
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.