Overview
Max Total Supply
249,173 MLBCB
Holders
2,902
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
58 MLBCBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MLBNFT
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-08-14 */ /** * Created on 2018-06-05 16:37 * @summary: Our NFT Minting Contract which inherits ERC721 capability from LSNFT * @author: Fazri Zubair & Farhan Khwaja */ pragma solidity ^0.4.23; pragma solidity ^0.4.23; /* NFT Metadata Schema { "title": "Asset Metadata", "type": "object", "properties": { "name": { "type": "string", "description": "Identifies the asset to which this NFT represents", }, "description": { "type": "string", "description": "Describes the asset to which this NFT represents", }, "image": { "type": "string", "description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive.", } } } */ /** * @title SafeMath * @dev Math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two numbers, reverts on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_a == 0) { return 0; } uint256 c = _a * _b; require(c / _a == _b); return c; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { require(_b > 0); // Solidity only automatically asserts when dividing by 0 uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { require(_b <= _a); uint256 c = _a - _b; return c; } /** * @dev Adds two numbers, reverts on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256) { uint256 c = _a + _b; require(c >= _a); return c; } } /** * Utility library of inline functions on addresses */ library AddressUtils { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param addr address to check * @return whether the target address is a contract */ 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. // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(addr) } return size > 0; } } /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Basic { event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); function balanceOf(address _owner) public view returns (uint256 _balance); function ownerOf(uint256 _tokenId) public view returns (address _owner); function exists(uint256 _tokenId) public view returns (bool _exists); function approve(address _to, uint256 _tokenId) public; function getApproved(uint256 _tokenId) public view returns (address _operator); function setApprovalForAll(address _operator, bool _approved) public; function isApprovedForAll(address _owner, address _operator) public view returns (bool); function transferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) public; } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Enumerable is ERC721Basic { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex( address _owner, uint256 _index ) public view returns (uint256 _tokenId); function tokenByIndex(uint256 _index) public view returns (uint256); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Metadata is ERC721Basic { function name() public view returns (string _name); function symbol() public view returns (string _symbol); function tokenURI(uint256 _tokenId) public view returns (string); } /** * @title ERC-721 Non-Fungible Token Standard, full implementation interface * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata { } /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721BasicToken is ERC721Basic { using SafeMath for uint256; using AddressUtils for address; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` bytes4 public constant ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) internal tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) internal tokenApprovals; // Mapping from owner to number of owned token mapping (address => uint256) internal ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) internal operatorApprovals; /** * @dev Guarantees msg.sender is owner of the given token * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender */ modifier onlyOwnerOf(uint256 _tokenId) { require (ownerOf(_tokenId) == msg.sender); _; } /** * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator * @param _tokenId uint256 ID of the token to validate */ modifier canTransfer(uint256 _tokenId) { require (isApprovedOrOwner(msg.sender, _tokenId)); _; } /** * @dev Gets the balance of the specified address * @param _owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address _owner) public view returns (uint256) { require (_owner != address(0)); return ownedTokensCount[_owner]; } /** * @dev Gets the owner of the specified token ID * @param _tokenId uint256 ID of the token to query the owner of * @return owner address currently marked as the owner of the given token ID */ function ownerOf(uint256 _tokenId) public view returns (address) { address owner = tokenOwner[_tokenId]; require (owner != address(0)); return owner; } /** * @dev Returns whether the specified token exists * @param _tokenId uint256 ID of the token to query the existence of * @return whether the token exists */ function exists(uint256 _tokenId) public view returns (bool) { address owner = tokenOwner[_tokenId]; return owner != address(0); } /** * @dev Approves another address to transfer the given token ID * @dev The zero address indicates there is no approved address. * @dev There can only be one approved address per token at a given time. * @dev Can only be called by the token owner or an approved operator. * @param _to address to be approved for the given token ID * @param _tokenId uint256 ID of the token to be approved */ function approve(address _to, uint256 _tokenId) public { address owner = ownerOf(_tokenId); require (_to != owner); require (msg.sender == owner || isApprovedForAll(owner, msg.sender)); tokenApprovals[_tokenId] = _to; emit Approval(owner, _to, _tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * @param _tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 _tokenId) public view returns (address) { return tokenApprovals[_tokenId]; } /** * @dev Sets or unsets the approval of a given operator * @dev An operator is allowed to transfer all tokens of the sender on their behalf * @param _to operator address to set the approval * @param _approved representing the status of the approval to be set */ function setApprovalForAll(address _to, bool _approved) public { require (_to != msg.sender); operatorApprovals[msg.sender][_to] = _approved; emit ApprovalForAll(msg.sender, _to, _approved); } /** * @dev Tells whether an operator is approved by a given owner * @param _owner owner address which you want to query the approval of * @param _operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll( address _owner, address _operator ) public view returns (bool) { return operatorApprovals[_owner][_operator]; } /** * @dev Transfers the ownership of a given token ID to another address * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible * @dev Requires the msg sender to be the owner, approved, or operator * @param _from current owner of the token * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred */ function transferFrom( address _from, address _to, uint256 _tokenId ) public canTransfer(_tokenId) { require (_from != address(0)); require (_to != address(0)); clearApproval(_from, _tokenId); removeTokenFrom(_from, _tokenId); addTokenTo(_to, _tokenId); emit Transfer(_from, _to, _tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * @dev If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @dev Requires the msg sender to be the owner, approved, or operator * @param _from current owner of the token * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) public canTransfer(_tokenId) { // solium-disable-next-line arg-overflow safeTransferFrom(_from, _to, _tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * @dev If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @dev Requires the msg sender to be the owner, approved, or operator * @param _from current owner of the token * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) public canTransfer(_tokenId) { transferFrom(_from, _to, _tokenId); // solium-disable-next-line arg-overflow require (checkAndCallSafeTransfer(_from, _to, _tokenId, _data)); } /** * @dev Returns whether the given spender can transfer a given token ID * @param _spender address of the spender to query * @param _tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function isApprovedOrOwner( address _spender, uint256 _tokenId ) internal view returns (bool) { address owner = ownerOf(_tokenId); // Disable solium check because of // https://github.com/duaraghav8/Solium/issues/175 // solium-disable-next-line operator-whitespace return ( _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender) ); } /** * @dev Internal function to mint a new token * @dev Reverts if the given token ID already exists * @param _to The address that will own the minted token * @param _tokenId uint256 ID of the token to be minted by the msg.sender */ function _mint(address _to, uint256 _tokenId) internal { require (_to != address(0)); addTokenTo(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); } /** * @dev Internal function to burn a specific token * @dev Reverts if the token does not exist * @param _tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address _owner, uint256 _tokenId) internal { clearApproval(_owner, _tokenId); removeTokenFrom(_owner, _tokenId); emit Transfer(_owner, address(0), _tokenId); } /** * @dev Internal function to clear current approval of a given token ID * @dev Reverts if the given address is not indeed the owner of the token * @param _owner owner of the token * @param _tokenId uint256 ID of the token to be transferred */ function clearApproval(address _owner, uint256 _tokenId) internal { require (ownerOf(_tokenId) == _owner); if (tokenApprovals[_tokenId] != address(0)) { tokenApprovals[_tokenId] = address(0); } } /** * @dev Internal function to add a token ID to the list of a given address * @param _to address representing the new owner of the given token ID * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address */ function addTokenTo(address _to, uint256 _tokenId) internal { require (tokenOwner[_tokenId] == address(0)); tokenOwner[_tokenId] = _to; ownedTokensCount[_to] = ownedTokensCount[_to].add(1); } /** * @dev Internal function to remove a token ID from the list of a given address * @param _from address representing the previous owner of the given token ID * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function removeTokenFrom(address _from, uint256 _tokenId) internal { require (ownerOf(_tokenId) == _from); ownedTokensCount[_from] = ownedTokensCount[_from].sub(1); tokenOwner[_tokenId] = address(0); } /** * @dev Internal function to invoke `onERC721Received` on a target address * @dev The call is not executed if the target address is not a contract * @param _from address representing the previous owner of the given token ID * @param _to target address that will receive the tokens * @param _tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return whether the call correctly returned the expected magic value */ function checkAndCallSafeTransfer( address _from, address _to, uint256 _tokenId, bytes _data ) internal returns (bool) { if (!_to.isContract()) { return true; } bytes4 retval = ERC721Receiver(_to).onERC721Received( msg.sender, _from, _tokenId, _data); return (retval == ERC721_RECEIVED); } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract ERC721Receiver { /** * @dev Magic value to be returned upon successful reception of an NFT * Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`, * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` */ bytes4 public constant ERC721_RECEIVED = 0x150b7a02; /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safetransfer`. This function MAY throw to revert and reject the * transfer. This function MUST use 50,000 gas or less. Return of other * than the magic value MUST result in the transaction being reverted. * Note: the contract address is always the message sender. * @param _from The sending address * @param _tokenId The NFT identifier which is being transfered * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes _data ) public returns(bytes4); } contract ERC721Holder is ERC721Receiver { function onERC721Received( address, address, uint256, bytes ) public returns(bytes4) { return ERC721_RECEIVED; } } /** * @title Full ERC721 Token * This implementation includes all the required and some optional functionality of the ERC721 standard * Moreover, it includes approve all functionality using operator terminology * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Token is ERC721, ERC721BasicToken { // Token name string internal name_; // Token symbol string internal symbol_; // Mapping from owner to list of owned token IDs mapping(address => uint256[]) internal ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) internal ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] internal allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) internal allTokensIndex; // Base Server Address for Token MetaData URI string internal tokenURIBase; /** * @dev Returns an URI for a given token ID * @dev Throws if the token ID does not exist. May return an empty string. * @notice The user/developper needs to add the tokenID, in the end of URL, to * use the URI and get all details. Ex. www.<apiURL>.com/token/<tokenID> * @param _tokenId uint256 ID of the token to query */ function tokenURI(uint256 _tokenId) public view returns (string) { require (exists(_tokenId)); return tokenURIBase; } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner * @param _owner address owning the tokens list to be accessed * @param _index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) public view returns (uint256) { require (_index < balanceOf(_owner)); return ownedTokens[_owner][_index]; } /** * @dev Gets the total amount of tokens stored by the contract * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * @dev Reverts if the index is greater or equal to the total number of tokens * @param _index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 _index) public view returns (uint256) { require (_index < totalSupply()); return allTokens[_index]; } /** * @dev Internal function to set the token URI for a given token * @dev Reverts if the token ID does not exist * @param _uri string URI to assign */ function _setTokenURIBase(string _uri) internal { tokenURIBase = _uri; } /** * @dev Internal function to add a token ID to the list of a given address * @param _to address representing the new owner of the given token ID * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address */ function addTokenTo(address _to, uint256 _tokenId) internal { super.addTokenTo(_to, _tokenId); uint256 length = ownedTokens[_to].length; ownedTokens[_to].push(_tokenId); ownedTokensIndex[_tokenId] = length; } /** * @dev Internal function to remove a token ID from the list of a given address * @param _from address representing the previous owner of the given token ID * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function removeTokenFrom(address _from, uint256 _tokenId) internal { super.removeTokenFrom(_from, _tokenId); // To prevent a gap in the array, we store the last token in the index of the token to delete, and // then delete the last slot. uint256 tokenIndex = ownedTokensIndex[_tokenId]; uint256 lastTokenIndex = ownedTokens[_from].length.sub(1); uint256 lastToken = ownedTokens[_from][lastTokenIndex]; ownedTokens[_from][tokenIndex] = lastToken; // This also deletes the contents at the last position of the array ownedTokens[_from].length--; // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping // the lastToken to the first position, and then dropping the element placed in the last position of the list ownedTokensIndex[_tokenId] = 0; ownedTokensIndex[lastToken] = tokenIndex; } /** * @dev Gets the token name * @return string representing the token name */ function name() public view returns (string) { return name_; } /** * @dev Gets the token symbol * @return string representing the token symbol */ function symbol() public view returns (string) { return symbol_; } /** * @dev Internal function to mint a new token * @dev Reverts if the given token ID already exists * @param _to address the beneficiary that will own the minted token * @param _tokenId uint256 ID of the token to be minted by the msg.sender */ function _mint(address _to, uint256 _tokenId) internal { super._mint(_to, _tokenId); allTokensIndex[_tokenId] = allTokens.length; allTokens.push(_tokenId); } /** * @dev Internal function to burn a specific token * @dev Reverts if the token does not exist * @param _owner owner of the token to burn * @param _tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address _owner, uint256 _tokenId) internal { super._burn(_owner, _tokenId); // Reorg all tokens array uint256 tokenIndex = allTokensIndex[_tokenId]; uint256 lastTokenIndex = allTokens.length.sub(1); uint256 lastToken = allTokens[lastTokenIndex]; allTokens[tokenIndex] = lastToken; allTokens[lastTokenIndex] = 0; allTokens.length--; allTokensIndex[_tokenId] = 0; allTokensIndex[lastToken] = tokenIndex; } bytes4 constant InterfaceSignature_ERC165 = 0x01ffc9a7; /* bytes4(keccak256('supportsInterface(bytes4)')); */ bytes4 constant InterfaceSignature_ERC721Enumerable = 0x780e9d63; /* bytes4(keccak256('totalSupply()')) ^ bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ bytes4(keccak256('tokenByIndex(uint256)')); */ bytes4 constant InterfaceSignature_ERC721Metadata = 0x5b5e139f; /* bytes4(keccak256('name()')) ^ bytes4(keccak256('symbol()')) ^ bytes4(keccak256('tokenURI(uint256)')); */ bytes4 constant InterfaceSignature_ERC721 = 0x80ac58cd; /* bytes4(keccak256('balanceOf(address)')) ^ bytes4(keccak256('ownerOf(uint256)')) ^ bytes4(keccak256('approve(address,uint256)')) ^ bytes4(keccak256('getApproved(uint256)')) ^ bytes4(keccak256('setApprovalForAll(address,bool)')) ^ bytes4(keccak256('isApprovedForAll(address,address)')) ^ bytes4(keccak256('transferFrom(address,address,uint256)')) ^ bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^ bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')); */ bytes4 public constant InterfaceSignature_ERC721Optional =- 0x4f558e79; /* bytes4(keccak256('exists(uint256)')); */ /** * @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165). * @dev Returns true for any standardized interfaces implemented by this contract. * @param _interfaceID bytes4 the interface to check for * @return true for any standardized interfaces implemented by this contract. */ function supportsInterface(bytes4 _interfaceID) external view returns (bool) { return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721) || (_interfaceID == InterfaceSignature_ERC721Enumerable) || (_interfaceID == InterfaceSignature_ERC721Metadata)); } function implementsERC721() public pure returns (bool) { return true; } } /* Lucid Sight, Inc. ERC-721 Collectibles. * @title LSNFT - Lucid Sight, Inc. Non-Fungible Token * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.) */ contract LSNFT is ERC721Token { /*** EVENTS ***/ /// @dev The Created event is fired whenever a new collectible comes into existence. event Created(address owner, uint256 tokenId); /*** DATATYPES ***/ struct NFT { // The sequence of potential attributes a Collectible has and can provide in creation events. Used in Creation logic to spwan new Cryptos uint256 attributes; // Current Game Card identifier uint256 currentGameCardId; // MLB Game Identifier (if asset generated as a game reward) uint256 mlbGameId; // player orverride identifier uint256 playerOverrideId; // official MLB Player ID uint256 mlbPlayerId; // earnedBy : In some instances we may want to retroactively write which MLB player triggered // the event that created a Legendary Trophy. This optional field should be able to be written // to after generation if we determine an event was newsworthy enough uint256 earnedBy; // asset metadata uint256 assetDetails; // Attach/Detach Flag uint256 isAttached; } NFT[] allNFTs; function isLSNFT() public view returns (bool) { return true; } /// For creating NFT function _createNFT ( uint256[5] _nftData, address _owner, uint256 _isAttached) internal returns(uint256) { NFT memory _lsnftObj = NFT({ attributes : _nftData[1], currentGameCardId : 0, mlbGameId : _nftData[2], playerOverrideId : _nftData[3], assetDetails: _nftData[0], isAttached: _isAttached, mlbPlayerId: _nftData[4], earnedBy: 0 }); uint256 newLSNFTId = allNFTs.push(_lsnftObj) - 1; _mint(_owner, newLSNFTId); // Created event emit Created(_owner, newLSNFTId); return newLSNFTId; } /// @dev Gets attributes of NFT function _getAttributesOfToken(uint256 _tokenId) internal returns(NFT) { NFT storage lsnftObj = allNFTs[_tokenId]; return lsnftObj; } function _approveForSale(address _owner, address _to, uint256 _tokenId) internal { address owner = ownerOf(_tokenId); require (_to != owner); require (_owner == owner || isApprovedForAll(owner, _owner)); if (getApproved(_tokenId) != address(0) || _to != address(0)) { tokenApprovals[_tokenId] = _to; emit Approval(_owner, _to, _tokenId); } } } /** Controls state and access rights for contract functions * @title Operational Control * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.) * Inspired and adapted from contract created by OpenZeppelin * Ref: https://github.com/OpenZeppelin/zeppelin-solidity/ */ contract OperationalControl { /// Facilitates access & control for the game. /// Roles: /// -The Managers (Primary/Secondary): Has universal control of all elements (No ability to withdraw) /// -The Banker: The Bank can withdraw funds and adjust fees / prices. /// -otherManagers: Contracts that need access to functions for gameplay /// @dev Emited when contract is upgraded event ContractUpgrade(address newContract); /// @dev The addresses of the accounts (or contracts) that can execute actions within each roles. address public managerPrimary; address public managerSecondary; address public bankManager; // Contracts that require access for gameplay mapping(address => uint8) public otherManagers; // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked bool public paused = false; // @dev Keeps track whether the contract erroredOut. When that is true, most actions are blocked & refund can be claimed bool public error = false; /** * @dev Operation modifiers for limiting access only to Managers */ modifier onlyManager() { require (msg.sender == managerPrimary || msg.sender == managerSecondary); _; } /** * @dev Operation modifiers for limiting access to only Banker */ modifier onlyBanker() { require (msg.sender == bankManager); _; } /** * @dev Operation modifiers for any Operators */ modifier anyOperator() { require ( msg.sender == managerPrimary || msg.sender == managerSecondary || msg.sender == bankManager || otherManagers[msg.sender] == 1 ); _; } /** * @dev Operation modifier for any Other Manager */ modifier onlyOtherManagers() { require (otherManagers[msg.sender] == 1); _; } /** * @dev Assigns a new address to act as the Primary Manager. * @param _newGM New primary manager address */ function setPrimaryManager(address _newGM) external onlyManager { require (_newGM != address(0)); managerPrimary = _newGM; } /** * @dev Assigns a new address to act as the Secondary Manager. * @param _newGM New Secondary Manager Address */ function setSecondaryManager(address _newGM) external onlyManager { require (_newGM != address(0)); managerSecondary = _newGM; } /** * @dev Assigns a new address to act as the Banker. * @param _newBK New Banker Address */ function setBanker(address _newBK) external onlyManager { require (_newBK != address(0)); bankManager = _newBK; } /// @dev Assigns a new address to act as the Other Manager. (State = 1 is active, 0 is disabled) function setOtherManager(address _newOp, uint8 _state) external onlyManager { require (_newOp != address(0)); otherManagers[_newOp] = _state; } /*** Pausable functionality adapted from OpenZeppelin ***/ /// @dev Modifier to allow actions only when the contract IS NOT paused modifier whenNotPaused() { require (!paused); _; } /// @dev Modifier to allow actions only when the contract IS paused modifier whenPaused { require (paused); _; } /// @dev Modifier to allow actions only when the contract has Error modifier whenError { require (error); _; } /** * @dev Called by any Operator role to pause the contract. * Used only if a bug or exploit is discovered (Here to limit losses / damage) */ function pause() external onlyManager whenNotPaused { paused = true; } /** * @dev Unpauses the smart contract. Can only be called by the Game Master */ function unpause() public onlyManager whenPaused { // can't unpause if contract was upgraded paused = false; } /** * @dev Errors out the contract thus mkaing the contract non-functionable */ function hasError() public onlyManager whenPaused { error = true; } /** * @dev Removes the Error Hold from the contract and resumes it for working */ function noError() public onlyManager whenPaused { error = false; } } /** Base contract for MLBNFT Collectibles. Holds all commons, events and base variables. * @title Lucid Sight MLB NFT 2018 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.) */ contract CollectibleBase is LSNFT { /*** EVENTS ***/ /// @dev Event emitted when an attribute of the player is updated event AssetUpdated(uint256 tokenId); /*** STORAGE ***/ /// @dev A mapping of Team Id to Team Sequence Number to Collectible mapping (uint256 => mapping (uint32 => uint256) ) public nftTeamIdToSequenceIdToCollectible; /// @dev A mapping from Team IDs to the Sequqence Number . mapping (uint256 => uint32) public nftTeamIndexToCollectibleCount; /// @dev Array to hold details on attachment for each LS NFT Collectible mapping(uint256 => uint256[]) public nftCollectibleAttachments; /// @dev Mapping to control the asset generation per season. mapping(uint256 => uint256) public generationSeasonController; /// @dev Mapping for generation Season Dict. mapping(uint256 => uint256) public generationSeasonDict; /// @dev internal function to update player override id function _updatePlayerOverrideId(uint256 _tokenId, uint256 _newPlayerOverrideId) internal { // Get Token Obj NFT storage lsnftObj = allNFTs[_tokenId]; lsnftObj.playerOverrideId = _newPlayerOverrideId; // Update Token Data with new updated attributes allNFTs[_tokenId] = lsnftObj; emit AssetUpdated(_tokenId); } /** * @dev An internal method that helps in generation of new NFT Collectibles * @param _teamId teamId of the asset/token/collectible * @param _attributes attributes of asset/token/collectible * @param _owner owner of asset/token/collectible * @param _isAttached State of the asset (attached or dettached) * @param _nftData Array of data required for creation */ function _createNFTCollectible( uint8 _teamId, uint256 _attributes, address _owner, uint256 _isAttached, uint256[5] _nftData ) internal returns (uint256) { uint256 generationSeason = (_attributes % 1000000).div(1000); require (generationSeasonController[generationSeason] == 1); uint32 _sequenceId = getSequenceId(_teamId); uint256 newNFTCryptoId = _createNFT(_nftData, _owner, _isAttached); nftTeamIdToSequenceIdToCollectible[_teamId][_sequenceId] = newNFTCryptoId; nftTeamIndexToCollectibleCount[_teamId] = _sequenceId; return newNFTCryptoId; } function getSequenceId(uint256 _teamId) internal returns (uint32) { return (nftTeamIndexToCollectibleCount[_teamId] + 1); } /** * @dev Internal function, Helps in updating the Creation Stop Time * @param _season Season UINT Code * @param _value 0 - Not allowed, 1 - Allowed */ function _updateGenerationSeasonFlag(uint256 _season, uint8 _value) internal { generationSeasonController[_season] = _value; } /** @param _owner The owner whose ships tokens we are interested in. * @dev This method MUST NEVER be called by smart contract code. First, it's fairly * expensive (it walks the entire Collectibles owners array looking for NFT belonging to owner) */ function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 totalItems = balanceOf(_owner); uint256 resultIndex = 0; // We count on the fact that all Collectible have IDs starting at 0 and increasing // sequentially up to the total count. uint256 _assetId; for (_assetId = 0; _assetId < totalItems; _assetId++) { result[resultIndex] = tokenOfOwnerByIndex(_owner,_assetId); resultIndex++; } return result; } } /// @dev internal function to update MLB player id function _updateMLBPlayerId(uint256 _tokenId, uint256 _newMLBPlayerId) internal { // Get Token Obj NFT storage lsnftObj = allNFTs[_tokenId]; lsnftObj.mlbPlayerId = _newMLBPlayerId; // Update Token Data with new updated attributes allNFTs[_tokenId] = lsnftObj; emit AssetUpdated(_tokenId); } /// @dev internal function to update asset earnedBy value for an asset/token function _updateEarnedBy(uint256 _tokenId, uint256 _earnedBy) internal { // Get Token Obj NFT storage lsnftObj = allNFTs[_tokenId]; lsnftObj.earnedBy = _earnedBy; // Update Token Data with new updated attributes allNFTs[_tokenId] = lsnftObj; emit AssetUpdated(_tokenId); } } /* Handles creating new Collectibles for promo and seed. * @title CollectibleMinting Minting * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.) * Inspired and adapted from KittyCore.sol created by Axiom Zen * Ref: ETH Contract - 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d */ contract CollectibleMinting is CollectibleBase, OperationalControl { uint256 public rewardsRedeemed = 0; /// @dev Counts the number of promo collectibles that can be made per-team uint256[31] public promoCreatedCount; /// @dev Counts the number of seed collectibles that can be made in total uint256 public seedCreatedCount; /// @dev Bool to toggle batch support bool public isBatchSupported = true; /// @dev A mapping of contracts that can trigger functions mapping (address => bool) public contractsApprovedList; /** * @dev Helps to toggle batch supported flag * @param _flag The flag */ function updateBatchSupport(bool _flag) public onlyManager { isBatchSupported = _flag; } modifier canCreate() { require (contractsApprovedList[msg.sender] || msg.sender == managerPrimary || msg.sender == managerSecondary); _; } /** * @dev Add an address to the Approved List * @param _newAddress The new address to be approved for interaction with the contract */ function addToApproveList(address _newAddress) public onlyManager { require (!contractsApprovedList[_newAddress]); contractsApprovedList[_newAddress] = true; } /** * @dev Remove an address from Approved List * @param _newAddress The new address to be approved for interaction with the contract */ function removeFromApproveList(address _newAddress) public onlyManager { require (contractsApprovedList[_newAddress]); delete contractsApprovedList[_newAddress]; } /** * @dev Generates promo collectibles. Only callable by Game Master, with isAttached as 0. * @notice The generation of an asset if limited via the generationSeasonController * @param _teamId teamId of the asset/token/collectible * @param _posId position of the asset/token/collectible * @param _attributes attributes of asset/token/collectible * @param _owner owner of asset/token/collectible * @param _gameId mlb game Identifier * @param _playerOverrideId player override identifier * @param _mlbPlayerId official mlb player identifier */ function createPromoCollectible( uint8 _teamId, uint8 _posId, uint256 _attributes, address _owner, uint256 _gameId, uint256 _playerOverrideId, uint256 _mlbPlayerId) external canCreate whenNotPaused returns (uint256) { address nftOwner = _owner; if (nftOwner == address(0)) { nftOwner = managerPrimary; } if(allNFTs.length > 0) { promoCreatedCount[_teamId]++; } uint32 _sequenceId = getSequenceId(_teamId); uint256 assetDetails = uint256(uint64(now)); assetDetails |= uint256(_sequenceId)<<64; assetDetails |= uint256(_teamId)<<96; assetDetails |= uint256(_posId)<<104; uint256[5] memory _nftData = [assetDetails, _attributes, _gameId, _playerOverrideId, _mlbPlayerId]; return _createNFTCollectible(_teamId, _attributes, nftOwner, 0, _nftData); } /** * @dev Generaes a new single seed Collectible, with isAttached as 0. * @notice Helps in creating seed collectible.The generation of an asset if limited via the generationSeasonController * @param _teamId teamId of the asset/token/collectible * @param _posId position of the asset/token/collectible * @param _attributes attributes of asset/token/collectible * @param _owner owner of asset/token/collectible * @param _gameId mlb game Identifier * @param _playerOverrideId player override identifier * @param _mlbPlayerId official mlb player identifier */ function createSeedCollectible( uint8 _teamId, uint8 _posId, uint256 _attributes, address _owner, uint256 _gameId, uint256 _playerOverrideId, uint256 _mlbPlayerId) external canCreate whenNotPaused returns (uint256) { address nftOwner = _owner; if (nftOwner == address(0)) { nftOwner = managerPrimary; } seedCreatedCount++; uint32 _sequenceId = getSequenceId(_teamId); uint256 assetDetails = uint256(uint64(now)); assetDetails |= uint256(_sequenceId)<<64; assetDetails |= uint256(_teamId)<<96; assetDetails |= uint256(_posId)<<104; uint256[5] memory _nftData = [assetDetails, _attributes, _gameId, _playerOverrideId, _mlbPlayerId]; return _createNFTCollectible(_teamId, _attributes, nftOwner, 0, _nftData); } /** * @dev Generate new Reward Collectible and transfer it to the owner, with isAttached as 0. * @notice Helps in redeeming the Rewards using our Oracle. Creates & transfers the asset to the redeemer (_owner) * The generation of an asset if limited via the generationSeasonController * @param _teamId teamId of the asset/token/collectible * @param _posId position of the asset/token/collectible * @param _attributes attributes of asset/token/collectible * @param _owner owner (redeemer) of asset/token/collectible * @param _gameId mlb game Identifier * @param _playerOverrideId player override identifier * @param _mlbPlayerId official mlb player identifier */ function createRewardCollectible ( uint8 _teamId, uint8 _posId, uint256 _attributes, address _owner, uint256 _gameId, uint256 _playerOverrideId, uint256 _mlbPlayerId) external canCreate whenNotPaused returns (uint256) { address nftOwner = _owner; if (nftOwner == address(0)) { nftOwner = managerPrimary; } rewardsRedeemed++; uint32 _sequenceId = getSequenceId(_teamId); uint256 assetDetails = uint256(uint64(now)); assetDetails |= uint256(_sequenceId)<<64; assetDetails |= uint256(_teamId)<<96; assetDetails |= uint256(_posId)<<104; uint256[5] memory _nftData = [assetDetails, _attributes, _gameId, _playerOverrideId, _mlbPlayerId]; return _createNFTCollectible(_teamId, _attributes, nftOwner, 0, _nftData); } /** * @dev Generate new ETH Card Collectible, with isAttached as 2. * @notice Helps to generate Collectibles/Tokens/Asset and transfer to ETH Cards, * which can be redeemed using our web-app.The generation of an asset if limited via the generationSeasonController * @param _teamId teamId of the asset/token/collectible * @param _posId position of the asset/token/collectible * @param _attributes attributes of asset/token/collectible * @param _owner owner of asset/token/collectible * @param _gameId mlb game Identifier * @param _playerOverrideId player override identifier * @param _mlbPlayerId official mlb player identifier */ function createETHCardCollectible ( uint8 _teamId, uint8 _posId, uint256 _attributes, address _owner, uint256 _gameId, uint256 _playerOverrideId, uint256 _mlbPlayerId) external canCreate whenNotPaused returns (uint256) { address nftOwner = _owner; if (nftOwner == address(0)) { nftOwner = managerPrimary; } rewardsRedeemed++; uint32 _sequenceId = getSequenceId(_teamId); uint256 assetDetails = uint256(uint64(now)); assetDetails |= uint256(_sequenceId)<<64; assetDetails |= uint256(_teamId)<<96; assetDetails |= uint256(_posId)<<104; uint256[5] memory _nftData = [assetDetails, _attributes, _gameId, _playerOverrideId, _mlbPlayerId]; return _createNFTCollectible(_teamId, _attributes, nftOwner, 2, _nftData); } } /* @title Interface for MLBNFT Contract * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.) */ contract SaleManager { function createSale(uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _owner) external; } /** * MLBNFT manages all aspects of the Lucid Sight, Inc. CryptoBaseball. * @title MLBNFT * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.) */ contract MLBNFT is CollectibleMinting { /// @dev Set in case the MLBNFT contract requires an upgrade address public newContractAddress; string public constant MLB_Legal = "Major League Baseball trademarks and copyrights are used with permission of the applicable MLB entity. All rights reserved."; // Time LS Oracle has to respond to detach requests uint32 public detachmentTime = 0; // Indicates if attached system is Active (Transfers will be blocked if attached and active) bool public attachedSystemActive; // Sale Manager Contract SaleManager public saleManagerAddress; /** * @dev MLBNFT constructor. */ constructor() public { // Starts paused. paused = true; managerPrimary = msg.sender; managerSecondary = msg.sender; bankManager = msg.sender; name_ = "LucidSight-MLB-NFT"; symbol_ = "MLBCB"; } /** * @dev Sets the address for the NFT Contract * @param _saleManagerAddress The nft address */ function setSaleManagerAddress(address _saleManagerAddress) public onlyManager { require (_saleManagerAddress != address(0)); saleManagerAddress = SaleManager(_saleManagerAddress); } /** * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator * @param _tokenId uint256 ID of the token to validate */ modifier canTransfer(uint256 _tokenId) { uint256 isAttached = checkIsAttached(_tokenId); if(isAttached == 2) { //One-Time Auth for Physical Card Transfers require (msg.sender == managerPrimary || msg.sender == managerSecondary || msg.sender == bankManager || otherManagers[msg.sender] == 1 ); updateIsAttached(_tokenId, 0); } else if(attachedSystemActive == true && isAttached >= 1) { require (msg.sender == managerPrimary || msg.sender == managerSecondary || msg.sender == bankManager || otherManagers[msg.sender] == 1 ); } else { require (isApprovedOrOwner(msg.sender, _tokenId)); } _; } /** * @dev Used to mark the smart contract as upgraded, in case of a issue * @param _v2Address The new contract address */ function setNewAddress(address _v2Address) external onlyManager { require (_v2Address != address(0)); newContractAddress = _v2Address; emit ContractUpgrade(_v2Address); } /** * @dev Returns all the relevant information about a specific Collectible. * @notice Get details about your collectible * @param _tokenId The token identifier * @return isAttached Is Object attached * @return teamId team identifier of the asset/token/collectible * @return positionId position identifier of the asset/token/collectible * @return creationTime creation timestamp * @return attributes attribute of the asset/token/collectible * @return currentGameCardId current game card of the asset/token/collectible * @return mlbGameID mlb game identifier in which the asset/token/collectible was generated * @return playerOverrideId player override identifier of the asset/token/collectible * @return playerStatus status of the player (Rookie/Veteran/Historical) * @return playerHandedness handedness of the asset * @return mlbPlayerId official MLB Player Identifier */ function getCollectibleDetails(uint256 _tokenId) external view returns ( uint256 isAttached, uint32 sequenceId, uint8 teamId, uint8 positionId, uint64 creationTime, uint256 attributes, uint256 playerOverrideId, uint256 mlbGameId, uint256 currentGameCardId, uint256 mlbPlayerId, uint256 earnedBy, uint256 generationSeason ) { NFT memory obj = _getAttributesOfToken(_tokenId); attributes = obj.attributes; currentGameCardId = obj.currentGameCardId; mlbGameId = obj.mlbGameId; playerOverrideId = obj.playerOverrideId; mlbPlayerId = obj.mlbPlayerId; creationTime = uint64(obj.assetDetails); sequenceId = uint32(obj.assetDetails>>64); teamId = uint8(obj.assetDetails>>96); positionId = uint8(obj.assetDetails>>104); isAttached = obj.isAttached; earnedBy = obj.earnedBy; generationSeason = generationSeasonDict[(obj.attributes % 1000000) / 1000]; } /** * @dev This is public rather than external so we can call super.unpause * without using an expensive CALL. */ function unpause() public onlyManager { /// Actually unpause the contract. super.unpause(); } /** * @dev Helper function to get the teamID of a collectible.To avoid using getCollectibleDetails * @notice Returns the teamID associated with the asset/collectible/token * @param _tokenId The token identifier */ function getTeamId(uint256 _tokenId) external view returns (uint256) { NFT memory obj = _getAttributesOfToken(_tokenId); uint256 teamId = uint256(uint8(obj.assetDetails>>96)); return uint256(teamId); } /** * @dev Helper function to get the position of a collectible.To avoid using getCollectibleDetails * @notice Returns the position of the asset/collectible/token * @param _tokenId The token identifier */ function getPositionId(uint256 _tokenId) external view returns (uint256) { NFT memory obj = _getAttributesOfToken(_tokenId); uint256 positionId = uint256(uint8(obj.assetDetails>>104)); return positionId; } /** * @dev Helper function to get the game card. To avoid using getCollectibleDetails * @notice Returns the gameCard associated with the asset/collectible/token * @param _tokenId The token identifier */ function getGameCardId(uint256 _tokenId) public view returns (uint256) { NFT memory obj = _getAttributesOfToken(_tokenId); return obj.currentGameCardId; } /** * @dev Returns isAttached property value for an asset/collectible/token * @param _tokenId The token identifier */ function checkIsAttached(uint256 _tokenId) public view returns (uint256) { NFT memory obj = _getAttributesOfToken(_tokenId); return obj.isAttached; } /** * @dev Helper function to get the attirbute of the collectible.To avoid using getCollectibleDetails * @notice Returns the ability of an asset/collectible/token from attributes. * @param _tokenId The token identifier * @return ability ability of the asset */ function getAbilitiesForCollectibleId(uint256 _tokenId) external view returns (uint256 ability) { NFT memory obj = _getAttributesOfToken(_tokenId); uint256 _attributes = uint256(obj.attributes); ability = (_attributes % 1000); } /** * @dev Only allows trasnctions to go throught if the msg.sender is in the apporved list * @notice Updates the gameCardID properrty of the asset * @param _gameCardNumber The game card number * @param _playerId The player identifier */ function updateCurrentGameCardId(uint256 _gameCardNumber, uint256 _playerId) public whenNotPaused { require (contractsApprovedList[msg.sender]); NFT memory obj = _getAttributesOfToken(_playerId); obj.currentGameCardId = _gameCardNumber; if ( _gameCardNumber == 0 ) { obj.isAttached = 0; } else { obj.isAttached = 1; } allNFTs[_playerId] = obj; } /** * @dev Only Manager can add an attachment (special events) to the collectible * @notice Adds an attachment to collectible. * @param _tokenId The token identifier * @param _attachment The attachment */ function addAttachmentToCollectible ( uint256 _tokenId, uint256 _attachment) external onlyManager whenNotPaused { require (exists(_tokenId)); nftCollectibleAttachments[_tokenId].push(_attachment); emit AssetUpdated(_tokenId); } /** * @dev It will remove the attachment form the collectible. We will need to re-add all attachment(s) if removed. * @notice Removes all attachments from collectible. * @param _tokenId The token identifier */ function removeAllAttachmentsFromCollectible(uint256 _tokenId) external onlyManager whenNotPaused { require (exists(_tokenId)); delete nftCollectibleAttachments[_tokenId]; emit AssetUpdated(_tokenId); } /** * @notice Transfers the ownership of NFT from one address to another address * @dev responsible for gifting assets to other user. * @param _to to address * @param _tokenId The token identifier */ function giftAsset(address _to, uint256 _tokenId) public whenNotPaused { safeTransferFrom(msg.sender, _to, _tokenId); } /** * @dev responsible for setting the tokenURI. * @notice The user/developper needs to add the tokenID, in the end of URL, to * use the URI and get all details. Ex. www.<apiURL>.com/token/<tokenID> * @param _tokenURI The token uri */ function setTokenURIBase (string _tokenURI) public anyOperator { _setTokenURIBase(_tokenURI); } /** * @dev Allowed to be called by onlyGameManager to update a certain collectible playerOverrideID * @notice Sets the player override identifier. * @param _tokenId The token identifier * @param _newOverrideId The new player override identifier */ function setPlayerOverrideId(uint256 _tokenId, uint256 _newOverrideId) public onlyManager whenNotPaused { require (exists(_tokenId)); _updatePlayerOverrideId(_tokenId, _newOverrideId); } /** * @notice Updates the Generation Season Controller. * @dev Allowed to be called by onlyGameManager to update the generation season. * this helps to control the generation of collectible. * @param _season Season UINT representation * @param _value 0-Not allowed, 1-open, >=2 Locked Forever */ function updateGenerationStopTime(uint256 _season, uint8 _value ) public onlyManager whenNotPaused { require (generationSeasonController[_season] == 1 && _value != 0); _updateGenerationSeasonFlag(_season, _value); } /** * @dev set Generation Season Controller, can only be called by Managers._season can be [0,1,2,3..] and * _value can be [0,1,N]. * @notice _value of 1: means generation of collectible is allowed. anything, apart from 1, wont allow generating assets for that season. * @param _season Season UINT representation */ function setGenerationSeasonController(uint256 _season) public onlyManager whenNotPaused { require (generationSeasonController[_season] == 0); _updateGenerationSeasonFlag(_season, 1); } /** * @dev Adding value to DICT helps in showing the season value in getCollectibleDetails * @notice Updates the Generation Season Dict. * @param _season Season UINT representation * @param _value 0-Not allowed,1-allowed */ function updateGenerationDict(uint256 _season, uint64 _value) public onlyManager whenNotPaused { require (generationSeasonDict[_season] <= 1); generationSeasonDict[_season] = _value; } /** * @dev Helper function to avoid calling getCollectibleDetails * @notice Gets the MLB player Id from the player attributes * @param _tokenId The token identifier * @return playerId MLB Player Identifier */ function getPlayerId(uint256 _tokenId) external view returns (uint256 playerId) { NFT memory obj = _getAttributesOfToken(_tokenId); playerId = ((obj.attributes.div(100000000000000000)) % 1000); } /** * @dev Helper function to avoid calling getCollectibleDetails * @notice Gets the attachments for an asset * @param _tokenId The token identifier * @return attachments */ function getAssetAttachment(uint256 _tokenId) external view returns (uint256[]) { uint256[] _attachments = nftCollectibleAttachments[_tokenId]; uint256[] attachments; for(uint i=0;i<_attachments.length;i++){ attachments.push(_attachments[i]); } return attachments; } /** * @dev Can only be trigerred by Managers. Updates the earnedBy property of the NFT * @notice Helps in updating the earned _by property of an asset/token. * @param _tokenId asser/token identifier * @param _earnedBy New asset/token DNA */ function updateEarnedBy(uint256 _tokenId, uint256 _earnedBy) public onlyManager whenNotPaused { require (exists(_tokenId)); _updateEarnedBy(_tokenId, _earnedBy); } /** * @dev A batch function to facilitate batching of asset creation. canCreate modifier * helps in controlling who can call the function * @notice Batch Function to Create Assets * @param _teamId The team identifier * @param _attributes The attributes * @param _playerOverrideId The player override identifier * @param _mlbPlayerId The mlb player identifier * @param _to To Address */ function batchCreateAsset( uint8[] _teamId, uint256[] _attributes, uint256[] _playerOverrideId, uint256[] _mlbPlayerId, address[] _to) external canCreate whenNotPaused { require (isBatchSupported); require (_teamId.length > 0 && _attributes.length > 0 && _playerOverrideId.length > 0 && _mlbPlayerId.length > 0 && _to.length > 0); uint256 assetDetails; uint256[5] memory _nftData; for(uint ii = 0; ii < _attributes.length; ii++){ require (_to[ii] != address(0) && _teamId[ii] != 0 && _attributes.length != 0 && _mlbPlayerId[ii] != 0); assetDetails = uint256(uint64(now)); assetDetails |= uint256(getSequenceId(_teamId[ii]))<<64; assetDetails |= uint256(_teamId[ii])<<96; assetDetails |= uint256((_attributes[ii]/1000000000000000000000000000000000000000)-800)<<104; _nftData = [assetDetails, _attributes[ii], 0, _playerOverrideId[ii], _mlbPlayerId[ii]]; _createNFTCollectible(_teamId[ii], _attributes[ii], _to[ii], 0, _nftData); } } /** * @dev A batch function to facilitate batching of asset creation for ETH Cards. canCreate modifier * helps in controlling who can call the function * @notice Batch Function to Create Assets * @param _teamId The team identifier * @param _attributes The attributes * @param _playerOverrideId The player override identifier * @param _mlbPlayerId The mlb player identifier * @param _to { parameter_description } */ function batchCreateETHCardAsset( uint8[] _teamId, uint256[] _attributes, uint256[] _playerOverrideId, uint256[] _mlbPlayerId, address[] _to) external canCreate whenNotPaused { require (isBatchSupported); require (_teamId.length > 0 && _attributes.length > 0 && _playerOverrideId.length > 0 && _mlbPlayerId.length > 0 && _to.length > 0); uint256 assetDetails; uint256[5] memory _nftData; for(uint ii = 0; ii < _attributes.length; ii++){ require (_to[ii] != address(0) && _teamId[ii] != 0 && _attributes.length != 0 && _mlbPlayerId[ii] != 0); assetDetails = uint256(uint64(now)); assetDetails |= uint256(getSequenceId(_teamId[ii]))<<64; assetDetails |= uint256(_teamId[ii])<<96; assetDetails |= uint256((_attributes[ii]/1000000000000000000000000000000000000000)-800)<<104; _nftData = [assetDetails, _attributes[ii], 0, _playerOverrideId[ii], _mlbPlayerId[ii]]; _createNFTCollectible(_teamId[ii], _attributes[ii], _to[ii], 2, _nftData); } } /** * @dev Overriden TransferFrom, with the modifier canTransfer which uses our attachment system * @notice Helps in trasnferring assets * @param _from the address sending from * @param _to the address sending to * @param _tokenId The token identifier */ function transferFrom( address _from, address _to, uint256 _tokenId ) public canTransfer(_tokenId) { // Asset should not be in play require (checkIsAttached(_tokenId) == 0); require (_from != address(0)); require (_to != address(0)); clearApproval(_from, _tokenId); removeTokenFrom(_from, _tokenId); addTokenTo(_to, _tokenId); emit Transfer(_from, _to, _tokenId); } /** * @dev Facilitates batch trasnfer of collectible with multiple TO Address, depending if batch is supported on contract. * @notice Batch Trasnfer with multpple TO addresses * @param _tokenIds The token identifiers * @param _fromB the address sending from * @param _toB the address sending to */ function multiBatchTransferFrom( uint256[] _tokenIds, address[] _fromB, address[] _toB) public { require (isBatchSupported); require (_tokenIds.length > 0 && _fromB.length > 0 && _toB.length > 0); uint256 _id; address _to; address _from; for (uint256 i = 0; i < _tokenIds.length; ++i) { require (_tokenIds[i] != 0 && _fromB[i] != 0 && _toB[i] != 0); _id = _tokenIds[i]; _to = _toB[i]; _from = _fromB[i]; transferFrom(_from, _to, _id); } } /** * @dev Facilitates batch trasnfer of collectible, depending if batch is supported on contract * @notice Batch TransferFrom with the same to & from address * @param _tokenIds The asset identifiers * @param _from the address sending from * @param _to the address sending to */ function batchTransferFrom(uint256[] _tokenIds, address _from, address _to) public { require (isBatchSupported); require (_tokenIds.length > 0 && _from != address(0) && _to != address(0)); uint256 _id; for (uint256 i = 0; i < _tokenIds.length; ++i) { require (_tokenIds[i] != 0); _id = _tokenIds[i]; transferFrom(_from, _to, _id); } } /** * @dev Facilitates batch trasnfer of collectible, depending if batch is supported on contract. * Checks for collectible 0,address 0 and then performs the transfer * @notice Batch SafeTransferFrom with multiple From and to Addresses * @param _tokenIds The asset identifiers * @param _fromB the address sending from * @param _toB the address sending to */ function multiBatchSafeTransferFrom( uint256[] _tokenIds, address[] _fromB, address[] _toB ) public { require (isBatchSupported); require (_tokenIds.length > 0 && _fromB.length > 0 && _toB.length > 0); uint256 _id; address _to; address _from; for (uint256 i = 0; i < _tokenIds.length; ++i) { require (_tokenIds[i] != 0 && _fromB[i] != 0 && _toB[i] != 0); _id = _tokenIds[i]; _to = _toB[i]; _from = _fromB[i]; safeTransferFrom(_from, _to, _id); } } /** * @dev Facilitates batch trasnfer of collectible, depending if batch is supported on contract. * Checks for collectible 0,address 0 and then performs the transfer * @notice Batch SafeTransferFrom from a single address to another address * @param _tokenIds The asset identifiers * @param _from the address sending from * @param _to the address sending to */ function batchSafeTransferFrom( uint256[] _tokenIds, address _from, address _to ) public { require (isBatchSupported); require (_tokenIds.length > 0 && _from != address(0) && _to != address(0)); uint256 _id; for (uint256 i = 0; i < _tokenIds.length; ++i) { require (_tokenIds[i] != 0); _id = _tokenIds[i]; safeTransferFrom(_from, _to, _id); } } /** * @notice Batch Function to approve the spender * @dev Helps to approve a batch of collectibles * @param _tokenIds The asset identifiers * @param _spender The spender */ function batchApprove( uint256[] _tokenIds, address _spender ) public { require (isBatchSupported); require (_tokenIds.length > 0 && _spender != address(0)); uint256 _id; for (uint256 i = 0; i < _tokenIds.length; ++i) { require (_tokenIds[i] != 0); _id = _tokenIds[i]; approve(_spender, _id); } } /** * @dev Batch Function to mark spender for approved for all. Does a check * for address(0) and throws if true * @notice Facilitates batch approveAll * @param _spenders The spenders * @param _approved The approved */ function batchSetApprovalForAll( address[] _spenders, bool _approved ) public { require (isBatchSupported); require (_spenders.length > 0); address _spender; for (uint256 i = 0; i < _spenders.length; ++i) { require (address(_spenders[i]) != address(0)); _spender = _spenders[i]; setApprovalForAll(_spender, _approved); } } /** * @dev Function to request Detachment from our Contract * @notice a wallet can request to detach it collectible, so, that it can be used in other third-party contracts. * @param _tokenId The token identifier */ function requestDetachment( uint256 _tokenId ) public { //Request can only be made by owner or approved address require (isApprovedOrOwner(msg.sender, _tokenId)); uint256 isAttached = checkIsAttached(_tokenId); //If collectible is on a gamecard prevent detachment require(getGameCardId(_tokenId) == 0); require (isAttached >= 1); if(attachedSystemActive == true) { //Checks to see if request was made and if time elapsed if(isAttached > 1 && block.timestamp - isAttached > detachmentTime) { isAttached = 0; } else if(isAttached > 1) { //Forces Tx Fail if time is already set for attachment and not less than detachmentTime require (isAttached == 1); } else { //Is attached, set detachment time and make request to detach // emit AssetUpdated(_tokenId); isAttached = block.timestamp; } } else { isAttached = 0; } updateIsAttached(_tokenId, isAttached); } /** * @dev Function to attach the asset, thus, restricting transfer * @notice Attaches the collectible to our contract * @param _tokenId The token identifier */ function attachAsset( uint256 _tokenId ) public canTransfer(_tokenId) { uint256 isAttached = checkIsAttached(_tokenId); require (isAttached == 0); isAttached = 1; updateIsAttached(_tokenId, isAttached); emit AssetUpdated(_tokenId); } /** * @dev Batch attach function * @param _tokenIds The identifiers */ function batchAttachAssets(uint256[] _tokenIds) public { require (isBatchSupported); for(uint i = 0; i < _tokenIds.length; i++) { attachAsset(_tokenIds[i]); } } /** * @dev Batch detach function * @param _tokenIds The identifiers */ function batchDetachAssets(uint256[] _tokenIds) public { require (isBatchSupported); for(uint i = 0; i < _tokenIds.length; i++) { requestDetachment(_tokenIds[i]); } } /** * @dev Function to facilitate detachment when contract is paused * @param _tokenId The identifiers */ function requestDetachmentOnPause (uint256 _tokenId) public whenPaused { //Request can only be made by owner or approved address require (isApprovedOrOwner(msg.sender, _tokenId)); updateIsAttached(_tokenId, 0); } /** * @dev Toggle the Attachment Switch * @param _state The state */ function toggleAttachedEnforcement (bool _state) public onlyManager { attachedSystemActive = _state; } /** * @dev Set Attachment Time Period (this restricts user from continuously trigger detachment) * @param _time The time */ function setDetachmentTime (uint256 _time) public onlyManager { //Detactment Time can not be set greater than 2 weeks. require (_time <= 1209600); detachmentTime = uint32(_time); } /** * @dev Detach Asset From System * @param _tokenId The token iddentifier */ function setNFTDetached(uint256 _tokenId) public anyOperator { require (checkIsAttached(_tokenId) > 0); updateIsAttached(_tokenId, 0); } /** * @dev Batch function to detach multiple assets * @param _tokenIds The token identifiers */ function setBatchDetachCollectibles(uint256[] _tokenIds) public anyOperator { uint256 _id; for(uint i = 0; i < _tokenIds.length; i++) { _id = _tokenIds[i]; setNFTDetached(_id); } } /** * @dev Function to update attach value * @param _tokenId The asset id * @param _isAttached Indicates if attached */ function updateIsAttached(uint256 _tokenId, uint256 _isAttached) internal { NFT memory obj = _getAttributesOfToken(_tokenId); obj.isAttached = _isAttached; allNFTs[_tokenId] = obj; emit AssetUpdated(_tokenId); } /** * @dev Facilitates Creating Sale using the Sale Contract. Forces owner check & collectibleId check * @notice Helps a wallet to create a sale using our Sale Contract * @param _tokenId The token identifier * @param _startingPrice The starting price * @param _endingPrice The ending price * @param _duration The duration */ function initiateCreateSale(uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration) external { require (_tokenId != 0); // If MLBNFT is already on any sale, this will throw // because it will be owned by the sale contract. address owner = ownerOf(_tokenId); require (owner == msg.sender); // Sale contract checks input sizes require (_startingPrice == _startingPrice); require (_endingPrice == _endingPrice); require (_duration == _duration); require (checkIsAttached(_tokenId) == 0); // One time approval for the tokenID _approveForSale(msg.sender, address(saleManagerAddress), _tokenId); saleManagerAddress.createSale(_tokenId, _startingPrice, _endingPrice, _duration, msg.sender); } /** * @dev Facilitates batch auction of collectibles, and enforeces strict checking on the collectibleId,starting/ending price, duration. * @notice Batch function to put 10 or less collectibles on sale * @param _tokenIds The token identifier * @param _startingPrices The starting price * @param _endingPrices The ending price * @param _durations The duration */ function batchCreateAssetSale(uint256[] _tokenIds, uint256[] _startingPrices, uint256[] _endingPrices, uint256[] _durations) external whenNotPaused { require (_tokenIds.length > 0 && _startingPrices.length > 0 && _endingPrices.length > 0 && _durations.length > 0); // Sale contract checks input sizes for(uint ii = 0; ii < _tokenIds.length; ii++){ // Do not process for tokenId 0 require (_tokenIds[ii] != 0); require (_startingPrices[ii] == _startingPrices[ii]); require (_endingPrices[ii] == _endingPrices[ii]); require (_durations[ii] == _durations[ii]); // If MLBNFT is already on any sale, this will throw // because it will be owned by the sale contract. address _owner = ownerOf(_tokenIds[ii]); address _msgSender = msg.sender; require (_owner == _msgSender); // Check whether the collectible is inPlay. If inPlay cant put it on Sale require (checkIsAttached(_tokenIds[ii]) == 0); // approve token to for Sale creation _approveForSale(msg.sender, address(saleManagerAddress), _tokenIds[ii]); saleManagerAddress.createSale(_tokenIds[ii], _startingPrices[ii], _endingPrices[ii], _durations[ii], msg.sender); } } }
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":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"},{"name":"_fromB","type":"address[]"},{"name":"_toB","type":"address[]"}],"name":"multiBatchSafeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_teamId","type":"uint8[]"},{"name":"_attributes","type":"uint256[]"},{"name":"_playerOverrideId","type":"uint256[]"},{"name":"_mlbPlayerId","type":"uint256[]"},{"name":"_to","type":"address[]"}],"name":"batchCreateAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"requestDetachment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_teamId","type":"uint8"},{"name":"_posId","type":"uint8"},{"name":"_attributes","type":"uint256"},{"name":"_owner","type":"address"},{"name":"_gameId","type":"uint256"},{"name":"_playerOverrideId","type":"uint256"},{"name":"_mlbPlayerId","type":"uint256"}],"name":"createETHCardCollectible","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spenders","type":"address[]"},{"name":"_approved","type":"bool"}],"name":"batchSetApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"detachmentTime","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"promoCreatedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"},{"name":"_fromB","type":"address[]"},{"name":"_toB","type":"address[]"}],"name":"multiBatchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"generationSeasonDict","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":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"otherManagers","outputs":[{"name":"","type":"uint8"}],"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":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"giftAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_saleManagerAddress","type":"address"}],"name":"setSaleManagerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_flag","type":"bool"}],"name":"updateBatchSupport","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"},{"name":"_spender","type":"address"}],"name":"batchApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_teamId","type":"uint8"},{"name":"_posId","type":"uint8"},{"name":"_attributes","type":"uint256"},{"name":"_owner","type":"address"},{"name":"_gameId","type":"uint256"},{"name":"_playerOverrideId","type":"uint256"},{"name":"_mlbPlayerId","type":"uint256"}],"name":"createRewardCollectible","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[],"name":"MLB_Legal","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"nftTeamIndexToCollectibleCount","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"contractsApprovedList","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_teamId","type":"uint8"},{"name":"_posId","type":"uint8"},{"name":"_attributes","type":"uint256"},{"name":"_owner","type":"address"},{"name":"_gameId","type":"uint256"},{"name":"_playerOverrideId","type":"uint256"},{"name":"_mlbPlayerId","type":"uint256"}],"name":"createSeedCollectible","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"checkIsAttached","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"removeFromApproveList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_time","type":"uint256"}],"name":"setDetachmentTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceSignature_ERC721Optional","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_gameCardNumber","type":"uint256"},{"name":"_playerId","type":"uint256"}],"name":"updateCurrentGameCardId","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"attachedSystemActive","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getGameCardId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_teamId","type":"uint8[]"},{"name":"_attributes","type":"uint256[]"},{"name":"_playerOverrideId","type":"uint256[]"},{"name":"_mlbPlayerId","type":"uint256[]"},{"name":"_to","type":"address[]"}],"name":"batchCreateETHCardAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isLSNFT","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"}],"name":"batchDetachAssets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getCollectibleDetails","outputs":[{"name":"isAttached","type":"uint256"},{"name":"sequenceId","type":"uint32"},{"name":"teamId","type":"uint8"},{"name":"positionId","type":"uint8"},{"name":"creationTime","type":"uint64"},{"name":"attributes","type":"uint256"},{"name":"playerOverrideId","type":"uint256"},{"name":"mlbGameId","type":"uint256"},{"name":"currentGameCardId","type":"uint256"},{"name":"mlbPlayerId","type":"uint256"},{"name":"earnedBy","type":"uint256"},{"name":"generationSeason","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_v2Address","type":"address"}],"name":"setNewAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardsRedeemed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getTeamId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_earnedBy","type":"uint256"}],"name":"updateEarnedBy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"},{"name":"_startingPrices","type":"uint256[]"},{"name":"_endingPrices","type":"uint256[]"},{"name":"_durations","type":"uint256[]"}],"name":"batchCreateAssetSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newGM","type":"address"}],"name":"setSecondaryManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getAbilitiesForCollectibleId","outputs":[{"name":"ability","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getPositionId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"removeAllAttachmentsFromCollectible","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"}],"name":"batchAttachAssets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"noError","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_season","type":"uint256"},{"name":"_value","type":"uint64"}],"name":"updateGenerationDict","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"},{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"batchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"},{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"batchSafeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_attachment","type":"uint256"}],"name":"addAttachmentToCollectible","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"nftCollectibleAttachments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isBatchSupported","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"}],"name":"setBatchDetachCollectibles","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"hasError","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint32"}],"name":"nftTeamIdToSequenceIdToCollectible","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"managerPrimary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_teamId","type":"uint8"},{"name":"_posId","type":"uint8"},{"name":"_attributes","type":"uint256"},{"name":"_owner","type":"address"},{"name":"_gameId","type":"uint256"},{"name":"_playerOverrideId","type":"uint256"},{"name":"_mlbPlayerId","type":"uint256"}],"name":"createPromoCollectible","outputs":[{"name":"","type":"uint256"}],"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":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"initiateCreateSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOp","type":"address"},{"name":"_state","type":"uint8"}],"name":"setOtherManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"seedCreatedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newGM","type":"address"}],"name":"setPrimaryManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"attachAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"error","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_state","type":"bool"}],"name":"toggleAttachedEnforcement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"addToApproveList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_season","type":"uint256"}],"name":"setGenerationSeasonController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"generationSeasonController","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleManagerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenURI","type":"string"}],"name":"setTokenURIBase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"requestDetachmentOnPause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getAssetAttachment","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"setNFTDetached","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_season","type":"uint256"},{"name":"_value","type":"uint8"}],"name":"updateGenerationStopTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_newOverrideId","type":"uint256"}],"name":"setPlayerOverrideId","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"bankManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ERC721_RECEIVED","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"managerSecondary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newBK","type":"address"}],"name":"setBanker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getPlayerId","outputs":[{"name":"playerId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"AssetUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Created","type":"event"},{"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"}]
Contract Creation Code
60806040526015805461ffff1916905560006016556037805460ff191660011790556039805460a060020a63ffffffff02191690553480156200004157600080fd5b506015805460ff1916600117905560118054600160a060020a03199081163390811790925560128054821683178155601380549092169092179055604080518082019091528181527f4c7563696453696768742d4d4c422d4e465400000000000000000000000000006020909101908152620000c191600491906200010d565b506040805180820190915260058082527f4d4c42434200000000000000000000000000000000000000000000000000000060209092019182526200010691816200010d565b50620001b2565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200015057805160ff191683800117855562000180565b8280016001018555821562000180579182015b828111156200018057825182559160200191906001019062000163565b506200018e92915062000192565b5090565b620001af91905b808211156200018e576000815560010162000199565b90565b61512080620001c26000396000f3006080604052600436106104605763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461046557806306fdde031461049b57806307ff141314610525578063081812fc146105ee578063095ea7b314610622578063098e652b146106465780630dec1c23146106965780631051db34146106ae578063116ea900146106c3578063173428591461070e57806318160ddd146107675780631b825e891461077c5780631d6b0b82146107aa57806321bcc5e5146107c257806322d4cda31461088957806323b872dd146108a157806323d7af24146108cb5780632f745c59146109025780633331f3911461092657806335f3cf851461094a578063362f74e71461096b57806338752e58146109855780633f4ba83a146109e557806341763225146109fa57806342842e0e14610a3357806342c81f4514610a5d57806343ef32c314610a725780634e8522fb14610a8a5780634f558e7914610aab5780634f6ccce714610ac35780634f6d04e714610adb5780635265440c14610b14578063568f57e114610b2c5780635bc8a67214610b4d5780635c975abb14610b65578063624de3d914610b7a5780636352211e14610bac578063635439ac14610bc45780636554d17914610bdf5780636653be1a14610bf45780636723eab514610c0c5780636a8d7eb3146106ae5780636af04a5714610c5c5780636ff2817c14610c7157806370994b3114610cc657806370a0823114610d515780637158798814610d7257806374f6164214610d935780637942857014610da85780637fcf64b214610dc05780637ff860f614610ddb578063825bdb7414610e1f57806382d4004114610e405780638456cb5914610e585780638462151c14610e6d57806385d19a2514610ede57806386a3171f14610ef65780638920641114610f0e5780638a53f23014610f635780638c1e04a614610f7857806391177db414610f9d5780639493f0121461100857806395d89b41146110735780639ad8b5b714611088578063a22cb465146110a3578063a678108e146110c9578063aaeaa36c146110e4578063abd44556146110f9578063ad5e46cb1461114e578063b478f15a14611163578063b777cad714611184578063b7dcf6a914611199578063b88d4fde146111d2578063b8bdf70114611241578063bb1d45fc14611262578063bb642f6514611289578063c0619c701461129e578063c0f64f43146112bf578063c79f8b62146112d7578063c7e59334146112ec578063c87b56dd14611306578063d0b368a01461131e578063d37990ce1461133f578063d8b61a7714611357578063d9a96f9b1461136f578063da2bbfc714611384578063dd280c7a146113dd578063de0b18f2146113f5578063e080241c1461140d578063e172a57e14611425578063e96d01d414611443578063e985e9c51461145e578063e9e2990e14611485578063ecc98ce41461149a578063ee70f392146114af578063f1ff732b146114c4578063f4385912146114e5575b600080fd5b34801561047157600080fd5b50610487600160e060020a0319600435166114fd565b604080519115158252519081900360200190f35b3480156104a757600080fd5b506104b06115ce565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104ea5781810151838201526020016104d2565b50505050905090810190601f1680156105175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561053157600080fd5b50604080516020600480358082013583810280860185019096528085526105ec95369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506116659650505050505050565b005b3480156105fa57600080fd5b506106066004356117a1565b60408051600160a060020a039092168252519081900360200190f35b34801561062e57600080fd5b506105ec600160a060020a03600435166024356117bc565b34801561065257600080fd5b506105ec6024600480358281019290820135918135808301929082013591604435808301929082013591606435808301929082013591608435918201910135611865565b3480156106a257600080fd5b506105ec600435611b20565b3480156106ba57600080fd5b50610487611bee565b3480156106cf57600080fd5b506106fc60ff60043581169060243516604435600160a060020a036064351660843560a43560c435611bf3565b60408051918252519081900360200190f35b34801561071a57600080fd5b50604080516020600480358082013583810280860185019096528085526105ec95369593946024949385019291829185019084908082843750949750505050913515159250611d17915050565b34801561077357600080fd5b506106fc611da9565b34801561078857600080fd5b50610791611daf565b6040805163ffffffff9092168252519081900360200190f35b3480156107b657600080fd5b506106fc600435611dd3565b3480156107ce57600080fd5b50604080516020600480358082013583810280860185019096528085526105ec95369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750611de79650505050505050565b34801561089557600080fd5b506106fc600435611f1a565b3480156108ad57600080fd5b506105ec600160a060020a0360043581169060243516604435611f2c565b3480156108d757600080fd5b506108ec600160a060020a03600435166120ef565b6040805160ff9092168252519081900360200190f35b34801561090e57600080fd5b506106fc600160a060020a0360043516602435612104565b34801561093257600080fd5b506105ec600160a060020a0360043516602435612151565b34801561095657600080fd5b506105ec600160a060020a036004351661216c565b34801561097757600080fd5b506105ec60043515156121d1565b34801561099157600080fd5b50604080516020600480358082013583810280860185019096528085526105ec9536959394602494938501929182918501908490808284375094975050509235600160a060020a0316935061221292505050565b3480156109f157600080fd5b506105ec6122a8565b348015610a0657600080fd5b506106fc60ff60043581169060243516604435600160a060020a036064351660843560a43560c4356122e0565b348015610a3f57600080fd5b506105ec600160a060020a03600435811690602435166044356123f4565b348015610a6957600080fd5b506104b0612537565b348015610a7e57600080fd5b506107916004356125e3565b348015610a9657600080fd5b50610487600160a060020a03600435166125fb565b348015610ab757600080fd5b50610487600435612610565b348015610acf57600080fd5b506106fc60043561262d565b348015610ae757600080fd5b506106fc60ff60043581169060243516604435600160a060020a036064351660843560a43560c435612662565b348015610b2057600080fd5b506106fc6004356126ff565b348015610b3857600080fd5b506105ec600160a060020a036004351661271d565b348015610b5957600080fd5b506105ec600435612793565b348015610b7157600080fd5b50610487612819565b348015610b8657600080fd5b50610b8f612822565b60408051600160e060020a03199092168252519081900360200190f35b348015610bb857600080fd5b50610606600435612846565b348015610bd057600080fd5b506105ec60043560243561286a565b348015610beb57600080fd5b50610487612943565b348015610c0057600080fd5b506106fc600435612953565b348015610c1857600080fd5b506105ec6024600480358281019290820135918135808301929082013591604435808301929082013591606435808301929082013591608435918201910135612971565b348015610c6857600080fd5b50610606612c0b565b348015610c7d57600080fd5b50604080516020600480358082013583810280860185019096528085526105ec95369593946024949385019291829185019084908082843750949750612c1a9650505050505050565b348015610cd257600080fd5b50610cde600435612c63565b604080519c8d5263ffffffff909b1660208d015260ff998a168c8c01529790981660608b015267ffffffffffffffff90951660808a015260a089019390935260c088019190915260e087015261010086015261012085015261014084019190915261016083015251908190036101800190f35b348015610d5d57600080fd5b506106fc600160a060020a0360043516612d32565b348015610d7e57600080fd5b506105ec600160a060020a0360043516612d65565b348015610d9f57600080fd5b506106fc612dfc565b348015610db457600080fd5b506106fc600435612e02565b348015610dcc57600080fd5b506105ec600435602435612e36565b348015610de757600080fd5b506105ec6024600480358281019290820135918135808301929082013591604435808301929082013591606435918201910135612e92565b348015610e2b57600080fd5b506105ec600160a060020a0360043516613140565b348015610e4c57600080fd5b506106fc6004356131a5565b348015610e6457600080fd5b506105ec6131c8565b348015610e7957600080fd5b50610e8e600160a060020a0360043516613215565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610eca578181015183820152602001610eb2565b505050509050019250505060405180910390f35b348015610eea57600080fd5b506106fc6004356132cd565b348015610f0257600080fd5b506105ec600435613302565b348015610f1a57600080fd5b50604080516020600480358082013583810280860185019096528085526105ec9536959394602494938501929182918501908490808284375094975061338f9650505050505050565b348015610f6f57600080fd5b506105ec6133d8565b348015610f8457600080fd5b506105ec60043567ffffffffffffffff60243516613424565b348015610fa957600080fd5b50604080516020600480358082013583810280860185019096528085526105ec9536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602090950135909416935061349d92505050565b34801561101457600080fd5b50604080516020600480358082013583810280860185019096528085526105ec9536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602090950135909416935061354892505050565b34801561107f57600080fd5b506104b06135f3565b34801561109457600080fd5b506105ec600435602435613654565b3480156110af57600080fd5b506105ec600160a060020a036004351660243515156136ef565b3480156110d557600080fd5b506106fc600435602435613773565b3480156110f057600080fd5b506104876137a3565b34801561110557600080fd5b50604080516020600480358082013583810280860185019096528085526105ec953695939460249493850192918291850190849080828437509497506137ac9650505050505050565b34801561115a57600080fd5b506105ec61384e565b34801561116f57600080fd5b506106fc60043563ffffffff6024351661389e565b34801561119057600080fd5b506106066138bb565b3480156111a557600080fd5b506106fc60ff60043581169060243516604435600160a060020a036064351660843560a43560c4356138ca565b3480156111de57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526105ec94600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506139829650505050505050565b34801561124d57600080fd5b506105ec600435602435604435606435613acc565b34801561126e57600080fd5b506105ec600160a060020a036004351660ff60243516613bc5565b34801561129557600080fd5b506106fc613c35565b3480156112aa57600080fd5b506105ec600160a060020a0360043516613c3b565b3480156112cb57600080fd5b506105ec600435613ca0565b3480156112e357600080fd5b50610487613e0d565b3480156112f857600080fd5b506105ec6004351515613e1b565b34801561131257600080fd5b506104b0600435613e7c565b34801561132a57600080fd5b506105ec600160a060020a0360043516613f24565b34801561134b57600080fd5b506105ec600435613f9c565b34801561136357600080fd5b506106fc600435614001565b34801561137b57600080fd5b50610606614013565b34801561139057600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526105ec9436949293602493928401919081908401838280828437509497506140229650505050505050565b3480156113e957600080fd5b506105ec60043561408b565b34801561140157600080fd5b50610e8e6004356140bc565b34801561141957600080fd5b506105ec600435614163565b34801561143157600080fd5b506105ec60043560ff602435166141d8565b34801561144f57600080fd5b506105ec60043560243561424b565b34801561146a57600080fd5b50610487600160a060020a03600435811690602435166142a7565b34801561149157600080fd5b506106066142d5565b3480156114a657600080fd5b50610b8f6142e4565b3480156114bb57600080fd5b50610606614308565b3480156114d057600080fd5b506105ec600160a060020a0360043516614317565b3480156114f157600080fd5b506106fc60043561437c565b6000600160e060020a031982167f01ffc9a70000000000000000000000000000000000000000000000000000000014806115605750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b806115945750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b806115c85750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b92915050565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561165a5780601f1061162f5761010080835404028352916020019161165a565b820191906000526020600020905b81548152906001019060200180831161163d57829003601f168201915b505050505090505b90565b60375460009081908190819060ff16151561167f57600080fd5b60008751118015611691575060008651115b801561169e575060008551115b15156116a957600080fd5b5060005b86518110156117985786818151811015156116c457fe5b906020019060200201516000141580156116ff575085818151811015156116e757fe5b90602001906020020151600160a060020a0316600014155b801561172c5750848181518110151561171457fe5b90602001906020020151600160a060020a0316600014155b151561173757600080fd5b868181518110151561174557fe5b906020019060200201519350848181518110151561175f57fe5b906020019060200201519250858181518110151561177957fe5b9060200190602002015191506117908284866123f4565b6001016116ad565b50505050505050565b600090815260016020526040902054600160a060020a031690565b60006117c782612846565b9050600160a060020a0383811690821614156117e257600080fd5b33600160a060020a03821614806117fe57506117fe81336142a7565b151561180957600080fd5b6000828152600160205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061186f614f95565b3360009081526038602052604081205460ff16806118975750601154600160a060020a031633145b806118ac5750601254600160a060020a031633145b15156118b757600080fd5b60155460ff16156118c757600080fd5b60375460ff1615156118d857600080fd5b60008c1180156118e8575060008a115b80156118f45750600088115b80156119005750600086115b801561190c5750600084115b151561191757600080fd5b5060005b89811015611b1157600085858381811061193157fe5b90506020020135600160a060020a0316600160a060020a03161415801561197157508c8c8281811061195f57fe5b9050602002013560ff1660ff16600014155b801561197c57508915155b801561199b575086868281811061198f57fe5b90506020020135600014155b15156119a657600080fd5b67ffffffffffffffff4216925060406119d68e8e848181106119c457fe5b9050602002013560ff1660ff166143c1565b63ffffffff169060020a028317925060608d8d8381811015156119f557fe5b9050602002013560ff1660ff169060020a028317925060686103207002f050fe938943acc45f655680000000008d8d858181101515611a3057fe5b90506020020135811515611a4057fe5b04039060020a028317925060a0604051908101604052808481526020018c8c848181101515611a6b57fe5b905060200201358152602001600081526020018a8a848181101515611a8c57fe5b9050602002013581526020018888848181101515611aa657fe5b905060200201358152509150611b088d8d838181101515611ac357fe5b9050602002013560ff168c8c848181101515611adb57fe5b905060200201358787858181101515611af057fe5b90506020020135600160a060020a03166000866143de565b5060010161191b565b50505050505050505050505050565b6000611b2c338361447a565b1515611b3757600080fd5b611b40826126ff565b9050611b4b82612953565b15611b5557600080fd5b6001811015611b6357600080fd5b60395460c060020a900460ff16151560011415611bdc57600181118015611bac575060395474010000000000000000000000000000000000000000900463ffffffff1642829003115b15611bb957506000611bd7565b6001811115611bd45760018114611bcf57600080fd5b611bd7565b50425b611be0565b5060005b611bea82826144d9565b5050565b600190565b600080600080611c01614f95565b3360009081526038602052604090205460ff1680611c295750601154600160a060020a031633145b80611c3e5750601254600160a060020a031633145b1515611c4957600080fd5b60155460ff1615611c5957600080fd5b889350600160a060020a0384161515611c7b57601154600160a060020a031693505b601680546001019055611c9060ff8d166143c1565b92504267ffffffffffffffff16915060408363ffffffff169060020a028217915060608c60ff169060020a028217915060688b60ff169060020a028217915060a0604051908101604052808381526020018b8152602001898152602001888152602001878152509050611d078c8b866002856143de565b9c9b505050505050505050505050565b603754600090819060ff161515611d2d57600080fd5b8351600010611d3b57600080fd5b5060005b8351811015611da3578351600090859083908110611d5957fe5b60209081029091010151600160a060020a03161415611d7757600080fd5b8381815181101515611d8557fe5b906020019060200201519150611d9b82846136ef565b600101611d3f565b50505050565b60085490565b60395474010000000000000000000000000000000000000000900463ffffffff1681565b601781601f8110611de057fe5b0154905081565b60375460009081908190819060ff161515611e0157600080fd5b60008751118015611e13575060008651115b8015611e20575060008551115b1515611e2b57600080fd5b5060005b8651811015611798578681815181101515611e4657fe5b90602001906020020151600014158015611e8157508581815181101515611e6957fe5b90602001906020020151600160a060020a0316600014155b8015611eae57508481815181101515611e9657fe5b90602001906020020151600160a060020a0316600014155b1515611eb957600080fd5b8681815181101515611ec757fe5b9060200190602002015193508481815181101515611ee157fe5b9060200190602002015192508581815181101515611efb57fe5b906020019060200201519150611f12828486611f2c565b600101611e2f565b60106020526000908152604090205481565b806000611f38826126ff565b90508060021415611fb357601154600160a060020a0316331480611f665750601254600160a060020a031633145b80611f7b5750601354600160a060020a031633145b80611f9857503360009081526014602052604090205460ff166001145b1515611fa357600080fd5b611fae8260006144d9565b61204c565b60395460c060020a900460ff1615156001148015611fd2575060018110155b1561203757601154600160a060020a0316331480611ffa5750601254600160a060020a031633145b8061200f5750601354600160a060020a031633145b8061202c57503360009081526014602052604090205460ff166001145b1515611fae57600080fd5b612041338361447a565b151561204c57600080fd5b612055836126ff565b1561205f57600080fd5b600160a060020a038516151561207457600080fd5b600160a060020a038416151561208957600080fd5b6120938584614586565b61209d85846145e8565b6120a784846146ef565b8284600160a060020a031686600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b60146020526000908152604090205460ff1681565b600061210f83612d32565b821061211a57600080fd5b600160a060020a038316600090815260066020526040902080548390811061213e57fe5b9060005260206000200154905092915050565b60155460ff161561216157600080fd5b611bea3383836123f4565b601154600160a060020a031633148061218f5750601254600160a060020a031633145b151561219a57600080fd5b600160a060020a03811615156121af57600080fd5b603a8054600160a060020a031916600160a060020a0392909216919091179055565b601154600160a060020a03163314806121f45750601254600160a060020a031633145b15156121ff57600080fd5b6037805460ff1916911515919091179055565b603754600090819060ff16151561222857600080fd5b600084511180156122415750600160a060020a03831615155b151561224c57600080fd5b5060005b8351811015611da357838181518110151561226757fe5b60209081029091010151151561227c57600080fd5b838181518110151561228a57fe5b9060200190602002015191506122a083836117bc565b600101612250565b601154600160a060020a03163314806122cb5750601254600160a060020a031633145b15156122d657600080fd5b6122de614738565b565b6000806000806122ee614f95565b3360009081526038602052604090205460ff16806123165750601154600160a060020a031633145b8061232b5750601254600160a060020a031633145b151561233657600080fd5b60155460ff161561234657600080fd5b889350600160a060020a038416151561236857601154600160a060020a031693505b60168054600101905561237d60ff8d166143c1565b92504267ffffffffffffffff16915060408363ffffffff169060020a028217915060608c60ff169060020a028217915060688b60ff169060020a028217915060a0604051908101604052808381526020018b8152602001898152602001888152602001878152509050611d078c8b866000856143de565b806000612400826126ff565b9050806002141561247b57601154600160a060020a031633148061242e5750601254600160a060020a031633145b806124435750601354600160a060020a031633145b8061246057503360009081526014602052604090205460ff166001145b151561246b57600080fd5b6124768260006144d9565b612514565b60395460c060020a900460ff161515600114801561249a575060018110155b156124ff57601154600160a060020a03163314806124c25750601254600160a060020a031633145b806124d75750601354600160a060020a031633145b806124f457503360009081526014602052604090205460ff166001145b151561247657600080fd5b612509338361447a565b151561251457600080fd5b6125308585856020604051908101604052806000815250613982565b5050505050565b60a060405190810160405280607c81526020017f4d616a6f72204c6561677565204261736562616c6c2074726164656d61726b7381526020017f20616e6420636f7079726967687473206172652075736564207769746820706581526020017f726d697373696f6e206f6620746865206170706c696361626c65204d4c42206581526020017f6e746974792e2020416c6c207269676874732072657365727665642e0000000081525081565b600d6020526000908152604090205463ffffffff1681565b60386020526000908152604090205460ff1681565b600090815260208190526040902054600160a060020a0316151590565b6000612637611da9565b821061264257600080fd5b600880548390811061265057fe5b90600052602060002001549050919050565b600080600080612670614f95565b3360009081526038602052604090205460ff16806126985750601154600160a060020a031633145b806126ad5750601254600160a060020a031633145b15156126b857600080fd5b60155460ff16156126c857600080fd5b889350600160a060020a03841615156126ea57601154600160a060020a031693505b60368054600101905561237d60ff8d166143c1565b6000612709614fb4565b61271283614783565b60e001519392505050565b601154600160a060020a03163314806127405750601254600160a060020a031633145b151561274b57600080fd5b600160a060020a03811660009081526038602052604090205460ff16151561277257600080fd5b600160a060020a03166000908152603860205260409020805460ff19169055565b601154600160a060020a03163314806127b65750601254600160a060020a031633145b15156127c157600080fd5b621275008111156127d157600080fd5b6039805463ffffffff909216740100000000000000000000000000000000000000000277ffffffff000000000000000000000000000000000000000019909216919091179055565b60155460ff1681565b7fb0aa71870000000000000000000000000000000000000000000000000000000081565b600081815260208190526040812054600160a060020a03168015156115c857600080fd5b612872614fb4565b60155460ff161561288257600080fd5b3360009081526038602052604090205460ff1615156128a057600080fd5b6128a982614783565b6020810184905290508215156128c557600060e08201526128cd565b600160e08201525b80600b838154811015156128dd57fe5b9060005260206000209060080201600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050505050565b60395460c060020a900460ff1681565b600061295d614fb4565b61296683614783565b602001519392505050565b600061297b614f95565b3360009081526038602052604081205460ff16806129a35750601154600160a060020a031633145b806129b85750601254600160a060020a031633145b15156129c357600080fd5b60155460ff16156129d357600080fd5b60375460ff1615156129e457600080fd5b60008c1180156129f4575060008a115b8015612a005750600088115b8015612a0c5750600086115b8015612a185750600084115b1515612a2357600080fd5b5060005b89811015611b11576000858583818110612a3d57fe5b90506020020135600160a060020a0316600160a060020a031614158015612a7d57508c8c82818110612a6b57fe5b9050602002013560ff1660ff16600014155b8015612a8857508915155b8015612aa75750868682818110612a9b57fe5b90506020020135600014155b1515612ab257600080fd5b67ffffffffffffffff421692506040612ad08e8e848181106119c457fe5b63ffffffff169060020a028317925060608d8d838181101515612aef57fe5b9050602002013560ff1660ff169060020a028317925060686103207002f050fe938943acc45f655680000000008d8d858181101515612b2a57fe5b90506020020135811515612b3a57fe5b04039060020a028317925060a0604051908101604052808481526020018c8c848181101515612b6557fe5b905060200201358152602001600081526020018a8a848181101515612b8657fe5b9050602002013581526020018888848181101515612ba057fe5b905060200201358152509150612c028d8d838181101515612bbd57fe5b9050602002013560ff168c8c848181101515612bd557fe5b905060200201358787858181101515612bea57fe5b90506020020135600160a060020a03166002866143de565b50600101612a27565b603954600160a060020a031681565b60375460009060ff161515612c2e57600080fd5b5060005b8151811015611bea57612c5b8282815181101515612c4c57fe5b90602001906020020151611b20565b600101612c32565b600080600080600080600080600080600080612c7d614fb4565b612c868e614783565b905080600001519750806020015194508060400151955080606001519650806080015193508060c00151985060408160c001519060020a90049b5060608160c001519060020a90049a5060688160c001519060020a900499508060e001519c508060a001519250601060006103e8620f42408460000151811515612d0657fe5b06811515612d1057fe5b0481526020019081526020016000205491505091939597999b5091939597999b565b6000600160a060020a0382161515612d4957600080fd5b50600160a060020a031660009081526002602052604090205490565b601154600160a060020a0316331480612d885750601254600160a060020a031633145b1515612d9357600080fd5b600160a060020a0381161515612da857600080fd5b60398054600160a060020a038316600160a060020a0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b60165481565b6000612e0c614fb4565b6000612e1784614783565b60c001516c01000000000000000000000000900460ff16949350505050565b601154600160a060020a0316331480612e595750601254600160a060020a031633145b1515612e6457600080fd5b60155460ff1615612e7457600080fd5b612e7d82612610565b1515612e8857600080fd5b611bea8282614812565b6015546000908190819060ff1615612ea957600080fd5b60008a118015612eb95750600088115b8015612ec55750600086115b8015612ed15750600084115b1515612edc57600080fd5b600092505b89831015613133578a8a84818110612ef557fe5b90506020020135600014151515612f0b57600080fd5b888884818110612f1757fe5b905060200201358989858181101515612f2c57fe5b90506020020135141515612f3f57600080fd5b868684818110612f4b57fe5b905060200201358787858181101515612f6057fe5b90506020020135141515612f7357600080fd5b848484818110612f7f57fe5b905060200201358585858181101515612f9457fe5b90506020020135141515612fa757600080fd5b612fc28b8b85818110612fb657fe5b90506020020135612846565b9150339050600160a060020a0382168114612fdc57600080fd5b612ff78b8b85818110612feb57fe5b905060200201356126ff565b1561300157600080fd5b603a5461302b903390600160a060020a03168d8d8781811061301f57fe5b905060200201356148d7565b603a54600160a060020a03166372a1b73f8c8c8681811061304857fe5b905060200201358b8b87818110151561305d57fe5b905060200201358a8a88818110151561307257fe5b90506020020135898989818110151561308757fe5b90506020020135336040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018086815260200185815260200184815260200183815260200182600160a060020a0316600160a060020a0316815260200195505050505050600060405180830381600087803b15801561310f57600080fd5b505af1158015613123573d6000803e3d6000fd5b505060019094019350612ee19050565b5050505050505050505050565b601154600160a060020a03163314806131635750601254600160a060020a031633145b151561316e57600080fd5b600160a060020a038116151561318357600080fd5b60128054600160a060020a031916600160a060020a0392909216919091179055565b60006131af614fb4565b60006131ba84614783565b516103e89006949350505050565b601154600160a060020a03163314806131eb5750601254600160a060020a031633145b15156131f657600080fd5b60155460ff161561320657600080fd5b6015805460ff19166001179055565b606060006060600080600061322987612d32565b94508415156132485760408051600081526020810190915295506132c3565b84604051908082528060200260200182016040528015613272578160200160208202803883390190505b50935061327e87612d32565b925060009150600090505b828110156132bf5761329b8782612104565b84838151811015156132a957fe5b6020908102909101015260019182019101613289565b8395505b5050505050919050565b60006132d7614fb4565b60006132e284614783565b60c001516d0100000000000000000000000000900460ff16949350505050565b601154600160a060020a03163314806133255750601254600160a060020a031633145b151561333057600080fd5b60155460ff161561334057600080fd5b61334981612610565b151561335457600080fd5b6000818152600e6020526040812061336b91614ffa565b6040805182815290516000805160206150d58339815191529181900360200190a150565b60375460009060ff1615156133a357600080fd5b5060005b8151811015611bea576133d082828151811015156133c157fe5b90602001906020020151613ca0565b6001016133a7565b601154600160a060020a03163314806133fb5750601254600160a060020a031633145b151561340657600080fd5b60155460ff16151561341757600080fd5b6015805461ff0019169055565b601154600160a060020a03163314806134475750601254600160a060020a031633145b151561345257600080fd5b60155460ff161561346257600080fd5b6000828152601060205260409020546001101561347e57600080fd5b60009182526010602052604090912067ffffffffffffffff9091169055565b603754600090819060ff1615156134b357600080fd5b600085511180156134cc5750600160a060020a03841615155b80156134e05750600160a060020a03831615155b15156134eb57600080fd5b5060005b845181101561253057848181518110151561350657fe5b60209081029091010151151561351b57600080fd5b848181518110151561352957fe5b906020019060200201519150613540848484611f2c565b6001016134ef565b603754600090819060ff16151561355e57600080fd5b600085511180156135775750600160a060020a03841615155b801561358b5750600160a060020a03831615155b151561359657600080fd5b5060005b84518110156125305784818151811015156135b157fe5b6020908102909101015115156135c657600080fd5b84818151811015156135d457fe5b9060200190602002015191506135eb8484846123f4565b60010161359a565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561165a5780601f1061162f5761010080835404028352916020019161165a565b601154600160a060020a03163314806136775750601254600160a060020a031633145b151561368257600080fd5b60155460ff161561369257600080fd5b61369b82612610565b15156136a657600080fd5b6000828152600e60209081526040808320805460018101825590845292829020909201839055815184815291516000805160206150d58339815191529281900390910190a15050565b600160a060020a03821633141561370557600080fd5b336000818152600360209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600e6020528160005260406000208181548110151561378e57fe5b90600052602060002001600091509150505481565b60375460ff1681565b6011546000908190600160a060020a03163314806137d45750601254600160a060020a031633145b806137e95750601354600160a060020a031633145b8061380657503360009081526014602052604090205460ff166001145b151561381157600080fd5b5060005b825181101561384957828181518110151561382c57fe5b90602001906020020151915061384182614163565b600101613815565b505050565b601154600160a060020a03163314806138715750601254600160a060020a031633145b151561387c57600080fd5b60155460ff16151561388d57600080fd5b6015805461ff001916610100179055565b600c60209081526000928352604080842090915290825290205481565b601154600160a060020a031681565b6000806000806138d8614f95565b3360009081526038602052604090205460ff16806139005750601154600160a060020a031633145b806139155750601254600160a060020a031633145b151561392057600080fd5b60155460ff161561393057600080fd5b889350600160a060020a038416151561395257601154600160a060020a031693505b600b546000101561397657601760ff8d16601f811061396d57fe5b01805460010190555b61237d8c60ff166143c1565b81600061398e826126ff565b90508060021415613a0957601154600160a060020a03163314806139bc5750601254600160a060020a031633145b806139d15750601354600160a060020a031633145b806139ee57503360009081526014602052604090205460ff166001145b15156139f957600080fd5b613a048260006144d9565b613aa2565b60395460c060020a900460ff1615156001148015613a28575060018110155b15613a8d57601154600160a060020a0316331480613a505750601254600160a060020a031633145b80613a655750601354600160a060020a031633145b80613a8257503360009081526014602052604090205460ff166001145b1515613a0457600080fd5b613a97338361447a565b1515613aa257600080fd5b613aad868686611f2c565b613ab9868686866149b8565b1515613ac457600080fd5b505050505050565b6000841515613ada57600080fd5b613ae385612846565b9050600160a060020a0381163314613afa57600080fd5b613b03856126ff565b15613b0d57600080fd5b603a54613b25903390600160a060020a0316876148d7565b603a54604080517f72a1b73f000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606481018590523360848201529051600160a060020a03909216916372a1b73f9160a48082019260009290919082900301818387803b158015613ba657600080fd5b505af1158015613bba573d6000803e3d6000fd5b505050505050505050565b601154600160a060020a0316331480613be85750601254600160a060020a031633145b1515613bf357600080fd5b600160a060020a0382161515613c0857600080fd5b600160a060020a03919091166000908152601460205260409020805460ff191660ff909216919091179055565b60365481565b601154600160a060020a0316331480613c5e5750601254600160a060020a031633145b1515613c6957600080fd5b600160a060020a0381161515613c7e57600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b6000816000613cae826126ff565b90508060021415613d2957601154600160a060020a0316331480613cdc5750601254600160a060020a031633145b80613cf15750601354600160a060020a031633145b80613d0e57503360009081526014602052604090205460ff166001145b1515613d1957600080fd5b613d248260006144d9565b613dc2565b60395460c060020a900460ff1615156001148015613d48575060018110155b15613dad57601154600160a060020a0316331480613d705750601254600160a060020a031633145b80613d855750601354600160a060020a031633145b80613da257503360009081526014602052604090205460ff166001145b1515613d2457600080fd5b613db7338361447a565b1515613dc257600080fd5b613dcb846126ff565b92508215613dd857600080fd5b60019250613de684846144d9565b6040805185815290516000805160206150d58339815191529181900360200190a150505050565b601554610100900460ff1681565b601154600160a060020a0316331480613e3e5750601254600160a060020a031633145b1515613e4957600080fd5b6039805491151560c060020a0278ff00000000000000000000000000000000000000000000000019909216919091179055565b6060613e8782612610565b1515613e9257600080fd5b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015613f185780601f10613eed57610100808354040283529160200191613f18565b820191906000526020600020905b815481529060010190602001808311613efb57829003601f168201915b50505050509050919050565b601154600160a060020a0316331480613f475750601254600160a060020a031633145b1515613f5257600080fd5b600160a060020a03811660009081526038602052604090205460ff1615613f7857600080fd5b600160a060020a03166000908152603860205260409020805460ff19166001179055565b601154600160a060020a0316331480613fbf5750601254600160a060020a031633145b1515613fca57600080fd5b60155460ff1615613fda57600080fd5b6000818152600f602052604090205415613ff357600080fd5b613ffe816001614b25565b50565b600f6020526000908152604090205481565b603a54600160a060020a031681565b601154600160a060020a03163314806140455750601254600160a060020a031633145b8061405a5750601354600160a060020a031633145b8061407757503360009081526014602052604090205460ff166001145b151561408257600080fd5b613ffe81614b3d565b60155460ff16151561409c57600080fd5b6140a6338261447a565b15156140b157600080fd5b613ffe8160006144d9565b6000818152600e60205260408120606091805b825481101561410d578183828154811015156140e757fe5b6000918252602080832090910154835460018181018655948452919092200155016140cf565b81546040805160208084028201810190925282815291849183018282801561415457602002820191906000526020600020905b815481526020019060010190808311614140575b50505050509350505050919050565b601154600160a060020a03163314806141865750601254600160a060020a031633145b8061419b5750601354600160a060020a031633145b806141b857503360009081526014602052604090205460ff166001145b15156141c357600080fd5b60006141ce826126ff565b116140b157600080fd5b601154600160a060020a03163314806141fb5750601254600160a060020a031633145b151561420657600080fd5b60155460ff161561421657600080fd5b6000828152600f60205260409020546001148015614236575060ff811615155b151561424157600080fd5b611bea8282614b25565b601154600160a060020a031633148061426e5750601254600160a060020a031633145b151561427957600080fd5b60155460ff161561428957600080fd5b61429282612610565b151561429d57600080fd5b611bea8282614b50565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b601354600160a060020a031681565b7f150b7a020000000000000000000000000000000000000000000000000000000081565b601254600160a060020a031681565b601154600160a060020a031633148061433a5750601254600160a060020a031633145b151561434557600080fd5b600160a060020a038116151561435a57600080fd5b60138054600160a060020a031916600160a060020a0392909216919091179055565b6000614386614fb4565b61438f83614783565b80519091506103e8906143b09067016345785d8a000063ffffffff614b8a16565b8115156143b957fe5b069392505050565b6000818152600d602052604090205463ffffffff16600101919050565b60008080806143f4620f424089066103e8614b8a565b6000818152600f602052604090205490935060011461441257600080fd5b61441e8960ff166143c1565b915061442b858888614bad565b60ff999099166000818152600c6020908152604080832063ffffffff969096168084529582528083208d9055928252600d905220805463ffffffff191690921790915550959695505050505050565b60008061448683612846565b905080600160a060020a031684600160a060020a031614806144c1575083600160a060020a03166144b6846117a1565b600160a060020a0316145b806144d157506144d181856142a7565b949350505050565b6144e1614fb4565b6144ea83614783565b60e08101839052600b805491925082918590811061450457fe5b600091825260209182902083516008909202019081558282015160018201556040808401516002830155606084015160038301556080840151600483015560a0840151600583015560c0840151600683015560e090930151600790910155815185815291516000805160206150d58339815191529281900390910190a1505050565b81600160a060020a031661459982612846565b600160a060020a0316146145ac57600080fd5b600081815260016020526040902054600160a060020a031615611bea5760009081526001602052604090208054600160a060020a031916905550565b60008060006145f78585614da9565b600084815260076020908152604080832054600160a060020a038916845260069092529091205490935061463290600163ffffffff614e3116565b600160a060020a03861660009081526006602052604090208054919350908390811061465a57fe5b90600052602060002001549050806006600087600160a060020a0316600160a060020a031681526020019081526020016000208481548110151561469a57fe5b6000918252602080832090910192909255600160a060020a03871681526006909152604090208054906146d1906000198301615018565b50600093845260076020526040808520859055908452909220555050565b60006146fb8383614e48565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b601154600160a060020a031633148061475b5750601254600160a060020a031633145b151561476657600080fd5b60155460ff16151561477757600080fd5b6015805460ff19169055565b61478b614fb4565b6000600b8381548110151561479c57fe5b9060005260206000209060080201905080610100604051908101604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481525050915050919050565b6000600b8381548110151561482357fe5b9060005260206000209060080201905081816005018190555080600b8481548110151561484c57fe5b906000526020600020906008020160008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401556005820154816005015560068201548160060155600782015481600701559050506000805160206150d5833981519152836040518082815260200191505060405180910390a1505050565b60006148e282612846565b9050600160a060020a0383811690821614156148fd57600080fd5b80600160a060020a031684600160a060020a03161480614922575061492281856142a7565b151561492d57600080fd5b6000614938836117a1565b600160a060020a03161415806149565750600160a060020a03831615155b15611da3576000828152600160205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918816917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b6000806149cd85600160a060020a0316614eca565b15156149dc5760019150614b1c565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015614a6f578181015183820152602001614a57565b50505050905090810190601f168015614a9c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614abe57600080fd5b505af1158015614ad2573d6000803e3d6000fd5b505050506040513d6020811015614ae857600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b6000918252600f602052604090912060ff9091169055565b8051611bea90600a90602084019061503c565b6000600b83815481101515614b6157fe5b9060005260206000209060080201905081816003018190555080600b8481548110151561484c57fe5b600080808311614b9957600080fd5b8284811515614ba457fe5b04949350505050565b6000614bb7614fb4565b50604080516101008101825260208681015182526000908201818152878401519383019384526060808901519084019081526080808a015190850190815260a085018481528a5160c0870190815260e087018a8152600b805460018101825597528751600888027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db981019190915595517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba87015597517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb86015592517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbc85015590517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbd840155517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbe830155517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbf82015592517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc09093019290925590614d5c8582614ed2565b60408051600160a060020a03871681526020810183905281517f0ce3610e89a4bb9ec9359763f99110ed52a4abaea0b62028a1637e242ca2768b929181900390910190a195945050505050565b81600160a060020a0316614dbc82612846565b600160a060020a031614614dcf57600080fd5b600160a060020a038216600090815260026020526040902054614df990600163ffffffff614e3116565b600160a060020a0390921660009081526002602090815260408083209490945591815290819052208054600160a060020a0319169055565b60008083831115614e4157600080fd5b5050900390565b600081815260208190526040902054600160a060020a031615614e6a57600080fd5b6000818152602081815260408083208054600160a060020a031916600160a060020a03871690811790915583526002909152902054614eaa906001614f21565b600160a060020a0390921660009081526002602052604090209190915550565b6000903b1190565b614edc8282614f3a565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b600082820183811015614f3357600080fd5b9392505050565b600160a060020a0382161515614f4f57600080fd5b614f5982826146ef565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60a0604051908101604052806005906020820280388339509192915050565b6101006040519081016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5080546000825590600052602060002090810190613ffe91906150ba565b815481835581811115613849576000838152602090206138499181019083016150ba565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061507d57805160ff19168380011785556150aa565b828001600101855582156150aa579182015b828111156150aa57825182559160200191906001019061508f565b506150b69291506150ba565b5090565b61166291905b808211156150b657600081556001016150c05600ec666837ce46f92c7ff76499d757ade0ebd48ddade4d6acbccdc17b4257372f3a165627a7a72305820b844c610420cdd36c8a3fb492ba0f595eacb52f350ee6bdad4aae6fb4b0665e00029
Deployed Bytecode
0x6080604052600436106104605763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461046557806306fdde031461049b57806307ff141314610525578063081812fc146105ee578063095ea7b314610622578063098e652b146106465780630dec1c23146106965780631051db34146106ae578063116ea900146106c3578063173428591461070e57806318160ddd146107675780631b825e891461077c5780631d6b0b82146107aa57806321bcc5e5146107c257806322d4cda31461088957806323b872dd146108a157806323d7af24146108cb5780632f745c59146109025780633331f3911461092657806335f3cf851461094a578063362f74e71461096b57806338752e58146109855780633f4ba83a146109e557806341763225146109fa57806342842e0e14610a3357806342c81f4514610a5d57806343ef32c314610a725780634e8522fb14610a8a5780634f558e7914610aab5780634f6ccce714610ac35780634f6d04e714610adb5780635265440c14610b14578063568f57e114610b2c5780635bc8a67214610b4d5780635c975abb14610b65578063624de3d914610b7a5780636352211e14610bac578063635439ac14610bc45780636554d17914610bdf5780636653be1a14610bf45780636723eab514610c0c5780636a8d7eb3146106ae5780636af04a5714610c5c5780636ff2817c14610c7157806370994b3114610cc657806370a0823114610d515780637158798814610d7257806374f6164214610d935780637942857014610da85780637fcf64b214610dc05780637ff860f614610ddb578063825bdb7414610e1f57806382d4004114610e405780638456cb5914610e585780638462151c14610e6d57806385d19a2514610ede57806386a3171f14610ef65780638920641114610f0e5780638a53f23014610f635780638c1e04a614610f7857806391177db414610f9d5780639493f0121461100857806395d89b41146110735780639ad8b5b714611088578063a22cb465146110a3578063a678108e146110c9578063aaeaa36c146110e4578063abd44556146110f9578063ad5e46cb1461114e578063b478f15a14611163578063b777cad714611184578063b7dcf6a914611199578063b88d4fde146111d2578063b8bdf70114611241578063bb1d45fc14611262578063bb642f6514611289578063c0619c701461129e578063c0f64f43146112bf578063c79f8b62146112d7578063c7e59334146112ec578063c87b56dd14611306578063d0b368a01461131e578063d37990ce1461133f578063d8b61a7714611357578063d9a96f9b1461136f578063da2bbfc714611384578063dd280c7a146113dd578063de0b18f2146113f5578063e080241c1461140d578063e172a57e14611425578063e96d01d414611443578063e985e9c51461145e578063e9e2990e14611485578063ecc98ce41461149a578063ee70f392146114af578063f1ff732b146114c4578063f4385912146114e5575b600080fd5b34801561047157600080fd5b50610487600160e060020a0319600435166114fd565b604080519115158252519081900360200190f35b3480156104a757600080fd5b506104b06115ce565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104ea5781810151838201526020016104d2565b50505050905090810190601f1680156105175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561053157600080fd5b50604080516020600480358082013583810280860185019096528085526105ec95369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506116659650505050505050565b005b3480156105fa57600080fd5b506106066004356117a1565b60408051600160a060020a039092168252519081900360200190f35b34801561062e57600080fd5b506105ec600160a060020a03600435166024356117bc565b34801561065257600080fd5b506105ec6024600480358281019290820135918135808301929082013591604435808301929082013591606435808301929082013591608435918201910135611865565b3480156106a257600080fd5b506105ec600435611b20565b3480156106ba57600080fd5b50610487611bee565b3480156106cf57600080fd5b506106fc60ff60043581169060243516604435600160a060020a036064351660843560a43560c435611bf3565b60408051918252519081900360200190f35b34801561071a57600080fd5b50604080516020600480358082013583810280860185019096528085526105ec95369593946024949385019291829185019084908082843750949750505050913515159250611d17915050565b34801561077357600080fd5b506106fc611da9565b34801561078857600080fd5b50610791611daf565b6040805163ffffffff9092168252519081900360200190f35b3480156107b657600080fd5b506106fc600435611dd3565b3480156107ce57600080fd5b50604080516020600480358082013583810280860185019096528085526105ec95369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750611de79650505050505050565b34801561089557600080fd5b506106fc600435611f1a565b3480156108ad57600080fd5b506105ec600160a060020a0360043581169060243516604435611f2c565b3480156108d757600080fd5b506108ec600160a060020a03600435166120ef565b6040805160ff9092168252519081900360200190f35b34801561090e57600080fd5b506106fc600160a060020a0360043516602435612104565b34801561093257600080fd5b506105ec600160a060020a0360043516602435612151565b34801561095657600080fd5b506105ec600160a060020a036004351661216c565b34801561097757600080fd5b506105ec60043515156121d1565b34801561099157600080fd5b50604080516020600480358082013583810280860185019096528085526105ec9536959394602494938501929182918501908490808284375094975050509235600160a060020a0316935061221292505050565b3480156109f157600080fd5b506105ec6122a8565b348015610a0657600080fd5b506106fc60ff60043581169060243516604435600160a060020a036064351660843560a43560c4356122e0565b348015610a3f57600080fd5b506105ec600160a060020a03600435811690602435166044356123f4565b348015610a6957600080fd5b506104b0612537565b348015610a7e57600080fd5b506107916004356125e3565b348015610a9657600080fd5b50610487600160a060020a03600435166125fb565b348015610ab757600080fd5b50610487600435612610565b348015610acf57600080fd5b506106fc60043561262d565b348015610ae757600080fd5b506106fc60ff60043581169060243516604435600160a060020a036064351660843560a43560c435612662565b348015610b2057600080fd5b506106fc6004356126ff565b348015610b3857600080fd5b506105ec600160a060020a036004351661271d565b348015610b5957600080fd5b506105ec600435612793565b348015610b7157600080fd5b50610487612819565b348015610b8657600080fd5b50610b8f612822565b60408051600160e060020a03199092168252519081900360200190f35b348015610bb857600080fd5b50610606600435612846565b348015610bd057600080fd5b506105ec60043560243561286a565b348015610beb57600080fd5b50610487612943565b348015610c0057600080fd5b506106fc600435612953565b348015610c1857600080fd5b506105ec6024600480358281019290820135918135808301929082013591604435808301929082013591606435808301929082013591608435918201910135612971565b348015610c6857600080fd5b50610606612c0b565b348015610c7d57600080fd5b50604080516020600480358082013583810280860185019096528085526105ec95369593946024949385019291829185019084908082843750949750612c1a9650505050505050565b348015610cd257600080fd5b50610cde600435612c63565b604080519c8d5263ffffffff909b1660208d015260ff998a168c8c01529790981660608b015267ffffffffffffffff90951660808a015260a089019390935260c088019190915260e087015261010086015261012085015261014084019190915261016083015251908190036101800190f35b348015610d5d57600080fd5b506106fc600160a060020a0360043516612d32565b348015610d7e57600080fd5b506105ec600160a060020a0360043516612d65565b348015610d9f57600080fd5b506106fc612dfc565b348015610db457600080fd5b506106fc600435612e02565b348015610dcc57600080fd5b506105ec600435602435612e36565b348015610de757600080fd5b506105ec6024600480358281019290820135918135808301929082013591604435808301929082013591606435918201910135612e92565b348015610e2b57600080fd5b506105ec600160a060020a0360043516613140565b348015610e4c57600080fd5b506106fc6004356131a5565b348015610e6457600080fd5b506105ec6131c8565b348015610e7957600080fd5b50610e8e600160a060020a0360043516613215565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610eca578181015183820152602001610eb2565b505050509050019250505060405180910390f35b348015610eea57600080fd5b506106fc6004356132cd565b348015610f0257600080fd5b506105ec600435613302565b348015610f1a57600080fd5b50604080516020600480358082013583810280860185019096528085526105ec9536959394602494938501929182918501908490808284375094975061338f9650505050505050565b348015610f6f57600080fd5b506105ec6133d8565b348015610f8457600080fd5b506105ec60043567ffffffffffffffff60243516613424565b348015610fa957600080fd5b50604080516020600480358082013583810280860185019096528085526105ec9536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602090950135909416935061349d92505050565b34801561101457600080fd5b50604080516020600480358082013583810280860185019096528085526105ec9536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602090950135909416935061354892505050565b34801561107f57600080fd5b506104b06135f3565b34801561109457600080fd5b506105ec600435602435613654565b3480156110af57600080fd5b506105ec600160a060020a036004351660243515156136ef565b3480156110d557600080fd5b506106fc600435602435613773565b3480156110f057600080fd5b506104876137a3565b34801561110557600080fd5b50604080516020600480358082013583810280860185019096528085526105ec953695939460249493850192918291850190849080828437509497506137ac9650505050505050565b34801561115a57600080fd5b506105ec61384e565b34801561116f57600080fd5b506106fc60043563ffffffff6024351661389e565b34801561119057600080fd5b506106066138bb565b3480156111a557600080fd5b506106fc60ff60043581169060243516604435600160a060020a036064351660843560a43560c4356138ca565b3480156111de57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526105ec94600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506139829650505050505050565b34801561124d57600080fd5b506105ec600435602435604435606435613acc565b34801561126e57600080fd5b506105ec600160a060020a036004351660ff60243516613bc5565b34801561129557600080fd5b506106fc613c35565b3480156112aa57600080fd5b506105ec600160a060020a0360043516613c3b565b3480156112cb57600080fd5b506105ec600435613ca0565b3480156112e357600080fd5b50610487613e0d565b3480156112f857600080fd5b506105ec6004351515613e1b565b34801561131257600080fd5b506104b0600435613e7c565b34801561132a57600080fd5b506105ec600160a060020a0360043516613f24565b34801561134b57600080fd5b506105ec600435613f9c565b34801561136357600080fd5b506106fc600435614001565b34801561137b57600080fd5b50610606614013565b34801561139057600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526105ec9436949293602493928401919081908401838280828437509497506140229650505050505050565b3480156113e957600080fd5b506105ec60043561408b565b34801561140157600080fd5b50610e8e6004356140bc565b34801561141957600080fd5b506105ec600435614163565b34801561143157600080fd5b506105ec60043560ff602435166141d8565b34801561144f57600080fd5b506105ec60043560243561424b565b34801561146a57600080fd5b50610487600160a060020a03600435811690602435166142a7565b34801561149157600080fd5b506106066142d5565b3480156114a657600080fd5b50610b8f6142e4565b3480156114bb57600080fd5b50610606614308565b3480156114d057600080fd5b506105ec600160a060020a0360043516614317565b3480156114f157600080fd5b506106fc60043561437c565b6000600160e060020a031982167f01ffc9a70000000000000000000000000000000000000000000000000000000014806115605750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b806115945750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b806115c85750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b92915050565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561165a5780601f1061162f5761010080835404028352916020019161165a565b820191906000526020600020905b81548152906001019060200180831161163d57829003601f168201915b505050505090505b90565b60375460009081908190819060ff16151561167f57600080fd5b60008751118015611691575060008651115b801561169e575060008551115b15156116a957600080fd5b5060005b86518110156117985786818151811015156116c457fe5b906020019060200201516000141580156116ff575085818151811015156116e757fe5b90602001906020020151600160a060020a0316600014155b801561172c5750848181518110151561171457fe5b90602001906020020151600160a060020a0316600014155b151561173757600080fd5b868181518110151561174557fe5b906020019060200201519350848181518110151561175f57fe5b906020019060200201519250858181518110151561177957fe5b9060200190602002015191506117908284866123f4565b6001016116ad565b50505050505050565b600090815260016020526040902054600160a060020a031690565b60006117c782612846565b9050600160a060020a0383811690821614156117e257600080fd5b33600160a060020a03821614806117fe57506117fe81336142a7565b151561180957600080fd5b6000828152600160205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061186f614f95565b3360009081526038602052604081205460ff16806118975750601154600160a060020a031633145b806118ac5750601254600160a060020a031633145b15156118b757600080fd5b60155460ff16156118c757600080fd5b60375460ff1615156118d857600080fd5b60008c1180156118e8575060008a115b80156118f45750600088115b80156119005750600086115b801561190c5750600084115b151561191757600080fd5b5060005b89811015611b1157600085858381811061193157fe5b90506020020135600160a060020a0316600160a060020a03161415801561197157508c8c8281811061195f57fe5b9050602002013560ff1660ff16600014155b801561197c57508915155b801561199b575086868281811061198f57fe5b90506020020135600014155b15156119a657600080fd5b67ffffffffffffffff4216925060406119d68e8e848181106119c457fe5b9050602002013560ff1660ff166143c1565b63ffffffff169060020a028317925060608d8d8381811015156119f557fe5b9050602002013560ff1660ff169060020a028317925060686103207002f050fe938943acc45f655680000000008d8d858181101515611a3057fe5b90506020020135811515611a4057fe5b04039060020a028317925060a0604051908101604052808481526020018c8c848181101515611a6b57fe5b905060200201358152602001600081526020018a8a848181101515611a8c57fe5b9050602002013581526020018888848181101515611aa657fe5b905060200201358152509150611b088d8d838181101515611ac357fe5b9050602002013560ff168c8c848181101515611adb57fe5b905060200201358787858181101515611af057fe5b90506020020135600160a060020a03166000866143de565b5060010161191b565b50505050505050505050505050565b6000611b2c338361447a565b1515611b3757600080fd5b611b40826126ff565b9050611b4b82612953565b15611b5557600080fd5b6001811015611b6357600080fd5b60395460c060020a900460ff16151560011415611bdc57600181118015611bac575060395474010000000000000000000000000000000000000000900463ffffffff1642829003115b15611bb957506000611bd7565b6001811115611bd45760018114611bcf57600080fd5b611bd7565b50425b611be0565b5060005b611bea82826144d9565b5050565b600190565b600080600080611c01614f95565b3360009081526038602052604090205460ff1680611c295750601154600160a060020a031633145b80611c3e5750601254600160a060020a031633145b1515611c4957600080fd5b60155460ff1615611c5957600080fd5b889350600160a060020a0384161515611c7b57601154600160a060020a031693505b601680546001019055611c9060ff8d166143c1565b92504267ffffffffffffffff16915060408363ffffffff169060020a028217915060608c60ff169060020a028217915060688b60ff169060020a028217915060a0604051908101604052808381526020018b8152602001898152602001888152602001878152509050611d078c8b866002856143de565b9c9b505050505050505050505050565b603754600090819060ff161515611d2d57600080fd5b8351600010611d3b57600080fd5b5060005b8351811015611da3578351600090859083908110611d5957fe5b60209081029091010151600160a060020a03161415611d7757600080fd5b8381815181101515611d8557fe5b906020019060200201519150611d9b82846136ef565b600101611d3f565b50505050565b60085490565b60395474010000000000000000000000000000000000000000900463ffffffff1681565b601781601f8110611de057fe5b0154905081565b60375460009081908190819060ff161515611e0157600080fd5b60008751118015611e13575060008651115b8015611e20575060008551115b1515611e2b57600080fd5b5060005b8651811015611798578681815181101515611e4657fe5b90602001906020020151600014158015611e8157508581815181101515611e6957fe5b90602001906020020151600160a060020a0316600014155b8015611eae57508481815181101515611e9657fe5b90602001906020020151600160a060020a0316600014155b1515611eb957600080fd5b8681815181101515611ec757fe5b9060200190602002015193508481815181101515611ee157fe5b9060200190602002015192508581815181101515611efb57fe5b906020019060200201519150611f12828486611f2c565b600101611e2f565b60106020526000908152604090205481565b806000611f38826126ff565b90508060021415611fb357601154600160a060020a0316331480611f665750601254600160a060020a031633145b80611f7b5750601354600160a060020a031633145b80611f9857503360009081526014602052604090205460ff166001145b1515611fa357600080fd5b611fae8260006144d9565b61204c565b60395460c060020a900460ff1615156001148015611fd2575060018110155b1561203757601154600160a060020a0316331480611ffa5750601254600160a060020a031633145b8061200f5750601354600160a060020a031633145b8061202c57503360009081526014602052604090205460ff166001145b1515611fae57600080fd5b612041338361447a565b151561204c57600080fd5b612055836126ff565b1561205f57600080fd5b600160a060020a038516151561207457600080fd5b600160a060020a038416151561208957600080fd5b6120938584614586565b61209d85846145e8565b6120a784846146ef565b8284600160a060020a031686600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b60146020526000908152604090205460ff1681565b600061210f83612d32565b821061211a57600080fd5b600160a060020a038316600090815260066020526040902080548390811061213e57fe5b9060005260206000200154905092915050565b60155460ff161561216157600080fd5b611bea3383836123f4565b601154600160a060020a031633148061218f5750601254600160a060020a031633145b151561219a57600080fd5b600160a060020a03811615156121af57600080fd5b603a8054600160a060020a031916600160a060020a0392909216919091179055565b601154600160a060020a03163314806121f45750601254600160a060020a031633145b15156121ff57600080fd5b6037805460ff1916911515919091179055565b603754600090819060ff16151561222857600080fd5b600084511180156122415750600160a060020a03831615155b151561224c57600080fd5b5060005b8351811015611da357838181518110151561226757fe5b60209081029091010151151561227c57600080fd5b838181518110151561228a57fe5b9060200190602002015191506122a083836117bc565b600101612250565b601154600160a060020a03163314806122cb5750601254600160a060020a031633145b15156122d657600080fd5b6122de614738565b565b6000806000806122ee614f95565b3360009081526038602052604090205460ff16806123165750601154600160a060020a031633145b8061232b5750601254600160a060020a031633145b151561233657600080fd5b60155460ff161561234657600080fd5b889350600160a060020a038416151561236857601154600160a060020a031693505b60168054600101905561237d60ff8d166143c1565b92504267ffffffffffffffff16915060408363ffffffff169060020a028217915060608c60ff169060020a028217915060688b60ff169060020a028217915060a0604051908101604052808381526020018b8152602001898152602001888152602001878152509050611d078c8b866000856143de565b806000612400826126ff565b9050806002141561247b57601154600160a060020a031633148061242e5750601254600160a060020a031633145b806124435750601354600160a060020a031633145b8061246057503360009081526014602052604090205460ff166001145b151561246b57600080fd5b6124768260006144d9565b612514565b60395460c060020a900460ff161515600114801561249a575060018110155b156124ff57601154600160a060020a03163314806124c25750601254600160a060020a031633145b806124d75750601354600160a060020a031633145b806124f457503360009081526014602052604090205460ff166001145b151561247657600080fd5b612509338361447a565b151561251457600080fd5b6125308585856020604051908101604052806000815250613982565b5050505050565b60a060405190810160405280607c81526020017f4d616a6f72204c6561677565204261736562616c6c2074726164656d61726b7381526020017f20616e6420636f7079726967687473206172652075736564207769746820706581526020017f726d697373696f6e206f6620746865206170706c696361626c65204d4c42206581526020017f6e746974792e2020416c6c207269676874732072657365727665642e0000000081525081565b600d6020526000908152604090205463ffffffff1681565b60386020526000908152604090205460ff1681565b600090815260208190526040902054600160a060020a0316151590565b6000612637611da9565b821061264257600080fd5b600880548390811061265057fe5b90600052602060002001549050919050565b600080600080612670614f95565b3360009081526038602052604090205460ff16806126985750601154600160a060020a031633145b806126ad5750601254600160a060020a031633145b15156126b857600080fd5b60155460ff16156126c857600080fd5b889350600160a060020a03841615156126ea57601154600160a060020a031693505b60368054600101905561237d60ff8d166143c1565b6000612709614fb4565b61271283614783565b60e001519392505050565b601154600160a060020a03163314806127405750601254600160a060020a031633145b151561274b57600080fd5b600160a060020a03811660009081526038602052604090205460ff16151561277257600080fd5b600160a060020a03166000908152603860205260409020805460ff19169055565b601154600160a060020a03163314806127b65750601254600160a060020a031633145b15156127c157600080fd5b621275008111156127d157600080fd5b6039805463ffffffff909216740100000000000000000000000000000000000000000277ffffffff000000000000000000000000000000000000000019909216919091179055565b60155460ff1681565b7fb0aa71870000000000000000000000000000000000000000000000000000000081565b600081815260208190526040812054600160a060020a03168015156115c857600080fd5b612872614fb4565b60155460ff161561288257600080fd5b3360009081526038602052604090205460ff1615156128a057600080fd5b6128a982614783565b6020810184905290508215156128c557600060e08201526128cd565b600160e08201525b80600b838154811015156128dd57fe5b9060005260206000209060080201600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050505050565b60395460c060020a900460ff1681565b600061295d614fb4565b61296683614783565b602001519392505050565b600061297b614f95565b3360009081526038602052604081205460ff16806129a35750601154600160a060020a031633145b806129b85750601254600160a060020a031633145b15156129c357600080fd5b60155460ff16156129d357600080fd5b60375460ff1615156129e457600080fd5b60008c1180156129f4575060008a115b8015612a005750600088115b8015612a0c5750600086115b8015612a185750600084115b1515612a2357600080fd5b5060005b89811015611b11576000858583818110612a3d57fe5b90506020020135600160a060020a0316600160a060020a031614158015612a7d57508c8c82818110612a6b57fe5b9050602002013560ff1660ff16600014155b8015612a8857508915155b8015612aa75750868682818110612a9b57fe5b90506020020135600014155b1515612ab257600080fd5b67ffffffffffffffff421692506040612ad08e8e848181106119c457fe5b63ffffffff169060020a028317925060608d8d838181101515612aef57fe5b9050602002013560ff1660ff169060020a028317925060686103207002f050fe938943acc45f655680000000008d8d858181101515612b2a57fe5b90506020020135811515612b3a57fe5b04039060020a028317925060a0604051908101604052808481526020018c8c848181101515612b6557fe5b905060200201358152602001600081526020018a8a848181101515612b8657fe5b9050602002013581526020018888848181101515612ba057fe5b905060200201358152509150612c028d8d838181101515612bbd57fe5b9050602002013560ff168c8c848181101515612bd557fe5b905060200201358787858181101515612bea57fe5b90506020020135600160a060020a03166002866143de565b50600101612a27565b603954600160a060020a031681565b60375460009060ff161515612c2e57600080fd5b5060005b8151811015611bea57612c5b8282815181101515612c4c57fe5b90602001906020020151611b20565b600101612c32565b600080600080600080600080600080600080612c7d614fb4565b612c868e614783565b905080600001519750806020015194508060400151955080606001519650806080015193508060c00151985060408160c001519060020a90049b5060608160c001519060020a90049a5060688160c001519060020a900499508060e001519c508060a001519250601060006103e8620f42408460000151811515612d0657fe5b06811515612d1057fe5b0481526020019081526020016000205491505091939597999b5091939597999b565b6000600160a060020a0382161515612d4957600080fd5b50600160a060020a031660009081526002602052604090205490565b601154600160a060020a0316331480612d885750601254600160a060020a031633145b1515612d9357600080fd5b600160a060020a0381161515612da857600080fd5b60398054600160a060020a038316600160a060020a0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b60165481565b6000612e0c614fb4565b6000612e1784614783565b60c001516c01000000000000000000000000900460ff16949350505050565b601154600160a060020a0316331480612e595750601254600160a060020a031633145b1515612e6457600080fd5b60155460ff1615612e7457600080fd5b612e7d82612610565b1515612e8857600080fd5b611bea8282614812565b6015546000908190819060ff1615612ea957600080fd5b60008a118015612eb95750600088115b8015612ec55750600086115b8015612ed15750600084115b1515612edc57600080fd5b600092505b89831015613133578a8a84818110612ef557fe5b90506020020135600014151515612f0b57600080fd5b888884818110612f1757fe5b905060200201358989858181101515612f2c57fe5b90506020020135141515612f3f57600080fd5b868684818110612f4b57fe5b905060200201358787858181101515612f6057fe5b90506020020135141515612f7357600080fd5b848484818110612f7f57fe5b905060200201358585858181101515612f9457fe5b90506020020135141515612fa757600080fd5b612fc28b8b85818110612fb657fe5b90506020020135612846565b9150339050600160a060020a0382168114612fdc57600080fd5b612ff78b8b85818110612feb57fe5b905060200201356126ff565b1561300157600080fd5b603a5461302b903390600160a060020a03168d8d8781811061301f57fe5b905060200201356148d7565b603a54600160a060020a03166372a1b73f8c8c8681811061304857fe5b905060200201358b8b87818110151561305d57fe5b905060200201358a8a88818110151561307257fe5b90506020020135898989818110151561308757fe5b90506020020135336040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018086815260200185815260200184815260200183815260200182600160a060020a0316600160a060020a0316815260200195505050505050600060405180830381600087803b15801561310f57600080fd5b505af1158015613123573d6000803e3d6000fd5b505060019094019350612ee19050565b5050505050505050505050565b601154600160a060020a03163314806131635750601254600160a060020a031633145b151561316e57600080fd5b600160a060020a038116151561318357600080fd5b60128054600160a060020a031916600160a060020a0392909216919091179055565b60006131af614fb4565b60006131ba84614783565b516103e89006949350505050565b601154600160a060020a03163314806131eb5750601254600160a060020a031633145b15156131f657600080fd5b60155460ff161561320657600080fd5b6015805460ff19166001179055565b606060006060600080600061322987612d32565b94508415156132485760408051600081526020810190915295506132c3565b84604051908082528060200260200182016040528015613272578160200160208202803883390190505b50935061327e87612d32565b925060009150600090505b828110156132bf5761329b8782612104565b84838151811015156132a957fe5b6020908102909101015260019182019101613289565b8395505b5050505050919050565b60006132d7614fb4565b60006132e284614783565b60c001516d0100000000000000000000000000900460ff16949350505050565b601154600160a060020a03163314806133255750601254600160a060020a031633145b151561333057600080fd5b60155460ff161561334057600080fd5b61334981612610565b151561335457600080fd5b6000818152600e6020526040812061336b91614ffa565b6040805182815290516000805160206150d58339815191529181900360200190a150565b60375460009060ff1615156133a357600080fd5b5060005b8151811015611bea576133d082828151811015156133c157fe5b90602001906020020151613ca0565b6001016133a7565b601154600160a060020a03163314806133fb5750601254600160a060020a031633145b151561340657600080fd5b60155460ff16151561341757600080fd5b6015805461ff0019169055565b601154600160a060020a03163314806134475750601254600160a060020a031633145b151561345257600080fd5b60155460ff161561346257600080fd5b6000828152601060205260409020546001101561347e57600080fd5b60009182526010602052604090912067ffffffffffffffff9091169055565b603754600090819060ff1615156134b357600080fd5b600085511180156134cc5750600160a060020a03841615155b80156134e05750600160a060020a03831615155b15156134eb57600080fd5b5060005b845181101561253057848181518110151561350657fe5b60209081029091010151151561351b57600080fd5b848181518110151561352957fe5b906020019060200201519150613540848484611f2c565b6001016134ef565b603754600090819060ff16151561355e57600080fd5b600085511180156135775750600160a060020a03841615155b801561358b5750600160a060020a03831615155b151561359657600080fd5b5060005b84518110156125305784818151811015156135b157fe5b6020908102909101015115156135c657600080fd5b84818151811015156135d457fe5b9060200190602002015191506135eb8484846123f4565b60010161359a565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561165a5780601f1061162f5761010080835404028352916020019161165a565b601154600160a060020a03163314806136775750601254600160a060020a031633145b151561368257600080fd5b60155460ff161561369257600080fd5b61369b82612610565b15156136a657600080fd5b6000828152600e60209081526040808320805460018101825590845292829020909201839055815184815291516000805160206150d58339815191529281900390910190a15050565b600160a060020a03821633141561370557600080fd5b336000818152600360209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600e6020528160005260406000208181548110151561378e57fe5b90600052602060002001600091509150505481565b60375460ff1681565b6011546000908190600160a060020a03163314806137d45750601254600160a060020a031633145b806137e95750601354600160a060020a031633145b8061380657503360009081526014602052604090205460ff166001145b151561381157600080fd5b5060005b825181101561384957828181518110151561382c57fe5b90602001906020020151915061384182614163565b600101613815565b505050565b601154600160a060020a03163314806138715750601254600160a060020a031633145b151561387c57600080fd5b60155460ff16151561388d57600080fd5b6015805461ff001916610100179055565b600c60209081526000928352604080842090915290825290205481565b601154600160a060020a031681565b6000806000806138d8614f95565b3360009081526038602052604090205460ff16806139005750601154600160a060020a031633145b806139155750601254600160a060020a031633145b151561392057600080fd5b60155460ff161561393057600080fd5b889350600160a060020a038416151561395257601154600160a060020a031693505b600b546000101561397657601760ff8d16601f811061396d57fe5b01805460010190555b61237d8c60ff166143c1565b81600061398e826126ff565b90508060021415613a0957601154600160a060020a03163314806139bc5750601254600160a060020a031633145b806139d15750601354600160a060020a031633145b806139ee57503360009081526014602052604090205460ff166001145b15156139f957600080fd5b613a048260006144d9565b613aa2565b60395460c060020a900460ff1615156001148015613a28575060018110155b15613a8d57601154600160a060020a0316331480613a505750601254600160a060020a031633145b80613a655750601354600160a060020a031633145b80613a8257503360009081526014602052604090205460ff166001145b1515613a0457600080fd5b613a97338361447a565b1515613aa257600080fd5b613aad868686611f2c565b613ab9868686866149b8565b1515613ac457600080fd5b505050505050565b6000841515613ada57600080fd5b613ae385612846565b9050600160a060020a0381163314613afa57600080fd5b613b03856126ff565b15613b0d57600080fd5b603a54613b25903390600160a060020a0316876148d7565b603a54604080517f72a1b73f000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606481018590523360848201529051600160a060020a03909216916372a1b73f9160a48082019260009290919082900301818387803b158015613ba657600080fd5b505af1158015613bba573d6000803e3d6000fd5b505050505050505050565b601154600160a060020a0316331480613be85750601254600160a060020a031633145b1515613bf357600080fd5b600160a060020a0382161515613c0857600080fd5b600160a060020a03919091166000908152601460205260409020805460ff191660ff909216919091179055565b60365481565b601154600160a060020a0316331480613c5e5750601254600160a060020a031633145b1515613c6957600080fd5b600160a060020a0381161515613c7e57600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b6000816000613cae826126ff565b90508060021415613d2957601154600160a060020a0316331480613cdc5750601254600160a060020a031633145b80613cf15750601354600160a060020a031633145b80613d0e57503360009081526014602052604090205460ff166001145b1515613d1957600080fd5b613d248260006144d9565b613dc2565b60395460c060020a900460ff1615156001148015613d48575060018110155b15613dad57601154600160a060020a0316331480613d705750601254600160a060020a031633145b80613d855750601354600160a060020a031633145b80613da257503360009081526014602052604090205460ff166001145b1515613d2457600080fd5b613db7338361447a565b1515613dc257600080fd5b613dcb846126ff565b92508215613dd857600080fd5b60019250613de684846144d9565b6040805185815290516000805160206150d58339815191529181900360200190a150505050565b601554610100900460ff1681565b601154600160a060020a0316331480613e3e5750601254600160a060020a031633145b1515613e4957600080fd5b6039805491151560c060020a0278ff00000000000000000000000000000000000000000000000019909216919091179055565b6060613e8782612610565b1515613e9257600080fd5b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015613f185780601f10613eed57610100808354040283529160200191613f18565b820191906000526020600020905b815481529060010190602001808311613efb57829003601f168201915b50505050509050919050565b601154600160a060020a0316331480613f475750601254600160a060020a031633145b1515613f5257600080fd5b600160a060020a03811660009081526038602052604090205460ff1615613f7857600080fd5b600160a060020a03166000908152603860205260409020805460ff19166001179055565b601154600160a060020a0316331480613fbf5750601254600160a060020a031633145b1515613fca57600080fd5b60155460ff1615613fda57600080fd5b6000818152600f602052604090205415613ff357600080fd5b613ffe816001614b25565b50565b600f6020526000908152604090205481565b603a54600160a060020a031681565b601154600160a060020a03163314806140455750601254600160a060020a031633145b8061405a5750601354600160a060020a031633145b8061407757503360009081526014602052604090205460ff166001145b151561408257600080fd5b613ffe81614b3d565b60155460ff16151561409c57600080fd5b6140a6338261447a565b15156140b157600080fd5b613ffe8160006144d9565b6000818152600e60205260408120606091805b825481101561410d578183828154811015156140e757fe5b6000918252602080832090910154835460018181018655948452919092200155016140cf565b81546040805160208084028201810190925282815291849183018282801561415457602002820191906000526020600020905b815481526020019060010190808311614140575b50505050509350505050919050565b601154600160a060020a03163314806141865750601254600160a060020a031633145b8061419b5750601354600160a060020a031633145b806141b857503360009081526014602052604090205460ff166001145b15156141c357600080fd5b60006141ce826126ff565b116140b157600080fd5b601154600160a060020a03163314806141fb5750601254600160a060020a031633145b151561420657600080fd5b60155460ff161561421657600080fd5b6000828152600f60205260409020546001148015614236575060ff811615155b151561424157600080fd5b611bea8282614b25565b601154600160a060020a031633148061426e5750601254600160a060020a031633145b151561427957600080fd5b60155460ff161561428957600080fd5b61429282612610565b151561429d57600080fd5b611bea8282614b50565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b601354600160a060020a031681565b7f150b7a020000000000000000000000000000000000000000000000000000000081565b601254600160a060020a031681565b601154600160a060020a031633148061433a5750601254600160a060020a031633145b151561434557600080fd5b600160a060020a038116151561435a57600080fd5b60138054600160a060020a031916600160a060020a0392909216919091179055565b6000614386614fb4565b61438f83614783565b80519091506103e8906143b09067016345785d8a000063ffffffff614b8a16565b8115156143b957fe5b069392505050565b6000818152600d602052604090205463ffffffff16600101919050565b60008080806143f4620f424089066103e8614b8a565b6000818152600f602052604090205490935060011461441257600080fd5b61441e8960ff166143c1565b915061442b858888614bad565b60ff999099166000818152600c6020908152604080832063ffffffff969096168084529582528083208d9055928252600d905220805463ffffffff191690921790915550959695505050505050565b60008061448683612846565b905080600160a060020a031684600160a060020a031614806144c1575083600160a060020a03166144b6846117a1565b600160a060020a0316145b806144d157506144d181856142a7565b949350505050565b6144e1614fb4565b6144ea83614783565b60e08101839052600b805491925082918590811061450457fe5b600091825260209182902083516008909202019081558282015160018201556040808401516002830155606084015160038301556080840151600483015560a0840151600583015560c0840151600683015560e090930151600790910155815185815291516000805160206150d58339815191529281900390910190a1505050565b81600160a060020a031661459982612846565b600160a060020a0316146145ac57600080fd5b600081815260016020526040902054600160a060020a031615611bea5760009081526001602052604090208054600160a060020a031916905550565b60008060006145f78585614da9565b600084815260076020908152604080832054600160a060020a038916845260069092529091205490935061463290600163ffffffff614e3116565b600160a060020a03861660009081526006602052604090208054919350908390811061465a57fe5b90600052602060002001549050806006600087600160a060020a0316600160a060020a031681526020019081526020016000208481548110151561469a57fe5b6000918252602080832090910192909255600160a060020a03871681526006909152604090208054906146d1906000198301615018565b50600093845260076020526040808520859055908452909220555050565b60006146fb8383614e48565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b601154600160a060020a031633148061475b5750601254600160a060020a031633145b151561476657600080fd5b60155460ff16151561477757600080fd5b6015805460ff19169055565b61478b614fb4565b6000600b8381548110151561479c57fe5b9060005260206000209060080201905080610100604051908101604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481525050915050919050565b6000600b8381548110151561482357fe5b9060005260206000209060080201905081816005018190555080600b8481548110151561484c57fe5b906000526020600020906008020160008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401556005820154816005015560068201548160060155600782015481600701559050506000805160206150d5833981519152836040518082815260200191505060405180910390a1505050565b60006148e282612846565b9050600160a060020a0383811690821614156148fd57600080fd5b80600160a060020a031684600160a060020a03161480614922575061492281856142a7565b151561492d57600080fd5b6000614938836117a1565b600160a060020a03161415806149565750600160a060020a03831615155b15611da3576000828152600160205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918816917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b6000806149cd85600160a060020a0316614eca565b15156149dc5760019150614b1c565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015614a6f578181015183820152602001614a57565b50505050905090810190601f168015614a9c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614abe57600080fd5b505af1158015614ad2573d6000803e3d6000fd5b505050506040513d6020811015614ae857600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b6000918252600f602052604090912060ff9091169055565b8051611bea90600a90602084019061503c565b6000600b83815481101515614b6157fe5b9060005260206000209060080201905081816003018190555080600b8481548110151561484c57fe5b600080808311614b9957600080fd5b8284811515614ba457fe5b04949350505050565b6000614bb7614fb4565b50604080516101008101825260208681015182526000908201818152878401519383019384526060808901519084019081526080808a015190850190815260a085018481528a5160c0870190815260e087018a8152600b805460018101825597528751600888027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db981019190915595517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba87015597517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb86015592517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbc85015590517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbd840155517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbe830155517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbf82015592517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc09093019290925590614d5c8582614ed2565b60408051600160a060020a03871681526020810183905281517f0ce3610e89a4bb9ec9359763f99110ed52a4abaea0b62028a1637e242ca2768b929181900390910190a195945050505050565b81600160a060020a0316614dbc82612846565b600160a060020a031614614dcf57600080fd5b600160a060020a038216600090815260026020526040902054614df990600163ffffffff614e3116565b600160a060020a0390921660009081526002602090815260408083209490945591815290819052208054600160a060020a0319169055565b60008083831115614e4157600080fd5b5050900390565b600081815260208190526040902054600160a060020a031615614e6a57600080fd5b6000818152602081815260408083208054600160a060020a031916600160a060020a03871690811790915583526002909152902054614eaa906001614f21565b600160a060020a0390921660009081526002602052604090209190915550565b6000903b1190565b614edc8282614f3a565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b600082820183811015614f3357600080fd5b9392505050565b600160a060020a0382161515614f4f57600080fd5b614f5982826146ef565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60a0604051908101604052806005906020820280388339509192915050565b6101006040519081016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5080546000825590600052602060002090810190613ffe91906150ba565b815481835581811115613849576000838152602090206138499181019083016150ba565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061507d57805160ff19168380011785556150aa565b828001600101855582156150aa579182015b828111156150aa57825182559160200191906001019061508f565b506150b69291506150ba565b5090565b61166291905b808211156150b657600081556001016150c05600ec666837ce46f92c7ff76499d757ade0ebd48ddade4d6acbccdc17b4257372f3a165627a7a72305820b844c610420cdd36c8a3fb492ba0f595eacb52f350ee6bdad4aae6fb4b0665e00029
Swarm Source
bzzr://b844c610420cdd36c8a3fb492ba0f595eacb52f350ee6bdad4aae6fb4b0665e0
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.