Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
EvaTurtleNFTv2
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // copied from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/token/ERC721/ERC721.sol // and merged with: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/token/ERC721/extensions/ERC721Enumerable.sol import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Pausable.sol"; import "./Proxy.sol"; import "./EvaverseNFTv2.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. */ contract EvaTurtleNFTv2 is ProxyTarget, Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable, Pausable { using Address for address; using Strings for uint256; // Token name string private _tokenName; // Token symbol string private _tokenSymbol; // Base URI string private _baseURI; // 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; // 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; address private _evaverseNFT; uint256 private _tokenCount; uint256 private _maxTokens; bool private _initialized; bool private _isPromotionRunning; mapping (uint256 => bool) private _claimedEvaNFTs; uint256 private _tokenPrice; bool private _purchaseEnabled; // can't depend on a constructor because we have an upgradable proxy, have to initialize instead. function Initialize(address evaverseAddress) onlyOwner external { require(!_initialized, "Contract instance has already been initialized"); _tokenName = "Eva Turtle"; _tokenSymbol = "TRTL"; _baseURI = "https://evaverse.com/api/turtle.php?id="; _evaverseNFT = evaverseAddress; _maxTokens = 5000; _initialized = true; _isPromotionRunning = true; // Added in v2, so this will never be called. Added for popsterity in case we use this contract for another Pet in the future. _tokenPrice = 50000000000000000; //0.05 ETH _purchaseEnabled = true; } function IsInitialized() external view returns (bool) { return _initialized; } function IsEvaTokenClaimable(uint256 evaTokenId) external view returns(bool) { if (!_isPromotionRunning) return false; if (evaTokenId < 1 || evaTokenId > EvaverseNFTv2(_evaverseNFT).totalSupply()) return false; return !_claimedEvaNFTs[evaTokenId]; } function ClaimPets(uint256[] memory evaTokens) external whenNotPaused { require(_isPromotionRunning); require(evaTokens.length <= 30, "Can't claim that many at once, sorry."); uint claimableTokens = 0; uint remainingTokens = _maxTokens - _tokenCount; EvaverseNFTv2 evaContract = EvaverseNFTv2(_evaverseNFT); for(uint ii = 0; ii < evaTokens.length; ii++) { uint256 evaTokenId = evaTokens[ii]; if (claimableTokens >= remainingTokens) break; require(evaContract.ownerOf(evaTokenId) == _msgSender()); if (!_claimedEvaNFTs[evaTokenId]) { claimableTokens++; _claimedEvaNFTs[evaTokenId] = true; } } require(claimableTokens > 0, "Sorry, no tokens Evaverse to claim."); _batchMint(_msgSender(), claimableTokens); } function MintEvaAndPet(address to, uint count) payable external { MintInernal(to, count); } function MintEvaAndPet(uint count) payable external { MintInernal(_msgSender(), count); } function MintInernal(address to, uint count) internal whenNotPaused { require(_evaverseNFT != address(0)); require(count > 0, "You cant buy 0."); require(count <= 30, "Can't claim that many at once, sorry."); EvaverseNFTv2 evaContract = EvaverseNFTv2(_evaverseNFT); uint256 evaTokenId = evaContract.totalSupply(); evaContract.MintNFT{value:msg.value}(to, count); if(_isPromotionRunning) { uint256 endTokenId = evaContract.totalSupply(); if (endTokenId > _maxTokens) { endTokenId = _maxTokens; } if (endTokenId > evaTokenId) { for(uint id = evaTokenId + 1; id <= endTokenId; id++) { _claimedEvaNFTs[id] = true; } _batchMint(to, endTokenId - evaTokenId); } } } /** * @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 || interfaceId == type(IERC721Enumerable).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 _tokenName; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _tokenSymbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "URI query for nonexistent token"); return string(abi.encodePacked(_baseURI, tokenId.toString())); } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override whenNotPaused { address owner = EvaTurtleNFTv2.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override whenNotPaused { 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 whenNotPaused { //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 whenNotPaused { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override whenNotPaused { 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 = EvaTurtleNFTv2.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _batchMint(address to, uint count) internal { require(to != address(0), "ERC721: mint to the zero address"); uint256 tokenId = _tokenCount + 1; uint256 endToken = _tokenCount + count; require(_checkOnERC721Received(address(0), to, tokenId, ""), "ERC721: transfer to non ERC721Receiver implementer"); for(; tokenId <= endToken; tokenId++) { _beforeTokenTransfer(address(0), to, tokenId); _owners[tokenId] = to; _balances[to]++; // don't try and optimize this to only add once, _beforeTokenTransfer needs this to be updated each time. } tokenId = _tokenCount + 1; _tokenCount += count; for(; tokenId <= endToken; tokenId++) { emit Transfer(address(0), to, tokenId); } } /** * @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) internal virtual { _tokenCount++; _mint(to, _tokenCount); require( _checkOnERC721Received(address(0), to, _tokenCount, ""), "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 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(EvaTurtleNFTv2.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 whenNotPaused { _tokenApprovals[tokenId] = to; emit Approval(EvaTurtleNFTv2.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 See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < EvaTurtleNFTv2.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 < EvaTurtleNFTv2.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 { 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 = EvaTurtleNFTv2.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 = EvaTurtleNFTv2.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(); } function SetPause(bool pause) external onlyOwner { if (pause) _pause(); else _unpause(); } function WithdrawBalance(address payTo, uint256 amount) external onlyOwner { address thisAddr = address(this); require(thisAddr.balance > 0); address payable receiver = payable(payTo); receiver.transfer(amount); } function GetBalance() external view onlyOwner returns (uint256) { return address(this).balance; } function SendGiftToWinners(address[] memory winners) external onlyOwner { require(_tokenCount + winners.length < _maxTokens, "Not enough tokens remaining."); for(uint ii = 0; ii < winners.length; ii++) { _safeMint(winners[ii]); } } // Should only be used if all free tokens get claimed and we decide to air drop extra free gifts on the same contract. function SetMaxTokenCount(uint256 newMaxCount) external onlyOwner { require(_tokenCount < newMaxCount, "New Maximum Token Count must be greater than the amount of tokens already existing on the contract"); _maxTokens = newMaxCount; } function GetMaxTokenCount() external view returns (uint256) { return _maxTokens; } function SetPromotionState(bool enabled) external onlyOwner { _isPromotionRunning = enabled; } function IsPromotionEnabled() external view returns (bool) { return _isPromotionRunning; } function GetEvaContract() external view returns (address) { return _evaverseNFT; } // Not sure if we'll ever use this, but because we're doing a contract upgrade, Damos thought it would be a good idea to have this available to us in case we want to open it up later. function AdoptTurtle(address to, uint count) payable external whenNotPaused { require(_purchaseEnabled, "Purchasing is not enabled."); require(count > 0, "Count must be greater than 0."); require(count <= 30, "Count can't be that large, sorry."); require(_tokenCount < _maxTokens, "No tokens left to purchase."); require(msg.value == count * _tokenPrice, "Amount of ETH is not right."); // pro-rate any purchase that would have put us over the cap of total NFTs uint refundCount = 0; if (_tokenCount + count > _maxTokens) { refundCount = count - (_maxTokens - _tokenCount); count = _maxTokens - _tokenCount; } // Mint all our NFTs! _batchMint(to, count); // Refund any Ether for NFTs that couldn't be minted. if (refundCount > 0) { address payable receiver = payable(to); receiver.transfer(refundCount * _tokenPrice); } } function SetPrice(uint256 newPrice) external onlyOwner { _tokenPrice = newPrice; } function GetPrice() external view returns (uint) { return _tokenPrice; } function SetPurchasable(bool isPurchasable) external onlyOwner { _purchaseEnabled = isPurchasable; } function IsPurchasable() external view returns (bool) { return _purchaseEnabled; } }
// 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; // copied from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/token/ERC721/ERC721.sol // and merged with: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/token/ERC721/extensions/ERC721Enumerable.sol import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Pausable.sol"; import "./ReentrancyGuard.sol"; import "./Proxy.sol"; // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2309.md interface IERC2309 { // EvaverseNFTv2: We will no longer use this interface or event anymore. // Although it saved people money in gas, and it allowed us to send more batch mint tokens in 1 transaction, etherscan ignores the // message, and only listens to transfer message, so people don't see their tokens in the etherscan logs. event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed fromAddress, address indexed toAddress); } /** * @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 EvaverseNFTv2 is ProxyTarget, Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable, IERC2309, Pausable, ReentrancyGuard { using Address for address; using Strings for uint256; string private _tokenName; string private _tokenSymbol; string private _baseURI; // 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; // 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; uint256 private _tokenCount; uint256 private _giveawayTokens; uint256 private _maxTokens; uint256 private _tokenPrice; address payable private _bankAddress; bool private _bankIsContract; bool private _initialized; // can't depend on a constructor because we have an upgradable proxy, have to initialize instead. function Initialize() onlyOwner external { require(!_initialized, "Contract instance has already been initialized"); _tokenName = "Evaverse"; _tokenSymbol = "EVA"; _baseURI = "https://evaverse.com/api/creatures.php?id="; _giveawayTokens = 500; _maxTokens = 10000; _tokenPrice = 100000000000000000; //0.1 ETH _initialized = true; _batchMint(Ownable.owner(), _giveawayTokens); } function IsInitialized() external view returns (bool) { return _initialized; } // Hopefully never need this. Leaving it as an option if we have unsold tokens, if we want to do another giveaway or something. function DevMint(address to, uint count) external onlyOwner { require(_tokenCount + count < _maxTokens, "EvaNFT: Not enough tokens remaining."); _batchMint(to, count); } function MintNFT(uint count) payable external { MintInternal(_msgSender(), count); } function MintNFT(address to, uint count) payable external { MintInternal(to, count); } function MintInternal(address to, uint count) internal whenNotPaused nonReentrant { require(_initialized, "EvaNFT: Contract is not initialized."); require(count > 0, "EvaNFT: Count must be greater than 0."); require(count <= 400, "EvaNFT: Count can't be that large, sorry."); require(_tokenCount < _maxTokens, "EvaNFT: No tokens left to purchase."); require(msg.value == count * _tokenPrice, "EvaNFT: Amount of ETH is not right."); // pro-rate any purchase that would have put us over the cap of total NFTs uint refundCount = 0; if (_tokenCount + count > _maxTokens) { refundCount = count - (_maxTokens - _tokenCount); count = _maxTokens - _tokenCount; } // Mint all our NFTs! _batchMint(to, count); // Refund any Ether for NFTs that couldn't be minted. if (refundCount > 0) { address payable receiver = payable(to); receiver.transfer(refundCount * _tokenPrice); } // Store funds in a wallet or other smart contract. if (_bankAddress != address(0)) { if (_bankIsContract) { // This is the only way I could get funds to receive in Gnosis Safe. (bool sent, ) = _bankAddress.call{value: msg.value}(""); require(sent, "Failed to send Ether"); } else { _bankAddress.transfer(msg.value); } } } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "EvaNFT: balance query for the zero address"); return owner == Ownable.owner() ? 0 : _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "EvaNFT: owner query for nonexistent token"); address owner = _owners[tokenId]; return owner != address(0) ? owner : Ownable.owner(); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _tokenName; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _tokenSymbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "EvaNFT: URI query for nonexistent token"); return string(abi.encodePacked(_baseURI, tokenId.toString())); } function baseURI() public view returns (string memory) { return _baseURI; } function setBaseURI(string memory uri) external onlyOwner { _baseURI = uri; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override whenNotPaused { address owner = EvaverseNFTv2.ownerOf(tokenId); require(to != owner, "EvaNFT: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "EvaNFT: 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), "EvaNFT: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override whenNotPaused { require(operator != _msgSender(), "EvaNFT: 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 whenNotPaused { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "EvaNFT: 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 whenNotPaused { require(_isApprovedOrOwner(_msgSender(), tokenId), "EvaNFT: 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), "EvaNFT: 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 tokenId > 0 && tokenId <= _tokenCount; } /** * @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), "EvaNFT: operator query for nonexistent token"); address owner = EvaverseNFTv2.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _batchMint(address to, uint count) internal { require(to != address(0), "EvaNFT: mint to the zero address"); uint256 tokenId = _tokenCount + 1; uint256 endToken = tokenId + count; // Don't need to run this code on the owner, those tokens are... virtual? if (to != Ownable.owner()) { for(; tokenId < endToken; tokenId++) { _owners[tokenId] = to; } } tokenId = _tokenCount + 1; _balances[to] += count; _tokenCount += count; for(; tokenId < endToken; tokenId++) { emit Transfer(address(0), to, 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(EvaverseNFTv2.ownerOf(tokenId) == from, "EvaNFT: transfer of token that is not own"); require(to != address(0), "EvaNFT: 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 whenNotPaused { _tokenApprovals[tokenId] = to; emit Approval(EvaverseNFTv2.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("EvaNFT: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < EvaverseNFTv2.balanceOf(owner), "EvaNFT: owner index out of bounds"); require(owner != Ownable.owner(), "EvaNFT: contract owner tokenOfOwnerByIndex not supported"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _tokenCount; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < EvaverseNFTv2.totalSupply(), "EvaNFT: global index out of bounds"); return index + 1; } /** * @dev Hook that is called before any token transfer. * * 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) private { if (from == address(0)) { // this would only ever be called single single minting, which we don't care about //_addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { // this is only ever used in burning, which we don't care about. //_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 { if (to == Ownable.owner()) return; uint256 length = EvaverseNFTv2.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @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). if (from == Ownable.owner()) return; uint256 lastTokenIndex = EvaverseNFTv2.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]; } function SetPause(bool pause) external onlyOwner { if (pause) _pause(); else _unpause(); } function WithdrawBalance(address payTo, uint256 amount) external onlyOwner { address thisAddr = address(this); require(thisAddr.balance > 0); address payable receiver = payable(payTo); receiver.transfer(amount); } function SendGiftToWinners(uint256 startTokenId, address[] memory winners) external onlyOwner { for(uint ii = 0; ii < winners.length; ii++) { uint256 tokenId = startTokenId + ii; require(tokenId <= _giveawayTokens, "We can't give away that many."); // we must also be the owner, but that require check is already inside safeTransferFrom safeTransferFrom(Ownable.owner(), winners[ii], tokenId); } } function GetBalance() external view onlyOwner returns (uint256) { return address(this).balance; } function SetMaxTokenCount(uint256 newMaxCount) external onlyOwner { require(_tokenCount < newMaxCount, "New Maximum Token Count must be greater than the amount of tokens already existing on the contract"); _maxTokens = newMaxCount; } function GetMaxTokenCount() external view returns (uint256) { return _maxTokens; } function SetBank(address bank, bool isContract) external onlyOwner { _bankAddress = payable(bank); _bankIsContract = isContract; } function GetBank() external view onlyOwner returns (address) { return _bankAddress; } function SetPrice(uint256 newPrice) external onlyOwner { _tokenPrice = newPrice; } function GetPrice() external view returns (uint) { return _tokenPrice; } // At the time of writing this function there are 16 NFTs that have been sent to invalid addresses that are unrecoverable without this. // 1 Was sent to a Giveaway and the person receiving it gave us a Binance wallet address, and they wouldn't help recover it. // 1 Was sent to a Coinbase wallet and is also unrecoverable. // 14 Were sent to this contract due to a bug with turtles. That bug has now been fixed but the 14 NFTs left untouchable. function DevRecoverToken(address from, address to, uint256 tokenId) external onlyOwner { _safeTransfer(from, to, 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; // We can't use the default implementation of OpenZeppelin's Ownable because it uses a constructor which doesn't work with Proxy contracts abstract contract Ownable { address internal _owner; function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } constructor () { _owner = msg.sender; } function SetOwner(address newOwner) external onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Ownable.sol"; // This is mostly lifted from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/Proxy.sol // Honorably mentions should be: https://fravoll.github.io/solidity-patterns/proxy_delegate.html // which guided me to: https://github.com/fravoll/solidity-patterns/tree/master/ProxyDelegate // Good Info here: https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable // Sample ERC721 Upgradable contract: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/tree/master/contracts/token/ERC721 abstract contract Proxy is Ownable { address internal _delegateAddress; function GetLogic() external view onlyOwner returns (address) { return _delegateAddress; } function SetLogic(address delegate) external onlyOwner { _delegateAddress = delegate; } fallback () external payable { _delegate(_delegateAddress); } receive () external payable { _delegate(_delegateAddress); } function _delegate(address implementation) internal { // solhint-disable-next-line no-inline-assembly assembly { //Optional, if we wan't to get rid of the param to this function, load from member variable //let _target := sload(0) // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize()) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) // Copy the returned data. returndatacopy(0, 0, returndatasize()) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } } abstract contract ProxyTarget is Ownable { address internal _delegateAddress; function GetLogicContract() external view onlyOwner returns (address) { return _delegateAddress; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // We can't use the default implementation of OpenZeppelin's Ownable because it uses a constructor which doesn't work with Proxy contracts abstract contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 0; uint256 private constant _ENTERED = 2; uint256 private _status; // Constructor doesn't work with Upgradable Proxy /*constructor() { _status = _NOT_ENTERED; }*/ /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// 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
[{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"AdoptTurtle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"evaTokens","type":"uint256[]"}],"name":"ClaimPets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"GetBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetEvaContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetLogicContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetMaxTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"evaverseAddress","type":"address"}],"name":"Initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"evaTokenId","type":"uint256"}],"name":"IsEvaTokenClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IsInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IsPromotionEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IsPurchasable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"MintEvaAndPet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"MintEvaAndPet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"winners","type":"address[]"}],"name":"SendGiftToWinners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxCount","type":"uint256"}],"name":"SetMaxTokenCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"SetOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause","type":"bool"}],"name":"SetPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"SetPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"SetPromotionState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPurchasable","type":"bool"}],"name":"SetPurchasable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"payTo","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600080546001600160a01b031916331790556001805460ff60a01b191690556132108061003f6000396000f3fe60806040526004361061023b5760003560e01c80635563aca01161012e578063a206bf90116100ab578063c87b56dd1161006f578063c87b56dd14610670578063dd1cb56114610690578063e985e9c5146106a5578063f0b1ec47146106ee578063f8f8a9121461070e57600080fd5b8063a206bf90146105d2578063a22cb465146105f2578063b88d4fde14610612578063b8c5c8b514610632578063bfbc99611461065257600080fd5b806370a08231116100f257806370a08231146105545780638da5cb5b1461057457806395975b2a1461059257806395d89b41146105aa5780639effe374146105bf57600080fd5b80635563aca0146104d85780635751cc84146104ed5780635c975abb146105005780636352211e1461051f5780636d90164e1461053f57600080fd5b80632597676e116101bc57806340a26e7b1161018057806340a26e7b1461043b57806342842e0e1461045b57806348e37a4a1461047b5780634f5539c0146104985780634f6ccce7146104b857600080fd5b80632597676e146103b05780632a321e9e146103d05780632f745c59146103e857806336b14535146104085780633a64e63f1461042857600080fd5b8063140eb9f811610203578063140eb9f814610311578063167d3e9c1461033157806318160ddd146103515780631ff7f0dd1461037057806323b872dd1461039057600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc146102975780630875ab8e146102cf578063095ea7b3146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004612d0c565b610723565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610790565b60405161026c9190612e9f565b3480156102a357600080fd5b506102b76102b2366004612d44565b610822565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea366004612b9f565b6108bc565b005b3480156102fd57600080fd5b506102ef61030c366004612b9f565b610940565b34801561031d57600080fd5b506102ef61032c366004612cf2565b610a80565b34801561033d57600080fd5b506102ef61034c3660046129f8565b610ad2565b34801561035d57600080fd5b50600b545b60405190815260200161026c565b34801561037c57600080fd5b5061026061038b366004612d44565b610b92565b34801561039c57600080fd5b506102ef6103ab366004612a6f565b610c63565b3480156103bc57600080fd5b506102ef6103cb366004612cf2565b610cbe565b3480156103dc57600080fd5b5060135460ff16610260565b3480156103f457600080fd5b50610362610403366004612b9f565b610d11565b34801561041457600080fd5b506102ef6104233660046129f8565b610da7565b6102ef610436366004612d44565b610f25565b34801561044757600080fd5b506102ef610456366004612bca565b610f2f565b34801561046757600080fd5b506102ef610476366004612a6f565b611019565b34801561048757600080fd5b50601054610100900460ff16610260565b3480156104a457600080fd5b506102ef6104b3366004612d44565b61105e565b3480156104c457600080fd5b506103626104d3366004612d44565b61109c565b3480156104e457600080fd5b506102b761113d565b6102ef6104fb366004612b9f565b611188565b34801561050c57600080fd5b50600154600160a01b900460ff16610260565b34801561052b57600080fd5b506102b761053a366004612d44565b611192565b34801561054b57600080fd5b50601254610362565b34801561056057600080fd5b5061036261056f3660046129f8565b611209565b34801561058057600080fd5b506000546001600160a01b03166102b7565b34801561059e57600080fd5b5060105460ff16610260565b3480156105b657600080fd5b5061028a611290565b6102ef6105cd366004612b9f565b61129f565b3480156105de57600080fd5b506102ef6105ed366004612cf2565b611512565b3480156105fe57600080fd5b506102ef61060d366004612b6b565b61155e565b34801561061e57600080fd5b506102ef61062d366004612aaf565b61164d565b34801561063e57600080fd5b506102ef61064d366004612d44565b6116af565b34801561065e57600080fd5b50600d546001600160a01b03166102b7565b34801561067c57600080fd5b5061028a61068b366004612d44565b611795565b34801561069c57600080fd5b50600f54610362565b3480156106b157600080fd5b506102606106c0366004612a37565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156106fa57600080fd5b506102ef610709366004612c6b565b61182e565b34801561071a57600080fd5b50610362611a3c565b60006001600160e01b031982166380ac58cd60e01b148061075457506001600160e01b03198216635b5e139f60e01b145b8061076f57506001600160e01b0319821663780e9d6360e01b145b8061078a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461079f906130dc565b80601f01602080910402602001604051908101604052809291908181526020018280546107cb906130dc565b80156108185780601f106107ed57610100808354040283529160200191610818565b820191906000526020600020905b8154815290600101906020018083116107fb57829003601f168201915b5050505050905090565b6000818152600560205260408120546001600160a01b03166108a05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b336108cf6000546001600160a01b031690565b6001600160a01b0316146108f55760405162461bcd60e51b815260040161089790612f73565b30803161090157600080fd5b60405183906001600160a01b0382169084156108fc029085906000818181858888f19350505050158015610939573d6000803e3d6000fd5b5050505050565b600154600160a01b900460ff161561096a5760405162461bcd60e51b815260040161089790612f49565b600061097582611192565b9050806001600160a01b0316836001600160a01b031614156109e35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610897565b336001600160a01b03821614806109ff57506109ff81336106c0565b610a715760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610897565b610a7b8383611a7c565b505050565b33610a936000546001600160a01b031690565b6001600160a01b031614610ab95760405162461bcd60e51b815260040161089790612f73565b8015610aca57610ac7611b14565b50565b610ac7611b96565b33610ae56000546001600160a01b031690565b6001600160a01b031614610b0b5760405162461bcd60e51b815260040161089790612f73565b6001600160a01b038116610b705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610897565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b601054600090610100900460ff16610bac57506000919050565b6001821080610c3f5750600d60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c0457600080fd5b505afa158015610c18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3c9190612d5c565b82115b15610c4c57506000919050565b5060009081526011602052604090205460ff161590565b600154600160a01b900460ff1615610c8d5760405162461bcd60e51b815260040161089790612f49565b610c973382611c1a565b610cb35760405162461bcd60e51b815260040161089790612fa8565b610a7b838383611d11565b33610cd16000546001600160a01b031690565b6001600160a01b031614610cf75760405162461bcd60e51b815260040161089790612f73565b601080549115156101000261ff0019909216919091179055565b6000610d1c83611209565b8210610d7e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610897565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b33610dba6000546001600160a01b031690565b6001600160a01b031614610de05760405162461bcd60e51b815260040161089790612f73565b60105460ff1615610e4a5760405162461bcd60e51b815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201526d195b881a5b9a5d1a585b1a5e995960921b6064820152608401610897565b60408051808201909152600a8082526945766120547572746c6560b01b6020909201918252610e7b9160029161294a565b50604080518082019091526004808252631514951360e21b6020909201918252610ea79160039161294a565b506040518060600160405280602781526020016131b4602791398051610ed59160049160209091019061294a565b50600d80546001600160a01b0319166001600160a01b0392909216919091179055611388600f556010805461ffff191661010117905566b1a2bc2ec500006012556013805460ff19166001179055565b610ac73382611ebc565b33610f426000546001600160a01b031690565b6001600160a01b031614610f685760405162461bcd60e51b815260040161089790612f73565b600f548151600e54610f7a919061304e565b10610fc75760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e732072656d61696e696e672e000000006044820152606401610897565b60005b815181101561101557611003828281518110610ff657634e487b7160e01b600052603260045260246000fd5b602002602001015161213c565b8061100d81613117565b915050610fca565b5050565b600154600160a01b900460ff16156110435760405162461bcd60e51b815260040161089790612f49565b610a7b8383836040518060200160405280600081525061164d565b336110716000546001600160a01b031690565b6001600160a01b0316146110975760405162461bcd60e51b815260040161089790612f73565b601255565b60006110a7600b5490565b821061110a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610897565b600b828154811061112b57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000336111526000546001600160a01b031690565b6001600160a01b0316146111785760405162461bcd60e51b815260040161089790612f73565b506001546001600160a01b031690565b6110158282611ebc565b6000818152600560205260408120546001600160a01b03168061078a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610897565b60006001600160a01b0382166112745760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610897565b506001600160a01b031660009081526006602052604090205490565b60606003805461079f906130dc565b600154600160a01b900460ff16156112c95760405162461bcd60e51b815260040161089790612f49565b60135460ff1661131b5760405162461bcd60e51b815260206004820152601a60248201527f50757263686173696e67206973206e6f7420656e61626c65642e0000000000006044820152606401610897565b6000811161136b5760405162461bcd60e51b815260206004820152601d60248201527f436f756e74206d7573742062652067726561746572207468616e20302e0000006044820152606401610897565b601e8111156113c65760405162461bcd60e51b815260206004820152602160248201527f436f756e742063616e27742062652074686174206c617267652c20736f7272796044820152601760f91b6064820152608401610897565b600f54600e54106114195760405162461bcd60e51b815260206004820152601b60248201527f4e6f20746f6b656e73206c65667420746f2070757263686173652e00000000006044820152606401610897565b601254611426908261307a565b34146114745760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206f6620455448206973206e6f742072696768742e00000000006044820152606401610897565b6000600f5482600e54611487919061304e565b11156114bc57600e54600f5461149d9190613099565b6114a79083613099565b9050600e54600f546114b99190613099565b91505b6114c68383612197565b8015610a7b5760125483906001600160a01b038216906108fc906114ea908561307a565b6040518115909202916000818181858888f19350505050158015610939573d6000803e3d6000fd5b336115256000546001600160a01b031690565b6001600160a01b03161461154b5760405162461bcd60e51b815260040161089790612f73565b6013805460ff1916911515919091179055565b600154600160a01b900460ff16156115885760405162461bcd60e51b815260040161089790612f49565b6001600160a01b0382163314156115e15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610897565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600154600160a01b900460ff16156116775760405162461bcd60e51b815260040161089790612f49565b6116813383611c1a565b61169d5760405162461bcd60e51b815260040161089790612fa8565b6116a984848484612330565b50505050565b336116c26000546001600160a01b031690565b6001600160a01b0316146116e85760405162461bcd60e51b815260040161089790612f73565b80600e54106117905760405162461bcd60e51b815260206004820152606260248201527f4e6577204d6178696d756d20546f6b656e20436f756e74206d7573742062652060448201527f67726561746572207468616e2074686520616d6f756e74206f6620746f6b656e60648201527f7320616c7265616479206578697374696e67206f6e2074686520636f6e74726160848201526118dd60f21b60a482015260c401610897565b600f55565b6000818152600560205260409020546060906001600160a01b03166117fc5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610897565b600461180783612363565b604051602001611818929190612dbc565b6040516020818303038152906040529050919050565b600154600160a01b900460ff16156118585760405162461bcd60e51b815260040161089790612f49565b601054610100900460ff1661186c57600080fd5b601e8151111561188e5760405162461bcd60e51b815260040161089790612eb2565b600080600e54600f546118a19190613099565b600d549091506001600160a01b031660005b84518110156119d55760008582815181106118de57634e487b7160e01b600052603260045260246000fd5b602002602001015190508385106118f557506119d5565b336040516331a9108f60e11b8152600481018390526001600160a01b0391821691851690636352211e9060240160206040518083038186803b15801561193a57600080fd5b505afa15801561194e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119729190612a1b565b6001600160a01b03161461198557600080fd5b60008181526011602052604090205460ff166119c257846119a581613117565b6000838152601160205260409020805460ff191660011790559550505b50806119cd81613117565b9150506118b3565b5060008311611a325760405162461bcd60e51b815260206004820152602360248201527f536f7272792c206e6f20746f6b656e7320457661766572736520746f20636c6160448201526234b69760e91b6064820152608401610897565b6116a93384612197565b600033611a516000546001600160a01b031690565b6001600160a01b031614611a775760405162461bcd60e51b815260040161089790612f73565b504790565b600154600160a01b900460ff1615611aa65760405162461bcd60e51b815260040161089790612f49565b600081815260076020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611adb82611192565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600154600160a01b900460ff1615611b3e5760405162461bcd60e51b815260040161089790612f49565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b793390565b6040516001600160a01b03909116815260200160405180910390a1565b600154600160a01b900460ff16611be65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610897565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611b79565b6000818152600560205260408120546001600160a01b0316611c935760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610897565b6000611c9e83611192565b9050806001600160a01b0316846001600160a01b03161480611cd95750836001600160a01b0316611cce84610822565b6001600160a01b0316145b80611d0957506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611d2482611192565b6001600160a01b031614611d8c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610897565b6001600160a01b038216611dee5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610897565b611df983838361247d565b611e04600082611a7c565b6001600160a01b0383166000908152600660205260408120805460019290611e2d908490613099565b90915550506001600160a01b0382166000908152600660205260408120805460019290611e5b90849061304e565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600154600160a01b900460ff1615611ee65760405162461bcd60e51b815260040161089790612f49565b600d546001600160a01b0316611efb57600080fd5b60008111611f3d5760405162461bcd60e51b815260206004820152600f60248201526e2cb7ba9031b0b73a10313abc90181760891b6044820152606401610897565b601e811115611f5e5760405162461bcd60e51b815260040161089790612eb2565b600d54604080516318160ddd60e01b815290516001600160a01b039092169160009183916318160ddd91600480820192602092909190829003018186803b158015611fa857600080fd5b505afa158015611fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe09190612d5c565b604051631f89f14760e01b81526001600160a01b0386811660048301526024820186905291925090831690631f89f1479034906044016000604051808303818588803b15801561202f57600080fd5b505af1158015612043573d6000803e3d6000fd5b5050601054610100900460ff161592506116a9915050576000826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561209557600080fd5b505afa1580156120a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cd9190612d5c565b9050600f548111156120de5750600f545b818111156109395760006120f383600161304e565b90505b818111612128576000818152601160205260409020805460ff191660011790558061212081613117565b9150506120f6565b50610939856121378484613099565b612197565b600e805490600061214c83613117565b919050555061215d81600e54612535565b61217b600082600e5460405180602001604052806000815250612683565b610ac75760405162461bcd60e51b815260040161089790612ef7565b6001600160a01b0382166121ed5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610897565b6000600e5460016121fe919061304e565b9050600082600e54612210919061304e565b905061222e6000858460405180602001604052806000815250612683565b61224a5760405162461bcd60e51b815260040161089790612ef7565b8082116122b75761225d6000858461247d565b600082815260056020908152604080832080546001600160a01b0319166001600160a01b03891690811790915583526006909152812080549161229f83613117565b919050555081806122af90613117565b92505061224a565b600e546122c590600161304e565b915082600e60008282546122d9919061304e565b90915550505b8082116116a95760405182906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48161232881613117565b9250506122df565b61233b848484611d11565b61234784848484612683565b6116a95760405162461bcd60e51b815260040161089790612ef7565b6060816123875750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123b1578061239b81613117565b91506123aa9050600a83613066565b915061238b565b60008167ffffffffffffffff8111156123da57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612404576020820181803683370190505b5090505b8415611d0957612419600183613099565b9150612426600a86613132565b61243190603061304e565b60f81b81838151811061245457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612476600a86613066565b9450612408565b6001600160a01b0383166124d8576124d381600b80546000838152600c60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b6124fb565b816001600160a01b0316836001600160a01b0316146124fb576124fb8382612790565b6001600160a01b03821661251257610a7b8161282d565b826001600160a01b0316826001600160a01b031614610a7b57610a7b8282612906565b6001600160a01b03821661258b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610897565b6000818152600560205260409020546001600160a01b0316156125f05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610897565b6125fc6000838361247d565b6001600160a01b038216600090815260066020526040812080546001929061262590849061304e565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561278557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906126c7903390899088908890600401612e62565b602060405180830381600087803b1580156126e157600080fd5b505af1925050508015612711575060408051601f3d908101601f1916820190925261270e91810190612d28565b60015b61276b573d80801561273f576040519150601f19603f3d011682016040523d82523d6000602084013e612744565b606091505b5080516127635760405162461bcd60e51b815260040161089790612ef7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d09565b506001949350505050565b6000600161279d84611209565b6127a79190613099565b6000838152600a60205260409020549091508082146127fa576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b600b5460009061283f90600190613099565b6000838152600c6020526040812054600b805493945090928490811061287557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600b83815481106128a457634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600c9091526040808220849055858252812055600b8054806128ea57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061291183611209565b6001600160a01b0390931660009081526009602090815260408083208684528252808320859055938252600a9052919091209190915550565b828054612956906130dc565b90600052602060002090601f01602090048101928261297857600085556129be565b82601f1061299157805160ff19168380011785556129be565b828001600101855582156129be579182015b828111156129be5782518255916020019190600101906129a3565b506129ca9291506129ce565b5090565b5b808211156129ca57600081556001016129cf565b803580151581146129f357600080fd5b919050565b600060208284031215612a09578081fd5b8135612a1481613188565b9392505050565b600060208284031215612a2c578081fd5b8151612a1481613188565b60008060408385031215612a49578081fd5b8235612a5481613188565b91506020830135612a6481613188565b809150509250929050565b600080600060608486031215612a83578081fd5b8335612a8e81613188565b92506020840135612a9e81613188565b929592945050506040919091013590565b60008060008060808587031215612ac4578081fd5b8435612acf81613188565b9350602085810135612ae081613188565b935060408601359250606086013567ffffffffffffffff80821115612b03578384fd5b818801915088601f830112612b16578384fd5b813581811115612b2857612b28613172565b612b3a601f8201601f19168501612ff9565b91508082528984828501011115612b4f578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215612b7d578182fd5b8235612b8881613188565b9150612b96602084016129e3565b90509250929050565b60008060408385031215612bb1578182fd5b8235612bbc81613188565b946020939093013593505050565b60006020808385031215612bdc578182fd5b823567ffffffffffffffff811115612bf2578283fd5b8301601f81018513612c02578283fd5b8035612c15612c108261302a565b612ff9565b80828252848201915084840188868560051b8701011115612c34578687fd5b8694505b83851015612c5f578035612c4b81613188565b835260019490940193918501918501612c38565b50979650505050505050565b60006020808385031215612c7d578182fd5b823567ffffffffffffffff811115612c93578283fd5b8301601f81018513612ca3578283fd5b8035612cb1612c108261302a565b80828252848201915084840188868560051b8701011115612cd0578687fd5b8694505b83851015612c5f578035835260019490940193918501918501612cd4565b600060208284031215612d03578081fd5b612a14826129e3565b600060208284031215612d1d578081fd5b8135612a148161319d565b600060208284031215612d39578081fd5b8151612a148161319d565b600060208284031215612d55578081fd5b5035919050565b600060208284031215612d6d578081fd5b5051919050565b60008151808452612d8c8160208601602086016130b0565b601f01601f19169290920160200192915050565b60008151612db28185602086016130b0565b9290920192915050565b600080845482600182811c915080831680612dd857607f831692505b6020808410821415612df857634e487b7160e01b87526022600452602487fd5b818015612e0c5760018114612e1d57612e49565b60ff19861689528489019650612e49565b60008b815260209020885b86811015612e415781548b820152908501908301612e28565b505084890196505b505050505050612e598185612da0565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e9590830184612d74565b9695505050505050565b602081526000612a146020830184612d74565b60208082526025908201527f43616e277420636c61696d2074686174206d616e79206174206f6e63652c207360408201526437b9393c9760d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561302257613022613172565b604052919050565b600067ffffffffffffffff82111561304457613044613172565b5060051b60200190565b6000821982111561306157613061613146565b500190565b6000826130755761307561315c565b500490565b600081600019048311821515161561309457613094613146565b500290565b6000828210156130ab576130ab613146565b500390565b60005b838110156130cb5781810151838201526020016130b3565b838111156116a95750506000910152565b600181811c908216806130f057607f821691505b6020821081141561311157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561312b5761312b613146565b5060010190565b6000826131415761314161315c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ac757600080fd5b6001600160e01b031981168114610ac757600080fdfe68747470733a2f2f65766176657273652e636f6d2f6170692f747572746c652e7068703f69643da2646970667358221220b384db761d4e42ff826146f0e75e3dd94e5654ef0a698974198f37c0af06944164736f6c63430008040033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c80635563aca01161012e578063a206bf90116100ab578063c87b56dd1161006f578063c87b56dd14610670578063dd1cb56114610690578063e985e9c5146106a5578063f0b1ec47146106ee578063f8f8a9121461070e57600080fd5b8063a206bf90146105d2578063a22cb465146105f2578063b88d4fde14610612578063b8c5c8b514610632578063bfbc99611461065257600080fd5b806370a08231116100f257806370a08231146105545780638da5cb5b1461057457806395975b2a1461059257806395d89b41146105aa5780639effe374146105bf57600080fd5b80635563aca0146104d85780635751cc84146104ed5780635c975abb146105005780636352211e1461051f5780636d90164e1461053f57600080fd5b80632597676e116101bc57806340a26e7b1161018057806340a26e7b1461043b57806342842e0e1461045b57806348e37a4a1461047b5780634f5539c0146104985780634f6ccce7146104b857600080fd5b80632597676e146103b05780632a321e9e146103d05780632f745c59146103e857806336b14535146104085780633a64e63f1461042857600080fd5b8063140eb9f811610203578063140eb9f814610311578063167d3e9c1461033157806318160ddd146103515780631ff7f0dd1461037057806323b872dd1461039057600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc146102975780630875ab8e146102cf578063095ea7b3146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004612d0c565b610723565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610790565b60405161026c9190612e9f565b3480156102a357600080fd5b506102b76102b2366004612d44565b610822565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea366004612b9f565b6108bc565b005b3480156102fd57600080fd5b506102ef61030c366004612b9f565b610940565b34801561031d57600080fd5b506102ef61032c366004612cf2565b610a80565b34801561033d57600080fd5b506102ef61034c3660046129f8565b610ad2565b34801561035d57600080fd5b50600b545b60405190815260200161026c565b34801561037c57600080fd5b5061026061038b366004612d44565b610b92565b34801561039c57600080fd5b506102ef6103ab366004612a6f565b610c63565b3480156103bc57600080fd5b506102ef6103cb366004612cf2565b610cbe565b3480156103dc57600080fd5b5060135460ff16610260565b3480156103f457600080fd5b50610362610403366004612b9f565b610d11565b34801561041457600080fd5b506102ef6104233660046129f8565b610da7565b6102ef610436366004612d44565b610f25565b34801561044757600080fd5b506102ef610456366004612bca565b610f2f565b34801561046757600080fd5b506102ef610476366004612a6f565b611019565b34801561048757600080fd5b50601054610100900460ff16610260565b3480156104a457600080fd5b506102ef6104b3366004612d44565b61105e565b3480156104c457600080fd5b506103626104d3366004612d44565b61109c565b3480156104e457600080fd5b506102b761113d565b6102ef6104fb366004612b9f565b611188565b34801561050c57600080fd5b50600154600160a01b900460ff16610260565b34801561052b57600080fd5b506102b761053a366004612d44565b611192565b34801561054b57600080fd5b50601254610362565b34801561056057600080fd5b5061036261056f3660046129f8565b611209565b34801561058057600080fd5b506000546001600160a01b03166102b7565b34801561059e57600080fd5b5060105460ff16610260565b3480156105b657600080fd5b5061028a611290565b6102ef6105cd366004612b9f565b61129f565b3480156105de57600080fd5b506102ef6105ed366004612cf2565b611512565b3480156105fe57600080fd5b506102ef61060d366004612b6b565b61155e565b34801561061e57600080fd5b506102ef61062d366004612aaf565b61164d565b34801561063e57600080fd5b506102ef61064d366004612d44565b6116af565b34801561065e57600080fd5b50600d546001600160a01b03166102b7565b34801561067c57600080fd5b5061028a61068b366004612d44565b611795565b34801561069c57600080fd5b50600f54610362565b3480156106b157600080fd5b506102606106c0366004612a37565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156106fa57600080fd5b506102ef610709366004612c6b565b61182e565b34801561071a57600080fd5b50610362611a3c565b60006001600160e01b031982166380ac58cd60e01b148061075457506001600160e01b03198216635b5e139f60e01b145b8061076f57506001600160e01b0319821663780e9d6360e01b145b8061078a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461079f906130dc565b80601f01602080910402602001604051908101604052809291908181526020018280546107cb906130dc565b80156108185780601f106107ed57610100808354040283529160200191610818565b820191906000526020600020905b8154815290600101906020018083116107fb57829003601f168201915b5050505050905090565b6000818152600560205260408120546001600160a01b03166108a05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b336108cf6000546001600160a01b031690565b6001600160a01b0316146108f55760405162461bcd60e51b815260040161089790612f73565b30803161090157600080fd5b60405183906001600160a01b0382169084156108fc029085906000818181858888f19350505050158015610939573d6000803e3d6000fd5b5050505050565b600154600160a01b900460ff161561096a5760405162461bcd60e51b815260040161089790612f49565b600061097582611192565b9050806001600160a01b0316836001600160a01b031614156109e35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610897565b336001600160a01b03821614806109ff57506109ff81336106c0565b610a715760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610897565b610a7b8383611a7c565b505050565b33610a936000546001600160a01b031690565b6001600160a01b031614610ab95760405162461bcd60e51b815260040161089790612f73565b8015610aca57610ac7611b14565b50565b610ac7611b96565b33610ae56000546001600160a01b031690565b6001600160a01b031614610b0b5760405162461bcd60e51b815260040161089790612f73565b6001600160a01b038116610b705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610897565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b601054600090610100900460ff16610bac57506000919050565b6001821080610c3f5750600d60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c0457600080fd5b505afa158015610c18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3c9190612d5c565b82115b15610c4c57506000919050565b5060009081526011602052604090205460ff161590565b600154600160a01b900460ff1615610c8d5760405162461bcd60e51b815260040161089790612f49565b610c973382611c1a565b610cb35760405162461bcd60e51b815260040161089790612fa8565b610a7b838383611d11565b33610cd16000546001600160a01b031690565b6001600160a01b031614610cf75760405162461bcd60e51b815260040161089790612f73565b601080549115156101000261ff0019909216919091179055565b6000610d1c83611209565b8210610d7e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610897565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b33610dba6000546001600160a01b031690565b6001600160a01b031614610de05760405162461bcd60e51b815260040161089790612f73565b60105460ff1615610e4a5760405162461bcd60e51b815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201526d195b881a5b9a5d1a585b1a5e995960921b6064820152608401610897565b60408051808201909152600a8082526945766120547572746c6560b01b6020909201918252610e7b9160029161294a565b50604080518082019091526004808252631514951360e21b6020909201918252610ea79160039161294a565b506040518060600160405280602781526020016131b4602791398051610ed59160049160209091019061294a565b50600d80546001600160a01b0319166001600160a01b0392909216919091179055611388600f556010805461ffff191661010117905566b1a2bc2ec500006012556013805460ff19166001179055565b610ac73382611ebc565b33610f426000546001600160a01b031690565b6001600160a01b031614610f685760405162461bcd60e51b815260040161089790612f73565b600f548151600e54610f7a919061304e565b10610fc75760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e732072656d61696e696e672e000000006044820152606401610897565b60005b815181101561101557611003828281518110610ff657634e487b7160e01b600052603260045260246000fd5b602002602001015161213c565b8061100d81613117565b915050610fca565b5050565b600154600160a01b900460ff16156110435760405162461bcd60e51b815260040161089790612f49565b610a7b8383836040518060200160405280600081525061164d565b336110716000546001600160a01b031690565b6001600160a01b0316146110975760405162461bcd60e51b815260040161089790612f73565b601255565b60006110a7600b5490565b821061110a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610897565b600b828154811061112b57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000336111526000546001600160a01b031690565b6001600160a01b0316146111785760405162461bcd60e51b815260040161089790612f73565b506001546001600160a01b031690565b6110158282611ebc565b6000818152600560205260408120546001600160a01b03168061078a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610897565b60006001600160a01b0382166112745760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610897565b506001600160a01b031660009081526006602052604090205490565b60606003805461079f906130dc565b600154600160a01b900460ff16156112c95760405162461bcd60e51b815260040161089790612f49565b60135460ff1661131b5760405162461bcd60e51b815260206004820152601a60248201527f50757263686173696e67206973206e6f7420656e61626c65642e0000000000006044820152606401610897565b6000811161136b5760405162461bcd60e51b815260206004820152601d60248201527f436f756e74206d7573742062652067726561746572207468616e20302e0000006044820152606401610897565b601e8111156113c65760405162461bcd60e51b815260206004820152602160248201527f436f756e742063616e27742062652074686174206c617267652c20736f7272796044820152601760f91b6064820152608401610897565b600f54600e54106114195760405162461bcd60e51b815260206004820152601b60248201527f4e6f20746f6b656e73206c65667420746f2070757263686173652e00000000006044820152606401610897565b601254611426908261307a565b34146114745760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206f6620455448206973206e6f742072696768742e00000000006044820152606401610897565b6000600f5482600e54611487919061304e565b11156114bc57600e54600f5461149d9190613099565b6114a79083613099565b9050600e54600f546114b99190613099565b91505b6114c68383612197565b8015610a7b5760125483906001600160a01b038216906108fc906114ea908561307a565b6040518115909202916000818181858888f19350505050158015610939573d6000803e3d6000fd5b336115256000546001600160a01b031690565b6001600160a01b03161461154b5760405162461bcd60e51b815260040161089790612f73565b6013805460ff1916911515919091179055565b600154600160a01b900460ff16156115885760405162461bcd60e51b815260040161089790612f49565b6001600160a01b0382163314156115e15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610897565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600154600160a01b900460ff16156116775760405162461bcd60e51b815260040161089790612f49565b6116813383611c1a565b61169d5760405162461bcd60e51b815260040161089790612fa8565b6116a984848484612330565b50505050565b336116c26000546001600160a01b031690565b6001600160a01b0316146116e85760405162461bcd60e51b815260040161089790612f73565b80600e54106117905760405162461bcd60e51b815260206004820152606260248201527f4e6577204d6178696d756d20546f6b656e20436f756e74206d7573742062652060448201527f67726561746572207468616e2074686520616d6f756e74206f6620746f6b656e60648201527f7320616c7265616479206578697374696e67206f6e2074686520636f6e74726160848201526118dd60f21b60a482015260c401610897565b600f55565b6000818152600560205260409020546060906001600160a01b03166117fc5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610897565b600461180783612363565b604051602001611818929190612dbc565b6040516020818303038152906040529050919050565b600154600160a01b900460ff16156118585760405162461bcd60e51b815260040161089790612f49565b601054610100900460ff1661186c57600080fd5b601e8151111561188e5760405162461bcd60e51b815260040161089790612eb2565b600080600e54600f546118a19190613099565b600d549091506001600160a01b031660005b84518110156119d55760008582815181106118de57634e487b7160e01b600052603260045260246000fd5b602002602001015190508385106118f557506119d5565b336040516331a9108f60e11b8152600481018390526001600160a01b0391821691851690636352211e9060240160206040518083038186803b15801561193a57600080fd5b505afa15801561194e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119729190612a1b565b6001600160a01b03161461198557600080fd5b60008181526011602052604090205460ff166119c257846119a581613117565b6000838152601160205260409020805460ff191660011790559550505b50806119cd81613117565b9150506118b3565b5060008311611a325760405162461bcd60e51b815260206004820152602360248201527f536f7272792c206e6f20746f6b656e7320457661766572736520746f20636c6160448201526234b69760e91b6064820152608401610897565b6116a93384612197565b600033611a516000546001600160a01b031690565b6001600160a01b031614611a775760405162461bcd60e51b815260040161089790612f73565b504790565b600154600160a01b900460ff1615611aa65760405162461bcd60e51b815260040161089790612f49565b600081815260076020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611adb82611192565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600154600160a01b900460ff1615611b3e5760405162461bcd60e51b815260040161089790612f49565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b793390565b6040516001600160a01b03909116815260200160405180910390a1565b600154600160a01b900460ff16611be65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610897565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611b79565b6000818152600560205260408120546001600160a01b0316611c935760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610897565b6000611c9e83611192565b9050806001600160a01b0316846001600160a01b03161480611cd95750836001600160a01b0316611cce84610822565b6001600160a01b0316145b80611d0957506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611d2482611192565b6001600160a01b031614611d8c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610897565b6001600160a01b038216611dee5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610897565b611df983838361247d565b611e04600082611a7c565b6001600160a01b0383166000908152600660205260408120805460019290611e2d908490613099565b90915550506001600160a01b0382166000908152600660205260408120805460019290611e5b90849061304e565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600154600160a01b900460ff1615611ee65760405162461bcd60e51b815260040161089790612f49565b600d546001600160a01b0316611efb57600080fd5b60008111611f3d5760405162461bcd60e51b815260206004820152600f60248201526e2cb7ba9031b0b73a10313abc90181760891b6044820152606401610897565b601e811115611f5e5760405162461bcd60e51b815260040161089790612eb2565b600d54604080516318160ddd60e01b815290516001600160a01b039092169160009183916318160ddd91600480820192602092909190829003018186803b158015611fa857600080fd5b505afa158015611fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe09190612d5c565b604051631f89f14760e01b81526001600160a01b0386811660048301526024820186905291925090831690631f89f1479034906044016000604051808303818588803b15801561202f57600080fd5b505af1158015612043573d6000803e3d6000fd5b5050601054610100900460ff161592506116a9915050576000826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561209557600080fd5b505afa1580156120a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cd9190612d5c565b9050600f548111156120de5750600f545b818111156109395760006120f383600161304e565b90505b818111612128576000818152601160205260409020805460ff191660011790558061212081613117565b9150506120f6565b50610939856121378484613099565b612197565b600e805490600061214c83613117565b919050555061215d81600e54612535565b61217b600082600e5460405180602001604052806000815250612683565b610ac75760405162461bcd60e51b815260040161089790612ef7565b6001600160a01b0382166121ed5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610897565b6000600e5460016121fe919061304e565b9050600082600e54612210919061304e565b905061222e6000858460405180602001604052806000815250612683565b61224a5760405162461bcd60e51b815260040161089790612ef7565b8082116122b75761225d6000858461247d565b600082815260056020908152604080832080546001600160a01b0319166001600160a01b03891690811790915583526006909152812080549161229f83613117565b919050555081806122af90613117565b92505061224a565b600e546122c590600161304e565b915082600e60008282546122d9919061304e565b90915550505b8082116116a95760405182906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48161232881613117565b9250506122df565b61233b848484611d11565b61234784848484612683565b6116a95760405162461bcd60e51b815260040161089790612ef7565b6060816123875750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123b1578061239b81613117565b91506123aa9050600a83613066565b915061238b565b60008167ffffffffffffffff8111156123da57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612404576020820181803683370190505b5090505b8415611d0957612419600183613099565b9150612426600a86613132565b61243190603061304e565b60f81b81838151811061245457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612476600a86613066565b9450612408565b6001600160a01b0383166124d8576124d381600b80546000838152600c60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b6124fb565b816001600160a01b0316836001600160a01b0316146124fb576124fb8382612790565b6001600160a01b03821661251257610a7b8161282d565b826001600160a01b0316826001600160a01b031614610a7b57610a7b8282612906565b6001600160a01b03821661258b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610897565b6000818152600560205260409020546001600160a01b0316156125f05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610897565b6125fc6000838361247d565b6001600160a01b038216600090815260066020526040812080546001929061262590849061304e565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561278557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906126c7903390899088908890600401612e62565b602060405180830381600087803b1580156126e157600080fd5b505af1925050508015612711575060408051601f3d908101601f1916820190925261270e91810190612d28565b60015b61276b573d80801561273f576040519150601f19603f3d011682016040523d82523d6000602084013e612744565b606091505b5080516127635760405162461bcd60e51b815260040161089790612ef7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d09565b506001949350505050565b6000600161279d84611209565b6127a79190613099565b6000838152600a60205260409020549091508082146127fa576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b600b5460009061283f90600190613099565b6000838152600c6020526040812054600b805493945090928490811061287557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600b83815481106128a457634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600c9091526040808220849055858252812055600b8054806128ea57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061291183611209565b6001600160a01b0390931660009081526009602090815260408083208684528252808320859055938252600a9052919091209190915550565b828054612956906130dc565b90600052602060002090601f01602090048101928261297857600085556129be565b82601f1061299157805160ff19168380011785556129be565b828001600101855582156129be579182015b828111156129be5782518255916020019190600101906129a3565b506129ca9291506129ce565b5090565b5b808211156129ca57600081556001016129cf565b803580151581146129f357600080fd5b919050565b600060208284031215612a09578081fd5b8135612a1481613188565b9392505050565b600060208284031215612a2c578081fd5b8151612a1481613188565b60008060408385031215612a49578081fd5b8235612a5481613188565b91506020830135612a6481613188565b809150509250929050565b600080600060608486031215612a83578081fd5b8335612a8e81613188565b92506020840135612a9e81613188565b929592945050506040919091013590565b60008060008060808587031215612ac4578081fd5b8435612acf81613188565b9350602085810135612ae081613188565b935060408601359250606086013567ffffffffffffffff80821115612b03578384fd5b818801915088601f830112612b16578384fd5b813581811115612b2857612b28613172565b612b3a601f8201601f19168501612ff9565b91508082528984828501011115612b4f578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215612b7d578182fd5b8235612b8881613188565b9150612b96602084016129e3565b90509250929050565b60008060408385031215612bb1578182fd5b8235612bbc81613188565b946020939093013593505050565b60006020808385031215612bdc578182fd5b823567ffffffffffffffff811115612bf2578283fd5b8301601f81018513612c02578283fd5b8035612c15612c108261302a565b612ff9565b80828252848201915084840188868560051b8701011115612c34578687fd5b8694505b83851015612c5f578035612c4b81613188565b835260019490940193918501918501612c38565b50979650505050505050565b60006020808385031215612c7d578182fd5b823567ffffffffffffffff811115612c93578283fd5b8301601f81018513612ca3578283fd5b8035612cb1612c108261302a565b80828252848201915084840188868560051b8701011115612cd0578687fd5b8694505b83851015612c5f578035835260019490940193918501918501612cd4565b600060208284031215612d03578081fd5b612a14826129e3565b600060208284031215612d1d578081fd5b8135612a148161319d565b600060208284031215612d39578081fd5b8151612a148161319d565b600060208284031215612d55578081fd5b5035919050565b600060208284031215612d6d578081fd5b5051919050565b60008151808452612d8c8160208601602086016130b0565b601f01601f19169290920160200192915050565b60008151612db28185602086016130b0565b9290920192915050565b600080845482600182811c915080831680612dd857607f831692505b6020808410821415612df857634e487b7160e01b87526022600452602487fd5b818015612e0c5760018114612e1d57612e49565b60ff19861689528489019650612e49565b60008b815260209020885b86811015612e415781548b820152908501908301612e28565b505084890196505b505050505050612e598185612da0565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e9590830184612d74565b9695505050505050565b602081526000612a146020830184612d74565b60208082526025908201527f43616e277420636c61696d2074686174206d616e79206174206f6e63652c207360408201526437b9393c9760d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561302257613022613172565b604052919050565b600067ffffffffffffffff82111561304457613044613172565b5060051b60200190565b6000821982111561306157613061613146565b500190565b6000826130755761307561315c565b500490565b600081600019048311821515161561309457613094613146565b500290565b6000828210156130ab576130ab613146565b500390565b60005b838110156130cb5781810151838201526020016130b3565b838111156116a95750506000910152565b600181811c908216806130f057607f821691505b6020821081141561311157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561312b5761312b613146565b5060010190565b6000826131415761314161315c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ac757600080fd5b6001600160e01b031981168114610ac757600080fdfe68747470733a2f2f65766176657273652e636f6d2f6170692f747572746c652e7068703f69643da2646970667358221220b384db761d4e42ff826146f0e75e3dd94e5654ef0a698974198f37c0af06944164736f6c63430008040033
Deployed Bytecode Sourcemap
797:25218:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5939:359;;;;;;;;;;-1:-1:-1;5939:359:14;;;;;:::i;:::-;;:::i;:::-;;;9271:14:15;;9264:22;9246:41;;9234:2;9219:18;5939:359:14;;;;;;;;6938:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8078:221::-;;;;;;;;;;-1:-1:-1;8078:221:14;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8290:32:15;;;8272:51;;8260:2;8245:18;8078:221:14;8227:102:15;22834:254:14;;;;;;;;;;-1:-1:-1;22834:254:14;;;;;:::i;:::-;;:::i;:::-;;7593:419;;;;;;;;;;-1:-1:-1;7593:419:14;;;;;:::i;:::-;;:::i;22683:139::-;;;;;;;;;;-1:-1:-1;22683:139:14;;;;;:::i;:::-;;:::i;547:175:9:-;;;;;;;;;;-1:-1:-1;547:175:9;;;;;:::i;:::-;;:::i;17265:113:14:-;;;;;;;;;;-1:-1:-1;17353:10:14;:17;17265:113;;;21813:25:15;;;21801:2;21786:18;17265:113:14;21768:76:15;3380:327:14;;;;;;;;;;-1:-1:-1;3380:327:14;;;;;:::i;:::-;;:::i;8982:319::-;;;;;;;;;;-1:-1:-1;8982:319:14;;;;;:::i;:::-;;:::i;24013:108::-;;;;;;;;;;-1:-1:-1;24013:108:14;;;;;:::i;:::-;;:::i;25916:96::-;;;;;;;;;;-1:-1:-1;25988:16:14;;;;25916:96;;16925:264;;;;;;;;;;-1:-1:-1;16925:264:14;;;;;:::i;:::-;;:::i;2550:718::-;;;;;;;;;;-1:-1:-1;2550:718:14;;;;;:::i;:::-;;:::i;4801:103::-;;;;;;:::i;:::-;;:::i;23225:276::-;;;;;;;;;;-1:-1:-1;23225:276:14;;;;;:::i;:::-;;:::i;9372:165::-;;;;;;;;;;-1:-1:-1;9372:165:14;;;;;:::i;:::-;;:::i;24133:104::-;;;;;;;;;;-1:-1:-1;24210:19:14;;;;;;;24133:104;;25584:96;;;;;;;;;;-1:-1:-1;25584:96:14;;;;;:::i;:::-;;:::i;17455:231::-;;;;;;;;;;-1:-1:-1;17455:231:14;;;;;:::i;:::-;;:::i;2291:112:11:-;;;;;;;;;;;;;:::i;4680:105:14:-;;;;;;:::i;:::-;;:::i;1035:84:10:-;;;;;;;;;;-1:-1:-1;1105:7:10;;-1:-1:-1;;;1105:7:10;;;;1035:84;;6632:239:14;;;;;;;;;;-1:-1:-1;6632:239:14;;;;;:::i;:::-;;:::i;25692:86::-;;;;;;;;;;-1:-1:-1;25759:11:14;;25692:86;;6362:208;;;;;;;;;;-1:-1:-1;6362:208:14;;;;;:::i;:::-;;:::i;269:79:9:-;;;;;;;;;;-1:-1:-1;307:7:9;334:6;-1:-1:-1;;;;;334:6:9;269:79;;3276:92:14;;;;;;;;;;-1:-1:-1;3348:12:14;;;;3276:92;;7112:109;;;;;;;;;;;;;:::i;24546:1026::-;;;;;;:::i;:::-;;:::i;25790:114::-;;;;;;;;;;-1:-1:-1;25790:114:14;;;;;:::i;:::-;;:::i;8371:309::-;;;;;;;;;;-1:-1:-1;8371:309:14;;;;;:::i;:::-;;:::i;9608:299::-;;;;;;;;;;-1:-1:-1;9608:299:14;;;;;:::i;:::-;;:::i;23637:256::-;;;;;;;;;;-1:-1:-1;23637:256:14;;;;;:::i;:::-;;:::i;24249:96::-;;;;;;;;;;-1:-1:-1;24325:12:14;;-1:-1:-1;;;;;24325:12:14;24249:96;;7292:239;;;;;;;;;;-1:-1:-1;7292:239:14;;;;;:::i;:::-;;:::i;23905:96::-;;;;;;;;;;-1:-1:-1;23983:10:14;;23905:96;;8751:164;;;;;;;;;;-1:-1:-1;8751:164:14;;;;;:::i;:::-;-1:-1:-1;;;;;8872:25:14;;;8848:4;8872:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;8751:164;3719:953;;;;;;;;;;-1:-1:-1;3719:953:14;;;;;:::i;:::-;;:::i;23102:111::-;;;;;;;;;;;;;:::i;5939:359::-;6041:4;-1:-1:-1;;;;;;6065:40:14;;-1:-1:-1;;;6065:40:14;;:105;;-1:-1:-1;;;;;;;6122:48:14;;-1:-1:-1;;;6122:48:14;6065:105;:172;;;-1:-1:-1;;;;;;;6187:50:14;;-1:-1:-1;;;6187:50:14;6065:172;:225;;;-1:-1:-1;;;;;;;;;;871:40:2;;;6254:36:14;6058:232;5939:359;-1:-1:-1;;5939:359:14:o;6938:105::-;6992:13;7025:10;7018:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6938:105;:::o;8078:221::-;8154:7;11463:16;;;:7;:16;;;;;;-1:-1:-1;;;;;11463:16:14;8174:73;;;;-1:-1:-1;;;8174:73:14;;17933:2:15;8174:73:14;;;17915:21:15;17972:2;17952:18;;;17945:30;18011:34;17991:18;;;17984:62;-1:-1:-1;;;18062:18:15;;;18055:42;18114:19;;8174:73:14;;;;;;;;;-1:-1:-1;8267:24:14;;;;:15;:24;;;;;;-1:-1:-1;;;;;8267:24:14;;8078:221::o;22834:254::-;407:10:9;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;22947:4:14::1;22971:16:::0;::::1;22963:29;;;::::0;::::1;;23055:25;::::0;23038:5;;-1:-1:-1;;;;;23055:17:14;::::1;::::0;:25;::::1;;;::::0;23073:6;;23003:24:::1;23055:25:::0;23003:24;23055:25;23073:6;23055:17;:25;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;465:1:9;;22834:254:14::0;;:::o;7593:419::-;1105:7:10;;-1:-1:-1;;;1105:7:10;;;;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:10;;;;;;;:::i;:::-;7688:13:14::1;7704:31;7727:7;7704:22;:31::i;:::-;7688:47;;7760:5;-1:-1:-1::0;;;;;7754:11:14::1;:2;-1:-1:-1::0;;;;;7754:11:14::1;;;7746:57;;;::::0;-1:-1:-1;;;7746:57:14;;19532:2:15;7746:57:14::1;::::0;::::1;19514:21:15::0;19571:2;19551:18;;;19544:30;19610:34;19590:18;;;19583:62;-1:-1:-1;;;19661:18:15;;;19654:31;19702:19;;7746:57:14::1;19504:223:15::0;7746:57:14::1;665:10:1::0;-1:-1:-1;;;;;7824:21:14;::::1;;::::0;:62:::1;;-1:-1:-1::0;7849:37:14::1;7866:5:::0;665:10:1;8751:164:14;:::i;7849:37::-:1;7816:154;;;::::0;-1:-1:-1;;;7816:154:14;;16326:2:15;7816:154:14::1;::::0;::::1;16308:21:15::0;16365:2;16345:18;;;16338:30;16404:34;16384:18;;;16377:62;16475:26;16455:18;;;16448:54;16519:19;;7816:154:14::1;16298:246:15::0;7816:154:14::1;7983:21;7992:2;7996:7;7983:8;:21::i;:::-;1388:1:10;7593:419:14::0;;:::o;22683:139::-;407:10:9;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;22747:5:14::1;22743:71;;;22767:8;:6;:8::i;:::-;22683:139:::0;:::o;22743:71::-:1;22804:10;:8;:10::i;547:175:9:-:0;407:10;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;621:22:9;::::1;613:73;;;::::0;-1:-1:-1;;;613:73:9;;12025:2:15;613:73:9::1;::::0;::::1;12007:21:15::0;12064:2;12044:18;;;12037:30;12103:34;12083:18;;;12076:62;-1:-1:-1;;;12154:18:15;;;12147:36;12200:19;;613:73:9::1;11997:228:15::0;613:73:9::1;697:6;:17:::0;;-1:-1:-1;;;;;;697:17:9::1;-1:-1:-1::0;;;;;697:17:9;;;::::1;::::0;;;::::1;::::0;;547:175::o;3380:327:14:-;3473:19;;3451:4;;3473:19;;;;;3468:51;;-1:-1:-1;3514:5:14;;3380:327;-1:-1:-1;3380:327:14:o;3468:51::-;3565:1;3552:10;:14;:72;;;;3597:12;;;;;;;;;-1:-1:-1;;;;;3597:12:14;-1:-1:-1;;;;;3583:39:14;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3570:10;:54;3552:72;3548:103;;;-1:-1:-1;3646:5:14;;3380:327;-1:-1:-1;3380:327:14:o;3548:103::-;-1:-1:-1;3672:27:14;;;;:15;:27;;;;;;;;3671:28;;3380:327::o;8982:319::-;1105:7:10;;-1:-1:-1;;;1105:7:10;;;;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:10;;;;;;;:::i;:::-;9157:41:14::1;665:10:1::0;9190:7:14::1;9157:18;:41::i;:::-;9149:103;;;;-1:-1:-1::0;;;9149:103:14::1;;;;;;;:::i;:::-;9265:28;9275:4;9281:2;9285:7;9265:9;:28::i;24013:108::-:0;407:10:9;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;24084:19:14::1;:29:::0;;;::::1;;;;-1:-1:-1::0;;24084:29:14;;::::1;::::0;;;::::1;::::0;;24013:108::o;16925:264::-;17022:7;17058:31;17083:5;17058:24;:31::i;:::-;17050:5;:39;17042:95;;;;-1:-1:-1;;;17042:95:14;;11194:2:15;17042:95:14;;;11176:21:15;11233:2;11213:18;;;11206:30;11272:34;11252:18;;;11245:62;-1:-1:-1;;;11323:18:15;;;11316:41;11374:19;;17042:95:14;11166:233:15;17042:95:14;-1:-1:-1;;;;;;17155:19:14;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;16925:264::o;2550:718::-;407:10:9;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;2634:12:14::1;::::0;::::1;;2633:13;2625:72;;;::::0;-1:-1:-1;;;2625:72:14;;18707:2:15;2625:72:14::1;::::0;::::1;18689:21:15::0;18746:2;18726:18;;;18719:30;18785:34;18765:18;;;18758:62;-1:-1:-1;;;18836:18:15;;;18829:44;18890:19;;2625:72:14::1;18679:236:15::0;2625:72:14::1;2710:34;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;2710:34:14::1;::::0;;::::1;::::0;;;::::1;::::0;:10:::1;::::0;:34:::1;:::i;:::-;-1:-1:-1::0;2755:28:14::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;2755:28:14::1;::::0;;::::1;::::0;;;::::1;::::0;:12:::1;::::0;:28:::1;:::i;:::-;;2794:63;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;:8:::1;::::0;:63:::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2868:12:14::1;:37:::0;;-1:-1:-1;;;;;;2868:37:14::1;-1:-1:-1::0;;;;;2868:37:14;;;::::1;::::0;;;::::1;::::0;;2938:4:::1;2916:10;:26:::0;2953:12:::1;:26:::0;;-1:-1:-1;;2990:26:14;;;;;3195:17:::1;3173:11;:39:::0;3234:16:::1;:26:::0;;-1:-1:-1;;3234:26:14::1;-1:-1:-1::0;3234:26:14::1;::::0;;2550:718::o;4801:103::-;4864:32;665:10:1;4890:5:14;4864:11;:32::i;23225:276::-;407:10:9;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;23347:10:14::1;;23330:7;:14;23316:11;;:28;;;;:::i;:::-;:41;23308:82;;;::::0;-1:-1:-1;;;23308:82:14;;14853:2:15;23308:82:14::1;::::0;::::1;14835:21:15::0;14892:2;14872:18;;;14865:30;14931;14911:18;;;14904:58;14979:18;;23308:82:14::1;14825:178:15::0;23308:82:14::1;23405:7;23401:93;23423:7;:14;23418:2;:19;23401:93;;;23460:22;23470:7;23478:2;23470:11;;;;;;-1:-1:-1::0;;;23470:11:14::1;;;;;;;;;;;;;;;23460:9;:22::i;:::-;23439:4:::0;::::1;::::0;::::1;:::i;:::-;;;;23401:93;;;;23225:276:::0;:::o;9372:165::-;1105:7:10;;-1:-1:-1;;;1105:7:10;;;;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:10;;;;;;;:::i;:::-;9490:39:14::1;9507:4;9513:2;9517:7;9490:39;;;;;;;;;;;::::0;:16:::1;:39::i;25584:96::-:0;407:10:9;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;25650:11:14::1;:22:::0;25584:96::o;17455:231::-;17530:7;17566:28;17353:10;:17;;17265:113;17566:28;17558:5;:36;17550:93;;;;-1:-1:-1;;;17550:93:14;;20352:2:15;17550:93:14;;;20334:21:15;20391:2;20371:18;;;20364:30;20430:34;20410:18;;;20403:62;-1:-1:-1;;;20481:18:15;;;20474:42;20533:19;;17550:93:14;20324:234:15;17550:93:14;17661:10;17672:5;17661:17;;;;;;-1:-1:-1;;;17661:17:14;;;;;;;;;;;;;;;;;17654:24;;17455:231;;;:::o;2291:112:11:-;2352:7;407:10:9;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;-1:-1:-1;2379:16:11::1;::::0;-1:-1:-1;;;;;2379:16:11::1;2291:112:::0;:::o;4680:105:14:-;4755:22;4767:2;4771:5;4755:11;:22::i;6632:239::-;6704:7;6740:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6740:16:14;6775:19;6767:73;;;;-1:-1:-1;;;6767:73:14;;17162:2:15;6767:73:14;;;17144:21:15;17201:2;17181:18;;;17174:30;17240:34;17220:18;;;17213:62;-1:-1:-1;;;17291:18:15;;;17284:39;17340:19;;6767:73:14;17134:231:15;6362:208:14;6434:7;-1:-1:-1;;;;;6462:19:14;;6454:74;;;;-1:-1:-1;;;6454:74:14;;16751:2:15;6454:74:14;;;16733:21:15;16790:2;16770:18;;;16763:30;16829:34;16809:18;;;16802:62;-1:-1:-1;;;16880:18:15;;;16873:40;16930:19;;6454:74:14;16723:232:15;6454:74:14;-1:-1:-1;;;;;;6546:16:14;;;;;:9;:16;;;;;;;6362:208::o;7112:109::-;7168:13;7201:12;7194:19;;;;;:::i;24546:1026::-;1105:7:10;;-1:-1:-1;;;1105:7:10;;;;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:10;;;;;;;:::i;:::-;24641:16:14::1;::::0;::::1;;24633:55;;;::::0;-1:-1:-1;;;24633:55:14;;10839:2:15;24633:55:14::1;::::0;::::1;10821:21:15::0;10878:2;10858:18;;;10851:30;10917:28;10897:18;;;10890:56;10963:18;;24633:55:14::1;10811:176:15::0;24633:55:14::1;24715:1;24707:5;:9;24699:51;;;::::0;-1:-1:-1;;;24699:51:14;;15623:2:15;24699:51:14::1;::::0;::::1;15605:21:15::0;15662:2;15642:18;;;15635:30;15701:31;15681:18;;;15674:59;15750:18;;24699:51:14::1;15595:179:15::0;24699:51:14::1;24778:2;24769:5;:11;;24761:57;;;::::0;-1:-1:-1;;;24761:57:14;;14451:2:15;24761:57:14::1;::::0;::::1;14433:21:15::0;14490:2;14470:18;;;14463:30;14529:34;14509:18;;;14502:62;-1:-1:-1;;;14580:18:15;;;14573:31;14621:19;;24761:57:14::1;14423:223:15::0;24761:57:14::1;24851:10;;24837:11;;:24;24829:64;;;::::0;-1:-1:-1;;;24829:64:14;;20765:2:15;24829:64:14::1;::::0;::::1;20747:21:15::0;20804:2;20784:18;;;20777:30;20843:29;20823:18;;;20816:57;20890:18;;24829:64:14::1;20737:177:15::0;24829:64:14::1;24933:11;::::0;24925:19:::1;::::0;:5;:19:::1;:::i;:::-;24912:9;:32;24904:72;;;::::0;-1:-1:-1;;;24904:72:14;;12789:2:15;24904:72:14::1;::::0;::::1;12771:21:15::0;12828:2;12808:18;;;12801:30;12867:29;12847:18;;;12840:57;12914:18;;24904:72:14::1;12761:177:15::0;24904:72:14::1;25073:16;25130:10;;25122:5;25108:11;;:19;;;;:::i;:::-;:32;25104:160;;;25193:11;;25180:10;;:24;;;;:::i;:::-;25171:34;::::0;:5;:34:::1;:::i;:::-;25157:48;;25241:11;;25228:10;;:24;;;;:::i;:::-;25220:32;;25104:160;25315:21;25326:2;25330:5;25315:10;:21::i;:::-;25424:15:::0;;25420:145:::1;;25541:11;::::0;25491:2;;-1:-1:-1;;;;;25509:17:14;::::1;::::0;:44:::1;::::0;25527:25:::1;::::0;:11;:25:::1;:::i;:::-;25509:44;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;25790:114:::0;407:10:9;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;25864:16:14::1;:32:::0;;-1:-1:-1;;25864:32:14::1;::::0;::::1;;::::0;;;::::1;::::0;;25790:114::o;8371:309::-;1105:7:10;;-1:-1:-1;;;1105:7:10;;;;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;8488:24:14;::::1;665:10:1::0;8488:24:14::1;;8480:62;;;::::0;-1:-1:-1;;;8480:62:14;;14097:2:15;8480:62:14::1;::::0;::::1;14079:21:15::0;14136:2;14116:18;;;14109:30;14175:27;14155:18;;;14148:55;14220:18;;8480:62:14::1;14069:175:15::0;8480:62:14::1;665:10:1::0;8555:32:14::1;::::0;;;:18:::1;:32;::::0;;;;;;;-1:-1:-1;;;;;8555:42:14;::::1;::::0;;;;;;;;;;:53;;-1:-1:-1;;8555:53:14::1;::::0;::::1;;::::0;;::::1;::::0;;;8624:48;;9246:41:15;;;8555:42:14;;665:10:1;8624:48:14::1;::::0;9219:18:15;8624:48:14::1;;;;;;;8371:309:::0;;:::o;9608:299::-;1105:7:10;;-1:-1:-1;;;1105:7:10;;;;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:10;;;;;;;:::i;:::-;9754:41:14::1;665:10:1::0;9787:7:14::1;9754:18;:41::i;:::-;9746:103;;;;-1:-1:-1::0;;;9746:103:14::1;;;;;;;:::i;:::-;9860:39;9874:4;9880:2;9884:7;9893:5;9860:13;:39::i;:::-;9608:299:::0;;;;:::o;23637:256::-;407:10:9;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;23736:11:14::1;23722;;:25;23714:136;;;::::0;-1:-1:-1;;;23714:136:14;;13145:2:15;23714:136:14::1;::::0;::::1;13127:21:15::0;13184:2;13164:18;;;13157:30;13223:34;13203:18;;;13196:62;13294:34;13274:18;;;13267:62;13366:34;13345:19;;;13338:63;-1:-1:-1;;;13417:19:15;;;13410:33;13460:19;;23714:136:14::1;13117:368:15::0;23714:136:14::1;23861:10;:24:::0;23637:256::o;7292:239::-;11439:4;11463:16;;;:7;:16;;;;;;7365:13;;-1:-1:-1;;;;;11463:16:14;7391:60;;;;-1:-1:-1;;;7391:60:14;;10479:2:15;7391:60:14;;;10461:21:15;10518:2;10498:18;;;10491:30;10557:33;10537:18;;;10530:61;10608:18;;7391:60:14;10451:181:15;7391:60:14;7493:8;7503:18;:7;:16;:18::i;:::-;7476:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7462:61;;7292:239;;;:::o;3719:953::-;1105:7:10;;-1:-1:-1;;;1105:7:10;;;;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:10;;;;;;;:::i;:::-;3808:19:14::1;::::0;::::1;::::0;::::1;;;3800:28;;;::::0;::::1;;3867:2;3847:9;:16;:22;;3839:72;;;;-1:-1:-1::0;;;3839:72:14::1;;;;;;;:::i;:::-;3922:20;3957::::0;3993:11:::1;;3980:10;;:24;;;;:::i;:::-;4067:12;::::0;3957:47;;-1:-1:-1;;;;;;4067:12:14::1;4025:25;4101:424;4123:9;:16;4118:2;:21;4101:424;;;4162:18;4183:9;4193:2;4183:13;;;;;;-1:-1:-1::0;;;4183:13:14::1;;;;;;;;;;;;;;;4162:34;;4248:15;4229;:34;4225:62;;4282:5;;;4225:62;665:10:1::0;4312:31:14::1;::::0;-1:-1:-1;;;4312:31:14;;::::1;::::0;::::1;21813:25:15::0;;;-1:-1:-1;;;;;4312:47:14;;::::1;::::0;:19;::::1;::::0;::::1;::::0;21786:18:15;;4312:31:14::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4312:47:14::1;;4304:56;;;::::0;::::1;;4380:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;4375:139;;4428:17:::0;::::1;::::0;::::1;:::i;:::-;4464:27;::::0;;;:15:::1;:27;::::0;;;;:34;;-1:-1:-1;;4464:34:14::1;4494:4;4464:34;::::0;;4428:17;-1:-1:-1;;4375:139:14::1;-1:-1:-1::0;4141:4:14;::::1;::::0;::::1;:::i;:::-;;;;4101:424;;;;4571:1;4553:15;:19;4545:67;;;::::0;-1:-1:-1;;;4545:67:14;;21121:2:15;4545:67:14::1;::::0;::::1;21103:21:15::0;21160:2;21140:18;;;21133:30;21199:34;21179:18;;;21172:62;-1:-1:-1;;;21250:18:15;;;21243:33;21293:19;;4545:67:14::1;21093:225:15::0;4545:67:14::1;4623:41;665:10:1::0;4648:15:14::1;4623:10;:41::i;23102:111::-:0;23157:7;407:10:9;396:7;307;334:6;-1:-1:-1;;;;;334:6:9;;269:79;396:7;-1:-1:-1;;;;;396:21:9;;388:66;;;;-1:-1:-1;;;388:66:9;;;;;;;:::i;:::-;-1:-1:-1;23184:21:14::1;23102:111:::0;:::o;15231:196::-;1105:7:10;;-1:-1:-1;;;1105:7:10;;;;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:10;;;;;;;:::i;:::-;15320:24:14::1;::::0;;;:15:::1;:24;::::0;;;;:29;;-1:-1:-1;;;;;;15320:29:14::1;-1:-1:-1::0;;;;;15320:29:14;::::1;::::0;;::::1;::::0;;;:24;;15374:31:::1;15320:24:::0;15374:22:::1;:31::i;:::-;-1:-1:-1::0;;;;;15365:54:14::1;;;;;;;;;;;15231:196:::0;;:::o;1800:115:10:-;1105:7;;-1:-1:-1;;;1105:7:10;;;;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:10;;;;;;;:::i;:::-;1869:4:::1;1859:14:::0;;-1:-1:-1;;;;1859:14:10::1;-1:-1:-1::0;;;1859:14:10::1;::::0;;1888:20:::1;1895:12;665:10:1::0;;586:96;1895:12:10::1;1888:20;::::0;-1:-1:-1;;;;;8290:32:15;;;8272:51;;8260:2;8245:18;1888:20:10::1;;;;;;;1800:115::o:0;2047:117::-;1105:7;;-1:-1:-1;;;1105:7:10;;;;1606:41;;;;-1:-1:-1;;;1606:41:10;;10130:2:15;1606:41:10;;;10112:21:15;10169:2;10149:18;;;10142:30;-1:-1:-1;;;10188:18:15;;;10181:50;10248:18;;1606:41:10;10102:170:15;1606:41:10;2105:7:::1;:15:::0;;-1:-1:-1;;;;2105:15:10::1;::::0;;2135:22:::1;665:10:1::0;2144:12:10::1;586:96:1::0;11668:356:14;11761:4;11463:16;;;:7;:16;;;;;;-1:-1:-1;;;;;11463:16:14;11778:73;;;;-1:-1:-1;;;11778:73:14;;15210:2:15;11778:73:14;;;15192:21:15;15249:2;15229:18;;;15222:30;15288:34;15268:18;;;15261:62;-1:-1:-1;;;15339:18:15;;;15332:42;15391:19;;11778:73:14;15182:234:15;11778:73:14;11862:13;11878:31;11901:7;11878:22;:31::i;:::-;11862:47;;11939:5;-1:-1:-1;;;;;11928:16:14;:7;-1:-1:-1;;;;;11928:16:14;;:51;;;;11972:7;-1:-1:-1;;;;;11948:31:14;:20;11960:7;11948:11;:20::i;:::-;-1:-1:-1;;;;;11948:31:14;;11928:51;:87;;;-1:-1:-1;;;;;;8872:25:14;;;8848:4;8872:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;11983:32;11920:96;11668:356;-1:-1:-1;;;;11668:356:14:o;14561:552::-;14694:4;-1:-1:-1;;;;;14659:39:14;:31;14682:7;14659:22;:31::i;:::-;-1:-1:-1;;;;;14659:39:14;;14651:93;;;;-1:-1:-1;;;14651:93:14;;19122:2:15;14651:93:14;;;19104:21:15;19161:2;19141:18;;;19134:30;19200:34;19180:18;;;19173:62;-1:-1:-1;;;19251:18:15;;;19244:39;19300:19;;14651:93:14;19094:231:15;14651:93:14;-1:-1:-1;;;;;14763:16:14;;14755:65;;;;-1:-1:-1;;;14755:65:14;;13692:2:15;14755:65:14;;;13674:21:15;13731:2;13711:18;;;13704:30;13770:34;13750:18;;;13743:62;-1:-1:-1;;;13821:18:15;;;13814:34;13865:19;;14755:65:14;13664:226:15;14755:65:14;14833:39;14854:4;14860:2;14864:7;14833:20;:39::i;:::-;14937:29;14954:1;14958:7;14937:8;:29::i;:::-;-1:-1:-1;;;;;14979:15:14;;;;;;:9;:15;;;;;:20;;14998:1;;14979:15;:20;;14998:1;;14979:20;:::i;:::-;;;;-1:-1:-1;;;;;;;15010:13:14;;;;;;:9;:13;;;;;:18;;15027:1;;15010:13;:18;;15027:1;;15010:18;:::i;:::-;;;;-1:-1:-1;;15039:16:14;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;15039:21:14;-1:-1:-1;;;;;15039:21:14;;;;;;;;;15078:27;;15039:16;;15078:27;;;;;;;14561:552;;;:::o;4916:947::-;1105:7:10;;-1:-1:-1;;;1105:7:10;;;;1348:9;1340:38;;;;-1:-1:-1;;;1340:38:10;;;;;;;:::i;:::-;5003:12:14::1;::::0;-1:-1:-1;;;;;5003:12:14::1;4995:35;;;::::0;::::1;;5057:1;5049:5;:9;5041:37;;;::::0;-1:-1:-1;;;5041:37:14;;21525:2:15;5041:37:14::1;::::0;::::1;21507:21:15::0;21564:2;21544:18;;;21537:30;-1:-1:-1;;;21583:18:15;;;21576:45;21638:18;;5041:37:14::1;21497:165:15::0;5041:37:14::1;5106:2;5097:5;:11;;5089:61;;;;-1:-1:-1::0;;;5089:61:14::1;;;;;;;:::i;:::-;5213:12;::::0;5260:25:::1;::::0;;-1:-1:-1;;;5260:25:14;;;;-1:-1:-1;;;;;5213:12:14;;::::1;::::0;5171:25:::1;::::0;5213:12;;5260:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;5213:12;5260:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5296:47;::::0;-1:-1:-1;;;5296:47:14;;-1:-1:-1;;;;;9019:32:15;;;5296:47:14::1;::::0;::::1;9001:51:15::0;9068:18;;;9061:34;;;5239:46:14;;-1:-1:-1;5296:19:14;;::::1;::::0;::::1;::::0;5322:9:::1;::::0;8974:18:15;;5296:47:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;5367:19:14::1;::::0;::::1;::::0;::::1;;;5364:492;::::0;-1:-1:-1;5364:492:14::1;::::0;-1:-1:-1;;5364:492:14::1;5403:18;5424:11;-1:-1:-1::0;;;;;5424:23:14::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5403:46;;5481:10;;5468;:23;5464:87;;;-1:-1:-1::0;5525:10:14::1;::::0;5464:87:::1;5600:10;5587;:23;5583:262;;;5635:7;5645:14;:10:::0;5658:1:::1;5645:14;:::i;:::-;5635:24;;5631:123;5667:10;5661:2;:16;5631:123;;5708:19;::::0;;;:15:::1;:19;::::0;;;;:26;;-1:-1:-1;;5708:26:14::1;5730:4;5708:26;::::0;;5724:2;5679:4:::1;5724:2:::0;5679:4:::1;:::i;:::-;;;;5631:123;;;-1:-1:-1::0;5790:39:14::1;5801:2:::0;5805:23:::1;5818:10:::0;5805;:23:::1;:::i;:::-;5790:10;:39::i;13227:279::-:0;13286:11;:13;;;:11;:13;;;:::i;:::-;;;;;;13310:22;13316:2;13320:11;;13310:5;:22::i;:::-;13365:55;13396:1;13400:2;13404:11;;13365:55;;;;;;;;;;;;:22;:55::i;:::-;13343:155;;;;-1:-1:-1;;;13343:155:14;;;;;;;:::i;12032:849::-;-1:-1:-1;;;;;12104:16:14;;12096:61;;;;-1:-1:-1;;;12096:61:14;;17572:2:15;12096:61:14;;;17554:21:15;;;17591:18;;;17584:30;17650:34;17630:18;;;17623:62;17702:18;;12096:61:14;17544:182:15;12096:61:14;12170:15;12188:11;;12202:1;12188:15;;;;:::i;:::-;12170:33;;12214:16;12247:5;12233:11;;:19;;;;:::i;:::-;12214:38;;12281:51;12312:1;12316:2;12320:7;12281:51;;;;;;;;;;;;:22;:51::i;:::-;12273:114;;;;-1:-1:-1;;;12273:114:14;;;;;;;:::i;:::-;12425:8;12414:7;:19;12408:282;;12461:45;12490:1;12494:2;12498:7;12461:20;:45::i;:::-;12521:16;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;12521:21:14;-1:-1:-1;;;;;12521:21:14;;;;;;;;12557:13;;:9;:13;;;;;:15;;;;;;:::i;:::-;;;;;;12435:9;;;;;:::i;:::-;;;;12408:282;;;12712:11;;:15;;12726:1;12712:15;:::i;:::-;12702:25;;12753:5;12738:11;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;12771:103:14;12788:8;12777:7;:19;12771:103;;12829:33;;12854:7;;-1:-1:-1;;;;;12829:33:14;;;12846:1;;12829:33;;12846:1;;12829:33;12798:9;;;;:::i;:::-;;;;12771:103;;10789:272;10903:28;10913:4;10919:2;10923:7;10903:9;:28::i;:::-;10950:48;10973:4;10979:2;10983:7;10992:5;10950:22;:48::i;:::-;10942:111;;;;-1:-1:-1;;;10942:111:14;;;;;;;:::i;271:703:13:-;327:13;544:10;540:51;;-1:-1:-1;;570:10:13;;;;;;;;;;;;-1:-1:-1;;;570:10:13;;;;;271:703::o;540:51::-;615:5;600:12;654:75;661:9;;654:75;;686:8;;;;:::i;:::-;;-1:-1:-1;708:10:13;;-1:-1:-1;716:2:13;708:10;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;-1:-1:-1;;;760:17:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;760:17:13;;738:39;;787:150;794:10;;787:150;;820:11;830:1;820:11;;:::i;:::-;;-1:-1:-1;888:10:13;896:2;888:5;:10;:::i;:::-;875:24;;:2;:24;:::i;:::-;862:39;;845:6;852;845:14;;;;;;-1:-1:-1;;;845:14:13;;;;;;;;;;;;:56;-1:-1:-1;;;;;845:56:13;;;;;;;;-1:-1:-1;915:11:13;924:2;915:11;;:::i;:::-;;;787:150;;18299:480:14;-1:-1:-1;;;;;18396:18:14;;18392:187;;18431:40;18463:7;19614:10;:17;;19587:24;;;;:15;:24;;;;;:44;;;19642:24;;;;;;;;;;;;19510:164;18431:40;18392:187;;;18501:2;-1:-1:-1;;;;;18493:10:14;:4;-1:-1:-1;;;;;18493:10:14;;18489:90;;18520:47;18553:4;18559:7;18520:32;:47::i;:::-;-1:-1:-1;;;;;18593:16:14;;18589:183;;18626:45;18663:7;18626:36;:45::i;18589:183::-;18699:4;-1:-1:-1;;;;;18693:10:14;:2;-1:-1:-1;;;;;18693:10:14;;18689:83;;18720:40;18748:2;18752:7;18720:27;:40::i;13842:382::-;-1:-1:-1;;;;;13922:16:14;;13914:61;;;;-1:-1:-1;;;13914:61:14;;17572:2:15;13914:61:14;;;17554:21:15;;;17591:18;;;17584:30;17650:34;17630:18;;;17623:62;17702:18;;13914:61:14;17544:182:15;13914:61:14;11439:4;11463:16;;;:7;:16;;;;;;-1:-1:-1;;;;;11463:16:14;:30;13986:58;;;;-1:-1:-1;;;13986:58:14;;12432:2:15;13986:58:14;;;12414:21:15;12471:2;12451:18;;;12444:30;12510;12490:18;;;12483:58;12558:18;;13986:58:14;12404:178:15;13986:58:14;14057:45;14086:1;14090:2;14094:7;14057:20;:45::i;:::-;-1:-1:-1;;;;;14115:13:14;;;;;;:9;:13;;;;;:18;;14132:1;;14115:13;:18;;14132:1;;14115:18;:::i;:::-;;;;-1:-1:-1;;14144:16:14;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;14144:21:14;-1:-1:-1;;;;;14144:21:14;;;;;;;;14183:33;;14144:16;;;14183:33;;14144:16;;14183:33;13842:382;;:::o;15992:843::-;16113:4;-1:-1:-1;;;;;16139:13:14;;1078:20:0;1116:8;16135:693:14;;16175:72;;-1:-1:-1;;;16175:72:14;;-1:-1:-1;;;;;16175:36:14;;;;;:72;;665:10:1;;16226:4:14;;16232:7;;16241:5;;16175:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16175:72:14;;;;;;;;-1:-1:-1;;16175:72:14;;;;;;;;;;;;:::i;:::-;;;16171:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16421:13:14;;16417:341;;16464:60;;-1:-1:-1;;;16464:60:14;;;;;;;:::i;16417:341::-;16708:6;16702:13;16693:6;16689:2;16685:15;16678:38;16171:602;-1:-1:-1;;;;;;16298:55:14;-1:-1:-1;;;16298:55:14;;-1:-1:-1;16291:62:14;;16135:693;-1:-1:-1;16812:4:14;15992:843;;;;;;:::o;20301:996::-;20567:22;20625:1;20592:30;20617:4;20592:24;:30::i;:::-;:34;;;;:::i;:::-;20637:18;20658:26;;;:17;:26;;;;;;20567:59;;-1:-1:-1;20791:28:14;;;20787:328;;-1:-1:-1;;;;;20858:18:14;;20836:19;20858:18;;;:12;:18;;;;;;;;:34;;;;;;;;;20909:30;;;;;;:44;;;21026:30;;:17;:30;;;;;:43;;;20787:328;-1:-1:-1;21211:26:14;;;;:17;:26;;;;;;;;21204:33;;;-1:-1:-1;;;;;21255:18:14;;;;;:12;:18;;;;;:34;;;;;;;21248:41;20301:996::o;21592:1079::-;21870:10;:17;21845:22;;21870:21;;21890:1;;21870:21;:::i;:::-;21902:18;21923:24;;;:15;:24;;;;;;22296:10;:26;;21845:46;;-1:-1:-1;21923:24:14;;21845:46;;22296:26;;;;-1:-1:-1;;;22296:26:14;;;;;;;;;;;;;;;;;22274:48;;22360:11;22335:10;22346;22335:22;;;;;;-1:-1:-1;;;22335:22:14;;;;;;;;;;;;;;;;;;;;:36;;;;22440:28;;;:15;:28;;;;;;;:41;;;22612:24;;;;;22605:31;22647:10;:16;;;;;-1:-1:-1;;;22647:16:14;;;;;;;;;;;;;;;;;;;;;;;;;;21592:1079;;;;:::o;19080:229::-;19165:14;19182:28;19207:2;19182:24;:28::i;:::-;-1:-1:-1;;;;;19221:16:14;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;19266:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;19080:229:14:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:160:15;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:257::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;312:6;304;297:22;259:2;356:9;343:23;375:31;400:5;375:31;:::i;:::-;425:5;249:187;-1:-1:-1;;;249:187:15:o;441:261::-;511:6;564:2;552:9;543:7;539:23;535:32;532:2;;;585:6;577;570:22;532:2;622:9;616:16;641:31;666:5;641:31;:::i;707:398::-;775:6;783;836:2;824:9;815:7;811:23;807:32;804:2;;;857:6;849;842:22;804:2;901:9;888:23;920:31;945:5;920:31;:::i;:::-;970:5;-1:-1:-1;1027:2:15;1012:18;;999:32;1040:33;999:32;1040:33;:::i;:::-;1092:7;1082:17;;;794:311;;;;;:::o;1110:466::-;1187:6;1195;1203;1256:2;1244:9;1235:7;1231:23;1227:32;1224:2;;;1277:6;1269;1262:22;1224:2;1321:9;1308:23;1340:31;1365:5;1340:31;:::i;:::-;1390:5;-1:-1:-1;1447:2:15;1432:18;;1419:32;1460:33;1419:32;1460:33;:::i;:::-;1214:362;;1512:7;;-1:-1:-1;;;1566:2:15;1551:18;;;;1538:32;;1214:362::o;1581:1153::-;1676:6;1684;1692;1700;1753:3;1741:9;1732:7;1728:23;1724:33;1721:2;;;1775:6;1767;1760:22;1721:2;1819:9;1806:23;1838:31;1863:5;1838:31;:::i;:::-;1888:5;-1:-1:-1;1912:2:15;1951:18;;;1938:32;1979:33;1938:32;1979:33;:::i;:::-;2031:7;-1:-1:-1;2085:2:15;2070:18;;2057:32;;-1:-1:-1;2140:2:15;2125:18;;2112:32;2163:18;2193:14;;;2190:2;;;2225:6;2217;2210:22;2190:2;2268:6;2257:9;2253:22;2243:32;;2313:7;2306:4;2302:2;2298:13;2294:27;2284:2;;2340:6;2332;2325:22;2284:2;2381;2368:16;2403:2;2399;2396:10;2393:2;;;2409:18;;:::i;:::-;2451:53;2494:2;2475:13;;-1:-1:-1;;2471:27:15;2467:36;;2451:53;:::i;:::-;2438:66;;2527:2;2520:5;2513:17;2567:7;2562:2;2557;2553;2549:11;2545:20;2542:33;2539:2;;;2593:6;2585;2578:22;2539:2;2653;2648;2644;2640:11;2635:2;2628:5;2624:14;2611:45;2676:14;;2672:23;;;2665:39;;;;1711:1023;;;;-1:-1:-1;1711:1023:15;;-1:-1:-1;;1711:1023:15:o;2739:325::-;2804:6;2812;2865:2;2853:9;2844:7;2840:23;2836:32;2833:2;;;2886:6;2878;2871:22;2833:2;2930:9;2917:23;2949:31;2974:5;2949:31;:::i;:::-;2999:5;-1:-1:-1;3023:35:15;3054:2;3039:18;;3023:35;:::i;:::-;3013:45;;2823:241;;;;;:::o;3069:325::-;3137:6;3145;3198:2;3186:9;3177:7;3173:23;3169:32;3166:2;;;3219:6;3211;3204:22;3166:2;3263:9;3250:23;3282:31;3307:5;3282:31;:::i;:::-;3332:5;3384:2;3369:18;;;;3356:32;;-1:-1:-1;;;3156:238:15:o;3399:1022::-;3483:6;3514:2;3557;3545:9;3536:7;3532:23;3528:32;3525:2;;;3578:6;3570;3563:22;3525:2;3623:9;3610:23;3656:18;3648:6;3645:30;3642:2;;;3693:6;3685;3678:22;3642:2;3721:22;;3774:4;3766:13;;3762:27;-1:-1:-1;3752:2:15;;3808:6;3800;3793:22;3752:2;3849;3836:16;3872:60;3888:43;3928:2;3888:43;:::i;:::-;3872:60;:::i;:::-;3954:3;3978:2;3973:3;3966:15;4006:2;4001:3;3997:12;3990:19;;4037:2;4033;4029:11;4085:7;4080:2;4074;4071:1;4067:10;4063:2;4059:19;4055:28;4052:41;4049:2;;;4111:6;4103;4096:22;4049:2;4138:6;4129:15;;4153:238;4167:2;4164:1;4161:9;4153:238;;;4238:3;4225:17;4255:31;4280:5;4255:31;:::i;:::-;4299:18;;4185:1;4178:9;;;;;4337:12;;;;4369;;4153:238;;;-1:-1:-1;4410:5:15;3494:927;-1:-1:-1;;;;;;;3494:927:15:o;4426:947::-;4510:6;4541:2;4584;4572:9;4563:7;4559:23;4555:32;4552:2;;;4605:6;4597;4590:22;4552:2;4650:9;4637:23;4683:18;4675:6;4672:30;4669:2;;;4720:6;4712;4705:22;4669:2;4748:22;;4801:4;4793:13;;4789:27;-1:-1:-1;4779:2:15;;4835:6;4827;4820:22;4779:2;4876;4863:16;4899:60;4915:43;4955:2;4915:43;:::i;4899:60::-;4981:3;5005:2;5000:3;4993:15;5033:2;5028:3;5024:12;5017:19;;5064:2;5060;5056:11;5112:7;5107:2;5101;5098:1;5094:10;5090:2;5086:19;5082:28;5079:41;5076:2;;;5138:6;5130;5123:22;5076:2;5165:6;5156:15;;5180:163;5194:2;5191:1;5188:9;5180:163;;;5251:17;;5239:30;;5212:1;5205:9;;;;;5289:12;;;;5321;;5180:163;;5378:190;5434:6;5487:2;5475:9;5466:7;5462:23;5458:32;5455:2;;;5508:6;5500;5493:22;5455:2;5536:26;5552:9;5536:26;:::i;5573:255::-;5631:6;5684:2;5672:9;5663:7;5659:23;5655:32;5652:2;;;5705:6;5697;5690:22;5652:2;5749:9;5736:23;5768:30;5792:5;5768:30;:::i;5833:259::-;5902:6;5955:2;5943:9;5934:7;5930:23;5926:32;5923:2;;;5976:6;5968;5961:22;5923:2;6013:9;6007:16;6032:30;6056:5;6032:30;:::i;6097:190::-;6156:6;6209:2;6197:9;6188:7;6184:23;6180:32;6177:2;;;6230:6;6222;6215:22;6177:2;-1:-1:-1;6258:23:15;;6167:120;-1:-1:-1;6167:120:15:o;6292:194::-;6362:6;6415:2;6403:9;6394:7;6390:23;6386:32;6383:2;;;6436:6;6428;6421:22;6383:2;-1:-1:-1;6464:16:15;;6373:113;-1:-1:-1;6373:113:15:o;6491:257::-;6532:3;6570:5;6564:12;6597:6;6592:3;6585:19;6613:63;6669:6;6662:4;6657:3;6653:14;6646:4;6639:5;6635:16;6613:63;:::i;:::-;6730:2;6709:15;-1:-1:-1;;6705:29:15;6696:39;;;;6737:4;6692:50;;6540:208;-1:-1:-1;;6540:208:15:o;6753:185::-;6795:3;6833:5;6827:12;6848:52;6893:6;6888:3;6881:4;6874:5;6870:16;6848:52;:::i;:::-;6916:16;;;;;6803:135;-1:-1:-1;;6803:135:15:o;6943:1178::-;7119:3;7148;7183:6;7177:13;7213:3;7235:1;7263:9;7259:2;7255:18;7245:28;;7323:2;7312:9;7308:18;7345;7335:2;;7389:4;7381:6;7377:17;7367:27;;7335:2;7415;7463;7455:6;7452:14;7432:18;7429:38;7426:2;;;-1:-1:-1;;;7490:33:15;;7546:4;7543:1;7536:15;7576:4;7497:3;7564:17;7426:2;7607:18;7634:104;;;;7752:1;7747:322;;;;7600:469;;7634:104;-1:-1:-1;;7667:24:15;;7655:37;;7712:16;;;;-1:-1:-1;7634:104:15;;7747:322;22364:4;22383:17;;;22433:4;22417:21;;7842:3;7858:165;7872:6;7869:1;7866:13;7858:165;;;7950:14;;7937:11;;;7930:35;7993:16;;;;7887:10;;7858:165;;;7862:3;;8052:6;8047:3;8043:16;8036:23;;7600:469;;;;;;;8085:30;8111:3;8103:6;8085:30;:::i;:::-;8078:37;7127:994;-1:-1:-1;;;;;7127:994:15:o;8334:488::-;-1:-1:-1;;;;;8603:15:15;;;8585:34;;8655:15;;8650:2;8635:18;;8628:43;8702:2;8687:18;;8680:34;;;8750:3;8745:2;8730:18;;8723:31;;;8528:4;;8771:45;;8796:19;;8788:6;8771:45;:::i;:::-;8763:53;8537:285;-1:-1:-1;;;;;;8537:285:15:o;9298:219::-;9447:2;9436:9;9429:21;9410:4;9467:44;9507:2;9496:9;9492:18;9484:6;9467:44;:::i;9522:401::-;9724:2;9706:21;;;9763:2;9743:18;;;9736:30;9802:34;9797:2;9782:18;;9775:62;-1:-1:-1;;;9868:2:15;9853:18;;9846:35;9913:3;9898:19;;9696:227::o;11404:414::-;11606:2;11588:21;;;11645:2;11625:18;;;11618:30;11684:34;11679:2;11664:18;;11657:62;-1:-1:-1;;;11750:2:15;11735:18;;11728:48;11808:3;11793:19;;11578:240::o;15779:340::-;15981:2;15963:21;;;16020:2;16000:18;;;15993:30;-1:-1:-1;;;16054:2:15;16039:18;;16032:46;16110:2;16095:18;;15953:166::o;18144:356::-;18346:2;18328:21;;;18365:18;;;18358:30;18424:34;18419:2;18404:18;;18397:62;18491:2;18476:18;;18318:182::o;19732:413::-;19934:2;19916:21;;;19973:2;19953:18;;;19946:30;20012:34;20007:2;19992:18;;19985:62;-1:-1:-1;;;20078:2:15;20063:18;;20056:47;20135:3;20120:19;;19906:239::o;21849:275::-;21920:2;21914:9;21985:2;21966:13;;-1:-1:-1;;21962:27:15;21950:40;;22020:18;22005:34;;22041:22;;;22002:62;21999:2;;;22067:18;;:::i;:::-;22103:2;22096:22;21894:230;;-1:-1:-1;21894:230:15:o;22129:183::-;22189:4;22222:18;22214:6;22211:30;22208:2;;;22244:18;;:::i;:::-;-1:-1:-1;22289:1:15;22285:14;22301:4;22281:25;;22198:114::o;22449:128::-;22489:3;22520:1;22516:6;22513:1;22510:13;22507:2;;;22526:18;;:::i;:::-;-1:-1:-1;22562:9:15;;22497:80::o;22582:120::-;22622:1;22648;22638:2;;22653:18;;:::i;:::-;-1:-1:-1;22687:9:15;;22628:74::o;22707:168::-;22747:7;22813:1;22809;22805:6;22801:14;22798:1;22795:21;22790:1;22783:9;22776:17;22772:45;22769:2;;;22820:18;;:::i;:::-;-1:-1:-1;22860:9:15;;22759:116::o;22880:125::-;22920:4;22948:1;22945;22942:8;22939:2;;;22953:18;;:::i;:::-;-1:-1:-1;22990:9:15;;22929:76::o;23010:258::-;23082:1;23092:113;23106:6;23103:1;23100:13;23092:113;;;23182:11;;;23176:18;23163:11;;;23156:39;23128:2;23121:10;23092:113;;;23223:6;23220:1;23217:13;23214:2;;;-1:-1:-1;;23258:1:15;23240:16;;23233:27;23063:205::o;23273:380::-;23352:1;23348:12;;;;23395;;;23416:2;;23470:4;23462:6;23458:17;23448:27;;23416:2;23523;23515:6;23512:14;23492:18;23489:38;23486:2;;;23569:10;23564:3;23560:20;23557:1;23550:31;23604:4;23601:1;23594:15;23632:4;23629:1;23622:15;23486:2;;23328:325;;;:::o;23658:135::-;23697:3;-1:-1:-1;;23718:17:15;;23715:2;;;23738:18;;:::i;:::-;-1:-1:-1;23785:1:15;23774:13;;23705:88::o;23798:112::-;23830:1;23856;23846:2;;23861:18;;:::i;:::-;-1:-1:-1;23895:9:15;;23836:74::o;23915:127::-;23976:10;23971:3;23967:20;23964:1;23957:31;24007:4;24004:1;23997:15;24031:4;24028:1;24021:15;24047:127;24108:10;24103:3;24099:20;24096:1;24089:31;24139:4;24136:1;24129:15;24163:4;24160:1;24153:15;24179:127;24240:10;24235:3;24231:20;24228:1;24221:31;24271:4;24268:1;24261:15;24295:4;24292:1;24285:15;24311:131;-1:-1:-1;;;;;24386:31:15;;24376:42;;24366:2;;24432:1;24429;24422:12;24447:131;-1:-1:-1;;;;;;24521:32:15;;24511:43;;24501:2;;24568:1;24565;24558:12
Swarm Source
ipfs://b384db761d4e42ff826146f0e75e3dd94e5654ef0a698974198f37c0af069441
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.