public override void Deserialize( GenericReader reader ) 
		{ 
			base.Deserialize( reader ); 

			int version = reader.ReadInt(); 

			if (version == 0)
			{
				bool bNull;
				int iNull;
				bNull = reader.ReadBool(); //custom hues
				bNull = reader.ReadBool(); //m_Blessed
				bNull = reader.ReadBool(); //m_Bonded
				bNull = reader.ReadBool(); //m_Hued
				iNull = reader.ReadInt(); //m_BlessedPrice
				iNull = reader.ReadInt(); //m_BondedPrice
				iNull = reader.ReadInt(); //m_HuedPrice
				m_AccessLevel = (AccessLevel)reader.ReadInt(); 
				m_Currency = reader.ReadString();
				m_EditMode = reader.ReadBool(); 

				int size1 = reader.ReadInt();
				ArrayList alPrice = new ArrayList( size1 );
				for ( int i = 0; i < size1; ++i )
				{
					int price = reader.ReadInt();
					alPrice.Add( price );
				}

				int size4 = reader.ReadInt();
				ArrayList alNull = new ArrayList( size4 );
				for ( int i = 0; i < size4; ++i )
				{
					int hue = reader.ReadInt();
					alNull.Add( hue );
				}

				int size5 = reader.ReadInt();
				ArrayList alAmount = new ArrayList( size5 );
				for ( int i = 0; i < size5; ++i )
				{
					int itemamount = reader.ReadInt();
					alAmount.Add( itemamount );
				}

				int size2 = reader.ReadInt();
				ArrayList alItem = new ArrayList( size2 );
				for ( int i = 0; i < size2; ++i )
				{
					string item = reader.ReadString();
					alItem.Add( item );
				}

				int size3 = reader.ReadInt();
				ArrayList alName = new ArrayList( size3 );
				for ( int i = 0; i < size3; ++i )
				{
					string gumpname = reader.ReadString();
					alName.Add( gumpname );
				}

				int size6 = reader.ReadInt();
				alNull = new ArrayList( size6 );
				for ( int i = 0; i < size6; ++i )
				{
					int hueprices = reader.ReadInt();
					alNull.Add( hueprices );
				}
				//dispose of the not used arrays (bless.. bond...)
				alNull.Clear();
				for( int i = 0; i < alName.Count; i++ )
				{
					VSItem v = new VSItem( alItem[i].ToString(), alName[i].ToString(), (int)alPrice[i], (int)alAmount[i], false, 0, "" );
					ItemList.Add( v );
				}
				//dispose of the "old" arrays
				alItem.Clear();
				alName.Clear();
				alPrice.Clear();
				alAmount.Clear();
			}
			else switch( version )
			{
				case 2:
				case 1:
				case 0:
				{
					m_AccessLevel = (AccessLevel)reader.ReadInt(); 
					m_Currency = reader.ReadString();
					m_EditMode = reader.ReadBool(); 

					int size = reader.ReadInt();
					m_ItemList = new ArrayList( size );
					for ( int i = 0; i < size; ++i )
					{
						VSItem vsi = new VSItem();
						vsi.Deserialize( reader, version );
						m_ItemList.Add( vsi );
					}

					break;
				} 
			} 
		} 
                public VendorStoneEditGump( Mobile from, VSItem vsi, VendorStone stone ) : base( 125, 125 )
                {
			m_Stone = stone;
			m_VSI = vsi;

			m_Stone.CloseGumps( from );

			AddPage( 0 ); 

			AddBackground( 0, 0, 420, 300, 0x2436 );

			AddLabel( 13, 10, 1152, "Item Type:" );
			AddTextEntry( 83, 10, 100, 15, 1152, 0, m_VSI.Item );

			AddLabel( 13, 30, 1152, "Gump Name:" );
			AddTextEntry( 90, 30, 90, 15, 1152, 1, m_VSI.Name );

			AddLabel( 13, 50, 1152, "Price:" );
			AddTextEntry( 53, 50, 85, 15, 1152, 2, ""+m_VSI.Price );

			AddLabel( 13, 70, 1152, "Amount:" );
			AddTextEntry( 63, 70, 85, 15, 1152, 3, ""+m_VSI.Amount );

			AddCheck( 15, 90, 0x2342, 0x2343, m_VSI.BlessBond, 1 );
			AddLabel( 45, 90, 1152, "Bless/Bond:" );

			AddLabel( 13, 110, 1152, "Bless/Bond Price:" );
			AddTextEntry( 123, 110, 225, 15, 1152, 4, ""+m_VSI.BBPrice );

			AddLabel( 13, 130, 1152, "Description:" );
			AddTextEntry( 13, 150, 387, 75, 1152, 5, m_VSI.Description );

			AddButton( 15, 245, 4005, 4007, 2, GumpButtonType.Reply, 0 ); 
			AddLabel( 45, 245, 33, "Remove" );

			AddButton( 15, 265, 4005, 4007, 0, GumpButtonType.Reply, 0 ); 
			AddLabel( 45, 265, 33, "Back" );
			AddButton( 85, 265, 4005, 4007, 1, GumpButtonType.Reply, 0 ); 
			AddLabel( 115, 265, 33, "Apply" );
		}
                public VendorStoneBlessBondGump( Mobile from, VSItem vsi, VendorStone stone, ArrayList objects ) : base( 125, 125 )
                {
			m_Stone = stone;
			m_VSI = vsi;
			m_Objects = objects;

			m_Stone.CloseGumps( from );

			AddPage( 0 ); 

			AddBackground( 0, 0, 375, 85, 0x2436 );

			if ( objects.Count > 0 && objects[0] is Item )
				AddLabel( 13, 10, 1152, "Would you like to bless this item: '"+ vsi.Name +"'?" );
			else if ( objects.Count > 0 && objects[0] is Mobile )
				AddLabel( 13, 10, 1152, "Would you like to bond this pet: '"+ vsi.Name +"'?" );
			AddLabel( 13, 25, 1152, "Price: "+ vsi.BBPrice );

			AddButton( 15, 50, 4005, 4007, 0, GumpButtonType.Reply, 0 ); 
			AddLabel( 45, 50, 33, "No" );
			AddButton( 85, 50, 4005, 4007, 1, GumpButtonType.Reply, 0 ); 
			AddLabel( 115, 50, 33, "Yes" );
		}
		public override void OnResponse( NetState state, RelayInfo info )
		{
			Mobile from = state.Mobile; 

			if ( from == null )
				return;

			if ( info.ButtonID == 0 )
			{
				from.SendGump( new StaffVendorGump( from, m_Stone ) );
			}
			if ( info.ButtonID == 1 )
			{
				string item = "";
				string gumpname = "";
				int price = 0;
				int amount = 0;
				int bbprice = 0;
				bool blessbond = info.IsSwitched( 1 );
				string description = "";

				string[] tr = new string[ 6 ];
				foreach( TextRelay t in info.TextEntries )
				{
					tr[ t.EntryID ] = t.Text;
				}

				try { price = (int) uint.Parse( tr[ 2 ] ); } 
				catch {}
				try { amount = (int) uint.Parse( tr[ 3 ] ); } 
				catch {}
				try { bbprice = (int) uint.Parse( tr[ 4 ] ); } 
				catch {}
				if ( tr[ 0 ] != null )
					item = tr[ 0 ];
				if ( tr[ 1 ] != null )
					gumpname = tr[ 1 ];
				if ( tr[ 5 ] != null )
					description = tr[ 5 ];

				if ( amount <= 0 )
					amount = 1;

				if ( item != "" && gumpname != "" )
				{
					VSItem vsi = new VSItem( item, gumpname, price, amount, blessbond, bbprice, description );
					m_Stone.ItemList.Add( vsi );

					from.SendMessage( "Item Added." );
				}
				else
				{
					from.SendMessage( "You must set a property for each one." );
				}

				from.SendGump( new VendorStoneAddItemGump( from, m_Stone ) );
			}
		}