Overview
Max Total Supply
60,452 MRBLNFT
Holders
1,522
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 MRBLNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MarbleNFT
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-08 */ // File: @0xcert/ethereum-erc721/contracts/tokens/ERC721.sol pragma solidity ^0.4.24; /** * @dev ERC-721 non-fungible token standard. See https://goo.gl/pc9yoS. */ 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 ); /** * @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. */ function balanceOf( address _owner ) external view returns (uint256); /** * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered * invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. */ function ownerOf( uint256 _tokenId ) external view returns (address); /** * @dev Transfers the ownership of an NFT from one address to another address. * @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)"))`. * @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 _data ) external; /** * @dev Transfers the ownership of an NFT from one address to another address. * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "" * @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; /** * @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. * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they mayb be permanently lost. * @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; /** * @dev Set or reaffirm the approved address for an NFT. * @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. * @param _tokenId The NFT to approve. */ function approve( address _approved, uint256 _tokenId ) external; /** * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @notice The contract MUST allow multiple operators per owner. * @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 Get the approved address for a single NFT. * @notice Throws if `_tokenId` is not a valid NFT. * @param _tokenId The NFT to find the approved address for. */ function getApproved( uint256 _tokenId ) external view returns (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. */ function isApprovedForAll( address _owner, address _operator ) external view returns (bool); } // File: @0xcert/ethereum-erc721/contracts/tokens/ERC721TokenReceiver.sol pragma solidity ^0.4.24; /** * @dev ERC-721 interface for accepting safe transfers. See https://goo.gl/pc9yoS. */ interface ERC721TokenReceiver { /** * @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. * @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. * @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. */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes _data ) external returns(bytes4); } // File: @0xcert/ethereum-utils/contracts/math/SafeMath.sol pragma solidity ^0.4.24; /** * @dev Math operations with safety checks that throw on error. This contract is based * on the source code at https://goo.gl/iyQsmU. */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. * @param _a Factor number. * @param _b Factor number. */ function mul( uint256 _a, uint256 _b ) internal pure returns (uint256) { if (_a == 0) { return 0; } uint256 c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. * @param _a Dividend number. * @param _b Divisor number. */ function div( uint256 _a, uint256 _b ) internal pure returns (uint256) { uint256 c = _a / _b; // assert(b > 0); // Solidity automatically throws when dividing by 0 // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). * @param _a Minuend number. * @param _b Subtrahend number. */ function sub( uint256 _a, uint256 _b ) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. * @param _a Number. * @param _b Number. */ function add( uint256 _a, uint256 _b ) internal pure returns (uint256) { uint256 c = _a + _b; assert(c >= _a); return c; } } // File: @0xcert/ethereum-utils/contracts/utils/ERC165.sol pragma solidity ^0.4.24; /** * @dev A standard for detecting smart contract interfaces. See https://goo.gl/cxQCse. */ interface ERC165 { /** * @dev Checks if the smart contract includes a specific interface. * @notice This function uses less than 30,000 gas. * @param _interfaceID The interface identifier, as specified in ERC-165. */ function supportsInterface( bytes4 _interfaceID ) external view returns (bool); } // File: @0xcert/ethereum-utils/contracts/utils/SupportsInterface.sol pragma solidity ^0.4.24; /** * @dev Implementation of standard for detect smart contract interfaces. */ contract SupportsInterface is ERC165 { /** * @dev Mapping of supported intefraces. * @notice You must not set element 0xffffffff to true. */ mapping(bytes4 => bool) internal supportedInterfaces; /** * @dev Contract constructor. */ constructor() public { supportedInterfaces[0x01ffc9a7] = true; // ERC165 } /** * @dev Function to check which interfaces are suported by this contract. * @param _interfaceID Id of the interface. */ function supportsInterface( bytes4 _interfaceID ) external view returns (bool) { return supportedInterfaces[_interfaceID]; } } // File: @0xcert/ethereum-utils/contracts/utils/AddressUtils.sol pragma solidity ^0.4.24; /** * @dev Utility library of inline functions on addresses. */ library AddressUtils { /** * @dev Returns whether the target address is a contract. * @param _addr Address to check. */ function isContract( address _addr ) internal view returns (bool) { uint256 size; /** * XXX Currently there is no better way to check if there is a contract in an address than to * check the size of the code at that address. * See https://ethereum.stackexchange.com/a/14016/36603 for more details about how this works. * TODO: Check this again before the Serenity release, because all addresses will be * contracts then. */ assembly { size := extcodesize(_addr) } // solium-disable-line security/no-inline-assembly return size > 0; } } // File: @0xcert/ethereum-erc721/contracts/tokens/NFToken.sol pragma solidity ^0.4.24; /** * @dev Implementation of ERC-721 non-fungible token standard. */ contract NFToken is ERC721, SupportsInterface { using SafeMath for uint256; using AddressUtils for address; /** * @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 idToApprovals; /** * @dev Mapping from owner address to count of his tokens. */ mapping (address => uint256) internal ownerToNFTokenCount; /** * @dev Mapping from owner address to mapping of operator addresses. */ mapping (address => mapping (address => bool)) internal ownerToOperators; /** * @dev Magic value of a smart contract that can recieve NFT. * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")). */ bytes4 constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02; /** * @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. * @param _from Sender of NFT (if address is zero address it indicates token creation). * @param _to Receiver of NFT (if address is zero address it indicates token destruction). * @param _tokenId The NFT that got transfered. */ 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. * @param _owner Owner of NFT. * @param _approved Address that we are approving. * @param _tokenId NFT which we are approving. */ 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. * @param _owner Owner of NFT. * @param _operator Address to which we are setting operator rights. * @param _approved Status of operator rights(true if operator rights are given and false if * revoked). */ event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); /** * @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]); _; } /** * @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 || getApproved(_tokenId) == msg.sender || ownerToOperators[tokenOwner][msg.sender] ); _; } /** * @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)); _; } /** * @dev Contract constructor. */ constructor() public { supportedInterfaces[0x80ac58cd] = true; // ERC721 } /** * @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. */ function balanceOf( address _owner ) external view returns (uint256) { require(_owner != address(0)); return ownerToNFTokenCount[_owner]; } /** * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered * invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. */ function ownerOf( uint256 _tokenId ) external view returns (address _owner) { _owner = idToOwner[_tokenId]; require(_owner != address(0)); } /** * @dev Transfers the ownership of an NFT from one address to another address. * @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)"))`. * @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 _data ) external { _safeTransferFrom(_from, _to, _tokenId, _data); } /** * @dev Transfers the ownership of an NFT from one address to another address. * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "" * @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 { _safeTransferFrom(_from, _to, _tokenId, ""); } /** * @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. * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they maybe be permanently lost. * @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 canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from); require(_to != address(0)); _transfer(_to, _tokenId); } /** * @dev Set or reaffirm the approved address for an NFT. * @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 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 canOperate(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(_approved != tokenOwner); idToApprovals[_tokenId] = _approved; emit Approval(tokenOwner, _approved, _tokenId); } /** * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @notice This works even if sender doesn't own any tokens at the time. * @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 { require(_operator != address(0)); ownerToOperators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /** * @dev Get the approved address for a single NFT. * @notice Throws if `_tokenId` is not a valid NFT. * @param _tokenId ID of the NFT to query the approval of. */ function getApproved( uint256 _tokenId ) public view validNFToken(_tokenId) returns (address) { return idToApprovals[_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. */ function isApprovedForAll( address _owner, address _operator ) external view returns (bool) { require(_owner != address(0)); require(_operator != address(0)); return ownerToOperators[_owner][_operator]; } /** * @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 _data ) internal canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from); require(_to != address(0)); _transfer(_to, _tokenId); if (_to.isContract()) { bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data); require(retval == MAGIC_ON_ERC721_RECEIVED); } } /** * @dev Actually preforms the transfer. * @notice Does NO checks. * @param _to Address of a new owner. * @param _tokenId The NFT that is being transferred. */ function _transfer( address _to, uint256 _tokenId ) private { address from = idToOwner[_tokenId]; clearApproval(_tokenId); removeNFToken(from, _tokenId); addNFToken(_to, _tokenId); emit Transfer(from, _to, _tokenId); } /** * @dev Mints a new NFT. * @notice This is a private 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. * @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 { require(_to != address(0)); require(_tokenId != 0); require(idToOwner[_tokenId] == address(0)); addNFToken(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); } /** * @dev Burns a NFT. * @notice This is a private 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. * @param _owner Address of the NFT owner. * @param _tokenId ID of the NFT to be burned. */ function _burn( address _owner, uint256 _tokenId ) validNFToken(_tokenId) internal { clearApproval(_tokenId); removeNFToken(_owner, _tokenId); emit Transfer(_owner, address(0), _tokenId); } /** * @dev Clears the current approval of a given NFT ID. * @param _tokenId ID of the NFT to be transferred. */ function clearApproval( uint256 _tokenId ) private { if(idToApprovals[_tokenId] != 0) { delete idToApprovals[_tokenId]; } } /** * @dev Removes a NFT from owner. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @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 { require(idToOwner[_tokenId] == _from); assert(ownerToNFTokenCount[_from] > 0); ownerToNFTokenCount[_from] = ownerToNFTokenCount[_from].sub(1); delete idToOwner[_tokenId]; } /** * @dev Assignes a new NFT to owner. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @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 { require(idToOwner[_tokenId] == address(0)); idToOwner[_tokenId] = _to; ownerToNFTokenCount[_to] = ownerToNFTokenCount[_to].add(1); } } // File: @0xcert/ethereum-erc721/contracts/tokens/ERC721Metadata.sol pragma solidity ^0.4.24; /** * @dev Optional metadata extension for ERC-721 non-fungible token standard. * See https://goo.gl/pc9yoS. */ interface ERC721Metadata { /** * @dev Returns a descriptive name for a collection of NFTs in this contract. */ function name() external view returns (string _name); /** * @dev Returns a abbreviated name for a collection of NFTs in this contract. */ function symbol() external view returns (string _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". */ function tokenURI(uint256 _tokenId) external view returns (string); } // File: @0xcert/ethereum-erc721/contracts/tokens/NFTokenMetadata.sol pragma solidity ^0.4.24; /** * @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; /** * @dev Contract constructor. * @notice When implementing this contract don't forget to set nftName and nftSymbol. */ constructor() public { supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata } /** * @dev Burns a NFT. * @notice This is a 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. * @param _owner Address of the NFT owner. * @param _tokenId ID of the NFT to be burned. */ function _burn( address _owner, uint256 _tokenId ) internal { super._burn(_owner, _tokenId); if (bytes(idToUri[_tokenId]).length != 0) { delete idToUri[_tokenId]; } } /** * @dev Set a distinct URI (RFC 3986) for a given NFT ID. * @notice this is a 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. * @param _tokenId Id for which we want uri. * @param _uri String representing RFC 3986 URI. */ function _setTokenUri( uint256 _tokenId, string _uri ) validNFToken(_tokenId) internal { idToUri[_tokenId] = _uri; } /** * @dev Returns a descriptive name for a collection of NFTokens. */ function name() external view returns (string _name) { _name = nftName; } /** * @dev Returns an abbreviated name for NFTokens. */ function symbol() external view returns (string _symbol) { _symbol = nftSymbol; } /** * @dev A distinct URI (RFC 3986) for a given NFT. * @param _tokenId Id for which we want uri. */ function tokenURI( uint256 _tokenId ) validNFToken(_tokenId) external view returns (string) { return idToUri[_tokenId]; } } // File: @0xcert/ethereum-erc721/contracts/tokens/ERC721Enumerable.sol pragma solidity ^0.4.24; /** * @dev Optional enumeration extension for ERC-721 non-fungible token standard. * See https://goo.gl/pc9yoS. */ 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. */ 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()`. */ 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)`. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external view returns (uint256); } // File: @0xcert/ethereum-erc721/contracts/tokens/NFTokenEnumerable.sol pragma solidity ^0.4.24; /** * @dev Optional enumeration implementation for ERC-721 non-fungible token standard. */ contract NFTokenEnumerable is NFToken, ERC721Enumerable { /** * @dev Array of all NFT IDs. */ uint256[] internal tokens; /** * @dev Mapping from token ID 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() public { supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable } /** * @dev Mints a new NFT. * @notice This is a private 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. * @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 { super._mint(_to, _tokenId); tokens.push(_tokenId); idToIndex[_tokenId] = tokens.length.sub(1); } /** * @dev Burns a NFT. * @notice This is a private 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. * @param _owner Address of the NFT owner. * @param _tokenId ID of the NFT to be burned. */ function _burn( address _owner, uint256 _tokenId ) internal { super._burn(_owner, _tokenId); assert(tokens.length > 0); uint256 tokenIndex = idToIndex[_tokenId]; // Sanity check. This could be removed in the future. assert(tokens[tokenIndex] == _tokenId); uint256 lastTokenIndex = tokens.length.sub(1); uint256 lastToken = tokens[lastTokenIndex]; tokens[tokenIndex] = lastToken; tokens.length--; // Consider adding a conditional check for the last token in order to save GAS. idToIndex[lastToken] = tokenIndex; idToIndex[_tokenId] = 0; } /** * @dev Removes a NFT from an address. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @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 { super.removeNFToken(_from, _tokenId); assert(ownerToIds[_from].length > 0); uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId]; uint256 lastTokenIndex = ownerToIds[_from].length.sub(1); uint256 lastToken = ownerToIds[_from][lastTokenIndex]; ownerToIds[_from][tokenToRemoveIndex] = lastToken; ownerToIds[_from].length--; // Consider adding a conditional check for the last token in order to save GAS. idToOwnerIndex[lastToken] = tokenToRemoveIndex; idToOwnerIndex[_tokenId] = 0; } /** * @dev Assignes a new NFT to an address. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @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 { super.addNFToken(_to, _tokenId); uint256 length = ownerToIds[_to].length; ownerToIds[_to].push(_tokenId); idToOwnerIndex[_tokenId] = length; } /** * @dev Returns the count of all existing NFTokens. */ function totalSupply() external view returns (uint256) { return tokens.length; } /** * @dev Returns NFT ID by its index. * @param _index A counter less than `totalSupply()`. */ function tokenByIndex( uint256 _index ) external view returns (uint256) { require(_index < tokens.length); // Sanity check. This could be removed in the future. assert(idToIndex[tokens[_index]] == _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. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external view returns (uint256) { require(_index < ownerToIds[_owner].length); return ownerToIds[_owner][_index]; } } // File: @0xcert/ethereum-utils/contracts/ownership/Ownable.sol pragma solidity ^0.4.24; /** * @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://goo.gl/n2ZGVt. */ contract Ownable { 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() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == 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 ) onlyOwner public { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } // File: @0xcert/ethereum-utils/contracts/ownership/Claimable.sol pragma solidity ^0.4.24; /** * @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 goo.gl/CfEAkv and upgrades Ownable contracts with additional claim step which makes ownership * transfers less prone to errors. */ contract Claimable is Ownable { address public pendingOwner; /** * @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 Allows the current owner to give new owner ability to claim the ownership of the contract. * This differs from the Owner's function in that it allows setting pedingOwner address to 0x0, * which effectively cancels an active claim. * @param _newOwner The address which can claim ownership of the contract. */ function transferOwnership( address _newOwner ) onlyOwner public { pendingOwner = _newOwner; } /** * @dev Allows the current pending owner to claim the ownership of the contract. It emits * OwnershipTransferred event and resets pending owner to 0. */ function claimOwnership() public { require(msg.sender == pendingOwner); address previousOwner = owner; owner = pendingOwner; pendingOwner = 0; emit OwnershipTransferred(previousOwner, owner); } } // File: contracts/Adminable.sol pragma solidity ^0.4.24; /** * @title Adminable * @dev Allows to manage privilages to special contract functionality. */ contract Adminable is Claimable { mapping(address => uint) public adminsMap; address[] public adminList; /** * @dev Returns true, if provided address has special privilages, otherwise false * @param adminAddress - address to check */ function isAdmin(address adminAddress) public view returns(bool isIndeed) { if (adminAddress == owner) return true; if (adminList.length == 0) return false; return (adminList[adminsMap[adminAddress]] == adminAddress); } /** * @dev Grants special rights for address holder * @param adminAddress - address of future admin */ function addAdmin(address adminAddress) public onlyOwner returns(uint index) { require(!isAdmin(adminAddress), "Address already has admin rights!"); adminsMap[adminAddress] = adminList.push(adminAddress)-1; return adminList.length-1; } /** * @dev Removes special rights for provided address * @param adminAddress - address of current admin */ function removeAdmin(address adminAddress) public onlyOwner returns(uint index) { // we can not remove owner from admin role require(owner != adminAddress, "Owner can not be removed from admin role!"); require(isAdmin(adminAddress), "Provided address is not admin."); uint rowToDelete = adminsMap[adminAddress]; address keyToMove = adminList[adminList.length-1]; adminList[rowToDelete] = keyToMove; adminsMap[keyToMove] = rowToDelete; adminList.length--; return rowToDelete; } /** * @dev modifier Throws if called by any account other than the owner. */ modifier onlyAdmin() { require(isAdmin(msg.sender), "Can be executed only by admin accounts!"); _; } } // File: contracts/MarbleNFTInterface.sol pragma solidity ^0.4.24; /** * @title Marble NFT Interface * @dev Defines Marbles unique extension of NFT. * ...It contains methodes returning core properties what describe Marble NFTs and provides management options to create, * burn NFT or change approvals of it. */ interface MarbleNFTInterface { /** * @dev Mints Marble NFT. * @notice This is a external function which should be called just by the owner of contract or any other user who has priviladge of being resposible * of creating valid Marble NFT. Valid token contains all neccessary information to be able recreate marble card image. * @param _tokenId The ID of new NFT. * @param _owner Address of the NFT owner. * @param _uri Unique URI proccessed by Marble services to be sure it is valid NFTs DNA. Most likely it is URL pointing to some website address. * @param _metadataUri URI pointing to "ERC721 Metadata JSON Schema" * @param _tokenId ID of the NFT to be burned. */ function mint( uint256 _tokenId, address _owner, address _creator, string _uri, string _metadataUri, uint256 _created ) external; /** * @dev Burns Marble NFT. Should be fired only by address with proper authority as contract owner or etc. * @param _tokenId ID of the NFT to be burned. */ function burn( uint256 _tokenId ) external; /** * @dev Allowes to change approval for change of ownership even when sender is not NFT holder. Sender has to have special role granted by contract to use this tool. * @notice Careful with this!!!! :)) * @param _tokenId ID of the NFT to be updated. * @param _approved ETH address what supposed to gain approval to take ownership of NFT. */ function forceApproval( uint256 _tokenId, address _approved ) external; /** * @dev Returns properties used for generating NFT metadata image (a.k.a. card). * @param _tokenId ID of the NFT. */ function tokenSource(uint256 _tokenId) external view returns ( string uri, address creator, uint256 created ); /** * @dev Returns ID of NFT what matches provided source URI. * @param _uri URI of source website. */ function tokenBySourceUri(string _uri) external view returns (uint256 tokenId); /** * @dev Returns all properties of Marble NFT. Lets call it Marble NFT Model with properties described below: * @param _tokenId ID of NFT * Returned model: * uint256 id ID of NFT * string uri URI of source website. Website is used to mine data to crate NFT metadata image. * string metadataUri URI to NFT metadata assets. In our case to our websevice providing JSON with additional information based on "ERC721 Metadata JSON Schema". * address owner NFT owner address. * address creator Address of creator of this NFT. It means that this addres placed sourceURI to candidate contract. * uint256 created Date and time of creation of NFT candidate. * * (id, uri, metadataUri, owner, creator, created) */ function getNFT(uint256 _tokenId) external view returns( uint256 id, string uri, string metadataUri, address owner, address creator, uint256 created ); /** * @dev Transforms URI to hash. * @param _uri URI to be transformed to hash. */ function getSourceUriHash(string _uri) external view returns(uint256 hash); } // File: contracts/MarbleNFT.sol pragma solidity ^0.4.24; /** * @title MARBLE NFT CONTRACT * @notice We omit a fallback function to prevent accidental sends to this contract. */ contract MarbleNFT is Adminable, NFTokenMetadata, NFTokenEnumerable, MarbleNFTInterface { /* * @dev structure storing additional information about created NFT * uri: URI used as source/key/representation of NFT, it can be considered as tokens DNA * creator: address of candidate creator - a.k.a. address of person who initialy provided source URI * created: date of NFT creation */ struct MarbleNFTSource { // URI used as source/key of NFT, we can consider it as tokens DNA string uri; // address of candidate creator - a.k.a. address of person who initialy provided source URI address creator; // date of NFT creation uint256 created; } /** * @dev Mapping from NFT ID to marble NFT source. */ mapping (uint256 => MarbleNFTSource) public idToMarbleNFTSource; /** * @dev Mapping from marble NFT source uri hash TO NFT ID . */ mapping (uint256 => uint256) public sourceUriHashToId; constructor() public { nftName = "MARBLE-NFT"; nftSymbol = "MRBLNFT"; } /** * @dev Mints a new NFT. * @param _tokenId The unique number representing NFT * @param _owner Holder of Marble NFT * @param _creator Creator of Marble NFT * @param _uri URI representing NFT * @param _metadataUri URI pointing to "ERC721 Metadata JSON Schema" * @param _created date of creation of NFT candidate */ function mint( uint256 _tokenId, address _owner, address _creator, string _uri, string _metadataUri, uint256 _created ) external onlyAdmin { uint256 uriHash = _getSourceUriHash(_uri); require(uriHash != _getSourceUriHash(""), "NFT URI can not be empty!"); require(sourceUriHashToId[uriHash] == 0, "NFT with same URI already exists!"); _mint(_owner, _tokenId); _setTokenUri(_tokenId, _metadataUri); idToMarbleNFTSource[_tokenId] = MarbleNFTSource(_uri, _creator, _created); sourceUriHashToId[uriHash] = _tokenId; } /** * @dev Burns NFT. Sadly, trully.. ...probably someone marbled something ugly!!!! :) * @param _tokenId ID of ugly NFT */ function burn( uint256 _tokenId ) external onlyAdmin { address owner = idToOwner[_tokenId]; MarbleNFTSource memory marbleNFTSource = idToMarbleNFTSource[_tokenId]; if (bytes(marbleNFTSource.uri).length != 0) { uint256 uriHash = _getSourceUriHash(marbleNFTSource.uri); delete sourceUriHashToId[uriHash]; delete idToMarbleNFTSource[_tokenId]; } _burn(owner, _tokenId); } /** * @dev Tool to manage misstreated NFTs or to be able to extend our services for new cool stuff like auctions, weird games and so on...... * @param _tokenId ID of the NFT to be update. * @param _approved Address to replace current approved address on NFT */ function forceApproval( uint256 _tokenId, address _approved ) external onlyAdmin { address tokenOwner = idToOwner[_tokenId]; require(_approved != tokenOwner,"Owner can not be become new owner!"); idToApprovals[_tokenId] = _approved; emit Approval(tokenOwner, _approved, _tokenId); } /** * @dev Returns model of Marble NFT source properties * @param _tokenId ID of the NFT */ function tokenSource(uint256 _tokenId) external view returns ( string uri, address creator, uint256 created) { MarbleNFTSource memory marbleNFTSource = idToMarbleNFTSource[_tokenId]; return (marbleNFTSource.uri, marbleNFTSource.creator, marbleNFTSource.created); } /** * @dev Returns token ID related to provided source uri * @param _uri URI representing created NFT */ function tokenBySourceUri(string _uri) external view returns (uint256 tokenId) { return sourceUriHashToId[_getSourceUriHash(_uri)]; } /** * @dev Returns whole Marble NFT model * -------------------- * MARBLE NFT MODEL * -------------------- * uint256 id NFT unique identification * string uri NFT source URI, source is whole site what was proccessed by marble to create this NFT, it is URI representation of NFT (call it DNA) * string metadataUri URI pointint to token NFT metadata shcema * address owner Current NFT owner * address creator First NFT owner * uint256 created Date of NFT candidate creation * * (id, uri, metadataUri, owner, creator, created) */ function getNFT(uint256 _tokenId) external view returns( uint256 id, string uri, string metadataUri, address owner, address creator, uint256 created ) { MarbleNFTSource memory marbleNFTSource = idToMarbleNFTSource[_tokenId]; return ( _tokenId, marbleNFTSource.uri, idToUri[_tokenId], idToOwner[_tokenId], marbleNFTSource.creator, marbleNFTSource.created); } /** * @dev Transforms URI to hash. * @param _uri URI to be transformed to hash. */ function getSourceUriHash(string _uri) external view returns(uint256 hash) { return _getSourceUriHash(_uri); } /** * @dev Transforms URI to hash. * @param _uri URI to be transformed to hash. */ function _getSourceUriHash(string _uri) internal pure returns(uint256 hash) { return uint256(keccak256(abi.encodePacked(_uri))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"adminList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"adminAddress","type":"address"}],"name":"removeAdmin","outputs":[{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_approved","type":"address"}],"name":"forceApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"adminAddress","type":"address"}],"name":"isAdmin","outputs":[{"name":"isIndeed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sourceUriHashToId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_uri","type":"string"}],"name":"tokenBySourceUri","outputs":[{"name":"tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getNFT","outputs":[{"name":"id","type":"uint256"},{"name":"uri","type":"string"},{"name":"metadataUri","type":"string"},{"name":"owner","type":"address"},{"name":"creator","type":"address"},{"name":"created","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"idToMarbleNFTSource","outputs":[{"name":"uri","type":"string"},{"name":"creator","type":"address"},{"name":"created","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"adminAddress","type":"address"}],"name":"addAdmin","outputs":[{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_owner","type":"address"},{"name":"_creator","type":"address"},{"name":"_uri","type":"string"},{"name":"_metadataUri","type":"string"},{"name":"_created","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenSource","outputs":[{"name":"uri","type":"string"},{"name":"creator","type":"address"},{"name":"created","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"adminsMap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_uri","type":"string"}],"name":"getSourceUriHash","outputs":[{"name":"hash","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006301ffc9a77c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460006380ac58cd7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160046000635b5e139f7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016004600063780e9d637c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506040805190810160405280600a81526020017f4d4152424c452d4e4654000000000000000000000000000000000000000000008152506009908051906020019062000257929190620002ac565b506040805190810160405280600781526020017f4d52424c4e465400000000000000000000000000000000000000000000000000815250600a9080519060200190620002a5929190620002ac565b506200035b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ef57805160ff191683800117855562000320565b8280016001018555821562000320579182015b828111156200031f57825182559160200191906001019062000302565b5b5090506200032f919062000333565b5090565b6200035891905b80821115620003545760008160009055506001016200033a565b5090565b90565b61477f806200036b6000396000f3006080604052600436106101ac576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101b157806306fdde0314610215578063081812fc146102a5578063095ea7b31461031257806311117fc81461035f5780631785f53c146103cc57806318160ddd146104235780631f2e4aa71461044e57806323b872dd1461049b57806324d7806c146105085780632b508f66146105635780632df7a13e146105a45780632f745c59146105f357806342842e0e1461065457806342966c68146106c15780634e71e0c8146106ee5780634f6ccce714610705578063576f7ea7146107465780636352211e146108cc5780636e6e4b5d146109395780637048027514610a1957806370a0823114610a705780638da5cb5b14610ac75780639407375e14610b1e57806395d89b4114610bc5578063a22cb46514610c55578063b88d4fde14610ca4578063c541aa1c14610d29578063c87b56dd14610e09578063e30c397814610eaf578063e8542b0714610f06578063e985e9c514610f5d578063efe72e4a14610fd8578063f2fde38b14611027575b600080fd5b3480156101bd57600080fd5b506101fb60048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061106a565b604051808215151515815260200191505060405180910390f35b34801561022157600080fd5b5061022a6110d2565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026a57808201518184015260208101905061024f565b50505050905090810190601f1680156102975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102b157600080fd5b506102d060048036038101908080359060200190929190505050611174565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031e57600080fd5b5061035d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611222565b005b34801561036b57600080fd5b5061038a600480360381019080803590602001909291905050506114be565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103d857600080fd5b5061040d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114fc565b6040518082815260200191505060405180910390f35b34801561042f57600080fd5b50610438611806565b6040518082815260200191505060405180910390f35b34801561045a57600080fd5b5061049960048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611813565b005b3480156104a757600080fd5b50610506600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a6a565b005b34801561051457600080fd5b50610549600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cdd565b604051808215151515815260200191505060405180910390f35b34801561056f57600080fd5b5061058e60048036038101908080359060200190929190505050611e03565b6040518082815260200191505060405180910390f35b3480156105b057600080fd5b506105dd600480360381019080803590602001908201803590602001919091929391929390505050611e1b565b6040518082815260200191505060405180910390f35b3480156105ff57600080fd5b5061063e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e73565b6040518082815260200191505060405180910390f35b34801561066057600080fd5b506106bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f24565b005b3480156106cd57600080fd5b506106ec60048036038101908080359060200190929190505050611f45565b005b3480156106fa57600080fd5b506107036121e8565b005b34801561071157600080fd5b506107306004803603810190808035906020019092919050505061238c565b6040518082815260200191505060405180910390f35b34801561075257600080fd5b50610771600480360381019080803590602001909291905050506123f9565b6040518087815260200180602001806020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838103835288818151815260200191508051906020019080838360005b8381101561082557808201518184015260208101905061080a565b50505050905090810190601f1680156108525780820380516001836020036101000a031916815260200191505b50838103825287818151815260200191508051906020019080838360005b8381101561088b578082015181840152602081019050610870565b50505050905090810190601f1680156108b85780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156108d857600080fd5b506108f76004803603810190808035906020019092919050505061263a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561094557600080fd5b50610964600480360381019080803590602001909291905050506126b3565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156109dc5780820151818401526020810190506109c1565b50505050905090810190601f168015610a095780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610a2557600080fd5b50610a5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612795565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610ab1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612951565b6040518082815260200191505060405180910390f35b348015610ad357600080fd5b50610adc6129d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b2a57600080fd5b50610bc360048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001909291905050506129fa565b005b348015610bd157600080fd5b50610bda612d6e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c1a578082015181840152602081019050610bff565b50505050905090810190601f168015610c475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c6157600080fd5b50610ca2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612e10565b005b348015610cb057600080fd5b50610d27600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050612f4d565b005b348015610d3557600080fd5b50610d5460048036038101908080359060200190929190505050612f92565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610dcc578082015181840152602081019050610db1565b50505050905090810190601f168015610df95780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610e1557600080fd5b50610e34600480360381019080803590602001909291905050506130e2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e74578082015181840152602081019050610e59565b50505050905090810190601f168015610ea15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ebb57600080fd5b50610ec4613208565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f1257600080fd5b50610f47600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061322e565b6040518082815260200191505060405180910390f35b348015610f6957600080fd5b50610fbe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613246565b604051808215151515815260200191505060405180910390f35b348015610fe457600080fd5b50611011600480360381019080803590602001908201803590602001919091929391929390505050613351565b6040518082815260200191505060405180910390f35b34801561103357600080fd5b50611068600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613396565b005b600060046000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561116a5780601f1061113f5761010080835404028352916020019161116a565b820191906000526020600020905b81548152906001019060200180831161114d57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156111e657600080fd5b6006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061131d5750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561132857600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561139857600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561140957600080fd5b856006600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6003818154811015156114cd57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561155c57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4f776e65722063616e206e6f742062652072656d6f7665642066726f6d20616481526020017f6d696e20726f6c6521000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61165084611cdd565b15156116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f50726f76696465642061646472657373206973206e6f742061646d696e2e000081525060200191505060405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150600360016003805490500381548110151561171d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060038381548110151561175a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060038054809190600190036117fb9190614556565b508192505050919050565b6000600c80549050905090565b600061181e33611cdd565b15156118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f776e65722063616e206e6f74206265206265636f6d65206e6577206f776e6581526020017f722100000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611b1257503373ffffffffffffffffffffffffffffffffffffffff16611afa83611174565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ba35750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515611bae57600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611c1e57600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515611c8e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515611cca57600080fd5b611cd48686613435565b50505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3d5760019050611dfe565b60006003805490501415611d545760009050611dfe565b8173ffffffffffffffffffffffffffffffffffffffff166003600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481101515611db957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b60116020528060005260406000206000915090505481565b600060116000611e5c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b815260200190815260200160002054905092915050565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082101515611ec557600080fd5b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611f1157fe5b9060005260206000200154905092915050565b611f4083838360206040519081016040528060008152506135c6565b505050565b6000611f4f614582565b6000611f5a33611cdd565b1515611ff4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506010600085815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e25780601f106120b7576101008083540402835291602001916120e2565b820191906000526020600020905b8154815290600101906020018083116120c557829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481525050915060008260000151511415156121d85761216982600001516134ea565b9050601160008281526020019081526020016000206000905560106000858152602001908152602001600020600080820160006121a691906145ba565b6001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905550505b6121e28385613a51565b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561224657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600c80549050821015156123a157600080fd5b81600d6000600c858154811015156123b557fe5b90600052602060002001548152602001908152602001600020541415156123d857fe5b600c828154811015156123e757fe5b90600052602060002001549050919050565b6000606080600080600061240b614582565b6010600089815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124c35780601f10612498576101008083540402835291602001916124c3565b820191906000526020600020905b8154815290600101906020018083116124a657829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050878160000151600b60008b8152602001908152602001600020600560008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684602001518560400151849450838054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561261d5780601f106125f25761010080835404028352916020019161261d565b820191906000526020600020905b81548152906001019060200180831161260057829003601f168201915b505050505093509650965096509650965096505091939550919395565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156126ae57600080fd5b919050565b6010602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561275f5780601f106127345761010080835404028352916020019161275f565b820191906000526020600020905b81548152906001019060200180831161274257829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127f257600080fd5b6127fb82611cdd565b151515612896576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4164647265737320616c7265616479206861732061646d696e2072696768747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160038390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600380549050039050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561298e57600080fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612a0533611cdd565b1515612a9f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612ada86868080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b9050612af560206040519081016040528060008152506134ea565b8114151515612b6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4e4654205552492063616e206e6f7420626520656d707479210000000000000081525060200191505060405180910390fd5b60006011600083815260200190815260200160002054141515612c1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4e465420776974682073616d652055524920616c72656164792065786973747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612c27888a613b4e565b612c638985858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613bb8565b60606040519081016040528087878080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018873ffffffffffffffffffffffffffffffffffffffff16815260200183815250601060008b81526020019081526020016000206000820151816000019080519060200190612cf6929190614602565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155905050886011600083815260200190815260200160002081905550505050505050505050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e065780601f10612ddb57610100808354040283529160200191612e06565b820191906000526020600020905b815481529060010190602001808311612de957829003601f168201915b5050505050905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e4c57600080fd5b80600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b612f8b85858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506135c6565b5050505050565b6060600080612f9f614582565b6010600086815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130575780601f1061302c57610100808354040283529160200191613057565b820191906000526020600020905b81548152906001019060200180831161303a57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050806000015181602001518260400151829250935093509350509193909250565b606081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561315457600080fd5b600b60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131fb5780601f106131d0576101008083540402835291602001916131fb565b820191906000526020600020905b8154815290600101906020018083116131de57829003601f168201915b5050505050915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561328357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156132bf57600080fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061338e83838080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156133f157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061347682613c55565b6134808183613ce2565b61348a8383613eec565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000816040516020018082805190602001908083835b6020831015156135255780518252602082019150602081019050602083039250613500565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561358e5780518252602082019150602081019050602083039250613569565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600190049050919050565b6000808360006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061366f57503373ffffffffffffffffffffffffffffffffffffffff1661365783611174565b73ffffffffffffffffffffffffffffffffffffffff16145b806137005750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561370b57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561377b57600080fd5b6005600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694508873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415156137eb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561382757600080fd5b6138318888613435565b6138508873ffffffffffffffffffffffffffffffffffffffff16613fc3565b15613a46578773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561394a57808201518184015260208101905061392f565b50505050905090810190601f1680156139775780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561399957600080fd5b505af11580156139ad573d6000803e3d6000fd5b505050506040513d60208110156139c357600080fd5b8101908080519060200190929190505050935063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141515613a4557600080fd5b5b505050505050505050565b6000806000613a608585613fd6565b6000600c80549050111515613a7157fe5b600d600085815260200190815260200160002054925083600c84815481101515613a9757fe5b9060005260206000200154141515613aab57fe5b613ac46001600c8054905061403590919063ffffffff16565b9150600c82815481101515613ad557fe5b9060005260206000200154905080600c84815481101515613af257fe5b9060005260206000200181905550600c805480919060019003613b159190614682565b5082600d6000838152602001908152602001600020819055506000600d6000868152602001908152602001600020819055505050505050565b613b58828261404e565b600c819080600181540180825580915050906001820390600052602060002001600090919290919091505550613b9d6001600c8054905061403590919063ffffffff16565b600d6000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515613c2857600080fd5b81600b60008581526020019081526020016000209080519060200190613c4f9291906146ae565b50505050565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613cdf576006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b6000806000613cf18585614172565b6000600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050111515613d3f57fe5b600f6000858152602001908152602001600020549250613dab6001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061403590919063ffffffff16565b9150600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515613df957fe5b9060005260206000200154905080600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515613e5357fe5b9060005260206000200181905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003613eb39190614682565b5082600f6000838152602001908152602001600020819055506000600f6000868152602001908152602001600020819055505050505050565b6000613ef883836142fa565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505090600182039060005260206000200160009091929091909150555080600f600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b613fe08282614454565b6000600b600083815260200190815260200160002080546001816001161561010002031660029004905014151561403157600b6000828152602001908152602001600020600061403091906145ba565b5b5050565b600082821115151561404357fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561408a57600080fd5b6000811415151561409a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561410857600080fd5b6141128282613eec565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156141df57600080fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561422a57fe5b61427d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461403590919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561436857600080fd5b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061440d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453890919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156144c457600080fd5b6144cd82613c55565b6144d78383613ce2565b81600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080828401905083811015151561454c57fe5b8091505092915050565b81548183558181111561457d5781836000526020600020918201910161457c919061472e565b5b505050565b60606040519081016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b50805460018160011615610100020316600290046000825580601f106145e057506145ff565b601f0160209004906000526020600020908101906145fe919061472e565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061464357805160ff1916838001178555614671565b82800160010185558215614671579182015b82811115614670578251825591602001919060010190614655565b5b50905061467e919061472e565b5090565b8154818355818111156146a9578183600052602060002091820191016146a8919061472e565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106146ef57805160ff191683800117855561471d565b8280016001018555821561471d579182015b8281111561471c578251825591602001919060010190614701565b5b50905061472a919061472e565b5090565b61475091905b8082111561474c576000816000905550600101614734565b5090565b905600a165627a7a72305820a162a838bfb7aaaf5c5d3e955f375f722d951c81977ffaea75852b587b469a150029
Deployed Bytecode
0x6080604052600436106101ac576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101b157806306fdde0314610215578063081812fc146102a5578063095ea7b31461031257806311117fc81461035f5780631785f53c146103cc57806318160ddd146104235780631f2e4aa71461044e57806323b872dd1461049b57806324d7806c146105085780632b508f66146105635780632df7a13e146105a45780632f745c59146105f357806342842e0e1461065457806342966c68146106c15780634e71e0c8146106ee5780634f6ccce714610705578063576f7ea7146107465780636352211e146108cc5780636e6e4b5d146109395780637048027514610a1957806370a0823114610a705780638da5cb5b14610ac75780639407375e14610b1e57806395d89b4114610bc5578063a22cb46514610c55578063b88d4fde14610ca4578063c541aa1c14610d29578063c87b56dd14610e09578063e30c397814610eaf578063e8542b0714610f06578063e985e9c514610f5d578063efe72e4a14610fd8578063f2fde38b14611027575b600080fd5b3480156101bd57600080fd5b506101fb60048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061106a565b604051808215151515815260200191505060405180910390f35b34801561022157600080fd5b5061022a6110d2565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026a57808201518184015260208101905061024f565b50505050905090810190601f1680156102975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102b157600080fd5b506102d060048036038101908080359060200190929190505050611174565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031e57600080fd5b5061035d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611222565b005b34801561036b57600080fd5b5061038a600480360381019080803590602001909291905050506114be565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103d857600080fd5b5061040d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114fc565b6040518082815260200191505060405180910390f35b34801561042f57600080fd5b50610438611806565b6040518082815260200191505060405180910390f35b34801561045a57600080fd5b5061049960048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611813565b005b3480156104a757600080fd5b50610506600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a6a565b005b34801561051457600080fd5b50610549600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cdd565b604051808215151515815260200191505060405180910390f35b34801561056f57600080fd5b5061058e60048036038101908080359060200190929190505050611e03565b6040518082815260200191505060405180910390f35b3480156105b057600080fd5b506105dd600480360381019080803590602001908201803590602001919091929391929390505050611e1b565b6040518082815260200191505060405180910390f35b3480156105ff57600080fd5b5061063e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e73565b6040518082815260200191505060405180910390f35b34801561066057600080fd5b506106bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f24565b005b3480156106cd57600080fd5b506106ec60048036038101908080359060200190929190505050611f45565b005b3480156106fa57600080fd5b506107036121e8565b005b34801561071157600080fd5b506107306004803603810190808035906020019092919050505061238c565b6040518082815260200191505060405180910390f35b34801561075257600080fd5b50610771600480360381019080803590602001909291905050506123f9565b6040518087815260200180602001806020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838103835288818151815260200191508051906020019080838360005b8381101561082557808201518184015260208101905061080a565b50505050905090810190601f1680156108525780820380516001836020036101000a031916815260200191505b50838103825287818151815260200191508051906020019080838360005b8381101561088b578082015181840152602081019050610870565b50505050905090810190601f1680156108b85780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156108d857600080fd5b506108f76004803603810190808035906020019092919050505061263a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561094557600080fd5b50610964600480360381019080803590602001909291905050506126b3565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156109dc5780820151818401526020810190506109c1565b50505050905090810190601f168015610a095780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610a2557600080fd5b50610a5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612795565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610ab1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612951565b6040518082815260200191505060405180910390f35b348015610ad357600080fd5b50610adc6129d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b2a57600080fd5b50610bc360048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001909291905050506129fa565b005b348015610bd157600080fd5b50610bda612d6e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c1a578082015181840152602081019050610bff565b50505050905090810190601f168015610c475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c6157600080fd5b50610ca2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612e10565b005b348015610cb057600080fd5b50610d27600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050612f4d565b005b348015610d3557600080fd5b50610d5460048036038101908080359060200190929190505050612f92565b60405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610dcc578082015181840152602081019050610db1565b50505050905090810190601f168015610df95780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610e1557600080fd5b50610e34600480360381019080803590602001909291905050506130e2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e74578082015181840152602081019050610e59565b50505050905090810190601f168015610ea15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ebb57600080fd5b50610ec4613208565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f1257600080fd5b50610f47600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061322e565b6040518082815260200191505060405180910390f35b348015610f6957600080fd5b50610fbe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613246565b604051808215151515815260200191505060405180910390f35b348015610fe457600080fd5b50611011600480360381019080803590602001908201803590602001919091929391929390505050613351565b6040518082815260200191505060405180910390f35b34801561103357600080fd5b50611068600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613396565b005b600060046000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561116a5780601f1061113f5761010080835404028352916020019161116a565b820191906000526020600020905b81548152906001019060200180831161114d57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156111e657600080fd5b6006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061131d5750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561132857600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561139857600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561140957600080fd5b856006600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6003818154811015156114cd57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561155c57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4f776e65722063616e206e6f742062652072656d6f7665642066726f6d20616481526020017f6d696e20726f6c6521000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61165084611cdd565b15156116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f50726f76696465642061646472657373206973206e6f742061646d696e2e000081525060200191505060405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150600360016003805490500381548110151561171d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060038381548110151561175a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060038054809190600190036117fb9190614556565b508192505050919050565b6000600c80549050905090565b600061181e33611cdd565b15156118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f776e65722063616e206e6f74206265206265636f6d65206e6577206f776e6581526020017f722100000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611b1257503373ffffffffffffffffffffffffffffffffffffffff16611afa83611174565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ba35750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515611bae57600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611c1e57600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515611c8e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515611cca57600080fd5b611cd48686613435565b50505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3d5760019050611dfe565b60006003805490501415611d545760009050611dfe565b8173ffffffffffffffffffffffffffffffffffffffff166003600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481101515611db957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b60116020528060005260406000206000915090505481565b600060116000611e5c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b815260200190815260200160002054905092915050565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082101515611ec557600080fd5b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611f1157fe5b9060005260206000200154905092915050565b611f4083838360206040519081016040528060008152506135c6565b505050565b6000611f4f614582565b6000611f5a33611cdd565b1515611ff4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6005600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506010600085815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e25780601f106120b7576101008083540402835291602001916120e2565b820191906000526020600020905b8154815290600101906020018083116120c557829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481525050915060008260000151511415156121d85761216982600001516134ea565b9050601160008281526020019081526020016000206000905560106000858152602001908152602001600020600080820160006121a691906145ba565b6001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905550505b6121e28385613a51565b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561224657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600c80549050821015156123a157600080fd5b81600d6000600c858154811015156123b557fe5b90600052602060002001548152602001908152602001600020541415156123d857fe5b600c828154811015156123e757fe5b90600052602060002001549050919050565b6000606080600080600061240b614582565b6010600089815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124c35780601f10612498576101008083540402835291602001916124c3565b820191906000526020600020905b8154815290600101906020018083116124a657829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050878160000151600b60008b8152602001908152602001600020600560008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684602001518560400151849450838054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561261d5780601f106125f25761010080835404028352916020019161261d565b820191906000526020600020905b81548152906001019060200180831161260057829003601f168201915b505050505093509650965096509650965096505091939550919395565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156126ae57600080fd5b919050565b6010602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561275f5780601f106127345761010080835404028352916020019161275f565b820191906000526020600020905b81548152906001019060200180831161274257829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127f257600080fd5b6127fb82611cdd565b151515612896576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4164647265737320616c7265616479206861732061646d696e2072696768747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160038390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600380549050039050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561298e57600080fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612a0533611cdd565b1515612a9f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f43616e206265206578656375746564206f6e6c792062792061646d696e20616381526020017f636f756e7473210000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612ada86868080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b9050612af560206040519081016040528060008152506134ea565b8114151515612b6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4e4654205552492063616e206e6f7420626520656d707479210000000000000081525060200191505060405180910390fd5b60006011600083815260200190815260200160002054141515612c1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4e465420776974682073616d652055524920616c72656164792065786973747381526020017f210000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612c27888a613b4e565b612c638985858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613bb8565b60606040519081016040528087878080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018873ffffffffffffffffffffffffffffffffffffffff16815260200183815250601060008b81526020019081526020016000206000820151816000019080519060200190612cf6929190614602565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155905050886011600083815260200190815260200160002081905550505050505050505050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e065780601f10612ddb57610100808354040283529160200191612e06565b820191906000526020600020905b815481529060010190602001808311612de957829003601f168201915b5050505050905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e4c57600080fd5b80600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b612f8b85858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506135c6565b5050505050565b6060600080612f9f614582565b6010600086815260200190815260200160002060606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130575780601f1061302c57610100808354040283529160200191613057565b820191906000526020600020905b81548152906001019060200180831161303a57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815250509050806000015181602001518260400151829250935093509350509193909250565b606081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561315457600080fd5b600b60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131fb5780601f106131d0576101008083540402835291602001916131fb565b820191906000526020600020905b8154815290600101906020018083116131de57829003601f168201915b5050505050915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561328357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156132bf57600080fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061338e83838080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134ea565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156133f157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061347682613c55565b6134808183613ce2565b61348a8383613eec565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000816040516020018082805190602001908083835b6020831015156135255780518252602082019150602081019050602083039250613500565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561358e5780518252602082019150602081019050602083039250613569565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600190049050919050565b6000808360006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061366f57503373ffffffffffffffffffffffffffffffffffffffff1661365783611174565b73ffffffffffffffffffffffffffffffffffffffff16145b806137005750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561370b57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561377b57600080fd5b6005600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694508873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415156137eb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561382757600080fd5b6138318888613435565b6138508873ffffffffffffffffffffffffffffffffffffffff16613fc3565b15613a46578773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561394a57808201518184015260208101905061392f565b50505050905090810190601f1680156139775780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561399957600080fd5b505af11580156139ad573d6000803e3d6000fd5b505050506040513d60208110156139c357600080fd5b8101908080519060200190929190505050935063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141515613a4557600080fd5b5b505050505050505050565b6000806000613a608585613fd6565b6000600c80549050111515613a7157fe5b600d600085815260200190815260200160002054925083600c84815481101515613a9757fe5b9060005260206000200154141515613aab57fe5b613ac46001600c8054905061403590919063ffffffff16565b9150600c82815481101515613ad557fe5b9060005260206000200154905080600c84815481101515613af257fe5b9060005260206000200181905550600c805480919060019003613b159190614682565b5082600d6000838152602001908152602001600020819055506000600d6000868152602001908152602001600020819055505050505050565b613b58828261404e565b600c819080600181540180825580915050906001820390600052602060002001600090919290919091505550613b9d6001600c8054905061403590919063ffffffff16565b600d6000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515613c2857600080fd5b81600b60008581526020019081526020016000209080519060200190613c4f9291906146ae565b50505050565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613cdf576006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b6000806000613cf18585614172565b6000600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050111515613d3f57fe5b600f6000858152602001908152602001600020549250613dab6001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061403590919063ffffffff16565b9150600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515613df957fe5b9060005260206000200154905080600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515613e5357fe5b9060005260206000200181905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003613eb39190614682565b5082600f6000838152602001908152602001600020819055506000600f6000868152602001908152602001600020819055505050505050565b6000613ef883836142fa565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505090600182039060005260206000200160009091929091909150555080600f600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b613fe08282614454565b6000600b600083815260200190815260200160002080546001816001161561010002031660029004905014151561403157600b6000828152602001908152602001600020600061403091906145ba565b5b5050565b600082821115151561404357fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561408a57600080fd5b6000811415151561409a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561410857600080fd5b6141128282613eec565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156141df57600080fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561422a57fe5b61427d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461403590919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561436857600080fd5b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061440d6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453890919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156144c457600080fd5b6144cd82613c55565b6144d78383613ce2565b81600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080828401905083811015151561454c57fe5b8091505092915050565b81548183558181111561457d5781836000526020600020918201910161457c919061472e565b5b505050565b60606040519081016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b50805460018160011615610100020316600290046000825580601f106145e057506145ff565b601f0160209004906000526020600020908101906145fe919061472e565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061464357805160ff1916838001178555614671565b82800160010185558215614671579182015b82811115614670578251825591602001919060010190614655565b5b50905061467e919061472e565b5090565b8154818355818111156146a9578183600052602060002091820191016146a8919061472e565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106146ef57805160ff191683800117855561471d565b8280016001018555821561471d579182015b8281111561471c578251825591602001919060010190614701565b5b50905061472a919061472e565b5090565b61475091905b8082111561474c576000816000905550600101614734565b5090565b905600a165627a7a72305820a162a838bfb7aaaf5c5d3e955f375f722d951c81977ffaea75852b587b469a150029
Deployed Bytecode Sourcemap
42782:5551:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9830:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9830:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27161:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27161:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27161:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19673:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19673:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18485:329;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18485:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37256:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37256:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38217:546;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38217:546:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33002:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33002:106:0;;;;;;;;;;;;;;;;;;;;;;;45705:333;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45705:333:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17791:314;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17791:314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37433:257;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37433:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43718:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43718:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46593:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46593:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33717:222;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33717:222:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17089:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17089:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44975:444;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44975:444:0;;;;;;;;;;;;;;;;;;;;;;;;;;36768:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36768:229:0;;;;;;33225:279;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33225:279:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47343:481;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47343:481:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;47343:481:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;47343:481:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15540:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15540:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43573:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43573:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43573:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37814:275;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37814:275:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15144:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15144:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34294:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34294:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;44227:603;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44227:603:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27333:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27333:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27333:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19225:257;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19225:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16540:186;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16540:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46151:316;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46151:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;46151:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27562:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27562:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27562:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35793:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35793:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37210:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37210:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20053:253;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20053:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47930:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47930:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36468:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36468:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9830:158;9926:4;9949:19;:33;9969:12;9949:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9942:40;;9830:158;;;:::o;27161:99::-;27215:12;27247:7;27239:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27161:99;:::o;19673:168::-;19786:7;19762:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;19812:13;:23;19826:8;19812:23;;;;;;;;;;;;;;;;;;;;;19805:30;;19673:168;;;;:::o;18485:329::-;18632:18;18584:8;13964:18;13985:9;:19;13995:8;13985:19;;;;;;;;;;;;;;;;;;;;;13964:40;;14033:10;14019:24;;:10;:24;;;:68;;;;14047:16;:28;14064:10;14047:28;;;;;;;;;;;;;;;:40;14076:10;14047:40;;;;;;;;;;;;;;;;;;;;;;;;;14019:68;14011:77;;;;;;;;18612:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;18653:9;:19;18663:8;18653:19;;;;;;;;;;;;;;;;;;;;;18632:40;;18700:10;18687:23;;:9;:23;;;;18679:32;;;;;;;;18746:9;18720:13;:23;18734:8;18720:23;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;18799:8;18788:9;18767:41;;18776:10;18767:41;;;;;;;;;;;;14095:1;18485:329;;;;;:::o;37256:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38217:546::-;38300:10;38525:16;38574:17;34921:5;;;;;;;;;;;34907:19;;:10;:19;;;34899:28;;;;;;;;38387:12;38378:21;;:5;;;;;;;;;;;:21;;;;38370:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38460:21;38468:12;38460:7;:21::i;:::-;38452:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38544:9;:23;38554:12;38544:23;;;;;;;;;;;;;;;;38525:42;;38594:9;38621:1;38604:9;:16;;;;:18;38594:29;;;;;;;;;;;;;;;;;;;;;;;;;;;38574:49;;38655:9;38630;38640:11;38630:22;;;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;38694:11;38671:9;:20;38681:9;38671:20;;;;;;;;;;;;;;;:34;;;;38712:9;:18;;;;;;;;;;;;:::i;:::-;;38746:11;38739:18;;38217:546;;;;;:::o;33002:106::-;33063:7;33089:6;:13;;;;33082:20;;33002:106;:::o;45705:333::-;45819:18;38893:19;38901:10;38893:7;:19::i;:::-;38885:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45840:9;:19;45850:8;45840:19;;;;;;;;;;;;;;;;;;;;;45819:40;;45887:10;45874:23;;:9;:23;;;;45866:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45970:9;45944:13;:23;45958:8;45944:23;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;46023:8;46012:9;45991:41;;46000:10;45991:41;;;;;;;;;;;;45705:333;;;:::o;17791:314::-;17958:18;17910:8;14297:18;14318:9;:19;14328:8;14318:19;;;;;;;;;;;;;;;;;;;;;14297:40;;14374:10;14360:24;;:10;:24;;;:70;;;;14420:10;14395:35;;:21;14407:8;14395:11;:21::i;:::-;:35;;;14360:70;:121;;;;14441:16;:28;14458:10;14441:28;;;;;;;;;;;;;;;:40;14470:10;14441:40;;;;;;;;;;;;;;;;;;;;;;;;;14360:121;14344:144;;;;;;;;17938:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;17979:9;:19;17989:8;17979:19;;;;;;;;;;;;;;;;;;;;;17958:40;;18027:5;18013:19;;:10;:19;;;18005:28;;;;;;;;18063:1;18048:17;;:3;:17;;;;18040:26;;;;;;;;18075:24;18085:3;18090:8;18075:9;:24::i;:::-;14497:1;17791:314;;;;;;:::o;37433:257::-;37507:13;37552:5;;;;;;;;;;;37536:21;;:12;:21;;;37532:38;;;37566:4;37559:11;;;;37532:38;37603:1;37583:9;:16;;;;:21;37579:39;;;37613:5;37606:12;;;;37579:39;37671:12;37633:50;;:9;37643;:23;37653:12;37643:23;;;;;;;;;;;;;;;;37633:34;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;37625:59;;37433:257;;;;:::o;43718:53::-;;;;;;;;;;;;;;;;;:::o;46593:159::-;46670:15;46704:17;:42;46722:23;46740:4;;46722:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:23::i;:::-;46704:42;;;;;;;;;;;;46697:49;;46593:159;;;;:::o;33717:222::-;33831:7;33867:10;:18;33878:6;33867:18;;;;;;;;;;;;;;;:25;;;;33858:6;:34;33850:43;;;;;;;;33907:10;:18;33918:6;33907:18;;;;;;;;;;;;;;;33926:6;33907:26;;;;;;;;;;;;;;;;;;33900:33;;33717:222;;;;:::o;17089:165::-;17205:43;17223:5;17230:3;17235:8;17205:43;;;;;;;;;;;;;:17;:43::i;:::-;17089:165;;;:::o;44975:444::-;45056:13;45100:38;;:::i;:::-;45232:15;38893:19;38901:10;38893:7;:19::i;:::-;38885:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45072:9;:19;45082:8;45072:19;;;;;;;;;;;;;;;;;;;;;45056:35;;45141:19;:29;45161:8;45141:29;;;;;;;;;;;45100:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45220:1;45189:15;:19;;;45183:33;:38;;45179:204;;;45250:38;45268:15;:19;;;45250:17;:38::i;:::-;45232:56;;45304:17;:26;45322:7;45304:26;;;;;;;;;;;45297:33;;;45346:19;:29;45366:8;45346:29;;;;;;;;;;;;45339:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;45179:204;45391:22;45397:5;45404:8;45391:5;:22::i;:::-;44975:444;;;;:::o;36768:229::-;36858:21;36838:12;;;;;;;;;;;36824:26;;:10;:26;;;36816:35;;;;;;;;36882:5;;;;;;;;;;;36858:29;;36902:12;;;;;;;;;;;36894:5;;:20;;;;;;;;;;;;;;;;;;36936:1;36921:12;;:16;;;;;;;;;;;;;;;;;;36985:5;;;;;;;;;;;36949:42;;36970:13;36949:42;;;;;;;;;;;;36768:229;:::o;33225:279::-;33311:7;33347:6;:13;;;;33338:6;:22;33330:31;;;;;;;;33463:6;33434:9;:25;33444:6;33451;33444:14;;;;;;;;;;;;;;;;;;33434:25;;;;;;;;;;;;:35;33427:43;;;;;;33484:6;33491;33484:14;;;;;;;;;;;;;;;;;;33477:21;;33225:279;;;:::o;47343:481::-;47422:10;47441;47460:18;47487:13;47509:15;47533;47568:38;;:::i;:::-;47609:19;:29;47629:8;47609:29;;;;;;;;;;;47568:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47663:8;47680:15;:19;;;47708:7;:17;47716:8;47708:17;;;;;;;;;;;47734:9;:19;47744:8;47734:19;;;;;;;;;;;;;;;;;;;;;47762:15;:23;;;47794:15;:23;;;47647:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47343:481;;;;;;;;:::o;15540:179::-;15623:14;15658:9;:19;15668:8;15658:19;;;;;;;;;;;;;;;;;;;;;15649:28;;15710:1;15692:20;;:6;:20;;;;15684:29;;;;;;;;15540:179;;;:::o;43573:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37814:275::-;37894:10;34921:5;;;;;;;;;;;34907:19;;:10;:19;;;34899:28;;;;;;;;37925:21;37933:12;37925:7;:21::i;:::-;37924:22;37916:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38048:1;38019:9;38034:12;38019:28;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38019:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;37993:9;:23;38003:12;37993:23;;;;;;;;;;;;;;;:56;;;;38082:1;38065:9;:16;;;;:18;38058:25;;37814:275;;;:::o;15144:178::-;15227:7;15272:1;15254:20;;:6;:20;;;;15246:29;;;;;;;;15289:19;:27;15309:6;15289:27;;;;;;;;;;;;;;;;15282:34;;15144:178;;;:::o;34294:20::-;;;;;;;;;;;;;:::o;44227:603::-;44419:15;38893:19;38901:10;38893:7;:19::i;:::-;38885:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44437:23;44455:4;;44437:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:23::i;:::-;44419:41;;44488:21;;;;;;;;;;;;;;:17;:21::i;:::-;44477:7;:32;;44469:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44584:1;44554:17;:26;44572:7;44554:26;;;;;;;;;;;;:31;44546:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44632:23;44638:6;44646:8;44632:5;:23::i;:::-;44662:36;44675:8;44685:12;;44662:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:36::i;:::-;44739:41;;;;;;;;;44755:4;;44739:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44761:8;44739:41;;;;;;44771:8;44739:41;;;44707:19;:29;44727:8;44707:29;;;;;;;;;;;:73;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44816:8;44787:17;:26;44805:7;44787:26;;;;;;;;;;;:37;;;;44227:603;;;;;;;;;:::o;27333:107::-;27389:14;27425:9;27415:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27333:107;:::o;19225:257::-;19355:1;19334:23;;:9;:23;;;;19326:32;;;;;;;;19407:9;19365:16;:28;19382:10;19365:28;;;;;;;;;;;;;;;:39;19394:9;19365:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;19455:9;19428:48;;19443:10;19428:48;;;19466:9;19428:48;;;;;;;;;;;;;;;;;;;;;;19225:257;;:::o;16540:186::-;16674:46;16692:5;16699:3;16704:8;16714:5;;16674:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;16540:186;;;;;:::o;46151:316::-;46236:10;46255:15;46279;46306:38;;:::i;:::-;46347:19;:29;46367:8;46347:29;;;;;;;;;;;46306:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46391:15;:19;;;46412:15;:23;;;46437:15;:23;;;46383:78;;;;;;;;;46151:316;;;;;;:::o;27562:160::-;27674:6;27626:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;27699:7;:17;27707:8;27699:17;;;;;;;;;;;27692:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27562:160;;;;:::o;35793:27::-;;;;;;;;;;;;;:::o;37210:41::-;;;;;;;;;;;;;;;;;:::o;20053:253::-;20167:4;20209:1;20191:20;;:6;:20;;;;20183:29;;;;;;;;20248:1;20227:23;;:9;:23;;;;20219:32;;;;;;;;20265:16;:24;20282:6;20265:24;;;;;;;;;;;;;;;:35;20290:9;20265:35;;;;;;;;;;;;;;;;;;;;;;;;;20258:42;;20053:253;;;;:::o;47930:140::-;48009:12;48041:23;48059:4;;48041:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:23::i;:::-;48034:30;;47930:140;;;;:::o;36468:123::-;34921:5;;;;;;;;;;;34907:19;;:10;:19;;;34899:28;;;;;;;;36576:9;36561:12;;:24;;;;;;;;;;;;;;;;;;36468:123;:::o;21304:271::-;21392:12;21407:9;:19;21417:8;21407:19;;;;;;;;;;;;;;;;;;;;;21392:34;;21433:23;21447:8;21433:13;:23::i;:::-;21465:29;21479:4;21485:8;21465:13;:29::i;:::-;21501:25;21512:3;21517:8;21501:10;:25::i;:::-;21560:8;21555:3;21540:29;;21549:4;21540:29;;;;;;;;;;;;21304:271;;;:::o;48174:156::-;48251:12;48317:4;48300:22;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;48300:22:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;48300:22:0;;;48290:33;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;48290:33:0;;;;;;;;;;;;;;;;48282:42;;;48275:49;;48174:156;;;:::o;20584:529::-;20774:18;20955:13;20726:8;14297:18;14318:9;:19;14328:8;14318:19;;;;;;;;;;;;;;;;;;;;;14297:40;;14374:10;14360:24;;:10;:24;;;:70;;;;14420:10;14395:35;;:21;14407:8;14395:11;:21::i;:::-;:35;;;14360:70;:121;;;;14441:16;:28;14458:10;14441:28;;;;;;;;;;;;;;;:40;14470:10;14441:40;;;;;;;;;;;;;;;;;;;;;;;;;14360:121;14344:144;;;;;;;;20754:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;20795:9;:19;20805:8;20795:19;;;;;;;;;;;;;;;;;;;;;20774:40;;20843:5;20829:19;;:10;:19;;;20821:28;;;;;;;;20879:1;20864:17;;:3;:17;;;;20856:26;;;;;;;;20891:24;20901:3;20906:8;20891:9;:24::i;:::-;20928:16;:3;:14;;;:16::i;:::-;20924:184;;;20991:3;20971:41;;;21013:10;21025:5;21032:8;21042:5;20971:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20971:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20971:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20971:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20971:77:0;;;;;;;;;;;;;;;;20955:93;;12002:10;21075:24;;21065:34;;;:6;:34;;;;21057:43;;;;;;;;20924:184;14497:1;20584:529;;;;;;;;:::o;30867:627::-;31025:18;31176:22;31228:17;30955:29;30967:6;30975:8;30955:11;:29::i;:::-;31014:1;30998:6;:13;;;;:17;30991:25;;;;;;31046:9;:19;31056:8;31046:19;;;;;;;;;;;;31025:40;;31160:8;31138:6;31145:10;31138:18;;;;;;;;;;;;;;;;;;:30;31131:38;;;;;;31201:20;31219:1;31201:6;:13;;;;:17;;:20;;;;:::i;:::-;31176:45;;31248:6;31255:14;31248:22;;;;;;;;;;;;;;;;;;31228:42;;31300:9;31279:6;31286:10;31279:18;;;;;;;;;;;;;;;;;:30;;;;31318:6;:15;;;;;;;;;;;;:::i;:::-;;31448:10;31425:9;:20;31435:9;31425:20;;;;;;;;;;;:33;;;;31487:1;31465:9;:19;31475:8;31465:19;;;;;;;;;;;:23;;;;30867:627;;;;;:::o;30316:194::-;30401:26;30413:3;30418:8;30401:11;:26::i;:::-;30434:6;30446:8;30434:21;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;30434:21:0;;;;;;;;;;;;;;;;;;;;;;30484:20;30502:1;30484:6;:13;;;;:17;;:20;;;;:::i;:::-;30462:9;:19;30472:8;30462:19;;;;;;;;;;;:42;;;;30316:194;;:::o;26923:150::-;27009:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;27063:4;27043:7;:17;27051:8;27043:17;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;26923:150;;;:::o;22969:164::-;23073:1;23046:13;:23;23060:8;23046:23;;;;;;;;;;;;;;;;;;;;;:28;;;;23043:85;;;23097:13;:23;23111:8;23097:23;;;;;;;;;;;;23090:30;;;;;;;;;;;23043:85;22969:164;:::o;31773:630::-;31955:26;32015:22;32078:17;31867:36;31887:5;31894:8;31867:19;:36::i;:::-;31944:1;31917:10;:17;31928:5;31917:17;;;;;;;;;;;;;;;:24;;;;:28;31910:36;;;;;;31984:14;:24;31999:8;31984:24;;;;;;;;;;;;31955:53;;32040:31;32069:1;32040:10;:17;32051:5;32040:17;;;;;;;;;;;;;;;:24;;;;:28;;:31;;;;:::i;:::-;32015:56;;32098:10;:17;32109:5;32098:17;;;;;;;;;;;;;;;32116:14;32098:33;;;;;;;;;;;;;;;;;;32078:53;;32180:9;32140:10;:17;32151:5;32140:17;;;;;;;;;;;;;;;32158:18;32140:37;;;;;;;;;;;;;;;;;:49;;;;32198:10;:17;32209:5;32198:17;;;;;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;32344:18;32316:14;:25;32331:9;32316:25;;;;;;;;;;;:46;;;;32396:1;32369:14;:24;32384:8;32369:24;;;;;;;;;;;:28;;;;31773:630;;;;;:::o;32675:252::-;32805:14;32765:31;32782:3;32787:8;32765:16;:31::i;:::-;32822:10;:15;32833:3;32822:15;;;;;;;;;;;;;;;:22;;;;32805:39;;32851:10;:15;32862:3;32851:15;;;;;;;;;;;;;;;32872:8;32851:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;32851:30:0;;;;;;;;;;;;;;;;;;;;;;32915:6;32888:14;:24;32903:8;32888:24;;;;;;;;;;;:33;;;;32675:252;;;:::o;10302:620::-;10385:4;10401:12;10836:5;10824:18;10816:26;;10915:1;10908:4;:8;10901:15;;10302:620;;;;:::o;26315:214::-;26403:29;26415:6;26423:8;26403:11;:29::i;:::-;26480:1;26451:7;:17;26459:8;26451:17;;;;;;;;;;;26445:31;;;;;;;;;;;;;;;;:36;;26441:83;;;26499:7;:17;26507:8;26499:17;;;;;;;;;;;;26492:24;;;;:::i;:::-;26441:83;26315:214;;:::o;8149:152::-;8239:7;8271:2;8265;:8;;8258:16;;;;;;8293:2;8288;:7;8281:14;;8149:152;;;;:::o;21967:278::-;22075:1;22060:17;;:3;:17;;;;22052:26;;;;;;;;22105:1;22093:8;:13;;22085:22;;;;;;;;22153:1;22122:33;;:9;:19;22132:8;22122:19;;;;;;;;;;;;;;;;;;;;;:33;;;22114:42;;;;;;;;22165:25;22176:3;22181:8;22165:10;:25::i;:::-;22230:8;22225:3;22204:35;;22221:1;22204:35;;;;;;;;;;;;21967:278;;:::o;23407:284::-;23532:5;23509:28;;:9;:19;23519:8;23509:19;;;;;;;;;;;;;;;;;;;;;:28;;;23501:37;;;;;;;;23581:1;23552:19;:26;23572:5;23552:26;;;;;;;;;;;;;;;;:30;23545:38;;;;;;23619:33;23650:1;23619:19;:26;23639:5;23619:26;;;;;;;;;;;;;;;;:30;;:33;;;;:::i;:::-;23590:19;:26;23610:5;23590:26;;;;;;;;;;;;;;;:62;;;;23666:9;:19;23676:8;23666:19;;;;;;;;;;;;23659:26;;;;;;;;;;;23407:284;;:::o;23958:237::-;24087:1;24056:33;;:9;:19;24066:8;24056:19;;;;;;;;;;;;;;;;;;;;;:33;;;24048:42;;;;;;;;24121:3;24099:9;:19;24109:8;24099:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;24158:31;24187:1;24158:19;:24;24178:3;24158:24;;;;;;;;;;;;;;;;:28;;:31;;;;:::i;:::-;24131:19;:24;24151:3;24131:24;;;;;;;;;;;;;;;:58;;;;23958:237;;:::o;22602:233::-;22684:8;14723:1;14692:33;;:9;:19;14702:8;14692:19;;;;;;;;;;;;;;;;;;;;;:33;;;;14684:42;;;;;;;;22718:23;22732:8;22718:13;:23::i;:::-;22748:31;22762:6;22770:8;22748:13;:31::i;:::-;22820:8;22816:1;22791:38;;22800:6;22791:38;;;;;;;;;;;;22602:233;;;:::o;8418:171::-;8508:7;8527:9;8544:2;8539;:7;8527:19;;8565:2;8560:1;:7;;8553:15;;;;;;8582:1;8575:8;;8418:171;;;;;:::o;42782:5551::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://a162a838bfb7aaaf5c5d3e955f375f722d951c81977ffaea75852b587b469a15
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.