Feature Tip: Add private address tag to any address under My Name Tag !
NFT
Overview
TokenID
234
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
HashDemons
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./ERC721Enumerable.sol"; import "./Ownable.sol"; contract HashDemons is ERC721Enumerable, Ownable { uint public constant MAX_DEMONS = 6666; string _baseTokenURI; constructor(string memory baseURI) ERC721("HashDemons", "HASHDEMONS") { setBaseURI(baseURI); } function mintDemons(address _to, uint _count) public payable { require(totalSupply() + _count <= MAX_DEMONS, "Max limit"); require(totalSupply() < MAX_DEMONS, "Sale end"); require(_count <= 20, "Exceeds 20"); require(msg.value >= price(_count), "Value below price"); for(uint i = 0; i < _count; i++){ _safeMint(_to, totalSupply()); } } function price(uint _count) public view returns (uint256) { uint _id = totalSupply(); if(_id <= 666 ){ return 0; } return 13000000000000000 * _count; // 0.013 ETH } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function tokensOfOwner(address _owner) external view returns(uint256[] memory) { uint tokenCount = balanceOf(_owner); uint256[] memory tokensId = new uint256[](tokenCount); for(uint i = 0; i < tokenCount; i++){ tokensId[i] = tokenOfOwnerByIndex(_owner, i); } return tokensId; } function withdrawAll() public payable onlyOwner { require(payable(_msgSender()).send(address(this).balance)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_DEMONS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintDemons","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200444f3803806200444f83398181016040528101906200003791906200039f565b6040518060400160405280600a81526020017f4861736844656d6f6e73000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f4841534844454d4f4e53000000000000000000000000000000000000000000008152508160009080519060200190620000bb9291906200027d565b508060019080519060200190620000d49291906200027d565b5050506000620000e9620001a060201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200019981620001a860201b60201c565b50620005d7565b600033905090565b620001b8620001a060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620001de6200025360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000237576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200022e906200040b565b60405180910390fd5b80600b90805190602001906200024f9291906200027d565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200028b90620004d3565b90600052602060002090601f016020900481019282620002af5760008555620002fb565b82601f10620002ca57805160ff1916838001178555620002fb565b82800160010185558215620002fb579182015b82811115620002fa578251825591602001919060010190620002dd565b5b5090506200030a91906200030e565b5090565b5b80821115620003295760008160009055506001016200030f565b5090565b6000620003446200033e8462000456565b6200042d565b9050828152602081018484840111156200035d57600080fd5b6200036a8482856200049d565b509392505050565b600082601f8301126200038457600080fd5b8151620003968482602086016200032d565b91505092915050565b600060208284031215620003b257600080fd5b600082015167ffffffffffffffff811115620003cd57600080fd5b620003db8482850162000372565b91505092915050565b6000620003f36020836200048c565b91506200040082620005ae565b602082019050919050565b600060208201905081810360008301526200042681620003e4565b9050919050565b6000620004396200044c565b905062000447828262000509565b919050565b6000604051905090565b600067ffffffffffffffff8211156200047457620004736200056e565b5b6200047f826200059d565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620004bd578082015181840152602081019050620004a0565b83811115620004cd576000848401525b50505050565b60006002820490506001821680620004ec57607f821691505b602082108114156200050357620005026200053f565b5b50919050565b62000514826200059d565b810181811067ffffffffffffffff821117156200053657620005356200056e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613e6880620005e76000396000f3fe6080604052600436106101665760003560e01c80636352211e116100d157806395d89b411161008a578063bdd490f311610064578063bdd490f314610532578063c87b56dd1461055d578063e985e9c51461059a578063f2fde38b146105d757610166565b806395d89b41146104b5578063a22cb465146104e0578063b88d4fde1461050957610166565b80636352211e146103b257806370a08231146103ef578063715018a61461042c5780638462151c14610443578063853828b6146104805780638da5cb5b1461048a57610166565b806326a49e371161012357806326a49e371461028d5780632f745c59146102ca57806342842e0e146103075780634f6ccce71461033057806355f804b31461036d5780635e0b06c81461039657610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612aec565b610600565b60405161019f91906130ac565b60405180910390f35b3480156101b457600080fd5b506101bd61067a565b6040516101ca91906130c7565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612b7f565b61070c565b6040516102079190613023565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612ab0565b610791565b005b34801561024557600080fd5b5061024e6108a9565b60405161025b91906133a9565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906129aa565b6108b6565b005b34801561029957600080fd5b506102b460048036038101906102af9190612b7f565b610916565b6040516102c191906133a9565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190612ab0565b610952565b6040516102fe91906133a9565b60405180910390f35b34801561031357600080fd5b5061032e600480360381019061032991906129aa565b6109f7565b005b34801561033c57600080fd5b5061035760048036038101906103529190612b7f565b610a17565b60405161036491906133a9565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190612b3e565b610aae565b005b6103b060048036038101906103ab9190612ab0565b610b44565b005b3480156103be57600080fd5b506103d960048036038101906103d49190612b7f565b610ca9565b6040516103e69190613023565b60405180910390f35b3480156103fb57600080fd5b5061041660048036038101906104119190612945565b610d5b565b60405161042391906133a9565b60405180910390f35b34801561043857600080fd5b50610441610e13565b005b34801561044f57600080fd5b5061046a60048036038101906104659190612945565b610f50565b604051610477919061308a565b60405180910390f35b61048861104a565b005b34801561049657600080fd5b5061049f61110d565b6040516104ac9190613023565b60405180910390f35b3480156104c157600080fd5b506104ca611137565b6040516104d791906130c7565b60405180910390f35b3480156104ec57600080fd5b5061050760048036038101906105029190612a74565b6111c9565b005b34801561051557600080fd5b50610530600480360381019061052b91906129f9565b61134a565b005b34801561053e57600080fd5b506105476113ac565b60405161055491906133a9565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612b7f565b6113b2565b60405161059191906130c7565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc919061296e565b611459565b6040516105ce91906130ac565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190612945565b6114ed565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610673575061067282611699565b5b9050919050565b60606000805461068990613692565b80601f01602080910402602001604051908101604052809291908181526020018280546106b590613692565b80156107025780601f106106d757610100808354040283529160200191610702565b820191906000526020600020905b8154815290600101906020018083116106e557829003601f168201915b5050505050905090565b60006107178261177b565b610756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074d90613289565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079c82610ca9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561080d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080490613329565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082c6117e7565b73ffffffffffffffffffffffffffffffffffffffff16148061085b575061085a816108556117e7565b611459565b5b61089a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610891906131e9565b60405180910390fd5b6108a483836117ef565b505050565b6000600880549050905090565b6108c76108c16117e7565b826118a8565b610906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fd90613369565b60405180910390fd5b610911838383611986565b505050565b6000806109216108a9565b905061029a811161093657600091505061094d565b82662e2f6e5e148000610949919061354e565b9150505b919050565b600061095d83610d5b565b821061099e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610995906130e9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a128383836040518060200160405280600081525061134a565b505050565b6000610a216108a9565b8210610a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5990613389565b60405180910390fd5b60088281548110610a9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610ab66117e7565b73ffffffffffffffffffffffffffffffffffffffff16610ad461110d565b73ffffffffffffffffffffffffffffffffffffffff1614610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b21906132a9565b60405180910390fd5b80600b9080519060200190610b40929190612769565b5050565b611a0a81610b506108a9565b610b5a91906134c7565b1115610b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b92906131a9565b60405180910390fd5b611a0a610ba66108a9565b10610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd90613269565b60405180910390fd5b6014811115610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2190613349565b60405180910390fd5b610c3381610916565b341015610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c90613309565b60405180910390fd5b60005b81811015610ca457610c9183610c8c6108a9565b611be2565b8080610c9c906136f5565b915050610c78565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4990613229565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390613209565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e1b6117e7565b73ffffffffffffffffffffffffffffffffffffffff16610e3961110d565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e86906132a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60606000610f5d83610d5b565b905060008167ffffffffffffffff811115610fa1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610fcf5781602001602082028036833780820191505090505b50905060005b8281101561103f57610fe78582610952565b828281518110611020577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611037906136f5565b915050610fd5565b508092505050919050565b6110526117e7565b73ffffffffffffffffffffffffffffffffffffffff1661107061110d565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd906132a9565b60405180910390fd5b6110ce6117e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061110b57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461114690613692565b80601f016020809104026020016040519081016040528092919081815260200182805461117290613692565b80156111bf5780601f10611194576101008083540402835291602001916111bf565b820191906000526020600020905b8154815290600101906020018083116111a257829003601f168201915b5050505050905090565b6111d16117e7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123690613189565b60405180910390fd5b806005600061124c6117e7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112f96117e7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161133e91906130ac565b60405180910390a35050565b61135b6113556117e7565b836118a8565b61139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613369565b60405180910390fd5b6113a684848484611c00565b50505050565b611a0a81565b60606113bd8261177b565b6113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f3906132e9565b60405180910390fd5b6000611406611c5c565b905060008151116114265760405180602001604052806000815250611451565b8061143084611cee565b604051602001611441929190612fff565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114f56117e7565b73ffffffffffffffffffffffffffffffffffffffff1661151361110d565b73ffffffffffffffffffffffffffffffffffffffff1614611569576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611560906132a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d090613129565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061176457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611774575061177382611e9b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661186283610ca9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118b38261177b565b6118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e9906131c9565b60405180910390fd5b60006118fd83610ca9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061196c57508373ffffffffffffffffffffffffffffffffffffffff166119548461070c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061197d575061197c8185611459565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119a682610ca9565b73ffffffffffffffffffffffffffffffffffffffff16146119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f3906132c9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390613169565b60405180910390fd5b611a77838383611f05565b611a826000826117ef565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ad291906135a8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b2991906134c7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611bfc828260405180602001604052806000815250612019565b5050565b611c0b848484611986565b611c1784848484612074565b611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d90613109565b60405180910390fd5b50505050565b6060600b8054611c6b90613692565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9790613692565b8015611ce45780601f10611cb957610100808354040283529160200191611ce4565b820191906000526020600020905b815481529060010190602001808311611cc757829003601f168201915b5050505050905090565b60606000821415611d36576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e96565b600082905060005b60008214611d68578080611d51906136f5565b915050600a82611d61919061351d565b9150611d3e565b60008167ffffffffffffffff811115611daa577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ddc5781602001600182028036833780820191505090505b5090505b60008514611e8f57600182611df591906135a8565b9150600a85611e04919061373e565b6030611e1091906134c7565b60f81b818381518110611e4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e88919061351d565b9450611de0565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f1083838361220b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f5357611f4e81612210565b611f92565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611f9157611f908382612259565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fd557611fd0816123c6565b612014565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612013576120128282612509565b5b5b505050565b6120238383612588565b6120306000848484612074565b61206f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206690613109565b60405180910390fd5b505050565b60006120958473ffffffffffffffffffffffffffffffffffffffff16612756565b156121fe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120be6117e7565b8786866040518563ffffffff1660e01b81526004016120e0949392919061303e565b602060405180830381600087803b1580156120fa57600080fd5b505af192505050801561212b57506040513d601f19601f820116820180604052508101906121289190612b15565b60015b6121ae573d806000811461215b576040519150601f19603f3d011682016040523d82523d6000602084013e612160565b606091505b506000815114156121a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219d90613109565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612203565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161226684610d5b565b61227091906135a8565b9050600060076000848152602001908152602001600020549050818114612355576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506123da91906135a8565b9050600060096000848152602001908152602001600020549050600060088381548110612430577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612478577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806124ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061251483610d5b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ef90613249565b60405180910390fd5b6126018161177b565b15612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890613149565b60405180910390fd5b61264d60008383611f05565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461269d91906134c7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461277590613692565b90600052602060002090601f01602090048101928261279757600085556127de565b82601f106127b057805160ff19168380011785556127de565b828001600101855582156127de579182015b828111156127dd5782518255916020019190600101906127c2565b5b5090506127eb91906127ef565b5090565b5b808211156128085760008160009055506001016127f0565b5090565b600061281f61281a846133e9565b6133c4565b90508281526020810184848401111561283757600080fd5b612842848285613650565b509392505050565b600061285d6128588461341a565b6133c4565b90508281526020810184848401111561287557600080fd5b612880848285613650565b509392505050565b60008135905061289781613dd6565b92915050565b6000813590506128ac81613ded565b92915050565b6000813590506128c181613e04565b92915050565b6000815190506128d681613e04565b92915050565b600082601f8301126128ed57600080fd5b81356128fd84826020860161280c565b91505092915050565b600082601f83011261291757600080fd5b813561292784826020860161284a565b91505092915050565b60008135905061293f81613e1b565b92915050565b60006020828403121561295757600080fd5b600061296584828501612888565b91505092915050565b6000806040838503121561298157600080fd5b600061298f85828601612888565b92505060206129a085828601612888565b9150509250929050565b6000806000606084860312156129bf57600080fd5b60006129cd86828701612888565b93505060206129de86828701612888565b92505060406129ef86828701612930565b9150509250925092565b60008060008060808587031215612a0f57600080fd5b6000612a1d87828801612888565b9450506020612a2e87828801612888565b9350506040612a3f87828801612930565b925050606085013567ffffffffffffffff811115612a5c57600080fd5b612a68878288016128dc565b91505092959194509250565b60008060408385031215612a8757600080fd5b6000612a9585828601612888565b9250506020612aa68582860161289d565b9150509250929050565b60008060408385031215612ac357600080fd5b6000612ad185828601612888565b9250506020612ae285828601612930565b9150509250929050565b600060208284031215612afe57600080fd5b6000612b0c848285016128b2565b91505092915050565b600060208284031215612b2757600080fd5b6000612b35848285016128c7565b91505092915050565b600060208284031215612b5057600080fd5b600082013567ffffffffffffffff811115612b6a57600080fd5b612b7684828501612906565b91505092915050565b600060208284031215612b9157600080fd5b6000612b9f84828501612930565b91505092915050565b6000612bb48383612fe1565b60208301905092915050565b612bc9816135dc565b82525050565b6000612bda8261345b565b612be48185613489565b9350612bef8361344b565b8060005b83811015612c20578151612c078882612ba8565b9750612c128361347c565b925050600181019050612bf3565b5085935050505092915050565b612c36816135ee565b82525050565b6000612c4782613466565b612c51818561349a565b9350612c6181856020860161365f565b612c6a8161382b565b840191505092915050565b6000612c8082613471565b612c8a81856134ab565b9350612c9a81856020860161365f565b612ca38161382b565b840191505092915050565b6000612cb982613471565b612cc381856134bc565b9350612cd381856020860161365f565b80840191505092915050565b6000612cec602b836134ab565b9150612cf78261383c565b604082019050919050565b6000612d0f6032836134ab565b9150612d1a8261388b565b604082019050919050565b6000612d326026836134ab565b9150612d3d826138da565b604082019050919050565b6000612d55601c836134ab565b9150612d6082613929565b602082019050919050565b6000612d786024836134ab565b9150612d8382613952565b604082019050919050565b6000612d9b6019836134ab565b9150612da6826139a1565b602082019050919050565b6000612dbe6009836134ab565b9150612dc9826139ca565b602082019050919050565b6000612de1602c836134ab565b9150612dec826139f3565b604082019050919050565b6000612e046038836134ab565b9150612e0f82613a42565b604082019050919050565b6000612e27602a836134ab565b9150612e3282613a91565b604082019050919050565b6000612e4a6029836134ab565b9150612e5582613ae0565b604082019050919050565b6000612e6d6020836134ab565b9150612e7882613b2f565b602082019050919050565b6000612e906008836134ab565b9150612e9b82613b58565b602082019050919050565b6000612eb3602c836134ab565b9150612ebe82613b81565b604082019050919050565b6000612ed66020836134ab565b9150612ee182613bd0565b602082019050919050565b6000612ef96029836134ab565b9150612f0482613bf9565b604082019050919050565b6000612f1c602f836134ab565b9150612f2782613c48565b604082019050919050565b6000612f3f6011836134ab565b9150612f4a82613c97565b602082019050919050565b6000612f626021836134ab565b9150612f6d82613cc0565b604082019050919050565b6000612f85600a836134ab565b9150612f9082613d0f565b602082019050919050565b6000612fa86031836134ab565b9150612fb382613d38565b604082019050919050565b6000612fcb602c836134ab565b9150612fd682613d87565b604082019050919050565b612fea81613646565b82525050565b612ff981613646565b82525050565b600061300b8285612cae565b91506130178284612cae565b91508190509392505050565b60006020820190506130386000830184612bc0565b92915050565b60006080820190506130536000830187612bc0565b6130606020830186612bc0565b61306d6040830185612ff0565b818103606083015261307f8184612c3c565b905095945050505050565b600060208201905081810360008301526130a48184612bcf565b905092915050565b60006020820190506130c16000830184612c2d565b92915050565b600060208201905081810360008301526130e18184612c75565b905092915050565b6000602082019050818103600083015261310281612cdf565b9050919050565b6000602082019050818103600083015261312281612d02565b9050919050565b6000602082019050818103600083015261314281612d25565b9050919050565b6000602082019050818103600083015261316281612d48565b9050919050565b6000602082019050818103600083015261318281612d6b565b9050919050565b600060208201905081810360008301526131a281612d8e565b9050919050565b600060208201905081810360008301526131c281612db1565b9050919050565b600060208201905081810360008301526131e281612dd4565b9050919050565b6000602082019050818103600083015261320281612df7565b9050919050565b6000602082019050818103600083015261322281612e1a565b9050919050565b6000602082019050818103600083015261324281612e3d565b9050919050565b6000602082019050818103600083015261326281612e60565b9050919050565b6000602082019050818103600083015261328281612e83565b9050919050565b600060208201905081810360008301526132a281612ea6565b9050919050565b600060208201905081810360008301526132c281612ec9565b9050919050565b600060208201905081810360008301526132e281612eec565b9050919050565b6000602082019050818103600083015261330281612f0f565b9050919050565b6000602082019050818103600083015261332281612f32565b9050919050565b6000602082019050818103600083015261334281612f55565b9050919050565b6000602082019050818103600083015261336281612f78565b9050919050565b6000602082019050818103600083015261338281612f9b565b9050919050565b600060208201905081810360008301526133a281612fbe565b9050919050565b60006020820190506133be6000830184612ff0565b92915050565b60006133ce6133df565b90506133da82826136c4565b919050565b6000604051905090565b600067ffffffffffffffff821115613404576134036137fc565b5b61340d8261382b565b9050602081019050919050565b600067ffffffffffffffff821115613435576134346137fc565b5b61343e8261382b565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006134d282613646565b91506134dd83613646565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135125761351161376f565b5b828201905092915050565b600061352882613646565b915061353383613646565b9250826135435761354261379e565b5b828204905092915050565b600061355982613646565b915061356483613646565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561359d5761359c61376f565b5b828202905092915050565b60006135b382613646565b91506135be83613646565b9250828210156135d1576135d061376f565b5b828203905092915050565b60006135e782613626565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561367d578082015181840152602081019050613662565b8381111561368c576000848401525b50505050565b600060028204905060018216806136aa57607f821691505b602082108114156136be576136bd6137cd565b5b50919050565b6136cd8261382b565b810181811067ffffffffffffffff821117156136ec576136eb6137fc565b5b80604052505050565b600061370082613646565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137335761373261376f565b5b600182019050919050565b600061374982613646565b915061375483613646565b9250826137645761376361379e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565647320323000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613ddf816135dc565b8114613dea57600080fd5b50565b613df6816135ee565b8114613e0157600080fd5b50565b613e0d816135fa565b8114613e1857600080fd5b50565b613e2481613646565b8114613e2f57600080fd5b5056fea2646970667358221220cfe8359850f6aefb550aaf8ea631bd2d9780849d00a5e9a4ac7d62eaad7acd8764736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101665760003560e01c80636352211e116100d157806395d89b411161008a578063bdd490f311610064578063bdd490f314610532578063c87b56dd1461055d578063e985e9c51461059a578063f2fde38b146105d757610166565b806395d89b41146104b5578063a22cb465146104e0578063b88d4fde1461050957610166565b80636352211e146103b257806370a08231146103ef578063715018a61461042c5780638462151c14610443578063853828b6146104805780638da5cb5b1461048a57610166565b806326a49e371161012357806326a49e371461028d5780632f745c59146102ca57806342842e0e146103075780634f6ccce71461033057806355f804b31461036d5780635e0b06c81461039657610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612aec565b610600565b60405161019f91906130ac565b60405180910390f35b3480156101b457600080fd5b506101bd61067a565b6040516101ca91906130c7565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612b7f565b61070c565b6040516102079190613023565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612ab0565b610791565b005b34801561024557600080fd5b5061024e6108a9565b60405161025b91906133a9565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906129aa565b6108b6565b005b34801561029957600080fd5b506102b460048036038101906102af9190612b7f565b610916565b6040516102c191906133a9565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190612ab0565b610952565b6040516102fe91906133a9565b60405180910390f35b34801561031357600080fd5b5061032e600480360381019061032991906129aa565b6109f7565b005b34801561033c57600080fd5b5061035760048036038101906103529190612b7f565b610a17565b60405161036491906133a9565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190612b3e565b610aae565b005b6103b060048036038101906103ab9190612ab0565b610b44565b005b3480156103be57600080fd5b506103d960048036038101906103d49190612b7f565b610ca9565b6040516103e69190613023565b60405180910390f35b3480156103fb57600080fd5b5061041660048036038101906104119190612945565b610d5b565b60405161042391906133a9565b60405180910390f35b34801561043857600080fd5b50610441610e13565b005b34801561044f57600080fd5b5061046a60048036038101906104659190612945565b610f50565b604051610477919061308a565b60405180910390f35b61048861104a565b005b34801561049657600080fd5b5061049f61110d565b6040516104ac9190613023565b60405180910390f35b3480156104c157600080fd5b506104ca611137565b6040516104d791906130c7565b60405180910390f35b3480156104ec57600080fd5b5061050760048036038101906105029190612a74565b6111c9565b005b34801561051557600080fd5b50610530600480360381019061052b91906129f9565b61134a565b005b34801561053e57600080fd5b506105476113ac565b60405161055491906133a9565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612b7f565b6113b2565b60405161059191906130c7565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc919061296e565b611459565b6040516105ce91906130ac565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190612945565b6114ed565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610673575061067282611699565b5b9050919050565b60606000805461068990613692565b80601f01602080910402602001604051908101604052809291908181526020018280546106b590613692565b80156107025780601f106106d757610100808354040283529160200191610702565b820191906000526020600020905b8154815290600101906020018083116106e557829003601f168201915b5050505050905090565b60006107178261177b565b610756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074d90613289565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079c82610ca9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561080d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080490613329565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082c6117e7565b73ffffffffffffffffffffffffffffffffffffffff16148061085b575061085a816108556117e7565b611459565b5b61089a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610891906131e9565b60405180910390fd5b6108a483836117ef565b505050565b6000600880549050905090565b6108c76108c16117e7565b826118a8565b610906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fd90613369565b60405180910390fd5b610911838383611986565b505050565b6000806109216108a9565b905061029a811161093657600091505061094d565b82662e2f6e5e148000610949919061354e565b9150505b919050565b600061095d83610d5b565b821061099e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610995906130e9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a128383836040518060200160405280600081525061134a565b505050565b6000610a216108a9565b8210610a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5990613389565b60405180910390fd5b60088281548110610a9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610ab66117e7565b73ffffffffffffffffffffffffffffffffffffffff16610ad461110d565b73ffffffffffffffffffffffffffffffffffffffff1614610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b21906132a9565b60405180910390fd5b80600b9080519060200190610b40929190612769565b5050565b611a0a81610b506108a9565b610b5a91906134c7565b1115610b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b92906131a9565b60405180910390fd5b611a0a610ba66108a9565b10610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd90613269565b60405180910390fd5b6014811115610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2190613349565b60405180910390fd5b610c3381610916565b341015610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c90613309565b60405180910390fd5b60005b81811015610ca457610c9183610c8c6108a9565b611be2565b8080610c9c906136f5565b915050610c78565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4990613229565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390613209565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e1b6117e7565b73ffffffffffffffffffffffffffffffffffffffff16610e3961110d565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e86906132a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60606000610f5d83610d5b565b905060008167ffffffffffffffff811115610fa1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610fcf5781602001602082028036833780820191505090505b50905060005b8281101561103f57610fe78582610952565b828281518110611020577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611037906136f5565b915050610fd5565b508092505050919050565b6110526117e7565b73ffffffffffffffffffffffffffffffffffffffff1661107061110d565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd906132a9565b60405180910390fd5b6110ce6117e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061110b57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461114690613692565b80601f016020809104026020016040519081016040528092919081815260200182805461117290613692565b80156111bf5780601f10611194576101008083540402835291602001916111bf565b820191906000526020600020905b8154815290600101906020018083116111a257829003601f168201915b5050505050905090565b6111d16117e7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123690613189565b60405180910390fd5b806005600061124c6117e7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112f96117e7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161133e91906130ac565b60405180910390a35050565b61135b6113556117e7565b836118a8565b61139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613369565b60405180910390fd5b6113a684848484611c00565b50505050565b611a0a81565b60606113bd8261177b565b6113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f3906132e9565b60405180910390fd5b6000611406611c5c565b905060008151116114265760405180602001604052806000815250611451565b8061143084611cee565b604051602001611441929190612fff565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114f56117e7565b73ffffffffffffffffffffffffffffffffffffffff1661151361110d565b73ffffffffffffffffffffffffffffffffffffffff1614611569576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611560906132a9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d090613129565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061176457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611774575061177382611e9b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661186283610ca9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118b38261177b565b6118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e9906131c9565b60405180910390fd5b60006118fd83610ca9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061196c57508373ffffffffffffffffffffffffffffffffffffffff166119548461070c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061197d575061197c8185611459565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119a682610ca9565b73ffffffffffffffffffffffffffffffffffffffff16146119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f3906132c9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390613169565b60405180910390fd5b611a77838383611f05565b611a826000826117ef565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ad291906135a8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b2991906134c7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611bfc828260405180602001604052806000815250612019565b5050565b611c0b848484611986565b611c1784848484612074565b611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d90613109565b60405180910390fd5b50505050565b6060600b8054611c6b90613692565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9790613692565b8015611ce45780601f10611cb957610100808354040283529160200191611ce4565b820191906000526020600020905b815481529060010190602001808311611cc757829003601f168201915b5050505050905090565b60606000821415611d36576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e96565b600082905060005b60008214611d68578080611d51906136f5565b915050600a82611d61919061351d565b9150611d3e565b60008167ffffffffffffffff811115611daa577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ddc5781602001600182028036833780820191505090505b5090505b60008514611e8f57600182611df591906135a8565b9150600a85611e04919061373e565b6030611e1091906134c7565b60f81b818381518110611e4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e88919061351d565b9450611de0565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f1083838361220b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f5357611f4e81612210565b611f92565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611f9157611f908382612259565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fd557611fd0816123c6565b612014565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612013576120128282612509565b5b5b505050565b6120238383612588565b6120306000848484612074565b61206f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206690613109565b60405180910390fd5b505050565b60006120958473ffffffffffffffffffffffffffffffffffffffff16612756565b156121fe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120be6117e7565b8786866040518563ffffffff1660e01b81526004016120e0949392919061303e565b602060405180830381600087803b1580156120fa57600080fd5b505af192505050801561212b57506040513d601f19601f820116820180604052508101906121289190612b15565b60015b6121ae573d806000811461215b576040519150601f19603f3d011682016040523d82523d6000602084013e612160565b606091505b506000815114156121a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219d90613109565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612203565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161226684610d5b565b61227091906135a8565b9050600060076000848152602001908152602001600020549050818114612355576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506123da91906135a8565b9050600060096000848152602001908152602001600020549050600060088381548110612430577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612478577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806124ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061251483610d5b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ef90613249565b60405180910390fd5b6126018161177b565b15612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890613149565b60405180910390fd5b61264d60008383611f05565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461269d91906134c7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461277590613692565b90600052602060002090601f01602090048101928261279757600085556127de565b82601f106127b057805160ff19168380011785556127de565b828001600101855582156127de579182015b828111156127dd5782518255916020019190600101906127c2565b5b5090506127eb91906127ef565b5090565b5b808211156128085760008160009055506001016127f0565b5090565b600061281f61281a846133e9565b6133c4565b90508281526020810184848401111561283757600080fd5b612842848285613650565b509392505050565b600061285d6128588461341a565b6133c4565b90508281526020810184848401111561287557600080fd5b612880848285613650565b509392505050565b60008135905061289781613dd6565b92915050565b6000813590506128ac81613ded565b92915050565b6000813590506128c181613e04565b92915050565b6000815190506128d681613e04565b92915050565b600082601f8301126128ed57600080fd5b81356128fd84826020860161280c565b91505092915050565b600082601f83011261291757600080fd5b813561292784826020860161284a565b91505092915050565b60008135905061293f81613e1b565b92915050565b60006020828403121561295757600080fd5b600061296584828501612888565b91505092915050565b6000806040838503121561298157600080fd5b600061298f85828601612888565b92505060206129a085828601612888565b9150509250929050565b6000806000606084860312156129bf57600080fd5b60006129cd86828701612888565b93505060206129de86828701612888565b92505060406129ef86828701612930565b9150509250925092565b60008060008060808587031215612a0f57600080fd5b6000612a1d87828801612888565b9450506020612a2e87828801612888565b9350506040612a3f87828801612930565b925050606085013567ffffffffffffffff811115612a5c57600080fd5b612a68878288016128dc565b91505092959194509250565b60008060408385031215612a8757600080fd5b6000612a9585828601612888565b9250506020612aa68582860161289d565b9150509250929050565b60008060408385031215612ac357600080fd5b6000612ad185828601612888565b9250506020612ae285828601612930565b9150509250929050565b600060208284031215612afe57600080fd5b6000612b0c848285016128b2565b91505092915050565b600060208284031215612b2757600080fd5b6000612b35848285016128c7565b91505092915050565b600060208284031215612b5057600080fd5b600082013567ffffffffffffffff811115612b6a57600080fd5b612b7684828501612906565b91505092915050565b600060208284031215612b9157600080fd5b6000612b9f84828501612930565b91505092915050565b6000612bb48383612fe1565b60208301905092915050565b612bc9816135dc565b82525050565b6000612bda8261345b565b612be48185613489565b9350612bef8361344b565b8060005b83811015612c20578151612c078882612ba8565b9750612c128361347c565b925050600181019050612bf3565b5085935050505092915050565b612c36816135ee565b82525050565b6000612c4782613466565b612c51818561349a565b9350612c6181856020860161365f565b612c6a8161382b565b840191505092915050565b6000612c8082613471565b612c8a81856134ab565b9350612c9a81856020860161365f565b612ca38161382b565b840191505092915050565b6000612cb982613471565b612cc381856134bc565b9350612cd381856020860161365f565b80840191505092915050565b6000612cec602b836134ab565b9150612cf78261383c565b604082019050919050565b6000612d0f6032836134ab565b9150612d1a8261388b565b604082019050919050565b6000612d326026836134ab565b9150612d3d826138da565b604082019050919050565b6000612d55601c836134ab565b9150612d6082613929565b602082019050919050565b6000612d786024836134ab565b9150612d8382613952565b604082019050919050565b6000612d9b6019836134ab565b9150612da6826139a1565b602082019050919050565b6000612dbe6009836134ab565b9150612dc9826139ca565b602082019050919050565b6000612de1602c836134ab565b9150612dec826139f3565b604082019050919050565b6000612e046038836134ab565b9150612e0f82613a42565b604082019050919050565b6000612e27602a836134ab565b9150612e3282613a91565b604082019050919050565b6000612e4a6029836134ab565b9150612e5582613ae0565b604082019050919050565b6000612e6d6020836134ab565b9150612e7882613b2f565b602082019050919050565b6000612e906008836134ab565b9150612e9b82613b58565b602082019050919050565b6000612eb3602c836134ab565b9150612ebe82613b81565b604082019050919050565b6000612ed66020836134ab565b9150612ee182613bd0565b602082019050919050565b6000612ef96029836134ab565b9150612f0482613bf9565b604082019050919050565b6000612f1c602f836134ab565b9150612f2782613c48565b604082019050919050565b6000612f3f6011836134ab565b9150612f4a82613c97565b602082019050919050565b6000612f626021836134ab565b9150612f6d82613cc0565b604082019050919050565b6000612f85600a836134ab565b9150612f9082613d0f565b602082019050919050565b6000612fa86031836134ab565b9150612fb382613d38565b604082019050919050565b6000612fcb602c836134ab565b9150612fd682613d87565b604082019050919050565b612fea81613646565b82525050565b612ff981613646565b82525050565b600061300b8285612cae565b91506130178284612cae565b91508190509392505050565b60006020820190506130386000830184612bc0565b92915050565b60006080820190506130536000830187612bc0565b6130606020830186612bc0565b61306d6040830185612ff0565b818103606083015261307f8184612c3c565b905095945050505050565b600060208201905081810360008301526130a48184612bcf565b905092915050565b60006020820190506130c16000830184612c2d565b92915050565b600060208201905081810360008301526130e18184612c75565b905092915050565b6000602082019050818103600083015261310281612cdf565b9050919050565b6000602082019050818103600083015261312281612d02565b9050919050565b6000602082019050818103600083015261314281612d25565b9050919050565b6000602082019050818103600083015261316281612d48565b9050919050565b6000602082019050818103600083015261318281612d6b565b9050919050565b600060208201905081810360008301526131a281612d8e565b9050919050565b600060208201905081810360008301526131c281612db1565b9050919050565b600060208201905081810360008301526131e281612dd4565b9050919050565b6000602082019050818103600083015261320281612df7565b9050919050565b6000602082019050818103600083015261322281612e1a565b9050919050565b6000602082019050818103600083015261324281612e3d565b9050919050565b6000602082019050818103600083015261326281612e60565b9050919050565b6000602082019050818103600083015261328281612e83565b9050919050565b600060208201905081810360008301526132a281612ea6565b9050919050565b600060208201905081810360008301526132c281612ec9565b9050919050565b600060208201905081810360008301526132e281612eec565b9050919050565b6000602082019050818103600083015261330281612f0f565b9050919050565b6000602082019050818103600083015261332281612f32565b9050919050565b6000602082019050818103600083015261334281612f55565b9050919050565b6000602082019050818103600083015261336281612f78565b9050919050565b6000602082019050818103600083015261338281612f9b565b9050919050565b600060208201905081810360008301526133a281612fbe565b9050919050565b60006020820190506133be6000830184612ff0565b92915050565b60006133ce6133df565b90506133da82826136c4565b919050565b6000604051905090565b600067ffffffffffffffff821115613404576134036137fc565b5b61340d8261382b565b9050602081019050919050565b600067ffffffffffffffff821115613435576134346137fc565b5b61343e8261382b565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006134d282613646565b91506134dd83613646565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135125761351161376f565b5b828201905092915050565b600061352882613646565b915061353383613646565b9250826135435761354261379e565b5b828204905092915050565b600061355982613646565b915061356483613646565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561359d5761359c61376f565b5b828202905092915050565b60006135b382613646565b91506135be83613646565b9250828210156135d1576135d061376f565b5b828203905092915050565b60006135e782613626565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561367d578082015181840152602081019050613662565b8381111561368c576000848401525b50505050565b600060028204905060018216806136aa57607f821691505b602082108114156136be576136bd6137cd565b5b50919050565b6136cd8261382b565b810181811067ffffffffffffffff821117156136ec576136eb6137fc565b5b80604052505050565b600061370082613646565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137335761373261376f565b5b600182019050919050565b600061374982613646565b915061375483613646565b9250826137645761376361379e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565647320323000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613ddf816135dc565b8114613dea57600080fd5b50565b613df6816135ee565b8114613e0157600080fd5b50565b613e0d816135fa565b8114613e1857600080fd5b50565b613e2481613646565b8114613e2f57600080fd5b5056fea2646970667358221220cfe8359850f6aefb550aaf8ea631bd2d9780849d00a5e9a4ac7d62eaad7acd8764736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string):
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
145:1615:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;938:237:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2377:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3796:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3340:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1591:113:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4660:300:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;808:228:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1259:256:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5026:149:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1781:233:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1170:102:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;391:409;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2080:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1818:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:12;;;;;;;;;;;;;:::i;:::-;;1280:344:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1632:125;;;:::i;:::-;;1061:85:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2539:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4080:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5241:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;201:38:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2707:353:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4436:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;938:237:4;1040:4;1079:35;1064:50;;;:11;:50;;;;:103;;;;1131:36;1155:11;1131:23;:36::i;:::-;1064:103;1057:110;;938:237;;;:::o;2377:98:3:-;2431:13;2463:5;2456:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:98;:::o;3796:217::-;3872:7;3899:16;3907:7;3899;:16::i;:::-;3891:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3982:15;:24;3998:7;3982:24;;;;;;;;;;;;;;;;;;;;;3975:31;;3796:217;;;:::o;3340:395::-;3420:13;3436:23;3451:7;3436:14;:23::i;:::-;3420:39;;3483:5;3477:11;;:2;:11;;;;3469:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3561:5;3545:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;3570:44;3594:5;3601:12;:10;:12::i;:::-;3570:23;:44::i;:::-;3545:69;3537:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;3707:21;3716:2;3720:7;3707:8;:21::i;:::-;3340:395;;;:::o;1591:113:4:-;1652:7;1679:10;:17;;;;1672:24;;1591:113;:::o;4660:300:3:-;4819:41;4838:12;:10;:12::i;:::-;4852:7;4819:18;:41::i;:::-;4811:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4925:28;4935:4;4941:2;4945:7;4925:9;:28::i;:::-;4660:300;;;:::o;808:228:6:-;857:7;877:8;888:13;:11;:13::i;:::-;877:24;;922:3;915;:10;912:50;;949:1;942:8;;;;;912:50;1009:6;989:17;:26;;;;:::i;:::-;982:33;;;808:228;;;;:::o;1259:256:4:-;1356:7;1392:23;1409:5;1392:16;:23::i;:::-;1384:5;:31;1376:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1481:12;:19;1494:5;1481:19;;;;;;;;;;;;;;;:26;1501:5;1481:26;;;;;;;;;;;;1474:33;;1259:256;;;;:::o;5026:149:3:-;5129:39;5146:4;5152:2;5156:7;5129:39;;;;;;;;;;;;:16;:39::i;:::-;5026:149;;;:::o;1781:233:4:-;1856:7;1892:30;:28;:30::i;:::-;1884:5;:38;1876:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1989:10;2000:5;1989:17;;;;;;;;;;;;;;;;;;;;;;;;1982:24;;1781:233;;;:::o;1170:102:6:-;1284:12:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1257:7:6::1;1241:13;:23;;;;;;;;;;;;:::i;:::-;;1170:102:::0;:::o;391:409::-;235:4;487:6;471:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;463:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;235:4;540:13;:11;:13::i;:::-;:26;532:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;608:2;598:6;:12;;590:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;657:13;663:6;657:5;:13::i;:::-;644:9;:26;;636:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;709:6;705:88;725:6;721:1;:10;705:88;;;752:29;762:3;767:13;:11;:13::i;:::-;752:9;:29::i;:::-;733:3;;;;;:::i;:::-;;;;705:88;;;;391:409;;:::o;2080:235:3:-;2152:7;2171:13;2187:7;:16;2195:7;2187:16;;;;;;;;;;;;;;;;;;;;;2171:32;;2238:1;2221:19;;:5;:19;;;;2213:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2303:5;2296:12;;;2080:235;;;:::o;1818:205::-;1890:7;1934:1;1917:19;;:5;:19;;;;1909:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2000:9;:16;2010:5;2000:16;;;;;;;;;;;;;;;;1993:23;;1818:205;;;:::o;1693:145:12:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;;;;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6;;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;1280:344:6:-;1341:16;1370:15;1388:17;1398:6;1388:9;:17::i;:::-;1370:35;;1418:25;1460:10;1446:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1418:53;;1486:6;1482:107;1502:10;1498:1;:14;1482:107;;;1547:30;1567:6;1575:1;1547:19;:30::i;:::-;1533:8;1542:1;1533:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;1514:3;;;;;:::i;:::-;;;;1482:107;;;;1608:8;1601:15;;;;1280:344;;;:::o;1632:125::-;1284:12:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1707:12:6::1;:10;:12::i;:::-;1699:26;;:49;1726:21;1699:49;;;;;;;;;;;;;;;;;;;;;;;1691:58;;;::::0;::::1;;1632:125::o:0;1061:85:12:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;2539:102:3:-;2595:13;2627:7;2620:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2539:102;:::o;4080:290::-;4194:12;:10;:12::i;:::-;4182:24;;:8;:24;;;;4174:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4292:8;4247:18;:32;4266:12;:10;:12::i;:::-;4247:32;;;;;;;;;;;;;;;:42;4280:8;4247:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4344:8;4315:48;;4330:12;:10;:12::i;:::-;4315:48;;;4354:8;4315:48;;;;;;:::i;:::-;;;;;;;;4080:290;;:::o;5241:282::-;5372:41;5391:12;:10;:12::i;:::-;5405:7;5372:18;:41::i;:::-;5364:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5477:39;5491:4;5497:2;5501:7;5510:5;5477:13;:39::i;:::-;5241:282;;;;:::o;201:38:6:-;235:4;201:38;:::o;2707:353:3:-;2780:13;2813:16;2821:7;2813;:16::i;:::-;2805:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2892:21;2916:10;:8;:10::i;:::-;2892:34;;2967:1;2949:7;2943:21;:25;:110;;;;;;;;;;;;;;;;;3007:7;3016:18;:7;:16;:18::i;:::-;2990:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2943:110;2936:117;;;2707:353;;;:::o;4436:162::-;4533:4;4556:18;:25;4575:5;4556:25;;;;;;;;;;;;;;;:35;4582:8;4556:35;;;;;;;;;;;;;;;;;;;;;;;;;4549:42;;4436:162;;;;:::o;1987:240:12:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;;;;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;;:17;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;1471:288:3:-;1573:4;1611:25;1596:40;;;:11;:40;;;;:104;;;;1667:33;1652:48;;;:11;:48;;;;1596:104;:156;;;;1716:36;1740:11;1716:23;:36::i;:::-;1596:156;1589:163;;1471:288;;;:::o;6957:125::-;7022:4;7073:1;7045:30;;:7;:16;7053:7;7045:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7038:37;;6957:125;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;10721:171:3:-;10822:2;10795:15;:24;10811:7;10795:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;10877:7;10873:2;10839:46;;10848:23;10863:7;10848:14;:23::i;:::-;10839:46;;;;;;;;;;;;10721:171;;:::o;7240:351::-;7333:4;7357:16;7365:7;7357;:16::i;:::-;7349:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7432:13;7448:23;7463:7;7448:14;:23::i;:::-;7432:39;;7500:5;7489:16;;:7;:16;;;:51;;;;7533:7;7509:31;;:20;7521:7;7509:11;:20::i;:::-;:31;;;7489:51;:94;;;;7544:39;7568:5;7575:7;7544:23;:39::i;:::-;7489:94;7481:103;;;7240:351;;;;:::o;10080:530::-;10204:4;10177:31;;:23;10192:7;10177:14;:23::i;:::-;:31;;;10169:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10286:1;10272:16;;:2;:16;;;;10264:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10340:39;10361:4;10367:2;10371:7;10340:20;:39::i;:::-;10441:29;10458:1;10462:7;10441:8;:29::i;:::-;10500:1;10481:9;:15;10491:4;10481:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10528:1;10511:9;:13;10521:2;10511:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10558:2;10539:7;:16;10547:7;10539:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10595:7;10591:2;10576:27;;10585:4;10576:27;;;;;;;;;;;;10080:530;;;:::o;7921:108::-;7996:26;8006:2;8010:7;7996:26;;;;;;;;;;;;:9;:26::i;:::-;7921:108;;:::o;6385:269::-;6498:28;6508:4;6514:2;6518:7;6498:9;:28::i;:::-;6544:48;6567:4;6573:2;6577:7;6586:5;6544:22;:48::i;:::-;6536:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6385:269;;;;:::o;1044:114:6:-;1104:13;1137;1130:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1044:114;:::o;271:703:13:-;327:13;553:1;544:5;:10;540:51;;;570:10;;;;;;;;;;;;;;;;;;;;;540:51;600:12;615:5;600:20;;630:14;654:75;669:1;661:4;:9;654:75;;686:8;;;;;:::i;:::-;;;;716:2;708:10;;;;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;738:39;;787:150;803:1;794:5;:10;787:150;;830:1;820:11;;;;;:::i;:::-;;;896:2;888:5;:10;;;;:::i;:::-;875:2;:24;;;;:::i;:::-;862:39;;845:6;852;845:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;924:2;915:11;;;;;:::i;:::-;;;787:150;;;960:6;946:21;;;;;271:703;;;;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;2627:555:4:-;2737:45;2764:4;2770:2;2774:7;2737:26;:45::i;:::-;2815:1;2799:18;;:4;:18;;;2795:187;;;2834:40;2866:7;2834:31;:40::i;:::-;2795:187;;;2904:2;2896:10;;:4;:10;;;2892:90;;2923:47;2956:4;2962:7;2923:32;:47::i;:::-;2892:90;2795:187;3010:1;2996:16;;:2;:16;;;2992:183;;;3029:45;3066:7;3029:36;:45::i;:::-;2992:183;;;3102:4;3096:10;;:2;:10;;;3092:83;;3123:40;3151:2;3155:7;3123:27;:40::i;:::-;3092:83;2992:183;2627:555;;;:::o;8250:247:3:-;8345:18;8351:2;8355:7;8345:5;:18::i;:::-;8381:54;8412:1;8416:2;8420:7;8429:5;8381:22;:54::i;:::-;8373:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;8250:247;;;:::o;11445:824::-;11565:4;11589:15;:2;:13;;;:15::i;:::-;11585:678;;;11640:2;11624:36;;;11661:12;:10;:12::i;:::-;11675:4;11681:7;11690:5;11624:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11620:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11884:1;11867:6;:13;:18;11863:334;;;11909:60;;;;;;;;;;:::i;:::-;;;;;;;;11863:334;12149:6;12143:13;12134:6;12130:2;12126:15;12119:38;11620:591;11756:45;;;11746:55;;;:6;:55;;;;11739:62;;;;;11585:678;12248:4;12241:11;;11445:824;;;;;;;:::o;12865:93::-;;;;:::o;3905:164:4:-;4009:10;:17;;;;3982:15;:24;3998:7;3982:24;;;;;;;;;;;:44;;;;4037:10;4053:7;4037:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3905:164;:::o;4696:988::-;4962:22;5012:1;4987:22;5004:4;4987:16;:22::i;:::-;:26;;;;:::i;:::-;4962:51;;5024:18;5045:17;:26;5063:7;5045:26;;;;;;;;;;;;5024:47;;5192:14;5178:10;:28;5174:328;;5223:19;5245:12;:18;5258:4;5245:18;;;;;;;;;;;;;;;:34;5264:14;5245:34;;;;;;;;;;;;5223:56;;5329:11;5296:12;:18;5309:4;5296:18;;;;;;;;;;;;;;;:30;5315:10;5296:30;;;;;;;;;;;:44;;;;5446:10;5413:17;:30;5431:11;5413:30;;;;;;;;;;;:43;;;;5174:328;;5598:17;:26;5616:7;5598:26;;;;;;;;;;;5591:33;;;5642:12;:18;5655:4;5642:18;;;;;;;;;;;;;;;:34;5661:14;5642:34;;;;;;;;;;;5635:41;;;4696:988;;;;:::o;5979:1079::-;6232:22;6277:1;6257:10;:17;;;;:21;;;;:::i;:::-;6232:46;;6289:18;6310:15;:24;6326:7;6310:24;;;;;;;;;;;;6289:45;;6661:19;6683:10;6694:14;6683:26;;;;;;;;;;;;;;;;;;;;;;;;6661:48;;6747:11;6722:10;6733;6722:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6858:10;6827:15;:28;6843:11;6827:28;;;;;;;;;;;:41;;;;6999:15;:24;7015:7;6999:24;;;;;;;;;;;6992:31;;;7034:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5979:1079;;;;:::o;3483:221::-;3568:14;3585:20;3602:2;3585:16;:20::i;:::-;3568:37;;3643:7;3616:12;:16;3629:2;3616:16;;;;;;;;;;;;;;;:24;3633:6;3616:24;;;;;;;;;;;:34;;;;3690:6;3661:17;:26;3679:7;3661:26;;;;;;;;;;;:35;;;;3483:221;;;:::o;8819:372:3:-;8912:1;8898:16;;:2;:16;;;;8890:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;8970:16;8978:7;8970;:16::i;:::-;8969:17;8961:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9030:45;9059:1;9063:2;9067:7;9030:20;:45::i;:::-;9103:1;9086:9;:13;9096:2;9086:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9133:2;9114:7;:16;9122:7;9114:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9176:7;9172:2;9151:33;;9168:1;9151:33;;;;;;;;;;;;8819:372;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:14:-;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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:179::-;6155:10;6176:46;6218:3;6210:6;6176:46;:::i;:::-;6254:4;6249:3;6245:14;6231:28;;6166:99;;;;:::o;6271:118::-;6358:24;6376:5;6358:24;:::i;:::-;6353:3;6346:37;6336:53;;:::o;6425:732::-;6544:3;6573:54;6621:5;6573:54;:::i;:::-;6643:86;6722:6;6717:3;6643:86;:::i;:::-;6636:93;;6753:56;6803:5;6753:56;:::i;:::-;6832:7;6863:1;6848:284;6873:6;6870:1;6867:13;6848:284;;;6949:6;6943:13;6976:63;7035:3;7020:13;6976:63;:::i;:::-;6969:70;;7062:60;7115:6;7062:60;:::i;:::-;7052:70;;6908:224;6895:1;6892;6888:9;6883:14;;6848:284;;;6852:14;7148:3;7141:10;;6549:608;;;;;;;:::o;7163:109::-;7244:21;7259:5;7244:21;:::i;:::-;7239:3;7232:34;7222:50;;:::o;7278:360::-;7364:3;7392:38;7424:5;7392:38;:::i;:::-;7446:70;7509:6;7504:3;7446:70;:::i;:::-;7439:77;;7525:52;7570:6;7565:3;7558:4;7551:5;7547:16;7525:52;:::i;:::-;7602:29;7624:6;7602:29;:::i;:::-;7597:3;7593:39;7586:46;;7368:270;;;;;:::o;7644:364::-;7732:3;7760:39;7793:5;7760:39;:::i;:::-;7815:71;7879:6;7874:3;7815:71;:::i;:::-;7808:78;;7895:52;7940:6;7935:3;7928:4;7921:5;7917:16;7895:52;:::i;:::-;7972:29;7994:6;7972:29;:::i;:::-;7967:3;7963:39;7956:46;;7736:272;;;;;:::o;8014:377::-;8120:3;8148:39;8181:5;8148:39;:::i;:::-;8203:89;8285:6;8280:3;8203:89;:::i;:::-;8196:96;;8301:52;8346:6;8341:3;8334:4;8327:5;8323:16;8301:52;:::i;:::-;8378:6;8373:3;8369:16;8362:23;;8124:267;;;;;:::o;8397:366::-;8539:3;8560:67;8624:2;8619:3;8560:67;:::i;:::-;8553:74;;8636:93;8725:3;8636:93;:::i;:::-;8754:2;8749:3;8745:12;8738:19;;8543:220;;;:::o;8769:366::-;8911:3;8932:67;8996:2;8991:3;8932:67;:::i;:::-;8925:74;;9008:93;9097:3;9008:93;:::i;:::-;9126:2;9121:3;9117:12;9110:19;;8915:220;;;:::o;9141:366::-;9283:3;9304:67;9368:2;9363:3;9304:67;:::i;:::-;9297:74;;9380:93;9469:3;9380:93;:::i;:::-;9498:2;9493:3;9489:12;9482:19;;9287:220;;;:::o;9513:366::-;9655:3;9676:67;9740:2;9735:3;9676:67;:::i;:::-;9669:74;;9752:93;9841:3;9752:93;:::i;:::-;9870:2;9865:3;9861:12;9854:19;;9659:220;;;:::o;9885:366::-;10027:3;10048:67;10112:2;10107:3;10048:67;:::i;:::-;10041:74;;10124:93;10213:3;10124:93;:::i;:::-;10242:2;10237:3;10233:12;10226:19;;10031:220;;;:::o;10257:366::-;10399:3;10420:67;10484:2;10479:3;10420:67;:::i;:::-;10413:74;;10496:93;10585:3;10496:93;:::i;:::-;10614:2;10609:3;10605:12;10598:19;;10403:220;;;:::o;10629:365::-;10771:3;10792:66;10856:1;10851:3;10792:66;:::i;:::-;10785:73;;10867:93;10956:3;10867:93;:::i;:::-;10985:2;10980:3;10976:12;10969:19;;10775:219;;;:::o;11000:366::-;11142:3;11163:67;11227:2;11222:3;11163:67;:::i;:::-;11156:74;;11239:93;11328:3;11239:93;:::i;:::-;11357:2;11352:3;11348:12;11341:19;;11146:220;;;:::o;11372:366::-;11514:3;11535:67;11599:2;11594:3;11535:67;:::i;:::-;11528:74;;11611:93;11700:3;11611:93;:::i;:::-;11729:2;11724:3;11720:12;11713:19;;11518:220;;;:::o;11744:366::-;11886:3;11907:67;11971:2;11966:3;11907:67;:::i;:::-;11900:74;;11983:93;12072:3;11983:93;:::i;:::-;12101:2;12096:3;12092:12;12085:19;;11890:220;;;:::o;12116:366::-;12258:3;12279:67;12343:2;12338:3;12279:67;:::i;:::-;12272:74;;12355:93;12444:3;12355:93;:::i;:::-;12473:2;12468:3;12464:12;12457:19;;12262:220;;;:::o;12488:366::-;12630:3;12651:67;12715:2;12710:3;12651:67;:::i;:::-;12644:74;;12727:93;12816:3;12727:93;:::i;:::-;12845:2;12840:3;12836:12;12829:19;;12634:220;;;:::o;12860:365::-;13002:3;13023:66;13087:1;13082:3;13023:66;:::i;:::-;13016:73;;13098:93;13187:3;13098:93;:::i;:::-;13216:2;13211:3;13207:12;13200:19;;13006:219;;;:::o;13231:366::-;13373:3;13394:67;13458:2;13453:3;13394:67;:::i;:::-;13387:74;;13470:93;13559:3;13470:93;:::i;:::-;13588:2;13583:3;13579:12;13572:19;;13377:220;;;:::o;13603:366::-;13745:3;13766:67;13830:2;13825:3;13766:67;:::i;:::-;13759:74;;13842:93;13931:3;13842:93;:::i;:::-;13960:2;13955:3;13951:12;13944:19;;13749:220;;;:::o;13975:366::-;14117:3;14138:67;14202:2;14197:3;14138:67;:::i;:::-;14131:74;;14214:93;14303:3;14214:93;:::i;:::-;14332:2;14327:3;14323:12;14316:19;;14121:220;;;:::o;14347:366::-;14489:3;14510:67;14574:2;14569:3;14510:67;:::i;:::-;14503:74;;14586:93;14675:3;14586:93;:::i;:::-;14704:2;14699:3;14695:12;14688:19;;14493:220;;;:::o;14719:366::-;14861:3;14882:67;14946:2;14941:3;14882:67;:::i;:::-;14875:74;;14958:93;15047:3;14958:93;:::i;:::-;15076:2;15071:3;15067:12;15060:19;;14865:220;;;:::o;15091:366::-;15233:3;15254:67;15318:2;15313:3;15254:67;:::i;:::-;15247:74;;15330:93;15419:3;15330:93;:::i;:::-;15448:2;15443:3;15439:12;15432:19;;15237:220;;;:::o;15463:366::-;15605:3;15626:67;15690:2;15685:3;15626:67;:::i;:::-;15619:74;;15702:93;15791:3;15702:93;:::i;:::-;15820:2;15815:3;15811:12;15804:19;;15609:220;;;:::o;15835:366::-;15977:3;15998:67;16062:2;16057:3;15998:67;:::i;:::-;15991:74;;16074:93;16163:3;16074:93;:::i;:::-;16192:2;16187:3;16183:12;16176:19;;15981:220;;;:::o;16207:366::-;16349:3;16370:67;16434:2;16429:3;16370:67;:::i;:::-;16363:74;;16446:93;16535:3;16446:93;:::i;:::-;16564:2;16559:3;16555:12;16548:19;;16353:220;;;:::o;16579:108::-;16656:24;16674:5;16656:24;:::i;:::-;16651:3;16644:37;16634:53;;:::o;16693:118::-;16780:24;16798:5;16780:24;:::i;:::-;16775:3;16768:37;16758:53;;:::o;16817:435::-;16997:3;17019:95;17110:3;17101:6;17019:95;:::i;:::-;17012:102;;17131:95;17222:3;17213:6;17131:95;:::i;:::-;17124:102;;17243:3;17236:10;;17001:251;;;;;:::o;17258:222::-;17351:4;17389:2;17378:9;17374:18;17366:26;;17402:71;17470:1;17459:9;17455:17;17446:6;17402:71;:::i;:::-;17356:124;;;;:::o;17486:640::-;17681:4;17719:3;17708:9;17704:19;17696:27;;17733:71;17801:1;17790:9;17786:17;17777:6;17733:71;:::i;:::-;17814:72;17882:2;17871:9;17867:18;17858:6;17814:72;:::i;:::-;17896;17964:2;17953:9;17949:18;17940:6;17896:72;:::i;:::-;18015:9;18009:4;18005:20;18000:2;17989:9;17985:18;17978:48;18043:76;18114:4;18105:6;18043:76;:::i;:::-;18035:84;;17686:440;;;;;;;:::o;18132:373::-;18275:4;18313:2;18302:9;18298:18;18290:26;;18362:9;18356:4;18352:20;18348:1;18337:9;18333:17;18326:47;18390:108;18493:4;18484:6;18390:108;:::i;:::-;18382:116;;18280:225;;;;:::o;18511:210::-;18598:4;18636:2;18625:9;18621:18;18613:26;;18649:65;18711:1;18700:9;18696:17;18687:6;18649:65;:::i;:::-;18603:118;;;;:::o;18727:313::-;18840:4;18878:2;18867:9;18863:18;18855:26;;18927:9;18921:4;18917:20;18913:1;18902:9;18898:17;18891:47;18955:78;19028:4;19019:6;18955:78;:::i;:::-;18947:86;;18845:195;;;;:::o;19046:419::-;19212:4;19250:2;19239:9;19235:18;19227:26;;19299:9;19293:4;19289:20;19285:1;19274:9;19270:17;19263:47;19327:131;19453:4;19327:131;:::i;:::-;19319:139;;19217:248;;;:::o;19471:419::-;19637:4;19675:2;19664:9;19660:18;19652:26;;19724:9;19718:4;19714:20;19710:1;19699:9;19695:17;19688:47;19752:131;19878:4;19752:131;:::i;:::-;19744:139;;19642:248;;;:::o;19896:419::-;20062:4;20100:2;20089:9;20085:18;20077:26;;20149:9;20143:4;20139:20;20135:1;20124:9;20120:17;20113:47;20177:131;20303:4;20177:131;:::i;:::-;20169:139;;20067:248;;;:::o;20321:419::-;20487:4;20525:2;20514:9;20510:18;20502:26;;20574:9;20568:4;20564:20;20560:1;20549:9;20545:17;20538:47;20602:131;20728:4;20602:131;:::i;:::-;20594:139;;20492:248;;;:::o;20746:419::-;20912:4;20950:2;20939:9;20935:18;20927:26;;20999:9;20993:4;20989:20;20985:1;20974:9;20970:17;20963:47;21027:131;21153:4;21027:131;:::i;:::-;21019:139;;20917:248;;;:::o;21171:419::-;21337:4;21375:2;21364:9;21360:18;21352:26;;21424:9;21418:4;21414:20;21410:1;21399:9;21395:17;21388:47;21452:131;21578:4;21452:131;:::i;:::-;21444:139;;21342:248;;;:::o;21596:419::-;21762:4;21800:2;21789:9;21785:18;21777:26;;21849:9;21843:4;21839:20;21835:1;21824:9;21820:17;21813:47;21877:131;22003:4;21877:131;:::i;:::-;21869:139;;21767:248;;;:::o;22021:419::-;22187:4;22225:2;22214:9;22210:18;22202:26;;22274:9;22268:4;22264:20;22260:1;22249:9;22245:17;22238:47;22302:131;22428:4;22302:131;:::i;:::-;22294:139;;22192:248;;;:::o;22446:419::-;22612:4;22650:2;22639:9;22635:18;22627:26;;22699:9;22693:4;22689:20;22685:1;22674:9;22670:17;22663:47;22727:131;22853:4;22727:131;:::i;:::-;22719:139;;22617:248;;;:::o;22871:419::-;23037:4;23075:2;23064:9;23060:18;23052:26;;23124:9;23118:4;23114:20;23110:1;23099:9;23095:17;23088:47;23152:131;23278:4;23152:131;:::i;:::-;23144:139;;23042:248;;;:::o;23296:419::-;23462:4;23500:2;23489:9;23485:18;23477:26;;23549:9;23543:4;23539:20;23535:1;23524:9;23520:17;23513:47;23577:131;23703:4;23577:131;:::i;:::-;23569:139;;23467:248;;;:::o;23721:419::-;23887:4;23925:2;23914:9;23910:18;23902:26;;23974:9;23968:4;23964:20;23960:1;23949:9;23945:17;23938:47;24002:131;24128:4;24002:131;:::i;:::-;23994:139;;23892:248;;;:::o;24146:419::-;24312:4;24350:2;24339:9;24335:18;24327:26;;24399:9;24393:4;24389:20;24385:1;24374:9;24370:17;24363:47;24427:131;24553:4;24427:131;:::i;:::-;24419:139;;24317:248;;;:::o;24571:419::-;24737:4;24775:2;24764:9;24760:18;24752:26;;24824:9;24818:4;24814:20;24810:1;24799:9;24795:17;24788:47;24852:131;24978:4;24852:131;:::i;:::-;24844:139;;24742:248;;;:::o;24996:419::-;25162:4;25200:2;25189:9;25185:18;25177:26;;25249:9;25243:4;25239:20;25235:1;25224:9;25220:17;25213:47;25277:131;25403:4;25277:131;:::i;:::-;25269:139;;25167:248;;;:::o;25421:419::-;25587:4;25625:2;25614:9;25610:18;25602:26;;25674:9;25668:4;25664:20;25660:1;25649:9;25645:17;25638:47;25702:131;25828:4;25702:131;:::i;:::-;25694:139;;25592:248;;;:::o;25846:419::-;26012:4;26050:2;26039:9;26035:18;26027:26;;26099:9;26093:4;26089:20;26085:1;26074:9;26070:17;26063:47;26127:131;26253:4;26127:131;:::i;:::-;26119:139;;26017:248;;;:::o;26271:419::-;26437:4;26475:2;26464:9;26460:18;26452:26;;26524:9;26518:4;26514:20;26510:1;26499:9;26495:17;26488:47;26552:131;26678:4;26552:131;:::i;:::-;26544:139;;26442:248;;;:::o;26696:419::-;26862:4;26900:2;26889:9;26885:18;26877:26;;26949:9;26943:4;26939:20;26935:1;26924:9;26920:17;26913:47;26977:131;27103:4;26977:131;:::i;:::-;26969:139;;26867:248;;;:::o;27121:419::-;27287:4;27325:2;27314:9;27310:18;27302:26;;27374:9;27368:4;27364:20;27360:1;27349:9;27345:17;27338:47;27402:131;27528:4;27402:131;:::i;:::-;27394:139;;27292:248;;;:::o;27546:419::-;27712:4;27750:2;27739:9;27735:18;27727:26;;27799:9;27793:4;27789:20;27785:1;27774:9;27770:17;27763:47;27827:131;27953:4;27827:131;:::i;:::-;27819:139;;27717:248;;;:::o;27971:419::-;28137:4;28175:2;28164:9;28160:18;28152:26;;28224:9;28218:4;28214:20;28210:1;28199:9;28195:17;28188:47;28252:131;28378:4;28252:131;:::i;:::-;28244:139;;28142:248;;;:::o;28396:222::-;28489:4;28527:2;28516:9;28512:18;28504:26;;28540:71;28608:1;28597:9;28593:17;28584:6;28540:71;:::i;:::-;28494:124;;;;:::o;28624:129::-;28658:6;28685:20;;:::i;:::-;28675:30;;28714:33;28742:4;28734:6;28714:33;:::i;:::-;28665:88;;;:::o;28759:75::-;28792:6;28825:2;28819:9;28809:19;;28799:35;:::o;28840:307::-;28901:4;28991:18;28983:6;28980:30;28977:2;;;29013:18;;:::i;:::-;28977:2;29051:29;29073:6;29051:29;:::i;:::-;29043:37;;29135:4;29129;29125:15;29117:23;;28906:241;;;:::o;29153:308::-;29215:4;29305:18;29297:6;29294:30;29291:2;;;29327:18;;:::i;:::-;29291:2;29365:29;29387:6;29365:29;:::i;:::-;29357:37;;29449:4;29443;29439:15;29431:23;;29220:241;;;:::o;29467:132::-;29534:4;29557:3;29549:11;;29587:4;29582:3;29578:14;29570:22;;29539:60;;;:::o;29605:114::-;29672:6;29706:5;29700:12;29690:22;;29679:40;;;:::o;29725:98::-;29776:6;29810:5;29804:12;29794:22;;29783:40;;;:::o;29829:99::-;29881:6;29915:5;29909:12;29899:22;;29888:40;;;:::o;29934:113::-;30004:4;30036;30031:3;30027:14;30019:22;;30009:38;;;:::o;30053:184::-;30152:11;30186:6;30181:3;30174:19;30226:4;30221:3;30217:14;30202:29;;30164:73;;;;:::o;30243:168::-;30326:11;30360:6;30355:3;30348:19;30400:4;30395:3;30391:14;30376:29;;30338:73;;;;:::o;30417:169::-;30501:11;30535:6;30530:3;30523:19;30575:4;30570:3;30566:14;30551:29;;30513:73;;;;:::o;30592:148::-;30694:11;30731:3;30716:18;;30706:34;;;;:::o;30746:305::-;30786:3;30805:20;30823:1;30805:20;:::i;:::-;30800:25;;30839:20;30857:1;30839:20;:::i;:::-;30834:25;;30993:1;30925:66;30921:74;30918:1;30915:81;30912:2;;;30999:18;;:::i;:::-;30912:2;31043:1;31040;31036:9;31029:16;;30790:261;;;;:::o;31057:185::-;31097:1;31114:20;31132:1;31114:20;:::i;:::-;31109:25;;31148:20;31166:1;31148:20;:::i;:::-;31143:25;;31187:1;31177:2;;31192:18;;:::i;:::-;31177:2;31234:1;31231;31227:9;31222:14;;31099:143;;;;:::o;31248:348::-;31288:7;31311:20;31329:1;31311:20;:::i;:::-;31306:25;;31345:20;31363:1;31345:20;:::i;:::-;31340:25;;31533:1;31465:66;31461:74;31458:1;31455:81;31450:1;31443:9;31436:17;31432:105;31429:2;;;31540:18;;:::i;:::-;31429:2;31588:1;31585;31581:9;31570:20;;31296:300;;;;:::o;31602:191::-;31642:4;31662:20;31680:1;31662:20;:::i;:::-;31657:25;;31696:20;31714:1;31696:20;:::i;:::-;31691:25;;31735:1;31732;31729:8;31726:2;;;31740:18;;:::i;:::-;31726:2;31785:1;31782;31778:9;31770:17;;31647:146;;;;:::o;31799:96::-;31836:7;31865:24;31883:5;31865:24;:::i;:::-;31854:35;;31844:51;;;:::o;31901:90::-;31935:7;31978:5;31971:13;31964:21;31953:32;;31943:48;;;:::o;31997:149::-;32033:7;32073:66;32066:5;32062:78;32051:89;;32041:105;;;:::o;32152:126::-;32189:7;32229:42;32222:5;32218:54;32207:65;;32197:81;;;:::o;32284:77::-;32321:7;32350:5;32339:16;;32329:32;;;:::o;32367:154::-;32451:6;32446:3;32441;32428:30;32513:1;32504:6;32499:3;32495:16;32488:27;32418:103;;;:::o;32527:307::-;32595:1;32605:113;32619:6;32616:1;32613:13;32605:113;;;32704:1;32699:3;32695:11;32689:18;32685:1;32680:3;32676:11;32669:39;32641:2;32638:1;32634:10;32629:15;;32605:113;;;32736:6;32733:1;32730:13;32727:2;;;32816:1;32807:6;32802:3;32798:16;32791:27;32727:2;32576:258;;;;:::o;32840:320::-;32884:6;32921:1;32915:4;32911:12;32901:22;;32968:1;32962:4;32958:12;32989:18;32979:2;;33045:4;33037:6;33033:17;33023:27;;32979:2;33107;33099:6;33096:14;33076:18;33073:38;33070:2;;;33126:18;;:::i;:::-;33070:2;32891:269;;;;:::o;33166:281::-;33249:27;33271:4;33249:27;:::i;:::-;33241:6;33237:40;33379:6;33367:10;33364:22;33343:18;33331:10;33328:34;33325:62;33322:2;;;33390:18;;:::i;:::-;33322:2;33430:10;33426:2;33419:22;33209:238;;;:::o;33453:233::-;33492:3;33515:24;33533:5;33515:24;:::i;:::-;33506:33;;33561:66;33554:5;33551:77;33548:2;;;33631:18;;:::i;:::-;33548:2;33678:1;33671:5;33667:13;33660:20;;33496:190;;;:::o;33692:176::-;33724:1;33741:20;33759:1;33741:20;:::i;:::-;33736:25;;33775:20;33793:1;33775:20;:::i;:::-;33770:25;;33814:1;33804:2;;33819:18;;:::i;:::-;33804:2;33860:1;33857;33853:9;33848:14;;33726:142;;;;:::o;33874:180::-;33922:77;33919:1;33912:88;34019:4;34016:1;34009:15;34043:4;34040:1;34033:15;34060:180;34108:77;34105:1;34098:88;34205:4;34202:1;34195:15;34229:4;34226:1;34219:15;34246:180;34294:77;34291:1;34284:88;34391:4;34388:1;34381:15;34415:4;34412:1;34405:15;34432:180;34480:77;34477:1;34470:88;34577:4;34574:1;34567:15;34601:4;34598:1;34591:15;34618:102;34659:6;34710:2;34706:7;34701:2;34694:5;34690:14;34686:28;34676:38;;34666:54;;;:::o;34726:230::-;34866:34;34862:1;34854:6;34850:14;34843:58;34935:13;34930:2;34922:6;34918:15;34911:38;34832:124;:::o;34962:237::-;35102:34;35098:1;35090:6;35086:14;35079:58;35171:20;35166:2;35158:6;35154:15;35147:45;35068:131;:::o;35205:225::-;35345:34;35341:1;35333:6;35329:14;35322:58;35414:8;35409:2;35401:6;35397:15;35390:33;35311:119;:::o;35436:178::-;35576:30;35572:1;35564:6;35560:14;35553:54;35542:72;:::o;35620:223::-;35760:34;35756:1;35748:6;35744:14;35737:58;35829:6;35824:2;35816:6;35812:15;35805:31;35726:117;:::o;35849:175::-;35989:27;35985:1;35977:6;35973:14;35966:51;35955:69;:::o;36030:159::-;36170:11;36166:1;36158:6;36154:14;36147:35;36136:53;:::o;36195:231::-;36335:34;36331:1;36323:6;36319:14;36312:58;36404:14;36399:2;36391:6;36387:15;36380:39;36301:125;:::o;36432:243::-;36572:34;36568:1;36560:6;36556:14;36549:58;36641:26;36636:2;36628:6;36624:15;36617:51;36538:137;:::o;36681:229::-;36821:34;36817:1;36809:6;36805:14;36798:58;36890:12;36885:2;36877:6;36873:15;36866:37;36787:123;:::o;36916:228::-;37056:34;37052:1;37044:6;37040:14;37033:58;37125:11;37120:2;37112:6;37108:15;37101:36;37022:122;:::o;37150:182::-;37290:34;37286:1;37278:6;37274:14;37267:58;37256:76;:::o;37338:158::-;37478:10;37474:1;37466:6;37462:14;37455:34;37444:52;:::o;37502:231::-;37642:34;37638:1;37630:6;37626:14;37619:58;37711:14;37706:2;37698:6;37694:15;37687:39;37608:125;:::o;37739:182::-;37879:34;37875:1;37867:6;37863:14;37856:58;37845:76;:::o;37927:228::-;38067:34;38063:1;38055:6;38051:14;38044:58;38136:11;38131:2;38123:6;38119:15;38112:36;38033:122;:::o;38161:234::-;38301:34;38297:1;38289:6;38285:14;38278:58;38370:17;38365:2;38357:6;38353:15;38346:42;38267:128;:::o;38401:167::-;38541:19;38537:1;38529:6;38525:14;38518:43;38507:61;:::o;38574:220::-;38714:34;38710:1;38702:6;38698:14;38691:58;38783:3;38778:2;38770:6;38766:15;38759:28;38680:114;:::o;38800:160::-;38940:12;38936:1;38928:6;38924:14;38917:36;38906:54;:::o;38966:236::-;39106:34;39102:1;39094:6;39090:14;39083:58;39175:19;39170:2;39162:6;39158:15;39151:44;39072:130;:::o;39208:231::-;39348:34;39344:1;39336:6;39332:14;39325:58;39417:14;39412:2;39404:6;39400:15;39393:39;39314:125;:::o;39445:122::-;39518:24;39536:5;39518:24;:::i;:::-;39511:5;39508:35;39498:2;;39557:1;39554;39547:12;39498:2;39488:79;:::o;39573:116::-;39643:21;39658:5;39643:21;:::i;:::-;39636:5;39633:32;39623:2;;39679:1;39676;39669:12;39623:2;39613:76;:::o;39695:120::-;39767:23;39784:5;39767:23;:::i;:::-;39760:5;39757:34;39747:2;;39805:1;39802;39795:12;39747:2;39737:78;:::o;39821:122::-;39894:24;39912:5;39894:24;:::i;:::-;39887:5;39884:35;39874:2;;39933:1;39930;39923:12;39874:2;39864:79;:::o
Swarm Source
ipfs://cfe8359850f6aefb550aaf8ea631bd2d9780849d00a5e9a4ac7d62eaad7acd87
Loading...
Loading
Loading...
Loading
[ 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.