Overview
TokenID
9417
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
newNFT
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-01-27 */ /** *Submitted for verification at polygonscan.com on 2021-11-17 */ // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/ownership/ownable.sol pragma solidity ^0.8.0; /** * @dev The contract has an owner address, and provides basic authorization control whitch * simplifies the implementation of user permissions. This contract is based on the source code at: * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol */ contract Ownable { /** * @dev Error constants. */ string public constant NOT_CURRENT_OWNER = "018001"; string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002"; /** * @dev Current owner address. */ address public owner; /** * @dev An event which is triggered when the owner is changed. * @param previousOwner The address of the previous owner. * @param newOwner The address of the new owner. */ event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The constructor sets the original `owner` of the contract to the sender account. */ constructor() { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner, NOT_CURRENT_OWNER); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership( address _newOwner ) public onlyOwner { require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/tokens/erc721-enumerable.sol pragma solidity ^0.8.0; /** * @dev Optional enumeration extension for ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721Enumerable { /** * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an * assigned and queryable owner not equal to the zero address. * @return Total supply of NFTs. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified. * @param _index A counter less than `totalSupply()`. * @return Token id. */ function tokenByIndex( uint256 _index ) external view returns (uint256); /** * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address, * representing invalid NFTs. * @param _owner An address where we are interested in NFTs owned by them. * @param _index A counter less than `balanceOf(_owner)`. * @return Token id. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external view returns (uint256); } // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/tokens/erc721-metadata.sol pragma solidity ^0.8.0; /** * @dev Optional metadata extension for ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721Metadata { /** * @dev Returns a descriptive name for a collection of NFTs in this contract. * @return _name Representing name. */ function name() external view returns (string memory _name); /** * @dev Returns a abbreviated name for a collection of NFTs in this contract. * @return _symbol Representing symbol. */ function symbol() external view returns (string memory _symbol); /** * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file * that conforms to the "ERC721 Metadata JSON Schema". * @return URI of _tokenId. */ function tokenURI(uint256 _tokenId) external view returns (string memory); } // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/utils/address-utils.sol pragma solidity ^0.8.0; /** * @notice Based on: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol * Requires EIP-1052. * @dev Utility library of inline functions on addresses. */ library AddressUtils { /** * @dev Returns whether the target address is a contract. * @param _addr Address to check. * @return addressCheck True if _addr is a contract, false if not. */ function isContract( address _addr ) internal view returns (bool addressCheck) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; assembly { codehash := extcodehash(_addr) } // solhint-disable-line addressCheck = (codehash != 0x0 && codehash != accountHash); } } // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/utils/erc165.sol pragma solidity ^0.8.0; /** * @dev A standard for detecting smart contract interfaces. * See: https://eips.ethereum.org/EIPS/eip-165. */ interface ERC165 { /** * @dev Checks if the smart contract includes a specific interface. * This function uses less than 30,000 gas. * @param _interfaceID The interface identifier, as specified in ERC-165. * @return True if _interfaceID is supported, false otherwise. */ function supportsInterface( bytes4 _interfaceID ) external view returns (bool); } // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/utils/supports-interface.sol pragma solidity ^0.8.0; /** * @dev Implementation of standard for detect smart contract interfaces. */ contract SupportsInterface is ERC165 { /** * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true. */ mapping(bytes4 => bool) internal supportedInterfaces; /** * @dev Contract constructor. */ constructor() { supportedInterfaces[0x01ffc9a7] = true; // ERC165 } /** * @dev Function to check which interfaces are suported by this contract. * @param _interfaceID Id of the interface. * @return True if _interfaceID is supported, false otherwise. */ function supportsInterface( bytes4 _interfaceID ) external override view returns (bool) { return supportedInterfaces[_interfaceID]; } } // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/tokens/erc721-token-receiver.sol pragma solidity ^0.8.0; /** * @dev ERC-721 interface for accepting safe transfers. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721TokenReceiver { /** * @notice The contract address is always the message sender. A wallet/broker/auction application * MUST implement the wallet interface if it will accept safe transfers. * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return * of other than the magic value MUST result in the transaction being reverted. * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing. * @param _operator The address which called `safeTransferFrom` function. * @param _from The address which previously owned the token. * @param _tokenId The NFT identifier which is being transferred. * @param _data Additional data with no specified format. * @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes calldata _data ) external returns(bytes4); } // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/tokens/erc721.sol pragma solidity ^0.8.0; /** * @dev ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721 { /** * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any * number of NFTs may be created and assigned without emitting Transfer. At the time of any * transfer, the approved address for that NFT (if any) is reset to none. */ event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); /** * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero * address indicates there is no approved address. When a Transfer event emits, this also * indicates that the approved address for that NFT (if any) is reset to none. */ event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); /** * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage * all NFTs of the owner. */ event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); /** * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this * function checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`. * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes calldata _data ) external; /** * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "" * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external; /** * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they may be permanently lost. * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function transferFrom( address _from, address _to, uint256 _tokenId ) external; /** * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is * the current NFT owner, or an authorized operator of the current owner. * @param _approved The new approved NFT controller. * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable. * @param _tokenId The NFT to approve. */ function approve( address _approved, uint256 _tokenId ) external; /** * @notice The contract MUST allow multiple operators per owner. * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @param _operator Address to add to the set of authorized operators. * @param _approved True if the operators is approved, false to revoke approval. */ function setApprovalForAll( address _operator, bool _approved ) external; /** * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are * considered invalid, and this function throws for queries about the zero address. * @notice Count all NFTs assigned to an owner. * @param _owner Address for whom to query the balance. * @return Balance of _owner. */ function balanceOf( address _owner ) external view returns (uint256); /** * @notice Find the owner of an NFT. * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are * considered invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. * @return Address of _tokenId owner. */ function ownerOf( uint256 _tokenId ) external view returns (address); /** * @notice Throws if `_tokenId` is not a valid NFT. * @dev Get the approved address for a single NFT. * @param _tokenId The NFT to find the approved address for. * @return Address that _tokenId is approved for. */ function getApproved( uint256 _tokenId ) external view returns (address); /** * @notice Query if an address is an authorized operator for another address. * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise. * @param _owner The address that owns the NFTs. * @param _operator The address that acts on behalf of the owner. * @return True if approved for all, false otherwise. */ function isApprovedForAll( address _owner, address _operator ) external view returns (bool); } // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/tokens/nf-token.sol pragma solidity ^0.8.0; /** * @dev Implementation of ERC-721 non-fungible token standard. */ contract NFToken is ERC721, SupportsInterface { using AddressUtils for address; /** * @dev List of revert message codes. Implementing dApp should handle showing the correct message. * Based on 0xcert framework error codes. */ string constant ZERO_ADDRESS = "003001"; string constant NOT_VALID_NFT = "003002"; string constant NOT_OWNER_OR_OPERATOR = "003003"; string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004"; string constant NOT_ABLE_TO_RECEIVE_NFT = "003005"; string constant NFT_ALREADY_EXISTS = "003006"; string constant NOT_OWNER = "003007"; string constant IS_OWNER = "003008"; /** * @dev Magic value of a smart contract that can receive NFT. * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")). */ bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02; /** * @dev A mapping from NFT ID to the address that owns it. */ mapping (uint256 => address) internal idToOwner; /** * @dev Mapping from NFT ID to approved address. */ mapping (uint256 => address) internal idToApproval; /** * @dev Mapping from owner address to count of their tokens. */ mapping (address => uint256) private ownerToNFTokenCount; /** * @dev Mapping from owner address to mapping of operator addresses. */ mapping (address => mapping (address => bool)) internal ownerToOperators; /** * @dev Guarantees that the msg.sender is an owner or operator of the given NFT. * @param _tokenId ID of the NFT to validate. */ modifier canOperate( uint256 _tokenId ) { address tokenOwner = idToOwner[_tokenId]; require( tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender], NOT_OWNER_OR_OPERATOR ); _; } /** * @dev Guarantees that the msg.sender is allowed to transfer NFT. * @param _tokenId ID of the NFT to transfer. */ modifier canTransfer( uint256 _tokenId ) { address tokenOwner = idToOwner[_tokenId]; require( tokenOwner == msg.sender || idToApproval[_tokenId] == msg.sender || ownerToOperators[tokenOwner][msg.sender], NOT_OWNER_APPROVED_OR_OPERATOR ); _; } /** * @dev Guarantees that _tokenId is a valid Token. * @param _tokenId ID of the NFT to validate. */ modifier validNFToken( uint256 _tokenId ) { require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT); _; } /** * @dev Contract constructor. */ constructor() { supportedInterfaces[0x80ac58cd] = true; // ERC721 } /** * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this * function checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`. * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes calldata _data ) external override { _safeTransferFrom(_from, _to, _tokenId, _data); } /** * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "". * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external override { _safeTransferFrom(_from, _to, _tokenId, ""); } /** * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they may be permanently lost. * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function transferFrom( address _from, address _to, uint256 _tokenId ) external override canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from, NOT_OWNER); require(_to != address(0), ZERO_ADDRESS); _transfer(_to, _tokenId); } /** * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is * the current NFT owner, or an authorized operator of the current owner. * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable. * @param _approved Address to be approved for the given NFT ID. * @param _tokenId ID of the token to be approved. */ function approve( address _approved, uint256 _tokenId ) external override canOperate(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(_approved != tokenOwner, IS_OWNER); idToApproval[_tokenId] = _approved; emit Approval(tokenOwner, _approved, _tokenId); } /** * @notice This works even if sender doesn't own any tokens at the time. * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @param _operator Address to add to the set of authorized operators. * @param _approved True if the operators is approved, false to revoke approval. */ function setApprovalForAll( address _operator, bool _approved ) external override { ownerToOperators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /** * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are * considered invalid, and this function throws for queries about the zero address. * @param _owner Address for whom to query the balance. * @return Balance of _owner. */ function balanceOf( address _owner ) external override view returns (uint256) { require(_owner != address(0), ZERO_ADDRESS); return _getOwnerNFTCount(_owner); } /** * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are * considered invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. * @return _owner Address of _tokenId owner. */ function ownerOf( uint256 _tokenId ) external override view returns (address _owner) { _owner = idToOwner[_tokenId]; require(_owner != address(0), NOT_VALID_NFT); } /** * @notice Throws if `_tokenId` is not a valid NFT. * @dev Get the approved address for a single NFT. * @param _tokenId ID of the NFT to query the approval of. * @return Address that _tokenId is approved for. */ function getApproved( uint256 _tokenId ) external override view validNFToken(_tokenId) returns (address) { return idToApproval[_tokenId]; } /** * @dev Checks if `_operator` is an approved operator for `_owner`. * @param _owner The address that owns the NFTs. * @param _operator The address that acts on behalf of the owner. * @return True if approved for all, false otherwise. */ function isApprovedForAll( address _owner, address _operator ) external override view returns (bool) { return ownerToOperators[_owner][_operator]; } /** * @notice Does NO checks. * @dev Actually performs the transfer. * @param _to Address of a new owner. * @param _tokenId The NFT that is being transferred. */ function _transfer( address _to, uint256 _tokenId ) internal { address from = idToOwner[_tokenId]; _clearApproval(_tokenId); _removeNFToken(from, _tokenId); _addNFToken(_to, _tokenId); emit Transfer(from, _to, _tokenId); } /** * @notice This is an internal function which should be called from user-implemented external * mint function. Its purpose is to show and properly initialize data structures when using this * implementation. * @dev Mints a new NFT. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function _mint( address _to, uint256 _tokenId ) internal virtual { require(_to != address(0), ZERO_ADDRESS); require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); _addNFToken(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); } /** * @notice This is an internal function which should be called from user-implemented external burn * function. Its purpose is to show and properly initialize data structures when using this * implementation. Also, note that this burn implementation allows the minter to re-mint a burned * NFT. * @dev Burns a NFT. * @param _tokenId ID of the NFT to be burned. */ function _burn( uint256 _tokenId ) internal virtual validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; _clearApproval(_tokenId); _removeNFToken(tokenOwner, _tokenId); emit Transfer(tokenOwner, address(0), _tokenId); } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Removes a NFT from owner. * @param _from Address from which we want to remove the NFT. * @param _tokenId Which NFT we want to remove. */ function _removeNFToken( address _from, uint256 _tokenId ) internal virtual { require(idToOwner[_tokenId] == _from, NOT_OWNER); ownerToNFTokenCount[_from] -= 1; delete idToOwner[_tokenId]; } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Assigns a new NFT to owner. * @param _to Address to which we want to add the NFT. * @param _tokenId Which NFT we want to add. */ function _addNFToken( address _to, uint256 _tokenId ) internal virtual { require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); idToOwner[_tokenId] = _to; ownerToNFTokenCount[_to] += 1; } /** * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable * extension to remove double storage (gas optimization) of owner NFT count. * @param _owner Address for whom to query the count. * @return Number of _owner NFTs. */ function _getOwnerNFTCount( address _owner ) internal virtual view returns (uint256) { return ownerToNFTokenCount[_owner]; } /** * @dev Actually perform the safeTransferFrom. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function _safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes memory _data ) private canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from, NOT_OWNER); require(_to != address(0), ZERO_ADDRESS); _transfer(_to, _tokenId); if (_to.isContract()) { bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data); require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT); } } /** * @dev Clears the current approval of a given NFT ID. * @param _tokenId ID of the NFT to be transferred. */ function _clearApproval( uint256 _tokenId ) private { delete idToApproval[_tokenId]; } } // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/tokens/nf-token-enumerable.sol pragma solidity ^0.8.0; /** * @dev Optional enumeration implementation for ERC-721 non-fungible token standard. */ contract NFTokenEnumerable is NFToken, ERC721Enumerable { /** * @dev List of revert message codes. Implementing dApp should handle showing the correct message. * Based on 0xcert framework error codes. */ string constant INVALID_INDEX = "005007"; /** * @dev Array of all NFT IDs. */ uint256[] internal tokens; /** * @dev Mapping from token ID to its index in global tokens array. */ mapping(uint256 => uint256) internal idToIndex; /** * @dev Mapping from owner to list of owned NFT IDs. */ mapping(address => uint256[]) internal ownerToIds; /** * @dev Mapping from NFT ID to its index in the owner tokens list. */ mapping(uint256 => uint256) internal idToOwnerIndex; /** * @dev Contract constructor. */ constructor() { supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable } /** * @dev Returns the count of all existing NFTokens. * @return Total supply of NFTs. */ function totalSupply() external override view returns (uint256) { return tokens.length; } /** * @dev Returns NFT ID by its index. * @param _index A counter less than `totalSupply()`. * @return Token id. */ function tokenByIndex( uint256 _index ) external override view returns (uint256) { require(_index < tokens.length, INVALID_INDEX); return tokens[_index]; } /** * @dev returns the n-th NFT ID from a list of owner's tokens. * @param _owner Token owner's address. * @param _index Index number representing n-th token in owner's list of tokens. * @return Token id. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external override view returns (uint256) { require(_index < ownerToIds[_owner].length, INVALID_INDEX); return ownerToIds[_owner][_index]; } /** * @notice This is an internal function which should be called from user-implemented external * mint function. Its purpose is to show and properly initialize data structures when using this * implementation. * @dev Mints a new NFT. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function _mint( address _to, uint256 _tokenId ) internal override virtual { super._mint(_to, _tokenId); tokens.push(_tokenId); idToIndex[_tokenId] = tokens.length - 1; } /** * @notice This is an internal function which should be called from user-implemented external * burn function. Its purpose is to show and properly initialize data structures when using this * implementation. Also, note that this burn implementation allows the minter to re-mint a burned * NFT. * @dev Burns a NFT. * @param _tokenId ID of the NFT to be burned. */ function _burn( uint256 _tokenId ) internal override virtual { super._burn(_tokenId); uint256 tokenIndex = idToIndex[_tokenId]; uint256 lastTokenIndex = tokens.length - 1; uint256 lastToken = tokens[lastTokenIndex]; tokens[tokenIndex] = lastToken; tokens.pop(); // This wastes gas if you are burning the last token but saves a little gas if you are not. idToIndex[lastToken] = tokenIndex; idToIndex[_tokenId] = 0; } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Removes a NFT from an address. * @param _from Address from wich we want to remove the NFT. * @param _tokenId Which NFT we want to remove. */ function _removeNFToken( address _from, uint256 _tokenId ) internal override virtual { require(idToOwner[_tokenId] == _from, NOT_OWNER); delete idToOwner[_tokenId]; uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId]; uint256 lastTokenIndex = ownerToIds[_from].length - 1; if (lastTokenIndex != tokenToRemoveIndex) { uint256 lastToken = ownerToIds[_from][lastTokenIndex]; ownerToIds[_from][tokenToRemoveIndex] = lastToken; idToOwnerIndex[lastToken] = tokenToRemoveIndex; } ownerToIds[_from].pop(); } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Assigns a new NFT to an address. * @param _to Address to wich we want to add the NFT. * @param _tokenId Which NFT we want to add. */ function _addNFToken( address _to, uint256 _tokenId ) internal override virtual { require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); idToOwner[_tokenId] = _to; ownerToIds[_to].push(_tokenId); idToOwnerIndex[_tokenId] = ownerToIds[_to].length - 1; } /** * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable * extension to remove double storage(gas optimization) of owner NFT count. * @param _owner Address for whom to query the count. * @return Number of _owner NFTs. */ function _getOwnerNFTCount( address _owner ) internal override virtual view returns (uint256) { return ownerToIds[_owner].length; } } // File: https://github.com/0xcert/ethereum-erc721/blob/master/src/contracts/tokens/nf-token-metadata.sol pragma solidity ^0.8.0; /** * @dev Optional metadata implementation for ERC-721 non-fungible token standard. */ contract NFTokenMetadata is NFToken, ERC721Metadata { /** * @dev A descriptive name for a collection of NFTs. */ string internal nftName; /** * @dev An abbreviated name for NFTokens. */ string internal nftSymbol; /** * @dev Mapping from NFT ID to metadata uri. */ mapping (uint256 => string) internal idToUri; /** * @notice When implementing this contract don't forget to set nftName and nftSymbol. * @dev Contract constructor. */ constructor() { supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata } /** * @dev Returns a descriptive name for a collection of NFTokens. * @return _name Representing name. */ function name() external override view returns (string memory _name) { _name = nftName; } /** * @dev Returns an abbreviated name for NFTokens. * @return _symbol Representing symbol. */ function symbol() external override view returns (string memory _symbol) { _symbol = nftSymbol; } /** * @dev A distinct URI (RFC 3986) for a given NFT. * @param _tokenId Id for which we want uri. * @return URI of _tokenId. */ function tokenURI( uint256 _tokenId ) external override view validNFToken(_tokenId) returns (string memory) { return _tokenURI(_tokenId); } /** * @notice This is an internal function that can be overriden if you want to implement a different * way to generate token URI. * @param _tokenId Id for which we want uri. * @return URI of _tokenId. */ function _tokenURI( uint256 _tokenId ) internal virtual view returns (string memory) { return idToUri[_tokenId]; } /** * @notice This is an internal function which should be called from user-implemented external * burn function. Its purpose is to show and properly initialize data structures when using this * implementation. Also, note that this burn implementation allows the minter to re-mint a burned * NFT. * @dev Burns a NFT. * @param _tokenId ID of the NFT to be burned. */ function _burn( uint256 _tokenId ) internal override virtual { super._burn(_tokenId); delete idToUri[_tokenId]; } /** * @notice This is an internal function which should be called from user-implemented external * function. Its purpose is to show and properly initialize data structures when using this * implementation. * @dev Set a distinct URI (RFC 3986) for a given NFT ID. * @param _tokenId Id for which we want URI. * @param _uri String representing RFC 3986 URI. */ function _setTokenUri( uint256 _tokenId, string memory _uri ) internal validNFToken(_tokenId) { idToUri[_tokenId] = _uri; } } // File: ERC721.sol pragma solidity 0.8.6; contract newNFT is NFTokenMetadata, Ownable,ERC721Enumerable { constructor() { nftName = "Yolee"; nftSymbol = "YOLEE"; } function mint(address _to, uint256 _tokenId, string calldata _uri) external onlyOwner { _mint(_to, _tokenId); super._setTokenUri(_tokenId, _uri); } /** * @dev List of revert message codes. Implementing dApp should handle showing the correct message. * Based on 0xcert framework error codes. */ string constant INVALID_INDEX = "005007"; /** * @dev Array of all NFT IDs. */ uint256[] internal tokens; /** * @dev Mapping from token ID to its index in global tokens array. */ mapping(uint256 => uint256) internal idToIndex; /** * @dev Mapping from owner to list of owned NFT IDs. */ mapping(address => uint256[]) internal ownerToIds; /** * @dev Mapping from NFT ID to its index in the owner tokens list. */ mapping(uint256 => uint256) internal idToOwnerIndex; /** * @dev Returns the count of all existing NFTokens. * @return Total supply of NFTs. */ function totalSupply() external override view returns (uint256) { return tokens.length; } /** * @dev Returns NFT ID by its index. * @param _index A counter less than `totalSupply()`. * @return Token id. */ function tokenByIndex( uint256 _index ) external override view returns (uint256) { require(_index < tokens.length, INVALID_INDEX); return tokens[_index]; } /** * @dev returns the n-th NFT ID from a list of owner's tokens. * @param _owner Token owner's address. * @param _index Index number representing n-th token in owner's list of tokens. * @return Token id. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external override view returns (uint256) { require(_index < ownerToIds[_owner].length, INVALID_INDEX); return ownerToIds[_owner][_index]; } /** * @notice This is an internal function which should be called from user-implemented external * mint function. Its purpose is to show and properly initialize data structures when using this * implementation. * @dev Mints a new NFT. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function _mint( address _to, uint256 _tokenId ) internal override virtual { super._mint(_to, _tokenId); tokens.push(_tokenId); idToIndex[_tokenId] = tokens.length - 1; } function _burn( uint256 _tokenId ) internal override virtual { super._burn(_tokenId); uint256 tokenIndex = idToIndex[_tokenId]; uint256 lastTokenIndex = tokens.length - 1; uint256 lastToken = tokens[lastTokenIndex]; tokens[tokenIndex] = lastToken; tokens.pop(); // This wastes gas if you are burning the last token but saves a little gas if you are not. idToIndex[lastToken] = tokenIndex; idToIndex[_tokenId] = 0; } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Removes a NFT from an address. * @param _from Address from wich we want to remove the NFT. * @param _tokenId Which NFT we want to remove. */ function _removeNFToken( address _from, uint256 _tokenId ) internal override virtual { require(idToOwner[_tokenId] == _from, NOT_OWNER); delete idToOwner[_tokenId]; uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId]; uint256 lastTokenIndex = ownerToIds[_from].length - 1; if (lastTokenIndex != tokenToRemoveIndex) { uint256 lastToken = ownerToIds[_from][lastTokenIndex]; ownerToIds[_from][tokenToRemoveIndex] = lastToken; idToOwnerIndex[lastToken] = tokenToRemoveIndex; } ownerToIds[_from].pop(); } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Assigns a new NFT to an address. * @param _to Address to wich we want to add the NFT. * @param _tokenId Which NFT we want to add. */ function _addNFToken( address _to, uint256 _tokenId ) internal override virtual { require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); idToOwner[_tokenId] = _to; ownerToIds[_to].push(_tokenId); idToOwnerIndex[_tokenId] = ownerToIds[_to].length - 1; } /** * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable * extension to remove double storage(gas optimization) of owner NFT count. * @param _owner Address for whom to query the count. * @return Number of _owner NFTs. */ function _getOwnerNFTCount( address _owner ) internal override virtual view returns (uint256) { return ownerToIds[_owner].length; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_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":"_owner","type":"address"}],"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":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600581526020017f596f6c65650000000000000000000000000000000000000000000000000000008152506005908051906020019062000193929190620001e8565b506040518060400160405280600581526020017f594f4c454500000000000000000000000000000000000000000000000000000081525060069080519060200190620001e1929190620001e8565b50620002fd565b828054620001f69062000298565b90600052602060002090601f0160209004810192826200021a576000855562000266565b82601f106200023557805160ff191683800117855562000266565b8280016001018555821562000266579182015b828111156200026557825182559160200191906001019062000248565b5b50905062000275919062000279565b5090565b5b80821115620002945760008160009055506001016200027a565b5090565b60006002820490506001821680620002b157607f821691505b60208210811415620002c857620002c7620002ce565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61321a806200030d6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063b88d4fde1161007c578063b88d4fde14610362578063c87b56dd1461037e578063d3fc9864146103ae578063e985e9c5146103ca578063f2fde38b146103fa578063f3fe3bc31461041657610137565b806370a08231146102bc578063860d248a146102ec5780638da5cb5b1461030a57806395d89b4114610328578063a22cb4651461034657610137565b806323b872dd116100ff57806323b872dd146101f45780632f745c591461021057806342842e0e146102405780634f6ccce71461025c5780636352211e1461028c57610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806318160ddd146101d6575b600080fd5b61015660048036038101906101519190612d78565b610434565b6040516101639190612f05565b60405180910390f35b61017461049b565b6040516101819190612f20565b60405180910390f35b6101a4600480360381019061019f9190612dd2565b61052d565b6040516101b19190612e9e565b60405180910390f35b6101d460048036038101906101cf9190612cc4565b610648565b005b6101de610a2b565b6040516101eb9190612f42565b60405180910390f35b61020e60048036038101906102099190612ba9565b610a38565b005b61022a60048036038101906102259190612cc4565b610e8a565b6040516102379190612f42565b60405180910390f35b61025a60048036038101906102559190612ba9565b610fad565b005b61027660048036038101906102719190612dd2565b610fcd565b6040516102839190612f42565b60405180910390f35b6102a660048036038101906102a19190612dd2565b611075565b6040516102b39190612e9e565b60405180910390f35b6102d660048036038101906102d19190612b3c565b61115b565b6040516102e39190612f42565b60405180910390f35b6102f4611215565b6040516103019190612f20565b60405180910390f35b61031261124e565b60405161031f9190612e9e565b60405180910390f35b610330611274565b60405161033d9190612f20565b60405180910390f35b610360600480360381019061035b9190612c84565b611306565b005b61037c60048036038101906103779190612bfc565b611403565b005b61039860048036038101906103939190612dd2565b61145a565b6040516103a59190612f20565b60405180910390f35b6103c860048036038101906103c39190612d04565b61154a565b005b6103e460048036038101906103df9190612b69565b611671565b6040516103f19190612f05565b60405180910390f35b610414600480360381019061040f9190612b3c565b611705565b005b61041e611937565b60405161042b9190612f20565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600580546104aa90613070565b80601f01602080910402602001604051908101604052809291908181526020018280546104d690613070565b80156105235780601f106104f857610100808354040283529160200191610523565b820191906000526020600020905b81548152906001019060200180831161050657829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061060b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106029190612f20565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806107415750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906107b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107af9190612f20565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088c9190612f20565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096c9190612f20565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6000600980549050905090565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610b0957503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610b9a5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c089190612f20565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce59190612f20565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc49190612f20565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6d9190612f20565b60405180910390fd5b50610e818686611970565b50505050505050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082106040518060400160405280600681526020017f303035303037000000000000000000000000000000000000000000000000000081525090610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f9190612f20565b60405180910390fd5b50600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610f9a57610f9961312f565b5b9060005260206000200154905092915050565b610fc883838360405180602001604052806000815250611a25565b505050565b600060098054905082106040518060400160405280600681526020017f30303530303700000000000000000000000000000000000000000000000000008152509061104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110459190612f20565b60405180910390fd5b50600982815481106110635761106261312f565b5b90600052602060002001549050919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c9190612f20565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fb9190612f20565b60405180910390fd5b5061120e82611ff3565b9050919050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461128390613070565b80601f01602080910402602001604051908101604052809291908181526020018280546112af90613070565b80156112fc5780601f106112d1576101008083540402835291602001916112fc565b820191906000526020600020905b8154815290600101906020018083116112df57829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113f79190612f05565b60405180910390a35050565b61145385858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611a25565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f9190612f20565b60405180910390fd5b506115428361203f565b915050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611612576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116099190612f20565b60405180910390fd5b5061161d84846120e4565b61166b8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612144565b50505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906117cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c49190612f20565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d9190612f20565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506119b18261224e565b6119bb8183612287565b6119c5838361254e565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611af657503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611b875750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf59190612f20565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd29190612f20565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db19190612f20565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a9190612f20565b60405180910390fd5b50611e6e8787611970565b611e8d8773ffffffffffffffffffffffffffffffffffffffff1661274b565b15611fe95760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401611ed39493929190612eb9565b602060405180830381600087803b158015611eed57600080fd5b505af1158015611f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f259190612da5565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f303033303035000000000000000000000000000000000000000000000000000081525090611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd9190612f20565b60405180910390fd5b50505b5050505050505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b606060076000838152602001908152602001600020805461205f90613070565b80601f016020809104026020016040519081016040528092919081815260200182805461208b90613070565b80156120d85780601f106120ad576101008083540402835291602001916120d8565b820191906000526020600020905b8154815290600101906020018083116120bb57829003601f168201915b50505050509050919050565b6120ee8282612796565b600981908060018154018082558091505060019003906000526020600020016000909190919091505560016009805490506121299190612f95565b600a6000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612220576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122179190612f20565b60405180910390fd5b5081600760008581526020019081526020016000209080519060200190612248929190612984565b50505050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612360576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123579190612f20565b60405180910390fd5b506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000600c600083815260200190815260200160002054905060006001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506124009190612f95565b90508181146124e3576000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061245c5761245b61312f565b5b9060005260206000200154905080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106124bb576124ba61312f565b5b906000526020600020018190555082600c600083815260200190815260200160002081905550505b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061253257612531613100565b5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261f9190612f20565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506127309190612f95565b600c6000838152602001908152602001600020819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561278d5750808214155b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061283e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128359190612f20565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612919576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129109190612f20565b60405180910390fd5b50612924828261254e565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461299090613070565b90600052602060002090601f0160209004810192826129b257600085556129f9565b82601f106129cb57805160ff19168380011785556129f9565b828001600101855582156129f9579182015b828111156129f85782518255916020019190600101906129dd565b5b509050612a069190612a0a565b5090565b5b80821115612a23576000816000905550600101612a0b565b5090565b600081359050612a3681613188565b92915050565b600081359050612a4b8161319f565b92915050565b600081359050612a60816131b6565b92915050565b600081519050612a75816131b6565b92915050565b60008083601f840112612a9157612a90613163565b5b8235905067ffffffffffffffff811115612aae57612aad61315e565b5b602083019150836001820283011115612aca57612ac9613168565b5b9250929050565b60008083601f840112612ae757612ae6613163565b5b8235905067ffffffffffffffff811115612b0457612b0361315e565b5b602083019150836001820283011115612b2057612b1f613168565b5b9250929050565b600081359050612b36816131cd565b92915050565b600060208284031215612b5257612b51613172565b5b6000612b6084828501612a27565b91505092915050565b60008060408385031215612b8057612b7f613172565b5b6000612b8e85828601612a27565b9250506020612b9f85828601612a27565b9150509250929050565b600080600060608486031215612bc257612bc1613172565b5b6000612bd086828701612a27565b9350506020612be186828701612a27565b9250506040612bf286828701612b27565b9150509250925092565b600080600080600060808688031215612c1857612c17613172565b5b6000612c2688828901612a27565b9550506020612c3788828901612a27565b9450506040612c4888828901612b27565b935050606086013567ffffffffffffffff811115612c6957612c6861316d565b5b612c7588828901612a7b565b92509250509295509295909350565b60008060408385031215612c9b57612c9a613172565b5b6000612ca985828601612a27565b9250506020612cba85828601612a3c565b9150509250929050565b60008060408385031215612cdb57612cda613172565b5b6000612ce985828601612a27565b9250506020612cfa85828601612b27565b9150509250929050565b60008060008060608587031215612d1e57612d1d613172565b5b6000612d2c87828801612a27565b9450506020612d3d87828801612b27565b935050604085013567ffffffffffffffff811115612d5e57612d5d61316d565b5b612d6a87828801612ad1565b925092505092959194509250565b600060208284031215612d8e57612d8d613172565b5b6000612d9c84828501612a51565b91505092915050565b600060208284031215612dbb57612dba613172565b5b6000612dc984828501612a66565b91505092915050565b600060208284031215612de857612de7613172565b5b6000612df684828501612b27565b91505092915050565b612e0881612fc9565b82525050565b612e1781612fdb565b82525050565b6000612e2882612f5d565b612e328185612f73565b9350612e4281856020860161303d565b612e4b81613177565b840191505092915050565b6000612e6182612f68565b612e6b8185612f84565b9350612e7b81856020860161303d565b612e8481613177565b840191505092915050565b612e9881613033565b82525050565b6000602082019050612eb36000830184612dff565b92915050565b6000608082019050612ece6000830187612dff565b612edb6020830186612dff565b612ee86040830185612e8f565b8181036060830152612efa8184612e1d565b905095945050505050565b6000602082019050612f1a6000830184612e0e565b92915050565b60006020820190508181036000830152612f3a8184612e56565b905092915050565b6000602082019050612f576000830184612e8f565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612fa082613033565b9150612fab83613033565b925082821015612fbe57612fbd6130a2565b5b828203905092915050565b6000612fd482613013565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561305b578082015181840152602081019050613040565b8381111561306a576000848401525b50505050565b6000600282049050600182168061308857607f821691505b6020821081141561309c5761309b6130d1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61319181612fc9565b811461319c57600080fd5b50565b6131a881612fdb565b81146131b357600080fd5b50565b6131bf81612fe7565b81146131ca57600080fd5b50565b6131d681613033565b81146131e157600080fd5b5056fea26469706673582212200fa0d17bfc180eb10123b5c59e40876500417b604f42fff000b48c9ecf7b061d64736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063b88d4fde1161007c578063b88d4fde14610362578063c87b56dd1461037e578063d3fc9864146103ae578063e985e9c5146103ca578063f2fde38b146103fa578063f3fe3bc31461041657610137565b806370a08231146102bc578063860d248a146102ec5780638da5cb5b1461030a57806395d89b4114610328578063a22cb4651461034657610137565b806323b872dd116100ff57806323b872dd146101f45780632f745c591461021057806342842e0e146102405780634f6ccce71461025c5780636352211e1461028c57610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806318160ddd146101d6575b600080fd5b61015660048036038101906101519190612d78565b610434565b6040516101639190612f05565b60405180910390f35b61017461049b565b6040516101819190612f20565b60405180910390f35b6101a4600480360381019061019f9190612dd2565b61052d565b6040516101b19190612e9e565b60405180910390f35b6101d460048036038101906101cf9190612cc4565b610648565b005b6101de610a2b565b6040516101eb9190612f42565b60405180910390f35b61020e60048036038101906102099190612ba9565b610a38565b005b61022a60048036038101906102259190612cc4565b610e8a565b6040516102379190612f42565b60405180910390f35b61025a60048036038101906102559190612ba9565b610fad565b005b61027660048036038101906102719190612dd2565b610fcd565b6040516102839190612f42565b60405180910390f35b6102a660048036038101906102a19190612dd2565b611075565b6040516102b39190612e9e565b60405180910390f35b6102d660048036038101906102d19190612b3c565b61115b565b6040516102e39190612f42565b60405180910390f35b6102f4611215565b6040516103019190612f20565b60405180910390f35b61031261124e565b60405161031f9190612e9e565b60405180910390f35b610330611274565b60405161033d9190612f20565b60405180910390f35b610360600480360381019061035b9190612c84565b611306565b005b61037c60048036038101906103779190612bfc565b611403565b005b61039860048036038101906103939190612dd2565b61145a565b6040516103a59190612f20565b60405180910390f35b6103c860048036038101906103c39190612d04565b61154a565b005b6103e460048036038101906103df9190612b69565b611671565b6040516103f19190612f05565b60405180910390f35b610414600480360381019061040f9190612b3c565b611705565b005b61041e611937565b60405161042b9190612f20565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600580546104aa90613070565b80601f01602080910402602001604051908101604052809291908181526020018280546104d690613070565b80156105235780601f106104f857610100808354040283529160200191610523565b820191906000526020600020905b81548152906001019060200180831161050657829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061060b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106029190612f20565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806107415750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906107b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107af9190612f20565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088c9190612f20565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096c9190612f20565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6000600980549050905090565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610b0957503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610b9a5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c089190612f20565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce59190612f20565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc49190612f20565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090610e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6d9190612f20565b60405180910390fd5b50610e818686611970565b50505050505050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082106040518060400160405280600681526020017f303035303037000000000000000000000000000000000000000000000000000081525090610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f9190612f20565b60405180910390fd5b50600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610f9a57610f9961312f565b5b9060005260206000200154905092915050565b610fc883838360405180602001604052806000815250611a25565b505050565b600060098054905082106040518060400160405280600681526020017f30303530303700000000000000000000000000000000000000000000000000008152509061104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110459190612f20565b60405180910390fd5b50600982815481106110635761106261312f565b5b90600052602060002001549050919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c9190612f20565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fb9190612f20565b60405180910390fd5b5061120e82611ff3565b9050919050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461128390613070565b80601f01602080910402602001604051908101604052809291908181526020018280546112af90613070565b80156112fc5780601f106112d1576101008083540402835291602001916112fc565b820191906000526020600020905b8154815290600101906020018083116112df57829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113f79190612f05565b60405180910390a35050565b61145385858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611a25565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f9190612f20565b60405180910390fd5b506115428361203f565b915050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611612576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116099190612f20565b60405180910390fd5b5061161d84846120e4565b61166b8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612144565b50505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906117cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c49190612f20565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d9190612f20565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506119b18261224e565b6119bb8183612287565b6119c5838361254e565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611af657503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611b875750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf59190612f20565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd29190612f20565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db19190612f20565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a9190612f20565b60405180910390fd5b50611e6e8787611970565b611e8d8773ffffffffffffffffffffffffffffffffffffffff1661274b565b15611fe95760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401611ed39493929190612eb9565b602060405180830381600087803b158015611eed57600080fd5b505af1158015611f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f259190612da5565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f303033303035000000000000000000000000000000000000000000000000000081525090611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd9190612f20565b60405180910390fd5b50505b5050505050505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b606060076000838152602001908152602001600020805461205f90613070565b80601f016020809104026020016040519081016040528092919081815260200182805461208b90613070565b80156120d85780601f106120ad576101008083540402835291602001916120d8565b820191906000526020600020905b8154815290600101906020018083116120bb57829003601f168201915b50505050509050919050565b6120ee8282612796565b600981908060018154018082558091505060019003906000526020600020016000909190919091505560016009805490506121299190612f95565b600a6000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612220576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122179190612f20565b60405180910390fd5b5081600760008581526020019081526020016000209080519060200190612248929190612984565b50505050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612360576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123579190612f20565b60405180910390fd5b506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000600c600083815260200190815260200160002054905060006001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506124009190612f95565b90508181146124e3576000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061245c5761245b61312f565b5b9060005260206000200154905080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106124bb576124ba61312f565b5b906000526020600020018190555082600c600083815260200190815260200160002081905550505b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061253257612531613100565b5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261f9190612f20565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506127309190612f95565b600c6000838152602001908152602001600020819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561278d5750808214155b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061283e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128359190612f20565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612919576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129109190612f20565b60405180910390fd5b50612924828261254e565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461299090613070565b90600052602060002090601f0160209004810192826129b257600085556129f9565b82601f106129cb57805160ff19168380011785556129f9565b828001600101855582156129f9579182015b828111156129f85782518255916020019190600101906129dd565b5b509050612a069190612a0a565b5090565b5b80821115612a23576000816000905550600101612a0b565b5090565b600081359050612a3681613188565b92915050565b600081359050612a4b8161319f565b92915050565b600081359050612a60816131b6565b92915050565b600081519050612a75816131b6565b92915050565b60008083601f840112612a9157612a90613163565b5b8235905067ffffffffffffffff811115612aae57612aad61315e565b5b602083019150836001820283011115612aca57612ac9613168565b5b9250929050565b60008083601f840112612ae757612ae6613163565b5b8235905067ffffffffffffffff811115612b0457612b0361315e565b5b602083019150836001820283011115612b2057612b1f613168565b5b9250929050565b600081359050612b36816131cd565b92915050565b600060208284031215612b5257612b51613172565b5b6000612b6084828501612a27565b91505092915050565b60008060408385031215612b8057612b7f613172565b5b6000612b8e85828601612a27565b9250506020612b9f85828601612a27565b9150509250929050565b600080600060608486031215612bc257612bc1613172565b5b6000612bd086828701612a27565b9350506020612be186828701612a27565b9250506040612bf286828701612b27565b9150509250925092565b600080600080600060808688031215612c1857612c17613172565b5b6000612c2688828901612a27565b9550506020612c3788828901612a27565b9450506040612c4888828901612b27565b935050606086013567ffffffffffffffff811115612c6957612c6861316d565b5b612c7588828901612a7b565b92509250509295509295909350565b60008060408385031215612c9b57612c9a613172565b5b6000612ca985828601612a27565b9250506020612cba85828601612a3c565b9150509250929050565b60008060408385031215612cdb57612cda613172565b5b6000612ce985828601612a27565b9250506020612cfa85828601612b27565b9150509250929050565b60008060008060608587031215612d1e57612d1d613172565b5b6000612d2c87828801612a27565b9450506020612d3d87828801612b27565b935050604085013567ffffffffffffffff811115612d5e57612d5d61316d565b5b612d6a87828801612ad1565b925092505092959194509250565b600060208284031215612d8e57612d8d613172565b5b6000612d9c84828501612a51565b91505092915050565b600060208284031215612dbb57612dba613172565b5b6000612dc984828501612a66565b91505092915050565b600060208284031215612de857612de7613172565b5b6000612df684828501612b27565b91505092915050565b612e0881612fc9565b82525050565b612e1781612fdb565b82525050565b6000612e2882612f5d565b612e328185612f73565b9350612e4281856020860161303d565b612e4b81613177565b840191505092915050565b6000612e6182612f68565b612e6b8185612f84565b9350612e7b81856020860161303d565b612e8481613177565b840191505092915050565b612e9881613033565b82525050565b6000602082019050612eb36000830184612dff565b92915050565b6000608082019050612ece6000830187612dff565b612edb6020830186612dff565b612ee86040830185612e8f565b8181036060830152612efa8184612e1d565b905095945050505050565b6000602082019050612f1a6000830184612e0e565b92915050565b60006020820190508181036000830152612f3a8184612e56565b905092915050565b6000602082019050612f576000830184612e8f565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612fa082613033565b9150612fab83613033565b925082821015612fbe57612fbd6130a2565b5b828203905092915050565b6000612fd482613013565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561305b578082015181840152602081019050613040565b8381111561306a576000848401525b50505050565b6000600282049050600182168061308857607f821691505b6020821081141561309c5761309b6130d1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61319181612fc9565b811461319c57600080fd5b50565b6131a881612fdb565b81146131b357600080fd5b50565b6131bf81612fe7565b81146131ca57600080fd5b50565b6131d681613033565b81146131e157600080fd5b5056fea26469706673582212200fa0d17bfc180eb10123b5c59e40876500417b604f42fff000b48c9ecf7b061d64736f6c63430008060033
Deployed Bytecode Sourcemap
37149:5107:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7218:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34886:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23203:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20988:352;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38255:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20214:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38952:251;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19459:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38516:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22751:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22277:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;633:65;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;753:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35122:128;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21751:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18839:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35403:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37295:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23655:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1578:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;577:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7218:172;7328:4;7351:19;:33;7371:12;7351:33;;;;;;;;;;;;;;;;;;;;;;;;;;;7344:40;;7218:172;;;:::o;34886:120::-;34954:19;34993:7;34985:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34886:120;:::o;23203:183::-;23332:7;23308:8;17802:1;17771:33;;:9;:19;17781:8;17771:19;;;;;;;;;;;;;;;;;;;;;:33;;;;17806:13;;;;;;;;;;;;;;;;;17763:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23358:12:::1;:22;23371:8;23358:22;;;;;;;;;;;;;;;;;;;;;23351:29;;23203:183:::0;;;;:::o;20988:352::-;21101:8;16955:18;16976:9;:19;16986:8;16976:19;;;;;;;;;;;;;;;;;;;;;16955:40;;17032:10;17018:24;;:10;:24;;;:68;;;;17046:16;:28;17063:10;17046:28;;;;;;;;;;;;;;;:40;17075:10;17046:40;;;;;;;;;;;;;;;;;;;;;;;;;17018:68;17095:21;;;;;;;;;;;;;;;;;17002:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21129:8:::1;17802:1;17771:33;;:9;:19;17781:8;17771:19;;;;;;;;;;;;;;;;;;;;;:33;;;;17806:13;;;;;;;;;;;;;;;;::::0;17763:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21149:18:::2;21170:9;:19;21180:8;21170:19;;;;;;;;;;;;;;;;;;;;;21149:40;;21217:10;21204:23;;:9;:23;;;;21229:8;;;;;;;;;;;;;;;;::::0;21196:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21272:9;21247:12;:22;21260:8;21247:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;21325:8;21314:9;21293:41;;21302:10;21293:41;;;;;;;;;;;;21142:198;17130:1:::1;16948:189:::0;20988:352;;;:::o;38255:120::-;38330:7;38356:6;:13;;;;38349:20;;38255:120;:::o;20214:353::-;20347:8;17335:18;17356:9;:19;17366:8;17356:19;;;;;;;;;;;;;;;;;;;;;17335:40;;17412:10;17398:24;;:10;:24;;;:71;;;;17459:10;17433:36;;:12;:22;17446:8;17433:22;;;;;;;;;;;;;;;;;;;;;:36;;;17398:71;:122;;;;17480:16;:28;17497:10;17480:28;;;;;;;;;;;;;;;:40;17509:10;17480:40;;;;;;;;;;;;;;;;;;;;;;;;;17398:122;17529:30;;;;;;;;;;;;;;;;;17382:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20375:8:::1;17802:1;17771:33;;:9;:19;17781:8;17771:19;;;;;;;;;;;;;;;;;;;;;:33;;;;17806:13;;;;;;;;;;;;;;;;::::0;17763:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20395:18:::2;20416:9;:19;20426:8;20416:19;;;;;;;;;;;;;;;;;;;;;20395:40;;20464:5;20450:19;;:10;:19;;;20471:9;;;;;;;;;;;;;;;;::::0;20442:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20511:1;20496:17;;:3;:17;;;;20515:12;;;;;;;;;;;;;;;;::::0;20488:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20537:24;20547:3;20552:8;20537:9;:24::i;:::-;20388:179;17573:1:::1;17328:252:::0;20214:353;;;;:::o;38952:251::-;39080:7;39116:10;:18;39127:6;39116:18;;;;;;;;;;;;;;;:25;;;;39107:6;:34;39143:13;;;;;;;;;;;;;;;;;39099:58;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;39171:10;:18;39182:6;39171:18;;;;;;;;;;;;;;;39190:6;39171:26;;;;;;;;:::i;:::-;;;;;;;;;;39164:33;;38952:251;;;;:::o;19459:179::-;19589:43;19607:5;19614:3;19619:8;19589:43;;;;;;;;;;;;:17;:43::i;:::-;19459:179;;;:::o;38516:199::-;38616:7;38652:6;:13;;;;38643:6;:22;38667:13;;;;;;;;;;;;;;;;;38635:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38695:6;38702;38695:14;;;;;;;;:::i;:::-;;;;;;;;;;38688:21;;38516:199;;;:::o;22751:208::-;22848:14;22883:9;:19;22893:8;22883:19;;;;;;;;;;;;;;;;;;;;;22874:28;;22935:1;22917:20;;:6;:20;;;;22939:13;;;;;;;;;;;;;;;;;22909:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22751:208;;;:::o;22277:204::-;22374:7;22419:1;22401:20;;:6;:20;;;;22423:12;;;;;;;;;;;;;;;;;22393:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22450:25;22468:6;22450:17;:25::i;:::-;22443:32;;22277:204;;;:::o;633:65::-;;;;;;;;;;;;;;;;;;;:::o;753:20::-;;;;;;;;;;;;;:::o;35122:128::-;35192:21;35235:9;35225:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35122:128;:::o;21751:232::-;21908:9;21866:16;:28;21883:10;21866:28;;;;;;;;;;;;;;;:39;21895:9;21866:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;21956:9;21929:48;;21944:10;21929:48;;;21967:9;21929:48;;;;;;:::i;:::-;;;;;;;;21751:232;;:::o;18839:209::-;18996:46;19014:5;19021:3;19026:8;19036:5;;18996:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;18839:209;;;;;:::o;35403:183::-;35529:13;35505:8;17802:1;17771:33;;:9;:19;17781:8;17771:19;;;;;;;;;;;;;;;;;;;;;:33;;;;17806:13;;;;;;;;;;;;;;;;;17763:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;35561:19:::1;35571:8;35561:9;:19::i;:::-;35554:26;;35403:183:::0;;;;:::o;37295:160::-;1371:5;;;;;;;;;;;1357:19;;:10;:19;;;1378:17;;;;;;;;;;;;;;;;;1349:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37388:20:::1;37394:3;37399:8;37388:5;:20::i;:::-;37415:34;37434:8;37444:4;;37415:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:34::i;:::-;37295:160:::0;;;;:::o;23655:192::-;23783:4;23806:16;:24;23823:6;23806:24;;;;;;;;;;;;;;;:35;23831:9;23806:35;;;;;;;;;;;;;;;;;;;;;;;;;23799:42;;23655:192;;;;:::o;1578:238::-;1371:5;;;;;;;;;;;1357:19;;:10;:19;;;1378:17;;;;;;;;;;;;;;;;;1349:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1700:1:::1;1679:23;;:9;:23;;;;1704:31;;;;;;;;;;;;;;;;::::0;1671:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1776:9;1748:38;;1769:5;;;;;;;;;;;1748:38;;;;;;;;;;;;1801:9;1793:5;;:17;;;;;;;;;;;;;;;;;;1578:238:::0;:::o;577:51::-;;;;;;;;;;;;;;;;;;;:::o;24038:275::-;24127:12;24142:9;:19;24152:8;24142:19;;;;;;;;;;;;;;;;;;;;;24127:34;;24168:24;24183:8;24168:14;:24::i;:::-;24201:30;24216:4;24222:8;24201:14;:30::i;:::-;24238:26;24250:3;24255:8;24238:11;:26::i;:::-;24298:8;24293:3;24278:29;;24287:4;24278:29;;;;;;;;;;;;24120:193;24038:275;;:::o;27441:590::-;27589:8;17335:18;17356:9;:19;17366:8;17356:19;;;;;;;;;;;;;;;;;;;;;17335:40;;17412:10;17398:24;;:10;:24;;;:71;;;;17459:10;17433:36;;:12;:22;17446:8;17433:22;;;;;;;;;;;;;;;;;;;;;:36;;;17398:71;:122;;;;17480:16;:28;17497:10;17480:28;;;;;;;;;;;;;;;:40;17509:10;17480:40;;;;;;;;;;;;;;;;;;;;;;;;;17398:122;17529:30;;;;;;;;;;;;;;;;;17382:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27617:8:::1;17802:1;17771:33;;:9;:19;17781:8;17771:19;;;;;;;;;;;;;;;;;;;;;:33;;;;17806:13;;;;;;;;;;;;;;;;::::0;17763:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27637:18:::2;27658:9;:19;27668:8;27658:19;;;;;;;;;;;;;;;;;;;;;27637:40;;27706:5;27692:19;;:10;:19;;;27713:9;;;;;;;;;;;;;;;;::::0;27684:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27753:1;27738:17;;:3;:17;;;;27757:12;;;;;;;;;;;;;;;;::::0;27730:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27779:24;27789:3;27794:8;27779:9;:24::i;:::-;27816:16;:3;:14;;;:16::i;:::-;27812:214;;;27848:13;27884:3;27864:41;;;27906:10;27918:5;27925:8;27935:5;27864:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27848:93;;16173:10;27968:24;;27958:34;;;:6;:34;;;;27994:23;;;;;;;;;;;;;;;;::::0;27950:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27839:187;27812:214;27630:401;17573:1:::1;17328:252:::0;27441:590;;;;;:::o;42078:175::-;42196:7;42222:10;:18;42233:6;42222:18;;;;;;;;;;;;;;;:25;;;;42215:32;;42078:175;;;:::o;35820:153::-;35918:13;35950:7;:17;35958:8;35950:17;;;;;;;;;;;35943:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35820:153;;;:::o;39594:218::-;39706:26;39718:3;39723:8;39706:11;:26::i;:::-;39739:6;39751:8;39739:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39805:1;39789:6;:13;;;;:17;;;;:::i;:::-;39767:9;:19;39777:8;39767:19;;;;;;;;;;;:39;;;;39594:218;;:::o;36925:157::-;37032:8;17802:1;17771:33;;:9;:19;17781:8;17771:19;;;;;;;;;;;;;;;;;;;;;:33;;;;17806:13;;;;;;;;;;;;;;;;;17763:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37072:4:::1;37052:7;:17;37060:8;37052:17;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;36925:157:::0;;;:::o;28164:110::-;28246:12;:22;28259:8;28246:22;;;;;;;;;;;;28239:29;;;;;;;;;;;28164:110;:::o;40594:602::-;40748:5;40725:28;;:9;:19;40735:8;40725:19;;;;;;;;;;;;;;;;;;;;;:28;;;40755:9;;;;;;;;;;;;;;;;;40717:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40779:9;:19;40789:8;40779:19;;;;;;;;;;;;40772:26;;;;;;;;;;;40807;40836:14;:24;40851:8;40836:24;;;;;;;;;;;;40807:53;;40867:22;40919:1;40892:10;:17;40903:5;40892:17;;;;;;;;;;;;;;;:24;;;;:28;;;;:::i;:::-;40867:53;;40951:18;40933:14;:36;40929:230;;40985:17;41005:10;:17;41016:5;41005:17;;;;;;;;;;;;;;;41023:14;41005:33;;;;;;;;:::i;:::-;;;;;;;;;;40985:53;;41087:9;41047:10;:17;41058:5;41047:17;;;;;;;;;;;;;;;41065:18;41047:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;41133:18;41105:14;:25;41120:9;41105:25;;;;;;;;;;;:46;;;;40976:183;40929:230;41167:10;:17;41178:5;41167:17;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40710:486;;40594:602;;:::o;41467:317::-;41624:1;41593:33;;:9;:19;41603:8;41593:19;;;;;;;;;;;;;;;;;;;;;:33;;;41628:18;;;;;;;;;;;;;;;;;41585:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41676:3;41654:9;:19;41664:8;41654:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;41688:10;:15;41699:3;41688:15;;;;;;;;;;;;;;;41709:8;41688:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41777:1;41752:10;:15;41763:3;41752:15;;;;;;;;;;;;;;;:22;;;;:26;;;;:::i;:::-;41725:14;:24;41740:8;41725:24;;;;;;;;;;;:53;;;;41467:317;;:::o;4998:780::-;5081:17;5522:16;5545:19;5567:66;5545:88;;;;5675:5;5663:18;5651:30;;5741:3;5729:15;;:8;:15;;:42;;;;;5760:11;5748:8;:23;;5729:42;5713:59;;5103:675;;4998:780;;;:::o;24704:297::-;24825:1;24810:17;;:3;:17;;;;24829:12;;;;;;;;;;;;;;;;;24802:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24888:1;24857:33;;:9;:19;24867:8;24857:19;;;;;;;;;;;;;;;;;;;;;:33;;;24892:18;;;;;;;;;;;;;;;;;24849:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24920:26;24932:3;24937:8;24920:11;:26::i;:::-;24986:8;24981:3;24960:35;;24977:1;24960:35;;;;;;;;;;;;24704:297;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;195:5;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:137::-;336:5;374:6;361:20;352:29;;390:32;416:5;390:32;:::i;:::-;342:86;;;;:::o;434:141::-;490:5;521:6;515:13;506:22;;537:32;563:5;537:32;:::i;:::-;496:79;;;;:::o;594:552::-;651:8;661:6;711:3;704:4;696:6;692:17;688:27;678:2;;719:79;;:::i;:::-;678:2;832:6;819:20;809:30;;862:18;854:6;851:30;848:2;;;884:79;;:::i;:::-;848:2;998:4;990:6;986:17;974:29;;1052:3;1044:4;1036:6;1032:17;1022:8;1018:32;1015:41;1012:2;;;1059:79;;:::i;:::-;1012:2;668:478;;;;;:::o;1166:553::-;1224:8;1234:6;1284:3;1277:4;1269:6;1265:17;1261:27;1251:2;;1292:79;;:::i;:::-;1251:2;1405:6;1392:20;1382:30;;1435:18;1427:6;1424:30;1421:2;;;1457:79;;:::i;:::-;1421:2;1571:4;1563:6;1559:17;1547:29;;1625:3;1617:4;1609:6;1605:17;1595:8;1591:32;1588:41;1585:2;;;1632:79;;:::i;:::-;1585:2;1241:478;;;;;:::o;1725:139::-;1771:5;1809:6;1796:20;1787:29;;1825:33;1852:5;1825:33;:::i;:::-;1777:87;;;;:::o;1870:329::-;1929:6;1978:2;1966:9;1957:7;1953:23;1949:32;1946:2;;;1984:79;;:::i;:::-;1946:2;2104:1;2129:53;2174:7;2165:6;2154:9;2150:22;2129:53;:::i;:::-;2119:63;;2075:117;1936:263;;;;:::o;2205:474::-;2273:6;2281;2330:2;2318:9;2309:7;2305:23;2301:32;2298:2;;;2336:79;;:::i;:::-;2298:2;2456:1;2481:53;2526:7;2517:6;2506:9;2502:22;2481:53;:::i;:::-;2471:63;;2427:117;2583:2;2609:53;2654:7;2645:6;2634:9;2630:22;2609:53;:::i;:::-;2599:63;;2554:118;2288:391;;;;;:::o;2685:619::-;2762:6;2770;2778;2827:2;2815:9;2806:7;2802:23;2798:32;2795:2;;;2833:79;;:::i;:::-;2795:2;2953:1;2978:53;3023:7;3014:6;3003:9;2999:22;2978:53;:::i;:::-;2968:63;;2924:117;3080:2;3106:53;3151:7;3142:6;3131:9;3127:22;3106:53;:::i;:::-;3096:63;;3051:118;3208:2;3234:53;3279:7;3270:6;3259:9;3255:22;3234:53;:::i;:::-;3224:63;;3179:118;2785:519;;;;;:::o;3310:963::-;3407:6;3415;3423;3431;3439;3488:3;3476:9;3467:7;3463:23;3459:33;3456:2;;;3495:79;;:::i;:::-;3456:2;3615:1;3640:53;3685:7;3676:6;3665:9;3661:22;3640:53;:::i;:::-;3630:63;;3586:117;3742:2;3768:53;3813:7;3804:6;3793:9;3789:22;3768:53;:::i;:::-;3758:63;;3713:118;3870:2;3896:53;3941:7;3932:6;3921:9;3917:22;3896:53;:::i;:::-;3886:63;;3841:118;4026:2;4015:9;4011:18;3998:32;4057:18;4049:6;4046:30;4043:2;;;4079:79;;:::i;:::-;4043:2;4192:64;4248:7;4239:6;4228:9;4224:22;4192:64;:::i;:::-;4174:82;;;;3969:297;3446:827;;;;;;;;:::o;4279:468::-;4344:6;4352;4401:2;4389:9;4380:7;4376:23;4372:32;4369:2;;;4407:79;;:::i;:::-;4369:2;4527:1;4552:53;4597:7;4588:6;4577:9;4573:22;4552:53;:::i;:::-;4542:63;;4498:117;4654:2;4680:50;4722:7;4713:6;4702:9;4698:22;4680:50;:::i;:::-;4670:60;;4625:115;4359:388;;;;;:::o;4753:474::-;4821:6;4829;4878:2;4866:9;4857:7;4853:23;4849:32;4846:2;;;4884:79;;:::i;:::-;4846:2;5004:1;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4975:117;5131:2;5157:53;5202:7;5193:6;5182:9;5178:22;5157:53;:::i;:::-;5147:63;;5102:118;4836:391;;;;;:::o;5233:819::-;5322:6;5330;5338;5346;5395:2;5383:9;5374:7;5370:23;5366:32;5363:2;;;5401:79;;:::i;:::-;5363:2;5521:1;5546:53;5591:7;5582:6;5571:9;5567:22;5546:53;:::i;:::-;5536:63;;5492:117;5648:2;5674:53;5719:7;5710:6;5699:9;5695:22;5674:53;:::i;:::-;5664:63;;5619:118;5804:2;5793:9;5789:18;5776:32;5835:18;5827:6;5824:30;5821:2;;;5857:79;;:::i;:::-;5821:2;5970:65;6027:7;6018:6;6007:9;6003:22;5970:65;:::i;:::-;5952:83;;;;5747:298;5353:699;;;;;;;:::o;6058:327::-;6116:6;6165:2;6153:9;6144:7;6140:23;6136:32;6133:2;;;6171:79;;:::i;:::-;6133:2;6291:1;6316:52;6360:7;6351:6;6340:9;6336:22;6316:52;:::i;:::-;6306:62;;6262:116;6123:262;;;;:::o;6391:349::-;6460:6;6509:2;6497:9;6488:7;6484:23;6480:32;6477:2;;;6515:79;;:::i;:::-;6477:2;6635:1;6660:63;6715:7;6706:6;6695:9;6691:22;6660:63;:::i;:::-;6650:73;;6606:127;6467:273;;;;:::o;6746:329::-;6805:6;6854:2;6842:9;6833:7;6829:23;6825:32;6822:2;;;6860:79;;:::i;:::-;6822:2;6980:1;7005:53;7050:7;7041:6;7030:9;7026:22;7005:53;:::i;:::-;6995:63;;6951:117;6812:263;;;;:::o;7081:118::-;7168:24;7186:5;7168:24;:::i;:::-;7163:3;7156:37;7146:53;;:::o;7205:109::-;7286:21;7301:5;7286:21;:::i;:::-;7281:3;7274:34;7264:50;;:::o;7320:360::-;7406:3;7434:38;7466:5;7434:38;:::i;:::-;7488:70;7551:6;7546:3;7488:70;:::i;:::-;7481:77;;7567:52;7612:6;7607:3;7600:4;7593:5;7589:16;7567:52;:::i;:::-;7644:29;7666:6;7644:29;:::i;:::-;7639:3;7635:39;7628:46;;7410:270;;;;;:::o;7686:364::-;7774:3;7802:39;7835:5;7802:39;:::i;:::-;7857:71;7921:6;7916:3;7857:71;:::i;:::-;7850:78;;7937:52;7982:6;7977:3;7970:4;7963:5;7959:16;7937:52;:::i;:::-;8014:29;8036:6;8014:29;:::i;:::-;8009:3;8005:39;7998:46;;7778:272;;;;;:::o;8056:118::-;8143:24;8161:5;8143:24;:::i;:::-;8138:3;8131:37;8121:53;;:::o;8180:222::-;8273:4;8311:2;8300:9;8296:18;8288:26;;8324:71;8392:1;8381:9;8377:17;8368:6;8324:71;:::i;:::-;8278:124;;;;:::o;8408:640::-;8603:4;8641:3;8630:9;8626:19;8618:27;;8655:71;8723:1;8712:9;8708:17;8699:6;8655:71;:::i;:::-;8736:72;8804:2;8793:9;8789:18;8780:6;8736:72;:::i;:::-;8818;8886:2;8875:9;8871:18;8862:6;8818:72;:::i;:::-;8937:9;8931:4;8927:20;8922:2;8911:9;8907:18;8900:48;8965:76;9036:4;9027:6;8965:76;:::i;:::-;8957:84;;8608:440;;;;;;;:::o;9054:210::-;9141:4;9179:2;9168:9;9164:18;9156:26;;9192:65;9254:1;9243:9;9239:17;9230:6;9192:65;:::i;:::-;9146:118;;;;:::o;9270:313::-;9383:4;9421:2;9410:9;9406:18;9398:26;;9470:9;9464:4;9460:20;9456:1;9445:9;9441:17;9434:47;9498:78;9571:4;9562:6;9498:78;:::i;:::-;9490:86;;9388:195;;;;:::o;9589:222::-;9682:4;9720:2;9709:9;9705:18;9697:26;;9733:71;9801:1;9790:9;9786:17;9777:6;9733:71;:::i;:::-;9687:124;;;;:::o;9898:98::-;9949:6;9983:5;9977:12;9967:22;;9956:40;;;:::o;10002:99::-;10054:6;10088:5;10082:12;10072:22;;10061:40;;;:::o;10107:168::-;10190:11;10224:6;10219:3;10212:19;10264:4;10259:3;10255:14;10240:29;;10202:73;;;;:::o;10281:169::-;10365:11;10399:6;10394:3;10387:19;10439:4;10434:3;10430:14;10415:29;;10377:73;;;;:::o;10456:191::-;10496:4;10516:20;10534:1;10516:20;:::i;:::-;10511:25;;10550:20;10568:1;10550:20;:::i;:::-;10545:25;;10589:1;10586;10583:8;10580:2;;;10594:18;;:::i;:::-;10580:2;10639:1;10636;10632:9;10624:17;;10501:146;;;;:::o;10653:96::-;10690:7;10719:24;10737:5;10719:24;:::i;:::-;10708:35;;10698:51;;;:::o;10755:90::-;10789:7;10832:5;10825:13;10818:21;10807:32;;10797:48;;;:::o;10851:149::-;10887:7;10927:66;10920:5;10916:78;10905:89;;10895:105;;;:::o;11006:126::-;11043:7;11083:42;11076:5;11072:54;11061:65;;11051:81;;;:::o;11138:77::-;11175:7;11204:5;11193:16;;11183:32;;;:::o;11221:307::-;11289:1;11299:113;11313:6;11310:1;11307:13;11299:113;;;11398:1;11393:3;11389:11;11383:18;11379:1;11374:3;11370:11;11363:39;11335:2;11332:1;11328:10;11323:15;;11299:113;;;11430:6;11427:1;11424:13;11421:2;;;11510:1;11501:6;11496:3;11492:16;11485:27;11421:2;11270:258;;;;:::o;11534:320::-;11578:6;11615:1;11609:4;11605:12;11595:22;;11662:1;11656:4;11652:12;11683:18;11673:2;;11739:4;11731:6;11727:17;11717:27;;11673:2;11801;11793:6;11790:14;11770:18;11767:38;11764:2;;;11820:18;;:::i;:::-;11764:2;11585:269;;;;:::o;11860:180::-;11908:77;11905:1;11898:88;12005:4;12002:1;11995:15;12029:4;12026:1;12019:15;12046:180;12094:77;12091:1;12084:88;12191:4;12188:1;12181:15;12215:4;12212:1;12205:15;12232:180;12280:77;12277:1;12270:88;12377:4;12374:1;12367:15;12401:4;12398:1;12391:15;12418:180;12466:77;12463:1;12456:88;12563:4;12560:1;12553:15;12587:4;12584:1;12577:15;12604:117;12713:1;12710;12703:12;12727:117;12836:1;12833;12826:12;12850:117;12959:1;12956;12949:12;12973:117;13082:1;13079;13072:12;13096:117;13205:1;13202;13195:12;13219:102;13260:6;13311:2;13307:7;13302:2;13295:5;13291:14;13287:28;13277:38;;13267:54;;;:::o;13327:122::-;13400:24;13418:5;13400:24;:::i;:::-;13393:5;13390:35;13380:2;;13439:1;13436;13429:12;13380:2;13370:79;:::o;13455:116::-;13525:21;13540:5;13525:21;:::i;:::-;13518:5;13515:32;13505:2;;13561:1;13558;13551:12;13505:2;13495:76;:::o;13577:120::-;13649:23;13666:5;13649:23;:::i;:::-;13642:5;13639:34;13629:2;;13687:1;13684;13677:12;13629:2;13619:78;:::o;13703:122::-;13776:24;13794:5;13776:24;:::i;:::-;13769:5;13766:35;13756:2;;13815:1;13812;13805:12;13756:2;13746:79;:::o
Swarm Source
ipfs://0fa0d17bfc180eb10123b5c59e40876500417b604f42fff000b48c9ecf7b061d
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.