contract CCNFTFactory {

   
    /** Public Functions */

    function getAssetDetails(uint256 _assetId) public view returns(
        uint256 assetId,
        uint256 ownersIndex,
        uint256 assetTypeSeqId,
        uint256 assetType,
        uint256 createdTimestamp,
        uint256 isAttached,
        address creator,
        address owner
    );

    function getAssetDetailsURI(uint256 _assetId) public view returns(
        uint256 assetId,
        uint256 ownersIndex,
        uint256 assetTypeSeqId,
        uint256 assetType,
        uint256 createdTimestamp,
        uint256 isAttached,
        address creator,
        address owner,
        string metaUriAddress
    );

    function getAssetRawMeta(uint256 _assetId) public view returns(
        uint256 dataA,
        uint128 dataB
    );

    function getAssetIdItemType(uint256 _assetId) public view returns(
        uint256 assetType
    );

    function getAssetIdTypeSequenceId(uint256 _assetId) public view returns(
        uint256 assetTypeSequenceId
    );
    
    function getIsNFTAttached( uint256 _tokenId) 
    public view returns(
        uint256 isAttached
    );

    function getAssetIdCreator(uint256 _assetId) public view returns(
        address creator
    );
    function getAssetIdOwnerAndOIndex(uint256 _assetId) public view returns(
        address owner,
        uint256 ownerIndex
    );
    function getAssetIdOwnerIndex(uint256 _assetId) public view returns(
        uint256 ownerIndex
    );

    function getAssetIdOwner(uint256 _assetId) public view returns(
        address owner
    );

    function spawnAsset(address _to, uint256 _assetType, uint256 _assetID, uint256 _isAttached) public;

    function isAssetIdOwnerOrApproved(address requesterAddress, uint256 _assetId) public view returns(
        bool
    );
    /// @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 NFT owners array looking for NFT belonging to owner),
    ///  but it also returns a dynamic array, which is only supported for web3 calls, and
    ///  not contract-to-contract calls.
    function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens);
    // Get the name of the Asset type
    function getTypeName (uint32 _type) public returns(string);
    function RequestDetachment(
        uint256 _tokenId
    )
        public;
    function AttachAsset(
        uint256 _tokenId
    )
        public;
    function BatchAttachAssets(uint256[10] _ids) public;
    function BatchDetachAssets(uint256[10] _ids) public;
    function RequestDetachmentOnPause (uint256 _tokenId) public;
    function burnAsset(uint256 _assetID) public;
    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;

}
function getTypeName (uint32 _type) public returns(string);

// Get the name of the Asset type