// Path: src/com/jumi/fbx/node/FBXNode.java
// public abstract class FBXNode {
// 
//     public int endOffset;
//     public int numProperties;
//     public int propertyListLength;
//     public int cursorPosition;
//     public int nameLength;
//     public String name;
//     public int sizeInBytes;
//     
//     public ArrayList<FBXProperty> properties = new ArrayList();
//     
//     // Constructor. Sets up some useful info about the node
//     public FBXNode(byte[] inputData, int propertyOffset) {
//         sizeInBytes = inputData.length;
// 
//         numProperties = getNumProperties(inputData);
// 
//         int propertyStartOffset = propertyOffset;
// 
//         for (int i = 0; i < numProperties; i++) {
//             FBXProperty newProp = new FBXProperty(inputData, propertyStartOffset);
//             propertyStartOffset += newProp.dataLength;
//             properties.add(newProp);
//         }
//         
//         cursorPosition = propertyStartOffset;
//     }
//    
//     public abstract void parseData(byte[] inputData, int propertyOffset);
// 
//     // Helper method to extract the data specific to this node
//     public final byte[] extractRawData(byte[] inputData, int startPosition, int endOffset) {
//         byte[] rawData = new byte[endOffset - startPosition];
// 
//         for (int i = 0; i < rawData.length; i++) {
//             rawData[i] = inputData[startPosition + i];
//         }
// 
//         return rawData;
//     }
// 
//     public final int getNumProperties(byte[] inputData) {
//         byte[] bytes = retrieveBytesFrom(inputData, 4, 4);
//         return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getInt();
//     }
//     
//     public final int getNumProperties(byte[] inputData, int startPosition) {
//         byte[] bytes = retrieveBytesFrom(inputData, 4, 4+startPosition);
//         return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getInt();
//     }
// 
//     public final String getName(byte[] inputData) {
//         nameLength = getNameLength(inputData);
//         return new String(retrieveBytesFrom(inputData, nameLength, 13));
//     }
// 
//     public final int getNameLength(byte[] inputData) {
//         return inputData[12];
//     }
// 
//     public final int getPropertyListLength(byte[] inputData) {
//         byte[] bytes = retrieveBytesFrom(inputData, 4, 8);
//         return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getInt();
//     }
// 
//     public final int getEndOffset(byte[] inputData, int startPosition) {
//         byte[] result = retrieveBytesFrom(inputData, 4, startPosition);
//         return ByteBuffer.wrap(result).order(ByteOrder.LITTLE_ENDIAN).getInt();
//     }
// 
//     public final static byte[] retrieveBytesFrom(byte[] inputData, int numBytes, int offSet) {
//         byte[] result = new byte[numBytes];
// 
//         for (int i = offSet; i < numBytes + offSet; i++) {
//             result[i - offSet] = inputData[i];
//         }
// 
//         return result;
//     }
// }


import com.jumi.fbx.node.FBXNode;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.DoubleBuffer;
import java.nio.IntBuffer;
import java.nio.LongBuffer;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;

                dataSizeInBytes = 8;
                parseArray(inputData);
                break;
            case 'l':
                dataType = "Long Array";
                dataSizeInBytes = 8;
                parseArray(inputData);
                break;
            case 'b':
                dataType = "Boolean Array";
                dataSizeInBytes = 1;
                parseArray(inputData);
                break;
            case 'S':
                dataType = "String";
                parseBinary(inputData);
                break;
            case 'R':
                dataType = "Raw Binary Data";
                parseBinary(inputData);
                break;
            default:
                System.err.println("Unknown property type! " + typeCode);
                System.exit(-1);
                break;
        }
    }
    
    /* Simply extract the binary data based on the data size */
    private void parseValue(byte[] inputData) {

// Path: src/com/jumi/fbx/node/FBXNode.java
// public abstract class FBXNode {
// 
//     public int endOffset;
//     public int numProperties;
//     public int propertyListLength;
//     public int cursorPosition;
//     public int nameLength;
//     public String name;
//     public int sizeInBytes;
//     
//     public ArrayList<FBXProperty> properties = new ArrayList();
//     
//     // Constructor. Sets up some useful info about the node
//     public FBXNode(byte[] inputData, int propertyOffset) {
//         sizeInBytes = inputData.length;
// 
//         numProperties = getNumProperties(inputData);
// 
//         int propertyStartOffset = propertyOffset;
// 
//         for (int i = 0; i < numProperties; i++) {
//             FBXProperty newProp = new FBXProperty(inputData, propertyStartOffset);
//             propertyStartOffset += newProp.dataLength;
//             properties.add(newProp);
//         }
//         
//         cursorPosition = propertyStartOffset;
//     }
//    
//     public abstract void parseData(byte[] inputData, int propertyOffset);
// 
//     // Helper method to extract the data specific to this node
//     public final byte[] extractRawData(byte[] inputData, int startPosition, int endOffset) {
//         byte[] rawData = new byte[endOffset - startPosition];
// 
//         for (int i = 0; i < rawData.length; i++) {
//             rawData[i] = inputData[startPosition + i];
//         }
// 
//         return rawData;
//     }
// 
//     public final int getNumProperties(byte[] inputData) {
//         byte[] bytes = retrieveBytesFrom(inputData, 4, 4);
//         return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getInt();
//     }
//     
//     public final int getNumProperties(byte[] inputData, int startPosition) {
//         byte[] bytes = retrieveBytesFrom(inputData, 4, 4+startPosition);
//         return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getInt();
//     }
// 
//     public final String getName(byte[] inputData) {
//         nameLength = getNameLength(inputData);
//         return new String(retrieveBytesFrom(inputData, nameLength, 13));
//     }
// 
//     public final int getNameLength(byte[] inputData) {
//         return inputData[12];
//     }
// 
//     public final int getPropertyListLength(byte[] inputData) {
//         byte[] bytes = retrieveBytesFrom(inputData, 4, 8);
//         return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getInt();
//     }
// 
//     public final int getEndOffset(byte[] inputData, int startPosition) {
//         byte[] result = retrieveBytesFrom(inputData, 4, startPosition);
//         return ByteBuffer.wrap(result).order(ByteOrder.LITTLE_ENDIAN).getInt();
//     }
// 
//     public final static byte[] retrieveBytesFrom(byte[] inputData, int numBytes, int offSet) {
//         byte[] result = new byte[numBytes];
// 
//         for (int i = offSet; i < numBytes + offSet; i++) {
//             result[i - offSet] = inputData[i];
//         }
// 
//         return result;
//     }
// }


// Path: src/com/jumi/fbx/objects/FBXProperty.java
import com.jumi.fbx.node.FBXNode;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.DoubleBuffer;
import java.nio.IntBuffer;
import java.nio.LongBuffer;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;

                dataSizeInBytes = 8;
                parseArray(inputData);
                break;
            case 'l':
                dataType = "Long Array";
                dataSizeInBytes = 8;
                parseArray(inputData);
                break;
            case 'b':
                dataType = "Boolean Array";
                dataSizeInBytes = 1;
                parseArray(inputData);
                break;
            case 'S':
                dataType = "String";
                parseBinary(inputData);
                break;
            case 'R':
                dataType = "Raw Binary Data";
                parseBinary(inputData);
                break;
            default:
                System.err.println("Unknown property type! " + typeCode);
                System.exit(-1);
                break;
        }
    }
    
    /* Simply extract the binary data based on the data size */
    private void parseValue(byte[] inputData) {

        binaryData = FBXNode.retrieveBytesFrom(inputData, dataSizeInBytes, startPosition + 1);
