 														   decodeObject,
 														   decodeArray,
 														   decodeInteger,
+														   decodeUnsignedInteger,
 														   decodeFloat,
 														   decodeString,
 														   decodeUTFString,

														   decodeBoolean,
														   decodeBitmapData];
		
		private static function getTypeFlag(source : *) : int
		{
			if (source is int)
				return FLAG_INTEGER;
			if (source is Number)
				return FLAG_FLOAT;
			if (source is String)
				return FLAG_UTF_STRING;
			if (source is Array)
				return FLAG_ARRAY;
			if (source is ByteArray)
				return FLAG_BYTES;
			if (source is Boolean)
				return FLAG_BOOLEAN;
			if (source is BitmapData)
				return FLAG_BITMAP_DATA;
			if (getQualifiedClassName(source) == "Object")
				return FLAG_OBJECT;
			
			return FLAG_CUSTOM;
		}
		
		public static function encode(source : *) : ByteArray
		{
			var data 	: ByteArray = new ByteArray();
			
			encodeRecursive(source, data);
			
			data.position = 0;
			
			return data;
		}
		
		public static function decode(source : ByteArray) : *
		{
			return decodeRecursive(source);
		}
		
		public static function encodeRecursive(source : *, target : ByteArray) : void
		{
			var flag : int = getTypeFlag(source);
			
			target.writeByte(flag);
			ENCODERS[flag].call(null, source, target);
		}
		
		public static function decodeRecursive(source : ByteArray) : *
		{
			var flag : int = source.readByte();
			
			return DECODERS[flag].call(null, source);
		}

			return source.readInt();
		}
		
		private static function encodeUnsignedInteger(source : uint, target : ByteArray) : void
		{
			target.writeUnsignedInt(source);
		}
		
		private static function decodeUnsignedInteger(source : ByteArray) : uint
		{
			return source.readUnsignedInt();
		}

		private static function encodeFloat(source : Number, target : ByteArray) : void
		{
			target.writeFloat(source);
