## Automatically generated incremental diff
## From:   linux-2.2.6-pre2
## To:     linux-2.2.6-pre3
## Robot:  $Id: make-incremental-diff,v 1.11 2002/02/20 02:59:33 hpa Exp $

diff -urN linux-2.2.6-pre2/arch/alpha/lib/io.c linux-2.2.6-pre3/arch/alpha/lib/io.c
--- linux-2.2.6-pre2/arch/alpha/lib/io.c	1998-09-06 10:34:33.000000000 -0700
+++ linux-2.2.6-pre3/arch/alpha/lib/io.c	2003-08-15 15:05:39.000000000 -0700
@@ -405,15 +405,16 @@
  * Copy data from "real" memory space to IO memory space.
  * This needs to be optimized.
  */
-void _memcpy_toio(unsigned long to, void * from, long count)
+void _memcpy_toio(unsigned long to, const void * from, long count)
 {
 	/* Optimize co-aligned transfers.  Everything else gets handled
 	   a byte at a time. */
+	/* FIXME -- align FROM.  */
 
 	if (count >= 8 && (to & 7) == ((long)from & 7)) {
 		count -= 8;
 		do {
-			writeq(*(u64 *)from, to);
+			writeq(*(const u64 *)from, to);
 			count -= 8;
 			to += 8;
 			from += 8;
@@ -424,7 +425,7 @@
 	if (count >= 4 && (to & 3) == ((long)from & 3)) {
 		count -= 4;
 		do {
-			writel(*(u32 *)from, to);
+			writel(*(const u32 *)from, to);
 			count -= 4;
 			to += 4;
 			from += 4;
@@ -435,7 +436,7 @@
 	if (count >= 2 && (to & 1) == ((long)from & 1)) {
 		count -= 2;
 		do {
-			writew(*(u16 *)from, to);
+			writew(*(const u16 *)from, to);
 			count -= 2;
 			to += 2;
 			from += 2;
@@ -444,7 +445,7 @@
 	}
 
 	while (count > 0) {
-		writeb(*(u8 *) from, to);
+		writeb(*(const u8 *) from, to);
 		count--;
 		to++;
 		from++;
diff -urN linux-2.2.6-pre2/arch/i386/kernel/io_apic.c linux-2.2.6-pre3/arch/i386/kernel/io_apic.c
--- linux-2.2.6-pre2/arch/i386/kernel/io_apic.c	2003-08-15 15:05:39.000000000 -0700
+++ linux-2.2.6-pre3/arch/i386/kernel/io_apic.c	2003-08-15 15:05:39.000000000 -0700
@@ -922,7 +922,7 @@
 
 		mp_irqs[pos].mpc_irqtype = mp_INT;
 		mp_irqs[pos].mpc_irqflag = 0;		/* default */
-		mp_irqs[pos].mpc_srcbus = bus_type;
+		mp_irqs[pos].mpc_srcbus = 0;
 		mp_irqs[pos].mpc_srcbusirq = i;
 		mp_irqs[pos].mpc_dstapic = 0;
 		mp_irqs[pos].mpc_dstirq = i;
@@ -1183,13 +1183,23 @@
 			 */
 			if (i < 16)
 				disable_8259A_irq(i);
-		} else
+		} else {
+			if (!IO_APIC_IRQ(i))
+				continue;
+
 			/*
-			 * we have no business changing low ISA
-			 * IRQs.
+			 * Hmm.. We don't have an entry for this,
+			 * so default to an old-fashioned 8259
+			 * interrupt if we can..
 			 */
-			if (IO_APIC_IRQ(i))
-				irq_desc[i].handler = &no_irq_type;
+			if (i < 16) {
+				make_8259A_irq(i);
+				continue;
+			}
+
+			/* Strange. Oh, well.. */
+			irq_desc[i].handler = &no_irq_type;
+		}
 	}
 	init_IRQ_SMP();
 }
diff -urN linux-2.2.6-pre2/arch/i386/kernel/irq.c linux-2.2.6-pre3/arch/i386/kernel/irq.c
--- linux-2.2.6-pre2/arch/i386/kernel/irq.c	1999-02-16 14:20:05.000000000 -0800
+++ linux-2.2.6-pre3/arch/i386/kernel/irq.c	2003-08-15 15:05:39.000000000 -0700
@@ -151,10 +151,7 @@
  */
 static unsigned int cached_irq_mask = 0xffff;
 
-#define __byte(x,y) (((unsigned char *)&(y))[x])
-#define __word(x,y) (((unsigned short *)&(y))[x])
-#define __long(x,y) (((unsigned int *)&(y))[x])
-
+#define __byte(x,y) 	(((unsigned char *)&(y))[x])
 #define cached_21	(__byte(0,cached_irq_mask))
 #define cached_A1	(__byte(1,cached_irq_mask))
 
@@ -207,7 +204,7 @@
 void make_8259A_irq(unsigned int irq)
 {
 	disable_irq(irq);
-	__long(0,io_apic_irqs) &= ~(1<<irq);
+	io_apic_irqs &= ~(1<<irq);
 	irq_desc[irq].handler = &i8259A_irq_type;
 	enable_irq(irq);
 }
diff -urN linux-2.2.6-pre2/arch/i386/kernel/mca.c linux-2.2.6-pre3/arch/i386/kernel/mca.c
--- linux-2.2.6-pre2/arch/i386/kernel/mca.c	1998-10-17 15:33:45.000000000 -0700
+++ linux-2.2.6-pre3/arch/i386/kernel/mca.c	2003-08-15 15:05:39.000000000 -0700
@@ -26,6 +26,9 @@
  *	- Added the 'driver_loaded' flag in MCA_adapter
  *	- Added an alternative implemention of ZP Gu's mca_find_unused_adapter
  *
+ *	David Weinehall March 24th, 1999
+ *	- Fixed the output of 'Driver Installed' in /proc/mca/pos
+ *	- Made the Integrated Video & SCSI show up even if they have id 0000
  */
 
 #include <linux/types.h>
@@ -49,12 +52,12 @@
  * Other miscellaneous information follows.
  */
 
-typedef enum {                                                                  
-	MCA_ADAPTER_NORMAL = 0,                                                 
-	MCA_ADAPTER_NONE = 1,                                                   
-	MCA_ADAPTER_DISABLED = 2,                                               
-	MCA_ADAPTER_ERROR = 3                                                   
-} MCA_AdapterStatus;    
+typedef enum {
+	MCA_ADAPTER_NORMAL = 0,
+	MCA_ADAPTER_NONE = 1,
+	MCA_ADAPTER_DISABLED = 2,
+	MCA_ADAPTER_ERROR = 3
+} MCA_AdapterStatus;
 
 struct MCA_adapter {
 	MCA_AdapterStatus status;	/* is there a valid adapter? */
@@ -69,16 +72,17 @@
 };
 
 struct MCA_info {
-/* one for each of the 8 possible slots, plus one for integrated SCSI
-   and one for integrated video. */
+	/* one for each of the 8 possible slots, plus one for integrated SCSI
+	 * and one for integrated video.
+	 */
 
 	struct MCA_adapter slot[MCA_NUMADAPTERS];
 
-/* two potential addresses for integrated SCSI adapter - this will      
- * track which one we think it is
- */                                       
+	/* two potential addresses for integrated SCSI adapter - this will
+	 * track which one we think it is.
+	 */
 
-	unsigned char which_scsi;  
+	unsigned char which_scsi;
 };
 
 /* The mca_info structure pointer. If MCA bus is present, the function
@@ -102,10 +106,10 @@
 
 #ifdef CONFIG_PROC_FS
 
-static void mca_do_proc_init( void );
-static int mca_default_procfn( char* buf, int slot );
+static void mca_do_proc_init(void);
+static int mca_default_procfn(char* buf, int slot);
 
-static ssize_t proc_mca_read( struct file*, char*, size_t, loff_t *);
+static ssize_t proc_mca_read(struct file*, char*, size_t, loff_t *);
 
 static struct file_operations proc_mca_operations = {
 	NULL,			/* array_lseek */
@@ -146,13 +150,13 @@
 
 /* Build the status info for the adapter */
 
-static void mca_configure_adapter_status( int slot ) {
+static void mca_configure_adapter_status(int slot) {
 	mca_info->slot[slot].status = MCA_ADAPTER_NONE;
 
 	mca_info->slot[slot].id = mca_info->slot[slot].pos[0]
 		+ (mca_info->slot[slot].pos[1] << 8);
 
-	if( !mca_info->slot[slot].id ) {
+	if(!mca_info->slot[slot].id && slot < MCA_MAX_SLOT_NR) {
 
 		/* id = 0x0000 usually indicates hardware failure,
 		 * however, ZP Gu (zpg@castle.net> reports that his 9556
@@ -162,7 +166,7 @@
 		mca_info->slot[slot].status = MCA_ADAPTER_ERROR;
 
 		return;
-	} else if( mca_info->slot[slot].id != 0xffff ) {
+	} else if(mca_info->slot[slot].id != 0xffff) {
 
 		/* 0xffff usually indicates that there's no adapter,
 		 * however, some integrated adapters may have 0xffff as
@@ -174,21 +178,21 @@
 		mca_info->slot[slot].status = MCA_ADAPTER_NORMAL;
 	}
 
-	if( (mca_info->slot[slot].id == 0xffff ||
-	     mca_info->slot[slot].id == 0x0000) && slot >= MCA_MAX_SLOT_NR ) {
+	if((mca_info->slot[slot].id == 0xffff ||
+	   mca_info->slot[slot].id == 0x0000) && slot >= MCA_MAX_SLOT_NR) {
 		int j;
 
-		for( j = 2; j < 8; j++ ) {
-			if( mca_info->slot[slot].pos[j] != 0xff ) {
+		for(j = 2; j < 8; j++) {
+			if(mca_info->slot[slot].pos[j] != 0xff) {
 				mca_info->slot[slot].status = MCA_ADAPTER_NORMAL;
 				break;
 			}
 		}
 	}
 
-	if( !(mca_info->slot[slot].pos[2] & MCA_ENABLED) ) {
+	if(!(mca_info->slot[slot].pos[2] & MCA_ENABLED)) {
 
-		/* enabled bit is in pos 2 */
+		/* enabled bit is in POS 2 */
 
 		mca_info->slot[slot].status = MCA_ADAPTER_DISABLED;
 	}
@@ -198,22 +202,22 @@
 
 __initfunc(void mca_init(void))
 {
-	unsigned int  i, j;
+	unsigned int i, j;
 	unsigned long flags;
 
 	/* WARNING: Be careful when making changes here. Putting an adapter
-	 * and the motherboard simultaneously into setup mode may result in 
-	 * damage to chips (according to The Indispensible PC Hardware Book 
-	 * by Hans-Peter Messmer). Also, we disable system interrupts (so  	
+	 * and the motherboard simultaneously into setup mode may result in
+	 * damage to chips (according to The Indispensible PC Hardware Book
+	 * by Hans-Peter Messmer). Also, we disable system interrupts (so
 	 * that we are not disturbed in the middle of this).
 	 */
 
 	/* Make sure the MCA bus is present */
 	
-	if (!MCA_bus)
+	if(!MCA_bus)
 		return;
-	printk( "Micro Channel bus detected.\n" );
-	save_flags( flags );
+	printk("Micro Channel bus detected.\n");
+	save_flags(flags);
 	cli();
 
 	/* Allocate MCA_info structure (at address divisible by 8) */
@@ -225,67 +229,68 @@
 	outb_p(0, MCA_ADAPTER_SETUP_REG);
 
 	/* Put motherboard into video setup mode, read integrated video 
-	 * pos registers, and turn motherboard setup off.
+	 * POS registers, and turn motherboard setup off.
 	 */
 
 	outb_p(0xdf, MCA_MOTHERBOARD_SETUP_REG);
 	mca_info->slot[MCA_INTEGVIDEO].name[0] = 0;
-	for (j=0; j<8; j++) {
-		mca_info->slot[MCA_INTEGVIDEO].pos[j] = inb_p(MCA_POS_REG(j)); 
+	for(j=0; j<8; j++) {
+		mca_info->slot[MCA_INTEGVIDEO].pos[j] = inb_p(MCA_POS_REG(j));
 	}
 	mca_configure_adapter_status(MCA_INTEGVIDEO);
 
 	/* Put motherboard into scsi setup mode, read integrated scsi
-	 * pos registers, and turn motherboard setup off.
+	 * POS registers, and turn motherboard setup off.
 	 *
-	 * It seems there are two possible SCSI registers.  Martin says that
+	 * It seems there are two possible SCSI registers. Martin says that
 	 * for the 56,57, 0xf7 is the one, but fails on the 76.
 	 * Alfredo (apena@vnet.ibm.com) says
-	 * 0xfd works on his machine.  We'll try both of them.  I figure it's
-	 * a good bet that only one could be valid at a time.  This could
+	 * 0xfd works on his machine. We'll try both of them. I figure it's
+	 * a good bet that only one could be valid at a time. This could
 	 * screw up though if one is used for something else on the other
 	 * machine.
 	 */
 
 	outb_p(0xf7, MCA_MOTHERBOARD_SETUP_REG);
 	mca_info->slot[MCA_INTEGSCSI].name[0] = 0;
-	for (j=0; j<8; j++)  {
-		if( (mca_info->slot[MCA_INTEGSCSI].pos[j] = inb_p(MCA_POS_REG(j))) != 0xff ) 
+	for(j=0; j<8; j++) {
+		if((mca_info->slot[MCA_INTEGSCSI].pos[j] = inb_p(MCA_POS_REG(j))) != 0xff) 
 		{
-			/* 0xff all across means no device.  0x00 means something's
-			 * broken, but a device is probably there.  However, if you get
-			 * 0x00 from a motherboard register it won't matter what we
-			 * find.  For the record, on the 57SLC, the integrated SCSI
-			 * adapter has 0xffff for the adapter ID, but nonzero for
-			 * other registers.
+			/* 0xff all across means no device. 0x00 means
+			 * something's broken, but a device is probably there.
+			 * However, if you get 0x00 from a motherboard
+			 * register it won't matter what we find.  For the
+			 * record, on the 57SLC, the integrated SCSI
+			 * adapter has 0xffff for the adapter ID, but
+			 * nonzero for other registers.
 			 */
 
 			mca_info->which_scsi = 0xf7;
 		}
 	}
-	if( !mca_info->which_scsi ) { 
+	if(!mca_info->which_scsi) { 
 
 		/* Didn't find it at 0xf7, try somewhere else... */
 		mca_info->which_scsi = 0xfd;
 
 		outb_p(0xfd, MCA_MOTHERBOARD_SETUP_REG);
-		for (j=0; j<8; j++) 
-			mca_info->slot[MCA_INTEGSCSI].pos[j] = inb_p(MCA_POS_REG(j)); 
+		for(j=0; j<8; j++) 
+			mca_info->slot[MCA_INTEGSCSI].pos[j] = inb_p(MCA_POS_REG(j));
 	}
 	mca_configure_adapter_status(MCA_INTEGSCSI);
 	
-	/* turn off motherboard setup */
+	/* Turn off motherboard setup */
 
 	outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
 
 	/* Now loop over MCA slots: put each adapter into setup mode, and
-	 * read its pos registers. Then put adapter setup off.
+	 * read its POS registers. Then put adapter setup off.
 	 */
 
-	for (i=0; i<MCA_MAX_SLOT_NR; i++) {
+	for(i=0; i<MCA_MAX_SLOT_NR; i++) {
 		outb_p(0x8|(i&0xf), MCA_ADAPTER_SETUP_REG);
-		for (j=0; j<8; j++) {
-			mca_info->slot[i].pos[j]=inb_p(MCA_POS_REG(j)); 
+		for(j=0; j<8; j++) {
+			mca_info->slot[i].pos[j]=inb_p(MCA_POS_REG(j));
 		}
 		mca_info->slot[i].name[0] = 0;
 		mca_info->slot[i].driver_loaded = 0;
@@ -295,7 +300,7 @@
 
 	/* Enable interrupts and return memory start */
 
-	restore_flags( flags );
+	restore_flags(flags);
 
 	request_region(0x60,0x01,"system control port B (MCA)");
 	request_region(0x90,0x01,"arbitration (MCA)");
@@ -312,89 +317,90 @@
 
 /*--------------------------------------------------------------------*/
 
-static void mca_handle_nmi_slot( int slot, int check_flag )
+static void mca_handle_nmi_slot(int slot, int check_flag)
 {
-        if( slot < MCA_MAX_SLOT_NR ) {                                          
-                printk( "NMI: caused by MCA adapter in slot %d (%s)\n", slot+1,
-                        mca_info->slot[slot].name );                            
-        } else if( slot == MCA_INTEGSCSI ) {                                    
-                printk( "NMI: caused by MCA integrated SCSI adapter (%s)\n",    
-                        mca_info->slot[slot].name );                            
-        } else if( slot == MCA_INTEGVIDEO ) {                                   
-                printk( "NMI: caused by MCA integrated video adapter (%s)\n",   
-                        mca_info->slot[slot].name );                            
-        }                                                                       
-                                                                                
-        /* more info available in pos 6 and 7? */                               
-
-        if( check_flag ) {                                                      
-                unsigned char pos6, pos7;                                       
-                                                                                
-                pos6 = mca_read_pos( slot, 6 );                                 
-                pos7 = mca_read_pos( slot, 7 );                                 
-                                                                                
-                printk( "NMI: POS 6 = 0x%x, POS 7 = 0x%x\n", pos6, pos7 );      
-        }                                                                       
-                                                                                
-} /* mca_handle_nmi_slot */                                                     
-                                                                                
-/*--------------------------------------------------------------------*/        
+	if(slot < MCA_MAX_SLOT_NR) {
+		printk("NMI: caused by MCA adapter in slot %d (%s)\n", slot+1,
+			mca_info->slot[slot].name);
+	} else if(slot == MCA_INTEGSCSI) {
+		printk("NMI: caused by MCA integrated SCSI adapter (%s)\n",
+			mca_info->slot[slot].name);
+	} else if(slot == MCA_INTEGVIDEO) {
+		printk("NMI: caused by MCA integrated video adapter (%s)\n",
+			mca_info->slot[slot].name);
+	}
+
+	/* More info available in POS 6 and 7? */
+
+	if(check_flag) {
+		unsigned char pos6, pos7;
+
+		pos6 = mca_read_pos(slot, 6);
+		pos7 = mca_read_pos(slot, 7);
+
+		printk("NMI: POS 6 = 0x%x, POS 7 = 0x%x\n", pos6, pos7);
+	}
+
+} /* mca_handle_nmi_slot */
+
+/*--------------------------------------------------------------------*/
 
-void mca_handle_nmi( void )
+void mca_handle_nmi(void)
 {
 
 	int i;
-        unsigned char pos5;                                                     
-                                                                                
-        /* First try - scan the various adapters and see if a specific          
-         * adapter was responsible for the error
-	 */                                
-
-        for( i = 0; i < MCA_NUMADAPTERS; i += 1 ) {                             
-                                                                                
-                /* bit 7 of POS 5 is reset when this adapter has a hardware     
-                 * error.  bit 7 it reset if there's error information
-                 * available in pos 6 and 7. */                                              
-                                                                                
-                pos5 = mca_read_pos( i, 5 );                                    
-                                                                                
-                if( !(pos5 & 0x80) ) {                                          
-                        mca_handle_nmi_slot( i, !(pos5 & 0x40) );               
-                        return;                                                 
-                }                                                               
-        }                                                                       
-                                                                                
-        /* if I recall correctly, there's a whole bunch of other things that    
-         * we can do to check for NMI problems, but that's all I know about
+	unsigned char pos5;
+
+	/* First try - scan the various adapters and see if a specific
+	 * adapter was responsible for the error.
+	 */
+
+	for(i = 0; i < MCA_NUMADAPTERS; i++) {
+
+	/* Bit 7 of POS 5 is reset when this adapter has a hardware
+	 * error. Bit 7 it reset if there's error information
+	 * available in POS 6 and 7.
+	 */
+
+	pos5 = mca_read_pos(i, 5);
+
+	if(!(pos5 & 0x80)) {
+			mca_handle_nmi_slot(i, !(pos5 & 0x40));
+			return;
+		}
+	}
+
+	/* If I recall correctly, there's a whole bunch of other things that
+	 * we can do to check for NMI problems, but that's all I know about
 	 * at the moment.
-	 */                                                          
+	 */
 
-        printk( "NMI generated from unknown source!\n" );                       
-} /* mca_handle_nmi */                                                          
+	printk("NMI generated from unknown source!\n");
+} /* mca_handle_nmi */
 
 /*--------------------------------------------------------------------*/
 
-int mca_find_adapter( int id, int start ) 
+int mca_find_adapter(int id, int start)
 {
-	if( mca_info == 0 || id == 0 || id == 0xffff ) {
+	if(mca_info == 0 || id == 0 || id == 0xffff) {
 		return MCA_NOTFOUND;
 	}
 
-	for( ; start >= 0 && start < MCA_NUMADAPTERS; start += 1 ) {
+	for(; start >= 0 && start < MCA_NUMADAPTERS; start++) {
 
-		/* not sure about this.  There's no point in returning
+		/* Not sure about this. There's no point in returning
 		 * adapters that aren't enabled, since they can't actually
-		 * be used.  However, they might be needed for statistical
+		 * be used. However, they might be needed for statistical
 		 * purposes or something... But if that is the case, the
 		 * user is free to write a routine that manually iterates
 		 * through the adapters.
 		 */
 
-		if( mca_info->slot[start].status == MCA_ADAPTER_DISABLED ) {
+		if(mca_info->slot[start].status == MCA_ADAPTER_DISABLED) {
 			continue;
 		}
 
-		if( id == mca_info->slot[start].id ) {
+		if(id == mca_info->slot[start].id) {
 			return start;
 		}
 	}
@@ -404,28 +410,28 @@
 
 /*--------------------------------------------------------------------*/
 
-int mca_find_unused_adapter( int id, int start ) 
+int mca_find_unused_adapter(int id, int start) 
 {
-	if( mca_info == 0 || id == 0 || id == 0xffff ) {
+	if(mca_info == 0 || id == 0 || id == 0xffff) {
 		return MCA_NOTFOUND;
 	}
 
-	for( ; start >= 0 && start < MCA_NUMADAPTERS; start += 1 ) {
+	for(; start >= 0 && start < MCA_NUMADAPTERS; start++) {
 
-		/* not sure about this.  There's no point in returning
+		/* not sure about this. There's no point in returning
 		 * adapters that aren't enabled, since they can't actually
-		 * be used.  However, they might be needed for statistical
+		 * be used. However, they might be needed for statistical
 		 * purposes or something... But if that is the case, the
 		 * user is free to write a routine that manually iterates
 		 * through the adapters.
 		 */
 
-		if( mca_info->slot[start].status == MCA_ADAPTER_DISABLED ||
-		    mca_info->slot[start].driver_loaded ) {
+		if(mca_info->slot[start].status == MCA_ADAPTER_DISABLED ||
+		   mca_info->slot[start].driver_loaded) {
 			continue;
 		}
 
-		if( id == mca_info->slot[start].id ) {
+		if(id == mca_info->slot[start].id) {
 			return start;
 		}
 	}
@@ -435,68 +441,68 @@
 
 /*--------------------------------------------------------------------*/
 
-unsigned char mca_read_stored_pos( int slot, int reg ) 
+unsigned char mca_read_stored_pos(int slot, int reg) 
 {
-	if( slot < 0 || slot >= MCA_NUMADAPTERS || mca_info == 0 ) return 0;
-	if( reg < 0 || reg >= 8 ) return 0;
+	if(slot < 0 || slot >= MCA_NUMADAPTERS || mca_info == 0) return 0;
+	if(reg < 0 || reg >= 8) return 0;
 	return mca_info->slot[slot].pos[reg];
 } /* mca_read_stored_pos() */
 
 /*--------------------------------------------------------------------*/
 
-unsigned char mca_read_pos( int slot, int reg ) 
+unsigned char mca_read_pos(int slot, int reg) 
 {
 	unsigned int byte = 0;
 	unsigned long flags;
 
-	if( slot < 0 || slot >= MCA_NUMADAPTERS || mca_info == 0 ) return 0;
-	if( reg < 0 || reg >= 8 ) return 0;
+	if(slot < 0 || slot >= MCA_NUMADAPTERS || mca_info == 0) return 0;
+	if(reg < 0 || reg >= 8) return 0;
 
-	save_flags( flags );
+	save_flags(flags);
 	cli();
 
-	/* make sure motherboard setup is off */
+	/* Make sure motherboard setup is off */
 
 	outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
 
-	/* read in the appropriate register */
+	/* Read in the appropriate register */
 
-	if( slot == MCA_INTEGSCSI && mca_info->which_scsi ) {
+	if(slot == MCA_INTEGSCSI && mca_info->which_scsi) {
 
-		/* disable adapter setup, enable motherboard setup */
+		/* Disable adapter setup, enable motherboard setup */
 
 		outb_p(0, MCA_ADAPTER_SETUP_REG);
 		outb_p(mca_info->which_scsi, MCA_MOTHERBOARD_SETUP_REG);
 
 		byte = inb_p(MCA_POS_REG(reg));
 		outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
-	} else if( slot == MCA_INTEGVIDEO ) {
+	} else if(slot == MCA_INTEGVIDEO) {
 
-		/* disable adapter setup, enable motherboard setup */
+		/* Disable adapter setup, enable motherboard setup */
 
 		outb_p(0, MCA_ADAPTER_SETUP_REG);
 		outb_p(0xdf, MCA_MOTHERBOARD_SETUP_REG);
 
 		byte = inb_p(MCA_POS_REG(reg));
 		outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
-	} else if( slot < MCA_MAX_SLOT_NR ) {
+	} else if(slot < MCA_MAX_SLOT_NR) {
 
-		/* make sure motherboard setup is off */
+		/* Make sure motherboard setup is off */
 
 		outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
 
-		/* read the appropriate register */
+		/* Read the appropriate register */
 
 		outb_p(0x8|(slot&0xf), MCA_ADAPTER_SETUP_REG);
 		byte = inb_p(MCA_POS_REG(reg));
 		outb_p(0, MCA_ADAPTER_SETUP_REG);
 	}
 
-	/* make sure the stored values are consistent, while we're here */
+	/* Make sure the stored values are consistent, while we're here */
 
 	mca_info->slot[slot].pos[reg] = byte;
 
-	restore_flags( flags );
+	restore_flags(flags);
 
 	return byte;
 } /* mca_read_pos() */
@@ -513,44 +519,47 @@
  * screws up.
  */
 
-void mca_write_pos( int slot, int reg, unsigned char byte ) 
+void mca_write_pos(int slot, int reg, unsigned char byte) 
 {
 	unsigned long flags;
 
-	if( slot < 0 || slot >= MCA_MAX_SLOT_NR ) return;
-	if( reg < 0 || reg >= 8 ) return;
-	if (mca_info == 0 )  return;
+	if(slot < 0 || slot >= MCA_MAX_SLOT_NR)
+		return;
+	if(reg < 0 || reg >= 8)
+		return;
+	if(mca_info == 0)
+		return;
 
-	save_flags( flags );
+	save_flags(flags);
 	cli();
 
-	/* make sure motherboard setup is off */
+	/* Make sure motherboard setup is off */
 
 	outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
 
-	/* read in the appropriate register */
+	/* Read in the appropriate register */
 
 	outb_p(0x8|(slot&0xf), MCA_ADAPTER_SETUP_REG);
-	outb_p( byte, MCA_POS_REG(reg) );
+	outb_p(byte, MCA_POS_REG(reg));
 	outb_p(0, MCA_ADAPTER_SETUP_REG);
 
-	restore_flags( flags );
+	restore_flags(flags);
 
-	/* update the global register list, while we have the byte */
+	/* Update the global register list, while we have the byte */
 
 	mca_info->slot[slot].pos[reg] = byte;
 } /* mca_write_pos() */
 
 /*--------------------------------------------------------------------*/
 
-void mca_set_adapter_name( int slot, char* name ) 
+void mca_set_adapter_name(int slot, char* name) 
 {
-	if( mca_info == 0 ) return;
+	if(mca_info == 0) return;
 
-	if( slot >= 0 && slot < MCA_NUMADAPTERS ) {
-		if( name != NULL ) {
-			strncpy( mca_info->slot[slot].name, name,
-				sizeof(mca_info->slot[slot].name)-1 );
+	if(slot >= 0 && slot < MCA_NUMADAPTERS) {
+		if(name != NULL) {
+			strncpy(mca_info->slot[slot].name, name,
+				sizeof(mca_info->slot[slot].name)-1);
 			mca_info->slot[slot].name[
 				sizeof(mca_info->slot[slot].name)-1] = 0;
 		} else {
@@ -559,61 +568,61 @@
 	}
 }
 
-void mca_set_adapter_procfn( int slot, MCA_ProcFn procfn, void* dev)
+void mca_set_adapter_procfn(int slot, MCA_ProcFn procfn, void* dev)
 {
-	if( mca_info == 0 ) return;
+	if(mca_info == 0) return;
 
-	if( slot >= 0 && slot < MCA_NUMADAPTERS ) {
+	if(slot >= 0 && slot < MCA_NUMADAPTERS) {
 		mca_info->slot[slot].procfn = procfn;
 		mca_info->slot[slot].dev = dev;
 	}
 }
 
-int mca_is_adapter_used( int slot )
+int mca_is_adapter_used(int slot)
 {
 	return mca_info->slot[slot].driver_loaded;
 }
 
-int mca_mark_as_used( int slot )
+int mca_mark_as_used(int slot)
 {
 	if(mca_info->slot[slot].driver_loaded) return 1;
 	mca_info->slot[slot].driver_loaded = 1;
 	return 0;
 }
 
-void mca_mark_as_unused( int slot )
+void mca_mark_as_unused(int slot)
 {
 	mca_info->slot[slot].driver_loaded = 0;
 }
  
-char *mca_get_adapter_name( int slot ) 
+char *mca_get_adapter_name(int slot) 
 {
-	if( mca_info == 0 ) return 0;
+	if(mca_info == 0) return 0;
 
-	if( slot >= 0 && slot < MCA_NUMADAPTERS ) {
+	if(slot >= 0 && slot < MCA_NUMADAPTERS) {
 		return mca_info->slot[slot].name;
 	}
 
 	return 0;
 }
 
-int mca_isadapter( int slot )
+int mca_isadapter(int slot)
 {
-	if( mca_info == 0 ) return 0;
+	if(mca_info == 0) return 0;
 
-	if( slot >= 0 && slot < MCA_NUMADAPTERS ) {
-		return (( mca_info->slot[slot].status == MCA_ADAPTER_NORMAL )
-			|| (mca_info->slot[slot].status == MCA_ADAPTER_DISABLED ) );
+	if(slot >= 0 && slot < MCA_NUMADAPTERS) {
+		return ((mca_info->slot[slot].status == MCA_ADAPTER_NORMAL)
+			|| (mca_info->slot[slot].status == MCA_ADAPTER_DISABLED));
 	}
 
 	return 0;
 }
 
-int mca_isenabled( int slot )
+int mca_isenabled(int slot)
 {
-	if( mca_info == 0 ) return 0;
+	if(mca_info == 0) return 0;
 
-	if( slot >= 0 && slot < MCA_NUMADAPTERS ) {
+	if(slot >= 0 && slot < MCA_NUMADAPTERS) {
 		return (mca_info->slot[slot].status == MCA_ADAPTER_NORMAL);
 	}
 
@@ -624,39 +633,37 @@
 
 #ifdef CONFIG_PROC_FS
 
-int  get_mca_info(char *buf) 
+int get_mca_info(char *buf) 
 {
-	int  i, j, len = 0; 
+	int i, j, len = 0;
 
-	if( MCA_bus && mca_info != 0 ) 
+	if(MCA_bus && mca_info != 0) 
 	{
-		/* Format pos registers of eight MCA slots */
+		/* Format POS registers of eight MCA slots */
 
-		for (i=0; i<MCA_MAX_SLOT_NR; i++) 
+		for(i=0; i<MCA_MAX_SLOT_NR; i++) 
 		{
 			len += sprintf(buf+len, "Slot %d: ", i+1);
-			for (j=0; j<8; j++) 
+			for(j=0; j<8; j++) 
 				len += sprintf(buf+len, "%02x ", mca_info->slot[i].pos[j]);
-			len += sprintf( buf+len, " %s\n", mca_info->slot[i].name );
-		}    
+			len += sprintf(buf+len, " %s\n", mca_info->slot[i].name);
+		}
 
-		/* Format pos registers of integrated video subsystem */
+		/* Format POS registers of integrated video subsystem */
 
 		len += sprintf(buf+len, "Video : ");
-		for (j=0; j<8; j++) 
+		for(j=0; j<8; j++) 
 			len += sprintf(buf+len, "%02x ", mca_info->slot[MCA_INTEGVIDEO].pos[j]);
-		len += sprintf( buf+len, " %s\n", mca_info->slot[MCA_INTEGVIDEO].name );
+		len += sprintf(buf+len, " %s\n", mca_info->slot[MCA_INTEGVIDEO].name);
 
-		/* Format pos registers of integrated SCSI subsystem */
+		/* Format POS registers of integrated SCSI subsystem */
 	
 		len += sprintf(buf+len, "SCSI  : ");
-		for (j=0; j<8; j++) 
+		for(j=0; j<8; j++)
 			len += sprintf(buf+len, "%02x ", mca_info->slot[MCA_INTEGSCSI].pos[j]);
-		len += sprintf( buf+len, " %s\n", mca_info->slot[MCA_INTEGSCSI].name );
-	} 
-	else 
-	{
-	  	/* Leave it empty if MCA not detected - this should *never*
+		len += sprintf(buf+len, " %s\n", mca_info->slot[MCA_INTEGSCSI].name);
+	} else {
+		/* Leave it empty if MCA not detected - this should *never*
 		 * happen! 
 		 */
 	}
@@ -667,119 +674,119 @@
 
 /*--------------------------------------------------------------------*/
 
-__initfunc(void mca_do_proc_init( void ))
+__initfunc(void mca_do_proc_init(void))
 {
 	int i = 0;
 	struct proc_dir_entry* node = 0;
 
-	if( mca_info == 0 ) return;	/* should never happen */
+	if(mca_info == 0) return;	/* Should never happen */
 
-	proc_register( &proc_mca, &(struct proc_dir_entry) {
+	proc_register(&proc_mca, &(struct proc_dir_entry) {
 		PROC_MCA_REGISTERS, 3, "pos", S_IFREG|S_IRUGO,
-		1, 0, 0, 0, &proc_mca_inode_operations,} );
+		1, 0, 0, 0, &proc_mca_inode_operations,});
 
-	proc_register( &proc_mca, &(struct proc_dir_entry) {
+	proc_register(&proc_mca, &(struct proc_dir_entry) {
 		PROC_MCA_MACHINE, 7, "machine", S_IFREG|S_IRUGO,
-		1, 0, 0, 0, &proc_mca_inode_operations,} );
+		1, 0, 0, 0, &proc_mca_inode_operations,});
 
-	/* initialize /proc/mca entries for existing adapters */
+	/* Initialize /proc/mca entries for existing adapters */
 
-	for( i = 0; i < MCA_NUMADAPTERS; i += 1 ) {
+	for(i = 0; i < MCA_NUMADAPTERS; i++) {
 		mca_info->slot[i].procfn = 0;
 		mca_info->slot[i].dev = 0;
 
-		if( ! mca_isadapter( i ) ) continue;
+		if(!mca_isadapter(i)) continue;
 		node = kmalloc(sizeof(struct proc_dir_entry), GFP_ATOMIC);
 
-		if( i < MCA_MAX_SLOT_NR ) {
+		if(i < MCA_MAX_SLOT_NR) {
 			node->low_ino = PROC_MCA_SLOT + i;
-			node->namelen = sprintf( mca_info->slot[i].procname,
-				"slot%d", i+1 );
-		} else if( i == MCA_INTEGVIDEO ) {
+			node->namelen = sprintf(mca_info->slot[i].procname,
+				"slot%d", i+1);
+		} else if(i == MCA_INTEGVIDEO) {
 			node->low_ino = PROC_MCA_VIDEO;
-			node->namelen = sprintf( mca_info->slot[i].procname,
-				"video" );
-		} else if( i == MCA_INTEGSCSI ) {
+			node->namelen = sprintf(mca_info->slot[i].procname,
+				"video");
+		} else if(i == MCA_INTEGSCSI) {
 			node->low_ino = PROC_MCA_SCSI;
-			node->namelen = sprintf( mca_info->slot[i].procname,
-				"scsi" );
+			node->namelen = sprintf(mca_info->slot[i].procname,
+				"scsi");
 		}
 		node->name = mca_info->slot[i].procname;
 		node->mode = S_IFREG | S_IRUGO;
 		node->ops = &proc_mca_inode_operations;
-		proc_register( &proc_mca, node );
+		proc_register(&proc_mca, node);
 	}
 
 } /* mca_do_proc_init() */
 
 /*--------------------------------------------------------------------*/
 
-int mca_default_procfn( char* buf, int slot ) 
+int mca_default_procfn(char* buf, int slot) 
 {
 	int len = 0, i;
 
-	/* this really shouldn't happen... */
+	/* This really shouldn't happen... */
 
-	if( mca_info == 0 ) {
+	if(mca_info == 0) {
 		*buf = 0;
 		return 0;
 	}
 
-	/* print out the basic information */
+	/* Print out the basic information */
 
-	if( slot < MCA_MAX_SLOT_NR ) {
-		len += sprintf( buf+len, "Slot: %d\n", slot+1 );
-	} else if( slot == MCA_INTEGSCSI ) {
-		len += sprintf( buf+len, "Integrated SCSI Adapter\n" );
-	} else if( slot == MCA_INTEGVIDEO ) {
-		len += sprintf( buf+len, "Integrated Video Adapter\n" );
+	if(slot < MCA_MAX_SLOT_NR) {
+		len += sprintf(buf+len, "Slot: %d\n", slot+1);
+	} else if(slot == MCA_INTEGSCSI) {
+		len += sprintf(buf+len, "Integrated SCSI Adapter\n");
+	} else if(slot == MCA_INTEGVIDEO) {
+		len += sprintf(buf+len, "Integrated Video Adapter\n");
 	}
-	if( mca_info->slot[slot].name[0] ) {
+	if(mca_info->slot[slot].name[0]) {
 
-		/* drivers might register a name without /proc handler... */
+		/* Drivers might register a name without /proc handler... */
 
-		len += sprintf( buf+len, "Adapter Name: %s\n",
-			mca_info->slot[slot].name );
+		len += sprintf(buf+len, "Adapter Name: %s\n",
+			mca_info->slot[slot].name);
 	} else {
-		len += sprintf( buf+len, "Adapter Name: Unknown\n" );
+		len += sprintf(buf+len, "Adapter Name: Unknown\n");
 	}
-	len += sprintf( buf+len, "Id: %02x%02x\n",
-		mca_info->slot[slot].pos[1], mca_info->slot[slot].pos[0] );
-	len += sprintf( buf+len, "Enabled: %s\nPOS: ",
-		mca_isenabled(slot) ? "Yes" : "No" );
-	len += sprintf( buf+len, "Driver Installed: %s\n",
-		mca_is_adapter_used(slot) ? "Yes" : "No" );
-	for (i=0; i<8; i++) {
+	len += sprintf(buf+len, "Id: %02x%02x\n",
+		mca_info->slot[slot].pos[1], mca_info->slot[slot].pos[0]);
+	len += sprintf(buf+len, "Enabled: %s\nPOS: ",
+		mca_isenabled(slot) ? "Yes" : "No");
+	for(i=0; i<8; i++) {
 		len += sprintf(buf+len, "%02x ", mca_info->slot[slot].pos[i]);
 	}
+	len += sprintf(buf+len, "\nDriver Installed: %s",
+		mca_is_adapter_used(slot) ? "Yes" : "No");
 	buf[len++] = '\n';
 	buf[len] = 0;
 
 	return len;
 } /* mca_default_procfn() */
 
-static int get_mca_machine_info( char* buf ) 
+static int get_mca_machine_info(char* buf) 
 {
 	int len = 0;
 
-	len += sprintf( buf+len, "Model Id: 0x%x\n", machine_id );
-	len += sprintf( buf+len, "Submodel Id: 0x%x\n", machine_submodel_id );
-	len += sprintf( buf+len, "BIOS Revision: 0x%x\n", BIOS_revision );
+	len += sprintf(buf+len, "Model Id: 0x%x\n", machine_id);
+	len += sprintf(buf+len, "Submodel Id: 0x%x\n", machine_submodel_id);
+	len += sprintf(buf+len, "BIOS Revision: 0x%x\n", BIOS_revision);
 
 	return len;
 }
 
-static int mca_fill( char* page, int pid, int type, char** start,
+static int mca_fill(char* page, int pid, int type, char** start,
 	loff_t *offset, int length)
 {
 	int len = 0;
 	int slot = 0;
 
-	switch( type ) {
+	switch(type) {
 		case PROC_MCA_REGISTERS:
-			return get_mca_info( page );
+			return get_mca_info(page);
 		case PROC_MCA_MACHINE:
-			return get_mca_machine_info( page );
+			return get_mca_machine_info(page);
 		case PROC_MCA_VIDEO:
 			slot = MCA_INTEGVIDEO;
 			break;
@@ -787,24 +794,24 @@
 			slot = MCA_INTEGSCSI;
 			break;
 		default:
-			if( type < PROC_MCA_SLOT || type >= PROC_MCA_LAST ) {
+			if(type < PROC_MCA_SLOT || type >= PROC_MCA_LAST) {
 				return -EBADF;
 			}
 			slot = type - PROC_MCA_SLOT;
 			break;
 	}
 
-	/* if we made it here, we better have a valid slot */
+	/* If we made it here, we better have a valid slot */
 
-	/* get the standard info */
+	/* Get the standard info */
 
-	len = mca_default_procfn( page, slot );
+	len = mca_default_procfn(page, slot);
 
-	/* do any device-specific processing, if there is any */
+	/* Do any device-specific processing, if there is any */
 
-	if( mca_info->slot[slot].procfn ) {
-		len += mca_info->slot[slot].procfn( page+len, slot,
-			mca_info->slot[slot].dev );
+	if(mca_info->slot[slot].procfn) {
+		len += mca_info->slot[slot].procfn(page+len, slot,
+			mca_info->slot[slot].dev);
 	}
 
 	return len;
@@ -814,7 +821,7 @@
 
 #define PROC_BLOCK_SIZE	(3*1024)
 
-static ssize_t proc_mca_read( struct file* file,
+static ssize_t proc_mca_read(struct file* file,
 	char* buf, size_t count, loff_t *ppos)
 {
 	unsigned long page;
@@ -825,11 +832,11 @@
 	struct proc_dir_entry *dp;
 	struct inode *inode = file->f_dentry->d_inode;
 
-	if (count < 0)
+	if(count < 0)
 		return -EINVAL;
-	if (count > PROC_BLOCK_SIZE)
+	if(count > PROC_BLOCK_SIZE)
 		count = PROC_BLOCK_SIZE;
-	if (!(page = __get_free_page(GFP_KERNEL)))
+	if(!(page = __get_free_page(GFP_KERNEL)))
 		return -ENOMEM;
 	type = inode->i_ino;
 	pid = type >> 16;
@@ -837,12 +844,12 @@
 	start = 0;
 	dp = (struct proc_dir_entry *) inode->u.generic_ip;
 	length = mca_fill((char *) page, pid, type,
-			    &start, ppos, count);
-	if (length < 0) {
+			  &start, ppos, count);
+	if(length < 0) {
 		free_page(page);
 		return length;
 	}
-	if (start != 0) {
+	if(start != 0) {
 		/* We have had block-adjusting processing! */
 
 		copy_to_user(buf, start, length);
@@ -851,11 +858,11 @@
 	} else {
 		/* Static 4kB (or whatever) block capacity */
 
-		if (*ppos >= length) {
+		if(*ppos >= length) {
 			free_page(page);
 			return 0;
 		}
-		if (count + *ppos > length)
+		if(count + *ppos > length)
 			count = length - *ppos;
 		end = count + *ppos;
 		copy_to_user(buf, (char *) page + *ppos, count);
diff -urN linux-2.2.6-pre2/drivers/char/Config.in linux-2.2.6-pre3/drivers/char/Config.in
--- linux-2.2.6-pre2/drivers/char/Config.in	1999-03-24 11:46:00.000000000 -0800
+++ linux-2.2.6-pre3/drivers/char/Config.in	2003-08-15 15:05:39.000000000 -0700
@@ -123,6 +123,7 @@
   if [ "$CONFIG_RADIO_AZTECH" = "y" ]; then
     hex '  Aztech/Packard Bell I/O port (0x350 or 0x358)' CONFIG_RADIO_AZTECH_PORT 350
   fi
+  dep_tristate 'ADS Cadet AM/FM Tuner' CONFIG_RADIO_CADET $CONFIG_VIDEO_DEV
   dep_tristate 'Miro PCM20 Radio' CONFIG_RADIO_MIROPCM20 $CONFIG_VIDEO_DEV
   dep_tristate 'GemTek Radio Card support' CONFIG_RADIO_GEMTEK $CONFIG_VIDEO_DEV
   if [ "$CONFIG_RADIO_GEMTEK" = "y" ]; then
diff -urN linux-2.2.6-pre2/drivers/char/Makefile linux-2.2.6-pre3/drivers/char/Makefile
--- linux-2.2.6-pre2/drivers/char/Makefile	1999-03-24 11:46:00.000000000 -0800
+++ linux-2.2.6-pre3/drivers/char/Makefile	2003-08-15 15:05:39.000000000 -0700
@@ -401,6 +401,14 @@
   endif
 endif                                             
 
+ifeq ($(CONFIG_RADIO_CADET),y)
+L_OBJS += radio-cadet.o
+else
+  ifeq ($(CONFIG_RADIO_CADET),m)
+  M_OBJS += radio-cadet.o
+  endif
+endif                                             
+
 ifeq ($(CONFIG_RADIO_MIROPCM20),y)
 L_OBJS += radio-miropcm20.o
 else
@@ -459,6 +467,7 @@
   ALL_SUB_DIRS += hfmodem
   MOD_SUB_DIRS += hfmodem
   endif
+
 endif
 
 include $(TOPDIR)/Rules.make
diff -urN linux-2.2.6-pre2/drivers/char/radio-aimslab.c linux-2.2.6-pre3/drivers/char/radio-aimslab.c
--- linux-2.2.6-pre2/drivers/char/radio-aimslab.c	1999-03-07 15:22:06.000000000 -0800
+++ linux-2.2.6-pre3/drivers/char/radio-aimslab.c	2003-08-15 15:05:39.000000000 -0700
@@ -235,6 +235,7 @@
 			v.rangehigh=(108*16000);
 			v.flags=VIDEO_TUNER_LOW;
 			v.mode=VIDEO_MODE_AUTO;
+			strcpy(v.name, "FM");
 			v.signal=0xFFFF*rt_getsigstr(rt);
 			if(copy_to_user(arg,&v, sizeof(v)))
 				return -EFAULT;
diff -urN linux-2.2.6-pre2/drivers/char/radio-aztech.c linux-2.2.6-pre3/drivers/char/radio-aztech.c
--- linux-2.2.6-pre2/drivers/char/radio-aztech.c	1999-03-07 15:22:06.000000000 -0800
+++ linux-2.2.6-pre3/drivers/char/radio-aztech.c	2003-08-15 15:05:39.000000000 -0700
@@ -186,6 +186,7 @@
 			v.signal=0xFFFF*az_getsigstr(az);
 			if(az_getstereo(az))
 				v.flags|=VIDEO_TUNER_STEREO_ON;
+			strcpy(v.name, "FM");
 			if(copy_to_user(arg,&v, sizeof(v)))
 				return -EFAULT;
 			return 0;
diff -urN linux-2.2.6-pre2/drivers/char/radio-cadet.c linux-2.2.6-pre3/drivers/char/radio-cadet.c
--- linux-2.2.6-pre2/drivers/char/radio-cadet.c	1969-12-31 16:00:00.000000000 -0800
+++ linux-2.2.6-pre3/drivers/char/radio-cadet.c	2003-08-15 15:05:39.000000000 -0700
@@ -0,0 +1,403 @@
+/* cadet.c - A video4linux driver for the ADS Cadet AM/FM Radio Card 
+ *
+ * by Fred Gleason <fredg@wava.com>
+ * Version 0.1.2
+ *
+ * (Loosely) based on code for the Aztech radio card by
+ *
+ * Russell Kroll    (rkroll@exploits.org)
+ * Quay Ly
+ * Donald Song
+ * Jason Lewis      (jlewis@twilight.vtc.vsc.edu) 
+ * Scott McGrath    (smcgrath@twilight.vtc.vsc.edu)
+ * William McGrath  (wmcgrath@twilight.vtc.vsc.edu)
+ *
+*/
+
+#include <linux/module.h>	/* Modules 			*/
+#include <linux/init.h>		/* Initdata			*/
+#include <linux/ioport.h>	/* check_region, request_region	*/
+#include <linux/delay.h>	/* udelay			*/
+#include <asm/io.h>		/* outb, outb_p			*/
+#include <asm/uaccess.h>	/* copy to/from user		*/
+#include <linux/videodev.h>	/* kernel radio structs		*/
+#include <linux/config.h>	/* CONFIG_RADIO_CADET_PORT 	*/
+
+#ifndef CONFIG_RADIO_CADET_PORT
+#define CONFIG_RADIO_CADET_PORT 0x330
+#endif
+
+static int io=CONFIG_RADIO_CADET_PORT; 
+static int users=0;
+static int curtuner=0;
+
+static int cadet_getstereo(void)
+{
+  if(curtuner!=0) {          /* Only FM has stereo capability! */
+	        return 0;
+	}
+        outb(7,io);          /* Select tuner control */
+        if((inb(io+1)&0x40)==0) {
+                return 1;    /* Stereo pilot detected */
+        }
+        else {
+                return 0;    /* Mono */
+        }
+}
+
+
+static unsigned cadet_getfreq(void)
+{
+        int curvol,i;
+        unsigned freq=0,test,fifo=0;
+  
+
+        /*
+         * Prepare for read
+         */
+        outb(7,io);       /* Select tuner control */
+        curvol=inb(io+1); /* Save current volume/mute setting */
+        outb(0x00,io+1);  /* Ensure WRITE-ENABLE is LOW */
+
+        /*
+         * Read the shift register
+         */
+        for(i=0;i<25;i++) {
+                fifo=(fifo<<1)|((inb(io+1)>>7)&0x01);
+                if(i<24) {
+                        outb(0x01,io+1);
+                        outb(0x00,io+1);
+                }
+        }
+
+        /*
+         * Restore volume/mute setting
+         */
+        outb(curvol,io+1);
+
+        /*
+         * Convert to actual frequency
+         */
+	if(curtuner==0) {    /* FM */
+	        test=12500;
+                for(i=0;i<14;i++) {
+                        if((fifo&0x01)!=0) {
+                                freq+=test;
+                        }
+                        test=test<<1;
+                        fifo=fifo>>1;
+                }
+                freq-=10700000;           /* IF frequency is 10.7 MHz */
+                freq=(freq*16)/1000000;   /* Make it 1/16 MHz */
+	}
+	if(curtuner==1) {    /* AM */
+	        freq=((fifo&0x7fff)-2010)*16;
+	}
+
+        return freq;
+}
+
+
+static void cadet_setfreq(unsigned freq)
+{
+        unsigned fifo;
+        int i,test;
+        int curvol;
+
+        /* 
+         * Formulate a fifo command
+         */
+	fifo=0;
+	if(curtuner==0) {    /* FM */
+        	test=102400;
+                freq=(freq*1000)/16;       /* Make it kHz */
+                freq+=10700;               /* IF is 10700 kHz */
+                for(i=0;i<14;i++) {
+                        fifo=fifo<<1;
+                        if(freq>=test) {
+                                fifo|=0x01;
+                                freq-=test;
+                        }
+                        test=test>>1;
+                }
+	}
+	if(curtuner==1) {    /* AM */
+                fifo=(freq/16)+2010;            /* Make it kHz */
+		fifo|=0x100000;            /* Select AM Band */
+	}
+
+        /*
+         * Save current volume/mute setting
+         */
+        curvol=inb(io+1); 
+
+        /*
+         * Write the shift register
+         */
+        test=0;
+        test=(fifo>>23)&0x02;      /* Align data for SDO */
+        test|=0x1c;                /* SDM=1, SWE=1, SEN=1, SCK=0 */
+        outb(7,io);                /* Select tuner control */
+        outb(test,io+1);           /* Initialize for write */
+        for(i=0;i<25;i++) {
+                test|=0x01;              /* Toggle SCK High */
+                outb(test,io+1);
+                test&=0xfe;              /* Toggle SCK Low */
+                outb(test,io+1);
+                fifo=fifo<<1;            /* Prepare the next bit */
+                test=0x1c|((fifo>>23)&0x02);
+                outb(test,io+1);
+        }
+        /*
+         * Restore volume/mute setting
+         */
+        outb(curvol,io+1);
+}
+
+
+static int cadet_getvol(void)
+{
+        outb(7,io);                /* Select tuner control */
+        if((inb(io+1)&0x20)!=0) {
+                return 0xffff;
+        }
+        else {
+                return 0;
+        }
+}
+
+
+static void cadet_setvol(int vol)
+{
+        outb(7,io);                /* Select tuner control */
+        if(vol>0) {
+                outb(0x20,io+1);
+        }
+        else {
+                outb(0x00,io+1);
+        }
+}  
+
+
+static int cadet_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
+{
+        unsigned freq;
+	switch(cmd)
+	{
+		case VIDIOCGCAP:
+		{
+			struct video_capability v;
+			v.type=VID_TYPE_TUNER;
+			v.channels=2;
+			v.audios=1;
+			/* No we don't do pictures */
+			v.maxwidth=0;
+			v.maxheight=0;
+			v.minwidth=0;
+			v.minheight=0;
+			strcpy(v.name, "ADS Cadet");
+			if(copy_to_user(arg,&v,sizeof(v)))
+				return -EFAULT;
+			return 0;
+		}
+		case VIDIOCGTUNER:
+		{
+			struct video_tuner v;
+			if(copy_from_user(&v, arg,sizeof(v))!=0) { 
+				return -EFAULT;
+			}
+			if((v.tuner<0)||(v.tuner>1)) {
+				return -EINVAL;
+			}
+			switch(v.tuner) {
+			        case 0:
+			        strcpy(v.name,"FM");
+			        v.rangelow=1400;     /* 87.5 MHz */
+			        v.rangehigh=1728;    /* 108.0 MHz */
+			        v.flags=0;
+			        v.mode=0;
+			        v.mode|=VIDEO_MODE_AUTO;
+			        v.signal=0xFFFF;
+			        if(cadet_getstereo()==1) {
+				        v.flags|=VIDEO_TUNER_STEREO_ON;
+			        }
+			        if(copy_to_user(arg,&v, sizeof(v))) {
+				        return -EFAULT;
+			        }
+			        break;
+			        case 1:
+			        strcpy(v.name,"AM");
+			        v.rangelow=8320;      /* 520 kHz */
+			        v.rangehigh=26400;    /* 1650 kHz */
+			        v.flags=0;
+			        v.flags|=VIDEO_TUNER_LOW;
+			        v.mode=0;
+			        v.mode|=VIDEO_MODE_AUTO;
+			        v.signal=0xFFFF;
+			        if(copy_to_user(arg,&v, sizeof(v))) {
+				        return -EFAULT;
+			        }
+			        break;
+			}
+			return 0;
+		}
+		case VIDIOCSTUNER:
+		{
+			struct video_tuner v;
+			if(copy_from_user(&v, arg, sizeof(v))) {
+				return -EFAULT;
+			}
+			if((v.tuner<0)||(v.tuner>1)) {
+				return -EINVAL;
+			}
+			curtuner=v.tuner;	
+			return 0;
+		}
+		case VIDIOCGFREQ:
+		        freq=cadet_getfreq();
+			if(copy_to_user(arg, &freq, sizeof(freq)))
+				return -EFAULT;
+			return 0;
+		case VIDIOCSFREQ:
+			if(copy_from_user(&freq, arg,sizeof(freq)))
+				return -EFAULT;
+			if((curtuner==0)&&((freq<1400)||(freq>1728))) {
+			        return -EINVAL;
+			}
+			if((curtuner==1)&&((freq<8320)||(freq>26400))) {
+			        return -EINVAL;
+			}
+			cadet_setfreq(freq);
+			return 0;
+		case VIDIOCGAUDIO:
+		{	
+			struct video_audio v;
+			memset(&v,0, sizeof(v));
+			v.flags=VIDEO_AUDIO_MUTABLE|VIDEO_AUDIO_VOLUME;
+			if(cadet_getstereo()==0) {
+			        v.mode=VIDEO_SOUND_MONO;
+			}
+			else {
+			  v.mode=VIDEO_SOUND_STEREO;
+			}
+			v.volume=cadet_getvol();
+			v.step=0xffff;
+			strcpy(v.name, "Radio");
+			if(copy_to_user(arg,&v, sizeof(v)))
+				return -EFAULT;
+			return 0;			
+		}
+		case VIDIOCSAUDIO:
+		{
+			struct video_audio v;
+			if(copy_from_user(&v, arg, sizeof(v))) 
+				return -EFAULT;	
+			if(v.audio) 
+				return -EINVAL;
+			cadet_setvol(v.volume);
+			if(v.flags&VIDEO_AUDIO_MUTE) 
+				cadet_setvol(0);
+			else
+				cadet_setvol(0xffff);
+			return 0;
+		}
+		default:
+			return -ENOIOCTLCMD;
+	}
+}
+
+
+static int cadet_open(struct video_device *dev, int flags)
+{
+	if(users)
+		return -EBUSY;
+	users++;
+	MOD_INC_USE_COUNT;
+	return 0;
+}
+
+static void cadet_close(struct video_device *dev)
+{
+	users--;
+	MOD_DEC_USE_COUNT;
+}
+
+
+static struct video_device cadet_radio=
+{
+	"Cadet radio",
+	VID_TYPE_TUNER,
+	VID_HARDWARE_CADET,
+	cadet_open,
+	cadet_close,
+	NULL,	/* Can't read  (no capture ability) */
+	NULL,	/* Can't write */
+	NULL,	/* No poll */
+	cadet_ioctl,
+	NULL,
+	NULL
+};
+
+__initfunc(int cadet_init(struct video_init *v))
+{
+#ifndef MODULE        
+        if(cadet_probe()<0) {
+	        return EINVAL;
+	}
+#endif
+	if(video_register_device(&cadet_radio,VFL_TYPE_RADIO)==-1)
+		return -EINVAL;
+		
+	request_region(io,2,"cadet");
+	printk(KERN_INFO "ADS Cadet Radio Card at %x\n",io);
+	return 0;
+}
+
+
+static int cadet_probe(void)
+{
+        static int iovals[8]={0x330,0x332,0x334,0x336,0x338,0x33a,0x33c,0x33e};
+	int i;
+
+	for(i=0;i<8;i++) {
+	        io=iovals[i];
+	        if(check_region(io,2)) {
+	                return -1;
+		}  
+		cadet_setfreq(1410);
+		if(cadet_getfreq()==1410) {
+		        return io;
+		}
+	}
+	return -1;
+}
+
+
+
+#ifdef MODULE
+
+MODULE_AUTHOR("Fred Gleason, Russell Kroll, Quay Lu, Donald Song, Jason Lewis, Scott McGrath, William McGrath");
+MODULE_DESCRIPTION("A driver for the ADS Cadet AM/FM/RDS radio card.");
+MODULE_PARM(io, "i");
+MODULE_PARM_DESC(io, "I/O address of Cadet card (0x330,0x332,0x334,0x336,0x338,0x33a,0x33c,0x33e)");
+
+EXPORT_NO_SYMBOLS;
+
+int init_module(void)
+{
+	if(io==-1)
+	{
+		printk(KERN_ERR "You must set an I/O address with io=0x???\n");
+		return -EINVAL;
+	}
+	return cadet_init(NULL);
+}
+
+void cleanup_module(void)
+{
+	video_unregister_device(&cadet_radio);
+	release_region(io,2);
+}
+
+#endif
+
diff -urN linux-2.2.6-pre2/drivers/char/radio-gemtek.c linux-2.2.6-pre3/drivers/char/radio-gemtek.c
--- linux-2.2.6-pre2/drivers/char/radio-gemtek.c	1998-12-27 10:49:06.000000000 -0800
+++ linux-2.2.6-pre3/drivers/char/radio-gemtek.c	2003-08-15 15:05:39.000000000 -0700
@@ -160,6 +160,7 @@
 			v.flags=VIDEO_TUNER_LOW;
 			v.mode=VIDEO_MODE_AUTO;
 			v.signal=0xFFFF*gemtek_getsigstr(rt);
+			strcpy(v.name, "FM");
 			if(copy_to_user(arg,&v, sizeof(v)))
 				return -EFAULT;
 			return 0;
diff -urN linux-2.2.6-pre2/drivers/char/radio-miropcm20.c linux-2.2.6-pre3/drivers/char/radio-miropcm20.c
--- linux-2.2.6-pre2/drivers/char/radio-miropcm20.c	1998-08-31 10:32:19.000000000 -0700
+++ linux-2.2.6-pre3/drivers/char/radio-miropcm20.c	2003-08-15 15:05:39.000000000 -0700
@@ -118,6 +118,7 @@
 			v.flags=0;
 			v.mode=VIDEO_MODE_AUTO;
 			v.signal=0xFFFF*pcm20_getsigstr(pcm20);
+			strcpy(v.name, "FM");
 			if(copy_to_user(arg,&v, sizeof(v)))
 				return -EFAULT;
 			return 0;
diff -urN linux-2.2.6-pre2/drivers/char/radio-rtrack2.c linux-2.2.6-pre3/drivers/char/radio-rtrack2.c
--- linux-2.2.6-pre2/drivers/char/radio-rtrack2.c	1998-08-23 13:32:25.000000000 -0700
+++ linux-2.2.6-pre3/drivers/char/radio-rtrack2.c	2003-08-15 15:05:39.000000000 -0700
@@ -130,6 +130,7 @@
 			v.flags=VIDEO_TUNER_LOW;
 			v.mode=VIDEO_MODE_AUTO;
 			v.signal=0xFFFF*rt_getsigstr(rt);
+			strcpy(v.name, "FM");
 			if(copy_to_user(arg,&v, sizeof(v)))
 				return -EFAULT;
 			return 0;
diff -urN linux-2.2.6-pre2/drivers/char/radio-sf16fmi.c linux-2.2.6-pre3/drivers/char/radio-sf16fmi.c
--- linux-2.2.6-pre2/drivers/char/radio-sf16fmi.c	1998-11-20 08:44:06.000000000 -0800
+++ linux-2.2.6-pre3/drivers/char/radio-sf16fmi.c	2003-08-15 15:05:39.000000000 -0700
@@ -158,6 +158,7 @@
 			v.flags=fmi->flags;
 			v.mode=VIDEO_MODE_AUTO;
 			v.signal = fmi_getsigstr(fmi);
+			strcpy(v.name, "FM");
 			if(copy_to_user(arg,&v, sizeof(v)))
 				return -EFAULT;
 			return 0;
diff -urN linux-2.2.6-pre2/drivers/char/radio-typhoon.c linux-2.2.6-pre3/drivers/char/radio-typhoon.c
--- linux-2.2.6-pre2/drivers/char/radio-typhoon.c	1999-02-24 16:27:53.000000000 -0800
+++ linux-2.2.6-pre3/drivers/char/radio-typhoon.c	2003-08-15 15:05:39.000000000 -0700
@@ -195,7 +195,8 @@
 			v.rangehigh = 1080 * 1600;
 			v.flags = VIDEO_TUNER_LOW;
 			v.mode = VIDEO_MODE_AUTO;
-			v.signal = 0;	/* We can't get the signal strength */
+			v.signal = 0xFFFF;	/* We can't get the signal strength */
+			strcpy(v.tuner, "FM");
 			if (copy_to_user(arg, &v, sizeof(v)))
 				return -EFAULT;
 			return 0;
diff -urN linux-2.2.6-pre2/drivers/char/radio-zoltrix.c linux-2.2.6-pre3/drivers/char/radio-zoltrix.c
--- linux-2.2.6-pre2/drivers/char/radio-zoltrix.c	1999-02-24 16:27:53.000000000 -0800
+++ linux-2.2.6-pre3/drivers/char/radio-zoltrix.c	2003-08-15 15:05:39.000000000 -0700
@@ -223,14 +223,11 @@
 	case VIDIOCGTUNER:
 		{
 			struct video_tuner v;
-/*
 			if (copy_from_user(&v, arg, sizeof(v)))
 				return -EFAULT;
 			if (v.tuner)	
 				return -EINVAL;
-*/
-			v.tuner = 0;
-			strcpy(v.name, "Zoltrix Radio");
+			strcpy(v.name, "FM");
 			v.rangelow = (int) (88.0 * 16000);
 			v.rangehigh = (int) (108.0 * 16000);
 			v.flags = zol_is_stereo(zol)
diff -urN linux-2.2.6-pre2/drivers/char/videodev.c linux-2.2.6-pre3/drivers/char/videodev.c
--- linux-2.2.6-pre2/drivers/char/videodev.c	1999-02-24 16:27:53.000000000 -0800
+++ linux-2.2.6-pre3/drivers/char/videodev.c	2003-08-15 15:05:39.000000000 -0700
@@ -75,6 +75,9 @@
 #ifdef CONFIG_RADIO_TYPHOON
 extern int typhoon_init(struct video_init *);
 #endif
+#ifdef CONFIG_RADIO_CADET
+extern int cadet_init(struct video_init *);
+#endif
 #ifdef CONFIG_VIDEO_PMS
 extern int init_pms_cards(struct video_init *);
 #endif
@@ -111,6 +114,9 @@
 #ifdef CONFIG_RADIO_MIROPCM20
 	{"PCM20", pcm20_init}, 
 #endif
+#ifdef CONFIG_RADIO_CADET
+	{"Cadet", cadet_init},
+#endif
 #ifdef CONFIG_RADIO_GEMTEK
 	{"GemTek", gemtek_init},
 #endif
@@ -430,6 +436,12 @@
 	unregister_chrdev(VIDEO_MAJOR, "video_capture");
 }
 
+
+
+
+
+
+
 #endif
 
 #if LINUX_VERSION_CODE >= 0x020100
diff -urN linux-2.2.6-pre2/drivers/net/irda/irport.c linux-2.2.6-pre3/drivers/net/irda/irport.c
--- linux-2.2.6-pre2/drivers/net/irda/irport.c	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/drivers/net/irda/irport.c	2003-08-15 15:05:39.000000000 -0700
@@ -64,13 +64,14 @@
 #include <net/irda/irport.h>
 
 #define IO_EXTENT 8
+#define CONFIG_HALF_DUPLEX
 
-static unsigned int io[]  = { 0x3e8, ~0, ~0, ~0 };
-static unsigned int irq[] = { 11, 0, 0, 0 };
+/* static unsigned int io[]  = { 0x3e8, ~0, ~0, ~0 }; */
+/* static unsigned int irq[] = { 11, 0, 0, 0 }; */
 
-static void irport_write_wakeup( struct irda_device *idev);
-static int  irport_write( int iobase, int fifo_size, __u8 *buf, int len);
-static void irport_receive( struct irda_device *idev);
+static void irport_write_wakeup(struct irda_device *idev);
+static int  irport_write(int iobase, int fifo_size, __u8 *buf, int len);
+static void irport_receive(struct irda_device *idev);
 
 __initfunc(int irport_init(void))
 {
@@ -115,15 +116,15 @@
  */
 int irport_open( int iobase)
 {
-	DEBUG( 0, __FUNCTION__ "(), iobase=%#x\n", iobase);
+	DEBUG(4, __FUNCTION__ "(), iobase=%#x\n", iobase);
 
 	/* Initialize UART */
-	outb( UART_LCR_WLEN8, iobase+UART_LCR);  /* Reset DLAB */
-	outb(( UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2), iobase+UART_MCR);
+	outb(UART_LCR_WLEN8, iobase+UART_LCR);  /* Reset DLAB */
+	outb((UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2), iobase+UART_MCR);
 	
 	/* Turn on interrups */
-	outb(( UART_IER_THRI |UART_IER_RLSI | UART_IER_RDI), iobase+UART_IER); 
-	
+	outb((UART_IER_RLSI | UART_IER_RDI), iobase+UART_IER);
+
 	return 0;
 }
 
@@ -135,13 +136,13 @@
  */
 void irport_close( int iobase) 
 {
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
 	/* Reset UART */
-	outb( 0, iobase+UART_MCR);
+	outb(0, iobase+UART_MCR);
 
 	/* Turn off interrupts */
-	outb( 0, iobase+UART_IER); 
+	outb(0, iobase+UART_IER); 
 }
 
 /*
@@ -158,10 +159,8 @@
 
 	DEBUG( 0, __FUNCTION__ "(), Setting speed to: %d\n", speed);
 
-	DEBUG( 0, __FUNCTION__ "(), iobase=%#x\n", iobase);
-
 	/* Turn off interrupts */
-	outb( 0, iobase+UART_IER); 
+	outb(0, iobase+UART_IER); 
 
 	divisor = SPEED_MAX/speed;
 	
@@ -170,55 +169,14 @@
 	/* IrDA ports use 8N1 */
 	lcr = UART_LCR_WLEN8;
 	
-	outb( UART_LCR_DLAB | lcr, iobase+UART_LCR); /* Set DLAB */
-	outb( divisor & 0xff,      iobase+UART_DLL); /* Set speed */
-	outb( divisor >> 8,	   iobase+UART_DLM);
-	outb( lcr,		   iobase+UART_LCR); /* Set 8N1	*/
-	outb( fcr,		   iobase+UART_FCR); /* Enable FIFO's */
-
-	/* Turn on interrups */
-	outb( UART_IER_THRI|UART_IER_RLSI|UART_IER_RDI, iobase+UART_IER); 
-}
-
-/*
- * Function irport_interrupt (irq, dev_id, regs)
- *
- *    
- */
-void irport_interrupt( int irq, void *dev_id, struct pt_regs *regs) 
-{
-	struct irda_device *idev = (struct irda_device *) dev_id;
-
-	int iobase, status;
-	int iir;
-
-	DEBUG( 4, __FUNCTION__ "(), irq %d\n", irq);
-
-	if ( !idev) {
-		printk( KERN_WARNING __FUNCTION__ 
-			"() irq %d for unknown device.\n", irq);
-		return;
-	}
-
-	idev->netdev.interrupt = 1;
+	outb(UART_LCR_DLAB | lcr, iobase+UART_LCR); /* Set DLAB */
+	outb(divisor & 0xff,      iobase+UART_DLL); /* Set speed */
+	outb(divisor >> 8,	  iobase+UART_DLM);
+	outb(lcr,		  iobase+UART_LCR); /* Set 8N1	*/
+	outb(fcr,		  iobase+UART_FCR); /* Enable FIFO's */
 
-	iobase = idev->io.iobase2;
-
-	iir = inb(iobase + UART_IIR);
-	do {
-		status = inb( iobase+UART_LSR);
-		
-		if (status & UART_LSR_DR) {
-	       		/* Receive interrupt */
-			irport_receive(idev);
-		}
-		if (status & UART_LSR_THRE) {
-	       		/* Transmitter ready for data */
-			irport_write_wakeup(idev);
-		}
-	} while (!(inb(iobase+UART_IIR) & UART_IIR_NO_INT));
-
-	idev->netdev.interrupt = 0;
+	/* Turn on receive interrups */
+	outb(UART_IER_RLSI|UART_IER_RDI, iobase+UART_IER); 
 }
 
 /*
@@ -231,34 +189,38 @@
 static void irport_write_wakeup( struct irda_device *idev)
 {
 	int actual = 0, count;
-	
-	DEBUG( 4, __FUNCTION__ "() <%ld>\n", jiffies);
-	
-	ASSERT( idev != NULL, return;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+	int iobase;
 
-	/* Finished with frame?  */
-	if ( idev->tx_buff.offset == idev->tx_buff.len)  {
+	ASSERT(idev != NULL, return;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
 
+	/* Finished with frame?  */
+	if (idev->tx_buff.offset == idev->tx_buff.len)  {
+		iobase = idev->io.iobase2;
 		/* 
 		 *  Now serial buffer is almost free & we can start 
 		 *  transmission of another packet 
 		 */
-		DEBUG( 4, __FUNCTION__ "(), finished with frame!\n");
-
 		idev->netdev.tbusy = 0; /* Unlock */
 		idev->stats.tx_packets++;
 
 		/* Schedule network layer, so we can get some more frames */
-		mark_bh( NET_BH);
-
+		mark_bh(NET_BH);
+#ifdef CONFIG_HALF_DUPLEX
+		outb(UART_FCR_ENABLE_FIFO | 
+		     UART_FCR_TRIGGER_14  |
+		     UART_FCR_CLEAR_RCVR, iobase+UART_FCR); /* Enable FIFO's */
+
+		/* Turn on receive interrupts */
+		outb(UART_IER_RLSI|UART_IER_RDI, iobase+UART_IER); 
+#endif
 		return;
 	}
 
 	/* Write data left in transmit buffer */
 	count = idev->tx_buff.len - idev->tx_buff.offset;
-	actual = irport_write( idev->io.iobase2, idev->io.fifo_size, 
-			       idev->tx_buff.head, count);
+	actual = irport_write(idev->io.iobase2, idev->io.fifo_size, 
+			      idev->tx_buff.head, count);
 	idev->tx_buff.offset += actual;
 	idev->tx_buff.head += actual;
 }
@@ -269,12 +231,12 @@
  *    
  *
  */
-static int irport_write( int iobase, int fifo_size, __u8 *buf, int len)
+static int irport_write(int iobase, int fifo_size, __u8 *buf, int len)
 {
 	int actual = 0;
 
 	/* Tx FIFO should be empty! */
-	if (!(inb( iobase+UART_LSR) & UART_LSR_THRE)) {
+	if (!(inb(iobase+UART_LSR) & UART_LSR_THRE)) {
 		DEBUG( 0, __FUNCTION__ "(), failed, fifo not empty!\n");
 		return -1;
 	}
@@ -287,8 +249,8 @@
 		actual++;
 	}
         
-	DEBUG( 4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n", 
-	       fifo_size, actual, len);
+	DEBUG(4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n", 
+	      fifo_size, actual, len);
 
 	return actual;
 }
@@ -300,43 +262,44 @@
  *    waits until the next transmitt interrupt, and continues until the
  *    frame is transmited.
  */
-int irport_hard_xmit( struct sk_buff *skb, struct device *dev)
+int irport_hard_xmit(struct sk_buff *skb, struct device *dev)
 {
 	struct irda_device *idev;
-	int actual;
-
-	DEBUG( 4, __FUNCTION__ "()\n");
+	int actual = 0;
+	int iobase;
 
-	ASSERT( dev != NULL, return -1;);
+	DEBUG(5, __FUNCTION__ "(), dev=%p\n", dev);
 
-	if ( dev->tbusy) {
-		DEBUG( 4, __FUNCTION__ "(), tbusy==TRUE\n");
-		
-		return -EBUSY;
-	}
+	ASSERT(dev != NULL, return 0;);
 	
 	idev = (struct irda_device *) dev->priv;
 
-	ASSERT( idev != NULL, return -1;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+	ASSERT(idev != NULL, return 0;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+	iobase = idev->io.iobase2;
 
 	/* Lock transmit buffer */
-	if ( irda_lock( (void *) &dev->tbusy) == FALSE)
+	if (irda_lock((void *) &dev->tbusy) == FALSE)
 		return -EBUSY;
 	
         /*  
 	 *  Transfer skb to tx_buff while wrapping, stuffing and making CRC 
 	 */
-	idev->tx_buff.len = async_wrap_skb( skb, idev->tx_buff.data, 
-					    idev->tx_buff.truesize);
+	idev->tx_buff.len = async_wrap_skb(skb, idev->tx_buff.data, 
+					   idev->tx_buff.truesize);
 	
-	actual = irport_write( idev->io.iobase2, idev->io.fifo_size, 
-			       idev->tx_buff.data, idev->tx_buff.len);
+/* 	actual = irport_write(idev->io.iobase2, idev->io.fifo_size,  */
+/* 			      idev->tx_buff.data, idev->tx_buff.len); */
 	
 	idev->tx_buff.offset = actual;
 	idev->tx_buff.head = idev->tx_buff.data + actual;
-	
-	dev_kfree_skb( skb);
+
+#ifdef CONFIG_HALF_DUPLEX
+	/* Turn on transmit finished interrupt. Will fire immediately!  */
+	outb(UART_IER_THRI, iobase+UART_IER); 
+#endif
+	dev_kfree_skb(skb);
 	
 	return 0;
 }
@@ -347,18 +310,19 @@
  *    Receive one frame from the infrared port
  *
  */
-static void irport_receive( struct irda_device *idev) 
+static void irport_receive(struct irda_device *idev) 
 {
 	int iobase;
+	int boguscount = 0;
 
-	if ( !idev)
+	if (!idev)
 		return;
 
 	DEBUG( 4, __FUNCTION__ "()\n");
 
 	iobase = idev->io.iobase2;
 
-	if ( idev->rx_buff.len == 0)
+	if (idev->rx_buff.len == 0)
 		idev->rx_buff.head = idev->rx_buff.data;
 	
 	/*  
@@ -366,11 +330,71 @@
          * async_unwrap_char will deliver all found frames  
 	 */
 	do {
-		async_unwrap_char( idev, inb( iobase+UART_RX));
+		async_unwrap_char(idev, inb( iobase+UART_RX));
+
+		/* Make sure we don't stay here to long */
+		if (boguscount++ > 32) {
+			DEBUG(0,__FUNCTION__ "(), breaking!\n");
+			break;
+		}
+
+	} while (inb(iobase+UART_LSR) & UART_LSR_DR);	
+}
+
+/*
+ * Function irport_interrupt (irq, dev_id, regs)
+ *
+ *    
+ */
+void irport_interrupt(int irq, void *dev_id, struct pt_regs *regs) 
+{
+	struct irda_device *idev = (struct irda_device *) dev_id;
+
+	int iobase;
+	int iir, lsr;
+	int boguscount = 0;
+
+	DEBUG(5, __FUNCTION__ "(), irq %d\n", irq);
+	
+	if (!idev) {
+		printk(KERN_WARNING __FUNCTION__ 
+		       "() irq %d for unknown device.\n", irq);
+		return;
+	}
+
+	idev->netdev.interrupt = 1;
+
+	iobase = idev->io.iobase2;
+
+	iir = inb(iobase + UART_IIR) & UART_IIR_ID;
+	while (iir) {
+		DEBUG(4,__FUNCTION__ "(), iir=%#x\n", iir);
+
+		/* Clear interrupt */
+		lsr = inb(iobase+UART_LSR);
+
+		if ((iir & UART_IIR_THRI) && (lsr & UART_LSR_THRE)) {
+			/* Transmitter ready for data */
+			irport_write_wakeup(idev);
+		}
+#ifdef CONFIG_HALF_DUPLEX
+		else 
+#endif
+		if ((iir & UART_IIR_RDI) && (lsr & UART_LSR_DR)) {
+	       		/* Receive interrupt */
+			irport_receive(idev);
+		}
 		
-	} while ( inb( iobase+UART_LSR) & UART_LSR_DR);	
+		/* Make sure we don't stay here to long */
+		if (boguscount++ > 32)
+			break;
+
+ 	        iir = inb(iobase + UART_IIR) & UART_IIR_ID;
+	}
+	idev->netdev.interrupt = 0;
 }
 
+
 #ifdef MODULE
 
 /*
diff -urN linux-2.2.6-pre2/drivers/net/irda/irtty.c linux-2.2.6-pre3/drivers/net/irda/irtty.c
--- linux-2.2.6-pre2/drivers/net/irda/irtty.c	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/drivers/net/irda/irtty.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Dec  9 21:18:38 1997
- * Modified at:   Tue Feb  9 13:08:25 1999
+ * Modified at:   Tue Apr  6 21:35:25 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Sources:       slip.c by Laurence Culhane,   <loz@holmes.demon.co.uk>
  *                          Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
@@ -33,7 +33,6 @@
 #include <linux/init.h>
 
 #include <net/irda/irda.h>
-#include <net/irda/irmod.h>
 #include <net/irda/irtty.h>
 #include <net/irda/wrapper.h>
 #include <net/irda/irlap.h>
@@ -191,7 +190,6 @@
 	/*
 	 *  Initialize driver
 	 */
-	/* self->idev.flags |= SIR_MODE | IO_PIO; */
 	self->idev.rx_buff.state = OUTSIDE_FRAME;
 
 	/* 
@@ -207,7 +205,7 @@
 		IR_115200;
 	self->idev.qos.min_turn_time.bits = 0x03;
 	self->idev.flags = IFF_SIR | IFF_PIO;
-	irda_qos_bits_to_value( &self->idev.qos);
+	irda_qos_bits_to_value(&self->idev.qos);
 
 	/* Specify which buffer allocation policy we need */
 	self->idev.rx_buff.flags = GFP_KERNEL;
@@ -230,7 +228,7 @@
 	self->idev.netdev.stop            = irtty_net_close;
 
 	/* Open the IrDA device */
-	irda_device_open( &self->idev, name, self);
+	irda_device_open(&self->idev, name, self);
 
 	MOD_INC_USE_COUNT;
 
@@ -244,20 +242,20 @@
  *    and then restoring the TTY line discipline to what it was before it got
  *    hooked to IrDA (which usually is TTY again).  
  */
-static void irtty_close( struct tty_struct *tty) 
+static void irtty_close(struct tty_struct *tty) 
 {
 	struct irtty_cb *self = (struct irtty_cb *) tty->disc_data;
 	
 	/* First make sure we're connected. */
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRTTY_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == IRTTY_MAGIC, return;);
 
 	/* We are not using any dongle anymore! */
-	if ( self->dongle_q)
-		self->dongle_q->dongle->close( &self->idev);
+	if (self->dongle_q)
+		self->dongle_q->dongle->close(&self->idev);
 
 	/* Remove driver */
-	irda_device_close( &self->idev);
+	irda_device_close(&self->idev);
 
 	/* Stop tty */
 	tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
@@ -266,11 +264,10 @@
 	self->tty = NULL;
 	self->magic = 0;
 	
-	/* hashbin_remove( irtty, 0, self->name); */
-	self = hashbin_remove( irtty, (int) self, NULL);
+	self = hashbin_remove(irtty, (int) self, NULL);
 	
-	if ( self != NULL)
-		kfree( self);
+	if (self != NULL)
+		kfree(self);
 
  	MOD_DEC_USE_COUNT;
 }
@@ -579,7 +576,7 @@
 		 *  Now serial buffer is almost free & we can start 
 		 *  transmission of another packet 
 		 */
-		DEBUG( 4, __FUNCTION__ "(), finished with frame!\n");
+		DEBUG(5, __FUNCTION__ "(), finished with frame!\n");
 
 		tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
 
@@ -649,8 +646,8 @@
 	memset( new, 0, sizeof( struct dongle_q));
         new->dongle = dongle;
 
-	/* Insert IrDA compressor into hashbin */
-	hashbin_insert( dongles, (QUEUE *) new, dongle->type, NULL);
+	/* Insert IrDA dongle into hashbin */
+	hashbin_insert(dongles, (QUEUE *) new, dongle->type, NULL);
 	
         return 0;
 }
@@ -668,11 +665,20 @@
 }
 
 
+/*
+ * Function irtty_set_dtr_rts (tty, dtr, rts)
+ *
+ *    This function can be used by dongles etc. to set or reset the status
+ *    of the dtr and rts lines
+ */
 void irtty_set_dtr_rts(struct tty_struct *tty, int dtr, int rts)
 {
 	mm_segment_t fs;
-	int arg = TIOCM_OUT2;
+	int arg = 0;
 
+#ifdef TIOCM_OUT2 /* Not defined for ARM */
+	arg = TIOCM_OUT2;
+#endif
 	if (rts)
 		arg |= TIOCM_RTS;
 	if (dtr)
@@ -747,8 +753,7 @@
  */
 int init_module(void)
 {
-	irtty_init();
-	return(0);
+	return irtty_init();
 }
 
 /*
diff -urN linux-2.2.6-pre2/drivers/net/irda/Makefile linux-2.2.6-pre3/drivers/net/irda/Makefile
--- linux-2.2.6-pre2/drivers/net/irda/Makefile	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/drivers/net/irda/Makefile	2003-08-15 15:05:39.000000000 -0700
@@ -10,7 +10,7 @@
 L_TARGET := irda_drivers.a
 L_OBJS   := 
 M_OBJS   :=
-MOD_LIST_NAME := IRDA_MODULES
+MOD_LIST_NAME := IRDA_DRIVERS_MODULES
 
 ifeq ($(CONFIG_IRTTY_SIR),y)
 L_OBJS += irtty.o
diff -urN linux-2.2.6-pre2/drivers/net/irda/pc87108.c linux-2.2.6-pre3/drivers/net/irda/pc87108.c
--- linux-2.2.6-pre2/drivers/net/irda/pc87108.c	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/drivers/net/irda/pc87108.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Nov  7 21:43:15 1998
- * Modified at:   Tue Feb  9 13:29:40 1999
+ * Modified at:   Sat Apr  3 15:54:47 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>
@@ -132,7 +132,7 @@
 
 	for ( i=0; (io[i] < 2000) && (i < 4); i++) {
 		int ioaddr = io[i];
-		if (check_region(ioaddr, CHIP_IO_EXTENT))
+		if (check_region(ioaddr, CHIP_IO_EXTENT) < 0)
 			continue;
 		if (pc87108_open( i, io[i], io2[i], irq[i], dma[i]) == 0)
 			return 0;
@@ -151,11 +151,11 @@
 {
 	int i;
 
-        DEBUG( 4, __FUNCTION__ "()\n");
+        DEBUG(4, __FUNCTION__ "()\n");
 
-	for ( i=0; i < 4; i++) {
-		if ( dev_self[i])
-			pc87108_close( &(dev_self[i]->idev));
+	for (i=0; i < 4; i++) {
+		if (dev_self[i])
+			pc87108_close(&(dev_self[i]->idev));
 	}
 }
 #endif /* MODULE */
@@ -233,7 +233,6 @@
 	idev->tx_buff.truesize = 4000;
 	
 	/* Initialize callbacks */
-	idev->hard_xmit       = pc87108_hard_xmit;
 	idev->change_speed    = pc87108_change_speed;
 	idev->wait_until_sent = pc87108_wait_until_sent;
 	idev->is_receiving    = pc87108_is_receiving;
@@ -671,7 +670,7 @@
 
 	/* Set appropriate speed mode */
 	switch_bank(iobase, BANK0);
-	outb( mcr|MCR_TX_DFR, iobase+MCR);
+	outb(mcr | MCR_TX_DFR, iobase+MCR);
 
 	/* Give some hits to the transceiver */
 	pc87108_change_dongle_speed( iobase, speed, idev->io.dongle_id);
@@ -805,8 +804,8 @@
 	switch_bank(iobase, BANK0);
 	outb( inb( iobase+MCR) & ~MCR_DMA_EN, iobase+MCR);
 
-	setup_dma( idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
-		   DMA_MODE_WRITE);
+	setup_dma(idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
+		  DMA_MODE_WRITE);
 	
 	/* idev->media_busy = TRUE; */
 	idev->io.direction = IO_XMIT;
@@ -920,29 +919,29 @@
  *    if it starts to receive a frame.
  *
  */
-static int pc87108_dma_receive( struct irda_device *idev) 
+static int pc87108_dma_receive(struct irda_device *idev) 
 {
 	struct pc87108 *self;
 	int iobase;
 	__u8 bsr;
 
-	ASSERT( idev != NULL, return -1;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+	ASSERT(idev != NULL, return -1;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return -1;);
 
-	DEBUG( 4, __FUNCTION__ "\n");
+	DEBUG(4, __FUNCTION__ "\n");
 
 	self = idev->priv;
-	iobase= idev->io.iobase;
+	iobase = idev->io.iobase;
 
 	/* Save current bank */
-	bsr = inb( iobase+BSR);
+	bsr = inb(iobase+BSR);
 
 	/* Disable DMA */
-	switch_bank( iobase, BANK0);
-	outb( inb(iobase+MCR) & ~MCR_DMA_EN, iobase+MCR);
+	switch_bank(iobase, BANK0);
+	outb(inb(iobase+MCR) & ~MCR_DMA_EN, iobase+MCR);
 
-	setup_dma( idev->io.dma, idev->rx_buff.data, idev->rx_buff.truesize, 
-		   DMA_MODE_READ);
+	setup_dma(idev->io.dma, idev->rx_buff.data, 
+		  idev->rx_buff.truesize, DMA_MODE_READ);
 	
 	/* driver->media_busy = FALSE; */
 	idev->io.direction = IO_RECV;
@@ -950,22 +949,22 @@
 	idev->rx_buff.offset = 0;
 
 	/* Reset Rx FIFO. This will also flush the ST_FIFO */
-	outb( FCR_RXTH|FCR_TXTH|FCR_RXSR|FCR_FIFO_EN, iobase+FCR);
+	outb(FCR_RXTH|FCR_TXTH|FCR_RXSR|FCR_FIFO_EN, iobase+FCR);
 	self->st_fifo.len = self->st_fifo.tail = self->st_fifo.head = 0;
 
 	/* Choose DMA Rx, DMA Fairness, and Advanced mode */
 	switch_bank(iobase, BANK2);
-	outb(( inb( iobase+ECR1) & ~ECR1_DMASWP)|ECR1_DMANF|ECR1_EXT_SL, 
-	      iobase+ECR1);
+	outb((inb( iobase+ECR1) & ~ECR1_DMASWP)|ECR1_DMANF|ECR1_EXT_SL, 
+	     iobase+ECR1);
 	
 	/* enable DMA */
 	switch_bank(iobase, BANK0);
-	outb( inb( iobase+MCR)|MCR_DMA_EN, iobase+MCR);
+	outb(inb(iobase+MCR)|MCR_DMA_EN, iobase+MCR);
 
 	/* Restore bank register */
-	outb( bsr, iobase+BSR);
+	outb(bsr, iobase+BSR);
 	
-	DEBUG( 4, __FUNCTION__ "(), done!\n");	
+	DEBUG(4, __FUNCTION__ "(), done!\n");	
 	
 	return 0;
 }
@@ -1481,9 +1480,7 @@
  */
 int init_module(void)
 {
-	pc87108_init();
-
-	return(0);
+	return pc87108_init();
 }
 
 /*
@@ -1496,6 +1493,5 @@
 {
 	pc87108_cleanup();
 }
-
-#endif
+#endif /* MODULE */
 
diff -urN linux-2.2.6-pre2/drivers/net/irda/tekram.c linux-2.2.6-pre3/drivers/net/irda/tekram.c
--- linux-2.2.6-pre2/drivers/net/irda/tekram.c	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/drivers/net/irda/tekram.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Wed Oct 21 20:02:35 1998
- * Modified at:   Tue Feb  9 15:36:55 1999
+ * Modified at:   Mon Feb 15 14:13:17 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
diff -urN linux-2.2.6-pre2/drivers/net/irda/uircc.c linux-2.2.6-pre3/drivers/net/irda/uircc.c
--- linux-2.2.6-pre2/drivers/net/irda/uircc.c	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/drivers/net/irda/uircc.c	2003-08-15 15:05:39.000000000 -0700
@@ -1,13 +1,13 @@
 /*********************************************************************
  *                
  * Filename:      uircc.c
- * Version:       0.1
+ * Version:       0.3
  * Description:   Driver for the Sharp Universal Infrared 
- *                Communications Controller (UIRCC)
+ *                Communications Controller (UIRCC v 1.3)
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Dec 26 10:59:03 1998
- * Modified at:   Tue Feb  9 13:30:41 1999
+ * Modified at:   Sat Apr  3 15:54:41 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -25,10 +25,6 @@
  *     740CDT, Portege 300CT, 660CDT, Satellite 220C Series, 
  *     Satellite Pro, 440C Series, 470CDT, 460C Series, 480C Series
  *
- *     Notice that FIR mode is not working yet, since I don't know 
- *     how to make the UIRCC drive the interrupt line, and not the
- *     UART (which is used for SIR speeds). Please mail me if you know!
- *
  ********************************************************************/
 
 #include <linux/module.h>
@@ -69,22 +65,24 @@
 static struct uircc_cb *dev_self[] = { NULL, NULL, NULL, NULL};
 
 /* Some prototypes */
-static int  uircc_open( int i, unsigned int iobase, unsigned int board_addr, 
-			unsigned int irq, unsigned int dma);
-static int  uircc_close( struct irda_device *idev);
-static int  uircc_probe( int iobase, int board_addr, int irq, int dma);
-static int  uircc_dma_receive( struct irda_device *idev); 
+static int  uircc_open(int i, unsigned int iobase, unsigned int board_addr, 
+		       unsigned int irq, unsigned int dma);
+#ifdef MODULE
+static int  uircc_close(struct irda_device *idev);
+#endif /* MODULE */
+static int  uircc_probe(int iobase, int board_addr, int irq, int dma);
+static int  uircc_dma_receive(struct irda_device *idev); 
 static int  uircc_dma_receive_complete(struct irda_device *idev, int iobase);
-static int  uircc_hard_xmit( struct sk_buff *skb, struct device *dev);
-static void uircc_dma_write( struct irda_device *idev, int iobase);
-static void uircc_change_speed( struct irda_device *idev, int baud);
+static int  uircc_hard_xmit(struct sk_buff *skb, struct device *dev);
+static void uircc_dma_write(struct irda_device *idev, int iobase);
+static void uircc_change_speed(struct irda_device *idev, int baud);
 static void uircc_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-static void uircc_wait_until_sent( struct irda_device *idev);
-static int  uircc_is_receiving( struct irda_device *idev);
-
-static int  uircc_net_init( struct device *dev);
-static int  uircc_net_open( struct device *dev);
-static int  uircc_net_close( struct device *dev);
+static void uircc_wait_until_sent(struct irda_device *idev);
+static int  uircc_is_receiving(struct irda_device *idev);
+static int uircc_toshiba_cmd(int *retval, int arg0, int arg1, int arg2);
+static int  uircc_net_init(struct device *dev);
+static int  uircc_net_open(struct device *dev);
+static int  uircc_net_close(struct device *dev);
 
 /*
  * Function uircc_init ()
@@ -98,9 +96,9 @@
 
 	for ( i=0; (io[i] < 2000) && (i < 4); i++) {
 		int ioaddr = io[i];
-		if (check_region(ioaddr, CHIP_IO_EXTENT))
+		if (check_region(ioaddr, CHIP_IO_EXTENT) < 0)
 			continue;
-		if (uircc_open( i, io[i], io2[i], irq[i], dma[i]) == 0)
+		if (uircc_open(i, io[i], io2[i], irq[i], dma[i]) == 0)
 			return 0;
 	}
 	return -ENODEV;
@@ -117,11 +115,11 @@
 {
 	int i;
 
-        DEBUG( 4, __FUNCTION__ "()\n");
+        DEBUG(4, __FUNCTION__ "()\n");
 
-	for ( i=0; i < 4; i++) {
-		if ( dev_self[i])
-			uircc_close( &(dev_self[i]->idev));
+	for (i=0; i < 4; i++) {
+		if (dev_self[i])
+			uircc_close(&(dev_self[i]->idev));
 	}
 }
 #endif /* MODULE */
@@ -132,28 +130,28 @@
  *    Open driver instance
  *
  */
-static int uircc_open( int i, unsigned int iobase, unsigned int iobase2, 
-                       unsigned int irq, unsigned int dma)
+static int uircc_open(int i, unsigned int iobase, unsigned int iobase2, 
+		      unsigned int irq, unsigned int dma)
 {
 	struct uircc_cb *self;
 	struct irda_device *idev;
 	int ret;
 
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	if (( uircc_probe( iobase, iobase2, irq, dma)) == -1)
+	if ((uircc_probe(iobase, iobase2, irq, dma)) == -1)
 		return -1;
 	
 	/*
 	 *  Allocate new instance of the driver
 	 */
 	self = kmalloc( sizeof(struct uircc_cb), GFP_KERNEL);
-	if ( self == NULL) {
-		printk( KERN_ERR "IrDA: Can't allocate memory for "
-			"IrDA control block!\n");
+	if (self == NULL) {
+		printk(KERN_ERR "IrDA: Can't allocate memory for "
+		       "IrDA control block!\n");
 		return -ENOMEM;
 	}
-	memset( self, 0, sizeof(struct uircc_cb));
+	memset(self, 0, sizeof(struct uircc_cb));
    
 	/* Need to store self somewhere */
 	dev_self[i] = self;
@@ -170,32 +168,32 @@
         idev->io.fifo_size = 16;
 
 	/* Lock the port that we need */
-	ret = check_region( idev->io.iobase, idev->io.io_ext);
-	if ( ret < 0) { 
-		DEBUG( 0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
-		       idev->io.iobase);
+	ret = check_region(idev->io.iobase, idev->io.io_ext);
+	if (ret < 0) { 
+		DEBUG(0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
+		      idev->io.iobase);
 		/* uircc_cleanup( self->idev);  */
 		return -ENODEV;
 	}
-	ret = check_region( idev->io.iobase2, idev->io.io_ext2);
-	if ( ret < 0) { 
-		DEBUG( 0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
-		       idev->io.iobase2);
+	ret = check_region(idev->io.iobase2, idev->io.io_ext2);
+	if (ret < 0) { 
+		DEBUG(0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
+		      idev->io.iobase2);
 		/* uircc_cleanup( self->idev);  */
 		return -ENODEV;
 	}
-	request_region( idev->io.iobase, idev->io.io_ext, idev->name);
-        request_region( idev->io.iobase2, idev->io.io_ext2, idev->name);
+	request_region(idev->io.iobase, idev->io.io_ext, idev->name);
+        request_region(idev->io.iobase2, idev->io.io_ext2, idev->name);
 
 	/* Initialize QoS for this device */
-	irda_init_max_qos_capabilies( &idev->qos);
+	irda_init_max_qos_capabilies(&idev->qos);
 	
 	/* The only value we must override it the baudrate */
 	idev->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
-		IR_115200|IR_576000|IR_1152000|(IR_4000000 << 8);
+		IR_115200|/*IR_576000|IR_1152000| */(IR_4000000 << 8);
 
-	idev->qos.min_turn_time.bits = 0x07;
-	irda_qos_bits_to_value( &idev->qos);
+	idev->qos.min_turn_time.bits = 0x0f;
+	irda_qos_bits_to_value(&idev->qos);
 
 	idev->flags = IFF_FIR|IFF_SIR|IFF_DMA|IFF_PIO;
 	
@@ -208,7 +206,6 @@
 	idev->tx_buff.truesize = 4000;
 	
 	/* Initialize callbacks */
-	idev->hard_xmit       = uircc_hard_xmit;
 	idev->change_speed    = uircc_change_speed;
 	idev->wait_until_sent = uircc_wait_until_sent;
 	idev->is_receiving    = uircc_is_receiving;
@@ -219,10 +216,10 @@
 	idev->netdev.open            = uircc_net_open;
 	idev->netdev.stop            = uircc_net_close;
 
-	irport_open( iobase2);
+	irport_open(iobase2);
 
 	/* Open the IrDA device */
-	irda_device_open( idev, driver_name, self);
+	irda_device_open(idev, driver_name, self);
 	
 	return 0;
 }
@@ -233,36 +230,41 @@
  *    Close driver instance
  *
  */
-static int uircc_close( struct irda_device *idev)
+#ifdef MODULE
+static int uircc_close(struct irda_device *idev)
 {
 	int iobase;
+	int status;
 
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( idev != NULL, return -1;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+	ASSERT(idev != NULL, return -1;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return -1;);
 
         iobase = idev->io.iobase;
 
+	/* Some magic to disable FIR and enable SIR */
+	uircc_toshiba_cmd(&status, 0xffff, 0x001b, 0x0000);
+
 	/* Disable modem */
-	outb( 0x00, iobase+UIRCC_CR10);
+	outb(0x00, iobase+UIRCC_CR10);
 
-	irport_close( idev->io.iobase2);
+	irport_close(idev->io.iobase2);
 
 	/* Release the PORT that this driver is using */
-	DEBUG( 4, __FUNCTION__ "(), Releasing Region %03x\n", idev->io.iobase);
-	release_region( idev->io.iobase, idev->io.io_ext);
+	DEBUG(4, __FUNCTION__ "(), Releasing Region %03x\n", idev->io.iobase);
+	release_region(idev->io.iobase, idev->io.io_ext);
 
-	if ( idev->io.iobase2) {
-		DEBUG( 4, __FUNCTION__ "(), Releasing Region %03x\n", 
-		       idev->io.iobase2);
-		release_region( idev->io.iobase2, idev->io.io_ext2);
+	if (idev->io.iobase2) {
+		DEBUG(4, __FUNCTION__ "(), Releasing Region %03x\n", 
+		      idev->io.iobase2);
+		release_region(idev->io.iobase2, idev->io.io_ext2);
 	}
-
-	irda_device_close( idev);
+	irda_device_close(idev);
 
 	return 0;
 }
+#endif /* MODULE */
 
 /*
  * Function uircc_probe (iobase, board_addr, irq, dma)
@@ -270,83 +272,38 @@
  *    Returns non-negative on success.
  *
  */
-static int uircc_probe( int iobase, int iobase2, int irq, int dma) 
+static int uircc_probe(int iobase, int iobase2, int irq, int dma) 
 {
 	int version;
-#if 0
-	int probe_irq=0;
-	unsigned long mask;
-	int i;
-#endif
 	
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
 	/* read the chip version, should be 0x03 */
-	version = inb( iobase+UIRCC_SR8);
+	version = inb(iobase+UIRCC_SR8);
 
-	if ( version != 0x03) {
-		DEBUG( 0, __FUNCTION__ "(), Wrong chip version");	
+	if (version != 0x03) {
+		DEBUG(0, __FUNCTION__ "(), Wrong chip version");	
 		return -1;
 	}
-        DEBUG( 0, "UIRCC driver loaded. Version: 0x%02x\n", version);
+        printk(KERN_INFO "Sharp UIRCC IrDA driver loaded. Version: 0x%02x\n",
+	       version);
 
 	/* Reset chip */
-	outb( UIRCC_CR0_SYS_RST, iobase+UIRCC_CR0);
+	outb(UIRCC_CR0_SYS_RST, iobase+UIRCC_CR0);
 
 	/* Initialize some registers */
-	outb( 0, iobase+UIRCC_CR11);
-	outb( 0, iobase+UIRCC_CR9);
-
-	/* Enable DMA single mode */
-	outb( UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, 
-	      iobase+UIRCC_CR1);
-
-	/* Disable interrupts */
-	outb( 0xff, iobase+UIRCC_CR2); 
-
-#if 0
-	irport_close( iobase2);
+	outb(0x03, iobase+UIRCC_CR15);
+	outb(0, iobase+UIRCC_CR11);
+	outb(0, iobase+UIRCC_CR9);
 
-	for (i=0;i<1;i++) {
-
-	/* Set appropriate speed mode */
-	outb( UIRCC_CR10_FIR, iobase+UIRCC_CR10);
+	DEBUG(0, __FUNCTION__ "(), sr15=%#x\n", inb(iobase+UIRCC_SR15));
 
 	/* Enable DMA single mode */
-	outb( UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, 
-	      iobase+UIRCC_CR1);
+	outb(UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, 
+	     iobase+UIRCC_CR1);
 
-	/* Set up timer */
-	outb( 0x01, iobase+UIRCC_CR12);
-	outb( 0x00, iobase+UIRCC_CR13);
-
-	/* Set interrupt mask */
-	outb( 0x82, iobase+UIRCC_CR2);
-
-	DEBUG( 0, __FUNCTION__ "(*), sr3=%#x, sr2=%#x, sr10=%#x, sr12=%#x\n", 
-	       inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2), 
-	       inb( iobase+UIRCC_SR10), inb( iobase+UIRCC_SR12));
-
-	mask = probe_irq_on();
-
-	/* Enable timer */
-	outb( 0x08, iobase+UIRCC_CR11);
-
-	udelay( 10000); /* Wait for interrupt! */
-
-	probe_irq = probe_irq_off( mask);
-
-	DEBUG( 0, "Found irq=%d\n", probe_irq);
-
-	DEBUG( 0, __FUNCTION__ "(), sr3=%#x, sr2=%#x, sr10=%#x, sr12=%#x\n", 
-	       inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2), 
-	       inb( iobase+UIRCC_SR10), inb( iobase+UIRCC_SR12));
-	
-
-	/* Diable timer */
-	outb( 0x00, iobase+UIRCC_CR11);
-	}
-#endif
+	/* Disable interrupts */
+	outb(0xff, iobase+UIRCC_CR2); 
 
 	/* Set self poll address */
 
@@ -359,16 +316,20 @@
  *    Change the speed of the device
  *
  */
-static void uircc_change_speed( struct irda_device *idev, int speed)
+static void uircc_change_speed(struct irda_device *idev, int speed)
 {
 	struct uircc_cb *self;
 	int iobase; 
 	int modem = UIRCC_CR10_SIR;
+	int status;
+
+	DEBUG(0, __FUNCTION__ "()\n");
 
-	DEBUG( 0, __FUNCTION__ "()\n");
+	/* Just test the high speed stuff */
+	/*speed = 4000000;*/
 
-	ASSERT( idev != NULL, return;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+	ASSERT(idev != NULL, return;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
 
 	self = idev->priv;
 	iobase = idev->io.iobase;
@@ -377,16 +338,20 @@
 	idev->io.baudrate = speed;
 
 	/* Disable interrupts */	
-	outb( 0xff, iobase+UIRCC_CR2);
+	outb(0xff, iobase+UIRCC_CR2);
 
-	switch ( speed) {
+	switch (speed) {
 	case 9600:
 	case 19200:
 	case 37600:
 	case 57600:
 	case 115200:
-/* 		irport_open( idev->io.iobase2); */
+ 		irport_open(idev->io.iobase2);
 		irport_change_speed( idev->io.iobase2, speed);
+
+		/* Some magic to disable FIR and enable SIR */
+		uircc_toshiba_cmd(&status, 0xffff, 0x001b, 0x0000);
+
 		modem = UIRCC_CR10_SIR;
 		break;
 	case 576000:		
@@ -398,9 +363,18 @@
 		DEBUG(0, __FUNCTION__ "(), handling baud of 1152000\n");
 		break;
 	case 4000000:
-		irport_close( idev->io.iobase2);
+		irport_close(idev->io.iobase2);
+
+		/* Some magic to disable SIR and enable FIR */
+		uircc_toshiba_cmd(&status, 0xffff, 0x001b, 0x0001);
+
 		modem = UIRCC_CR10_FIR;
 		DEBUG(0, __FUNCTION__ "(), handling baud of 4000000\n");
+
+		/* Set self pole address */
+		outb(0x10, iobase+UIRCC_CR8);
+
+	 	/* outb(0x10, iobase+UIRCC_CR11); */
 		break;
 	default:
 		DEBUG( 0, __FUNCTION__ "(), unknown baud rate of %d\n", speed);
@@ -408,19 +382,19 @@
 	}
 
 	/* Set appropriate speed mode */
-	outb( modem, iobase+UIRCC_CR10);
+	outb(modem, iobase+UIRCC_CR10);
 
 	idev->netdev.tbusy = 0;
 	
 	/* Enable some interrupts so we can receive frames */
-	if ( speed > 115200) {
+	if (speed > 115200) {
 		/* Enable DMA single mode */
-		outb( UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, 
-		      iobase+UIRCC_CR1);
+		outb(UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, 
+		     iobase+UIRCC_CR1);
 
- 		/* outb( UIRCC_CR2_RECV_MASK, iobase+UIRCC_CR2);  */
-		outb( 0, iobase+UIRCC_CR2); 
- 		uircc_dma_receive( idev);
+ 		/* Enable all interrupts  */
+		outb(0, iobase+UIRCC_CR2); 
+ 		uircc_dma_receive(idev);
  	}    	
 }
 
@@ -430,7 +404,7 @@
  *    Transmit the frame!
  *
  */
-static int uircc_hard_xmit( struct sk_buff *skb, struct device *dev)
+static int uircc_hard_xmit(struct sk_buff *skb, struct device *dev)
 {
 	struct irda_device *idev;
 	int iobase;
@@ -438,86 +412,97 @@
 	
 	idev = (struct irda_device *) dev->priv;
 
-	ASSERT( idev != NULL, return 0;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+	ASSERT(idev != NULL, return 0;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
 
 	iobase = idev->io.iobase;
 
-	DEBUG(0, __FUNCTION__ "(%ld), skb->len=%d\n", jiffies, (int) skb->len);
+	DEBUG(4, __FUNCTION__ "(%ld), skb->len=%d\n", jiffies, (int) skb->len);
+	
+	/* Reset carrier latch */
+	/*outb(0x02, iobase+UIRCC_CR0);*/
 
 	/* Use irport for SIR speeds */
 	if (idev->io.baudrate <= 115200) {
 		return irport_hard_xmit(skb, dev);
 	}
 	
+	DEBUG(0, __FUNCTION__ "(), sr0=%#x, sr1=%#x, sr2=%#x, sr3=%#x, sr10=%#x, sr11=%#x\n",
+	      inb(iobase+UIRCC_SR0), inb(iobase+UIRCC_SR3),
+	      inb(iobase+UIRCC_SR2), inb(iobase+UIRCC_SR3), 
+	      inb(iobase+UIRCC_SR10), inb(iobase+UIRCC_SR11));
+
 	/* Lock transmit buffer */
 	if (irda_lock((void *) &dev->tbusy) == FALSE)
 		return -EBUSY;
 
-	memcpy( idev->tx_buff.data, skb->data, skb->len);
+	memcpy(idev->tx_buff.data, skb->data, skb->len);
 
 	/* Make sure that the length is a multiple of 16 bits */
-	if ( skb->len & 0x01)
+	if (skb->len & 0x01)
 		skb->len++;
 
 	idev->tx_buff.len = skb->len;
 	idev->tx_buff.head = idev->tx_buff.data;
 	idev->tx_buff.offset = 0;
 	
-	mtt = irda_get_mtt( skb);
+	mtt = irda_get_mtt(skb);
 	
 	/* Use udelay for delays less than 50 us. */
 	if (mtt)
-		udelay( mtt);
+		udelay(mtt);
 	
 	/* Enable transmit interrupts */
-	/* outb( UIRCC_CR2_XMIT_MASK, iobase+UIRCC_CR2); */
-	outb( 0, iobase+UIRCC_CR2); 
+ 	outb(0, iobase+UIRCC_CR2);
 
-	uircc_dma_write( idev, iobase);
+	uircc_dma_write(idev, iobase);
 	
-	dev_kfree_skb( skb);
+	dev_kfree_skb(skb);
 
 	return 0;
 }
 
 /*
- * Function uircc_dma_xmit (idev, iobase)
+ * Function uircc_dma_write (idev, iobase)
  *
  *    Transmit data using DMA
  *
  */
-static void uircc_dma_write( struct irda_device *idev, int iobase)
+static void uircc_dma_write(struct irda_device *idev, int iobase)
 {
 	struct uircc_cb *self;
-	int i;
 
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( idev != NULL, return;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+	ASSERT(idev != NULL, return;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
 
 	self = idev->priv;
 
 	/* Receiving disable */
 	self->cr3 &= ~UIRCC_CR3_RECV_EN;
-	outb( self->cr3, iobase+UIRCC_CR3);
+	outb(self->cr3, iobase+UIRCC_CR3);
 
-	setup_dma( idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
-		   DMA_MODE_WRITE);
-	
-	DEBUG( 0, __FUNCTION__ "residue=%d\n", 
-	       get_dma_residue( idev->io.dma));
+	/* Set modem */
+	outb(0x80, iobase+UIRCC_CR10);
+
+	/* Enable transmit DMA */
+	outb(UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, iobase+UIRCC_CR1);
 
+	ASSERT((((__u32)(idev->tx_buff.data)) & 0x01) != 0x01, return;);
+
+	setup_dma(idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
+		  DMA_MODE_WRITE);
+	
 	idev->io.direction = IO_XMIT;
 
-	/* Set frame length */
-	outb( idev->tx_buff.len & 0xff, iobase+UIRCC_CR4); /* Low byte */
-	outb( idev->tx_buff.len >> 8, iobase+UIRCC_CR5);   /* High byte */
+	/* Set frame length (should be the real length without padding */
+	outb(idev->tx_buff.len & 0xff, iobase+UIRCC_CR4); /* Low byte */
+	outb(idev->tx_buff.len >> 8, iobase+UIRCC_CR5);   /* High byte */
 
 	/* Enable transmit and transmit CRC */
 	self->cr3 |= (UIRCC_CR3_XMIT_EN|UIRCC_CR3_TX_CRC_EN);
-	outb( self->cr3, iobase+UIRCC_CR3);
+	outb(self->cr3, iobase+UIRCC_CR3);
 }
 
 /*
@@ -533,33 +518,38 @@
 	int iobase;
 	int len;
 
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( idev != NULL, return;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+	ASSERT(idev != NULL, return;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
 
 	self = idev->priv;
 
 	iobase = idev->io.iobase;
 
 	/* Select TX counter */
-	outb( UIRCC_CR0_CNT_SWT, iobase+UIRCC_CR0);
+	outb(UIRCC_CR0_CNT_SWT, iobase+UIRCC_CR0);
 
 	/* Read TX length counter */
-	len  = inb( iobase+UIRCC_SR4);      /* Low byte */
-	len |= inb( iobase+UIRCC_SR5) << 8; /* High byte */
+	len  = inb(iobase+UIRCC_SR4);      /* Low byte */
+	len |= inb(iobase+UIRCC_SR5) << 8; /* High byte */
+
+	DEBUG(4, __FUNCTION__ "(), sent %d bytes\n", len);
 
 	/* Disable transmit */
 	self->cr3 &= ~UIRCC_CR3_XMIT_EN;
-	outb( self->cr3, iobase+UIRCC_CR3);
+	outb(self->cr3, iobase+UIRCC_CR3);
+
+	/* Transmit reset (just to be sure) */
+	outb(UIRCC_CR0_XMIT_RST, iobase+UIRCC_CR0);
 	
 	/* Check for underrrun! */
-	if ( underrun) {
+	if (underrun) {
 		idev->stats.tx_errors++;
 		idev->stats.tx_fifo_errors++;		
 	} else {
 		idev->stats.tx_packets++;
-		idev->stats.tx_bytes +=  idev->tx_buff.len;
+		idev->stats.tx_bytes += idev->tx_buff.len;
 	}
 
 	/* Unlock tx_buff and request another frame */
@@ -567,7 +557,7 @@
 	idev->media_busy = FALSE;
 	
 	/* Tell the network layer, that we can accept more frames */
-	mark_bh( NET_BH);
+	mark_bh(NET_BH);
 }
 
 /*
@@ -577,23 +567,38 @@
  *    if it starts to receive a frame.
  *
  */
-static int uircc_dma_receive( struct irda_device *idev) 
+static int uircc_dma_receive(struct irda_device *idev) 
 {
 	struct uircc_cb *self;
 	int iobase;
 
-	ASSERT( idev != NULL, return -1;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+	ASSERT(idev != NULL, return -1;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return -1;);
 
-	DEBUG( 0, __FUNCTION__ "\n");
+	DEBUG(4, __FUNCTION__ "\n");
 
 	self = idev->priv;
 	iobase= idev->io.iobase;
 
-	/* Disable DMA */
-	
-	setup_dma( idev->io.dma, idev->rx_buff.data, idev->rx_buff.truesize, 
-		   DMA_MODE_READ);
+	/* Transmit disable */
+	/* self->cr3 &= ~UIRCC_CR3_XMIT_EN; */
+	self->cr3 = 0;
+	outb(self->cr3, iobase+UIRCC_CR3);
+
+	/* Transmit reset (just in case) */
+	outb(UIRCC_CR0_XMIT_RST, iobase+UIRCC_CR0);
+
+	/* Set modem */
+	outb(0x08, iobase+UIRCC_CR10);
+
+	/* Make sure Rx DMA is set */
+ 	outb(UIRCC_CR1_RX_DMA|UIRCC_CR1_MUST_SET, iobase+UIRCC_CR1);
+
+	/* Rx reset */
+	/* outb(UIRCC_CR0_RECV_RST, iobase+UIRCC_CR0); */
+
+	setup_dma(idev->io.dma, idev->rx_buff.data, 
+		  idev->rx_buff.truesize, DMA_MODE_READ);
 	
 	/* driver->media_busy = FALSE; */
 	idev->io.direction = IO_RECV;
@@ -601,13 +606,13 @@
 	idev->rx_buff.offset = 0;
 
 	/* Enable receiving with CRC */
-	self->cr3 |= (UIRCC_CR3_RECV_EN|UIRCC_CR3_RX_CRC_EN);
-	outb( self->cr3, iobase+UIRCC_CR3);
+	self->cr3 = (UIRCC_CR3_RECV_EN|UIRCC_CR3_RX_CRC_EN);
+	outb(self->cr3, iobase+UIRCC_CR3);
+
+	DEBUG(4, __FUNCTION__ "(), cr3=%#x\n", self->cr3);
 	
 	/* Address check? */
 
-	DEBUG( 4, __FUNCTION__ "(), done!\n");	
-	
 	return 0;
 }
 
@@ -618,7 +623,7 @@
  *
  *    
  */
-static int uircc_dma_receive_complete( struct irda_device *idev, int iobase)
+static int uircc_dma_receive_complete(struct irda_device *idev, int iobase)
 {
 	struct sk_buff *skb;
 	struct uircc_cb *self;
@@ -626,37 +631,37 @@
 
 	self = idev->priv;
 
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(0, __FUNCTION__ "()\n");
 
 	/* Check for CRC or framing error */
-	if ( inb( iobase+UIRCC_SR0) & UIRCC_SR0_RX_CRCFRM) {
-		DEBUG( 0, __FUNCTION__ "(), crc or frm error\n");
+	if (inb(iobase+UIRCC_SR0) & UIRCC_SR0_RX_CRCFRM) {
+		DEBUG(0, __FUNCTION__ "(), CRC or FRAME error\n");
 		return -1;
 	}
 
 	/* Select receive length counter */
-	outb( 0x00, iobase+UIRCC_CR0);
+	outb(0x00, iobase+UIRCC_CR0);
 
 	/* Read frame length */
-	len = inb( iobase+UIRCC_SR4);       /* Low byte */
-	len |= inb( iobase+UIRCC_SR5) << 8; /* High byte */
+	len = inb(iobase+UIRCC_SR4);       /* Low byte */
+	len |= inb(iobase+UIRCC_SR5) << 8; /* High byte */
 
-	DEBUG( 0, __FUNCTION__ "(), len=%d\n", len);
+	DEBUG(0, __FUNCTION__ "(), len=%d\n", len);
 
 	/* Receiving disable */
 	self->cr3 &= ~UIRCC_CR3_RECV_EN;
-	outb( self->cr3, iobase+UIRCC_CR3);
+	outb(self->cr3, iobase+UIRCC_CR3);
 
-	skb = dev_alloc_skb( len+1);
+	skb = dev_alloc_skb(len+1);
 	if (skb == NULL)  {
-		printk( KERN_INFO __FUNCTION__ 
-			"(), memory squeeze, dropping frame.\n");
+		printk(KERN_INFO __FUNCTION__ 
+		       "(), memory squeeze, dropping frame.\n");
 				/* Restore bank register */
 		return FALSE;
 	}
 			
 	/* Make sure IP header gets aligned */
-	skb_reserve( skb, 1); 
+	skb_reserve(skb, 1);
 
 	/* Copy frame without CRC */
 	/* if ( idev->io.baudrate < 4000000) { */
@@ -667,14 +672,14 @@
 /* 		memcpy( skb->data, idev->rx_buff.head, len-4); */
 /* 	} */
 
-	skb_put( skb, len);
-	memcpy( skb->data, idev->rx_buff.head, len);
+	skb_put(skb, len);
+	memcpy(skb->data, idev->rx_buff.head, len);
 	idev->stats.rx_packets++;
 
 	skb->dev = &idev->netdev;
 	skb->mac.raw  = skb->data;
 	skb->protocol = htons(ETH_P_IRDA);
-	netif_rx( skb);
+	netif_rx(skb);
 
 	return TRUE;
 }
@@ -706,40 +711,44 @@
 	/* Read interrupt status */
 	sr3 = inb( iobase+UIRCC_SR3); 
 	if (!sr3) {
+		DEBUG(4,"**\n");
 		return;
 	}
-
 	idev->netdev.interrupt = 1;
 
-	DEBUG( 4, __FUNCTION__ "(), sr3=%#x, sr2=%#x, sr10=%#x\n", 
-	       inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2), 
-	       inb( iobase+UIRCC_SR10));
+	DEBUG(4, __FUNCTION__ "(), sr3=%#x, sr2=%#x, sr10=%#x\n", 
+	      inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2), 
+	      inb( iobase+UIRCC_SR10));
 
 	/*
 	 *  Check what interrupt this is. The UIRCC will not report two
 	 *  different interrupts at the same time!
 	 */
-	switch( sr3) {
-	case UIRCC_SR3_RX_EOF: /* Check of end of frame */
-		uircc_dma_receive_complete( idev, iobase);
+	switch(sr3) {
+	case UIRCC_SR3_RX_EOF: /* Check for end of frame */
+		uircc_dma_receive_complete(idev, iobase);
 		break;
 	case UIRCC_SR3_TXUR:   /* Check for transmit underrun */
-		uircc_dma_xmit_complete( idev, TRUE);
+		uircc_dma_xmit_complete(idev, TRUE);
+		uircc_dma_receive(idev);
+		outb(0, iobase+UIRCC_CR2); 
 		break;
 	case UIRCC_SR3_TX_DONE:
-		uircc_dma_xmit_complete( idev, FALSE);
+		uircc_dma_xmit_complete(idev, FALSE);
+		uircc_dma_receive(idev);
+
+		/* outb(0, iobase+UIRCC_CR2);  */
 		break;
 	case UIRCC_SR3_TMR_OUT:
 		/* Disable timer */
-		outb( inb( iobase+UIRCC_CR11) & ~UIRCC_CR11_TMR_EN, 
-		      iobase+UIRCC_CR11);
+		outb(inb(iobase+UIRCC_CR11) & ~UIRCC_CR11_TMR_EN, 
+		     iobase+UIRCC_CR11);
 		break;
 	default:
-		DEBUG( 0, __FUNCTION__ "(), unknown interrupt status=%#x\n",
-		       sr3);
+		DEBUG(0, __FUNCTION__ "(), unknown interrupt status=%#x\n",
+		      sr3);
 		break;
-	}
-	
+	}	
 	idev->netdev.interrupt = 0;
 }
 
@@ -767,13 +776,13 @@
 	int status = FALSE;
 	/* int iobase; */
 
-	ASSERT( idev != NULL, return FALSE;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return FALSE;);
+	ASSERT(idev != NULL, return FALSE;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return FALSE;);
 
-	if ( idev->io.baudrate > 115200) {
+	if (idev->io.baudrate > 115200) {
 		
 	} else 
-		status = ( idev->rx_buff.state != OUTSIDE_FRAME);
+		status = (idev->rx_buff.state != OUTSIDE_FRAME);
 	
 	return status;
 }
@@ -789,7 +798,7 @@
 	DEBUG( 4, __FUNCTION__ "()\n");
 
 	/* Setup to be a normal IrDA network device driver */
-	irda_device_setup( dev);
+	irda_device_setup(dev);
 
 	/* Insert overrides below this line! */
 
@@ -803,23 +812,23 @@
  *    Start the device
  *
  */
-static int uircc_net_open( struct device *dev)
+static int uircc_net_open(struct device *dev)
 {
 	struct irda_device *idev;
 	int iobase;
 	
 	DEBUG( 4, __FUNCTION__ "()\n");
 	
-	ASSERT( dev != NULL, return -1;);
+	ASSERT(dev != NULL, return -1;);
 	idev = (struct irda_device *) dev->priv;
 	
-	ASSERT( idev != NULL, return 0;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+	ASSERT(idev != NULL, return 0;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
 	
 	iobase = idev->io.iobase;
 
-	if (request_irq( idev->io.irq, uircc_interrupt, 0, idev->name, 
-			 (void *) idev)) {
+	if (request_irq(idev->io.irq, uircc_interrupt, 0, idev->name, 
+			(void *) idev)) {
 		return -EAGAIN;
 	}
 	/*
@@ -827,7 +836,7 @@
 	 * and clean up on failure.
 	 */
 	if (request_dma(idev->io.dma, idev->name)) {
-		free_irq( idev->io.irq, idev);
+		free_irq(idev->io.irq, idev);
 		return -EAGAIN;
 	}
 		
@@ -854,32 +863,62 @@
 	struct irda_device *idev;
 	int iobase;
 
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 	
 	/* Stop device */
 	dev->tbusy = 1;
 	dev->start = 0;
 
-	ASSERT( dev != NULL, return -1;);
+	ASSERT(dev != NULL, return -1;);
 	idev = (struct irda_device *) dev->priv;
 	
-	ASSERT( idev != NULL, return 0;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+	ASSERT(idev != NULL, return 0;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
 	
 	iobase = idev->io.iobase;
 
-	disable_dma( idev->io.dma);
+	disable_dma(idev->io.dma);
 
 	/* Disable interrupts */
        
-	free_irq( idev->io.irq, idev);
-	free_dma( idev->io.dma);
+	free_irq(idev->io.irq, idev);
+	free_dma(idev->io.dma);
 
 	MOD_DEC_USE_COUNT;
 
 	return 0;
 }
 
+/*
+ * Function uircc_toshiba_cmd (arg0, arg1, arg2)
+ *
+ *    disable FIR: uircc_toshiba_cmd(&status, 0xffff, 0x001b, 0x0000);
+ *    enable  FIR: uircc_toshiba_cmd(&status, 0xffff, 0x001b, 0x0001);
+ *    IRDA status: uircc_toshiba_cmd(&status, 0xfefe, 0x001b, 0x0000);
+ */
+static int uircc_toshiba_cmd(int *retval, int arg0, int arg1, int arg2)
+{
+	char return_code = 0;
+
+	__asm__ volatile ("inb   $0xb2,%%al; "
+			  "movb  %%ah,%%al;  "
+			  : /* Output */
+			  "=al"  (return_code),
+			  "=ecx" (*retval)
+			  : /* Input */
+			  "ax" (arg0),
+			  "bx" (arg1),
+			  "cx" (arg2)
+		);
+	/*
+	 * Return
+	 * 0x00 = OK
+	 * 0x80 = Function not supported by system
+	 * 0x83 = Input data error
+	 */
+	return (int) return_code;
+}
+
 #ifdef MODULE
 
 /*
@@ -890,9 +929,7 @@
  */
 int init_module(void)
 {
-	uircc_init();
-
-	return(0);
+	return uircc_init();
 }
 
 /*
@@ -905,6 +942,5 @@
 {
 	uircc_cleanup();
 }
-
-#endif
+#endif /* MODULE */
 
diff -urN linux-2.2.6-pre2/drivers/net/irda/w83977af_ir.c linux-2.2.6-pre3/drivers/net/irda/w83977af_ir.c
--- linux-2.2.6-pre2/drivers/net/irda/w83977af_ir.c	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/drivers/net/irda/w83977af_ir.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Paul VanderSpek
  * Created at:    Wed Nov  4 11:46:16 1998
- * Modified at:   Tue Feb  9 13:30:35 1999
+ * Modified at:   Wed Apr  7 17:35:59 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Corel Computer Corp.
@@ -22,7 +22,7 @@
  *     provided "AS-IS" and at no charge.
  *     
  *     If you find bugs in this file, its very likely that the same bug
- *     will also be in w83977af_ir.c since the implementations is quite
+ *     will also be in pc87108.c since the implementations is quite
  *     similar.
  *
  *     Notice that all functions that needs to access the chip in _any_
@@ -67,8 +67,8 @@
 
 #define CHIP_IO_EXTENT 8
 
-static unsigned int io[] = { 0x400, ~0, ~0, ~0 };
-static unsigned int irq[] = { 22, 0, 0, 0 };
+static unsigned int io[] = { 0x180, ~0, ~0, ~0 };
+static unsigned int irq[] = { 6, 0, 0, 0 };
 static unsigned int dma[] = { 0, 0, 0, 0 };
 
 static struct irda_device *dev_self[] = { NULL, NULL, NULL, NULL};
@@ -116,7 +116,7 @@
 
 	for ( i=0; (io[i] < 2000) && (i < 4); i++) {
 		int ioaddr = io[i];
-		if (check_region(ioaddr, CHIP_IO_EXTENT))
+		if (check_region(ioaddr, CHIP_IO_EXTENT) < 0)
 			continue;
 		if (w83977af_open( i, io[i], irq[i], dma[i]) == 0)
 			return 0;
@@ -216,7 +216,6 @@
 	idev->tx_buff.truesize = 4000;
 	
 	/* Initialize callbacks */
-	idev->hard_xmit       = w83977af_hard_xmit;
 	idev->change_speed    = w83977af_change_speed;
 	idev->wait_until_sent = w83977af_wait_until_sent;
         idev->is_receiving    = w83977af_is_receiving;
@@ -290,9 +289,10 @@
 	/* Configure PnP port, IRQ, and DMA channel */
 	w977_write_reg(0x60, (iobase >> 8) & 0xff);
 	w977_write_reg(0x61, (iobase) & 0xff);
-	w977_write_reg(0x70, 0x06);
+	/* w977_write_reg(0x70, 0x06); */
+	w977_write_reg(0x70, irq);
 #ifdef NETWINDER
-	w977_write_reg(0x74, dma+1); /* Netwinder uses 1 higher than Linux */
+	w977_write_reg(0x74, dma+1); /* Netwinder uses one higher than Linux */
 #else
 	w977_write_reg(0x74, dma);   
 #endif
@@ -433,7 +433,7 @@
 	
 	/* set FIFO threshold to TX17, RX16 */
 	switch_bank(iobase, SET0);
-	outb( UFR_RXTL|UFR_TXTL|UFR_TXF_RST|UFR_RXF_RST|UFR_EN_FIFO, iobase+UFR);
+	outb(UFR_RXTL|UFR_TXTL|UFR_TXF_RST|UFR_RXF_RST|UFR_EN_FIFO, iobase+UFR);
 	
 	idev->netdev.tbusy = 0;
 	
@@ -464,65 +464,65 @@
 	
 	idev = (struct irda_device *) dev->priv;
 
-	ASSERT( idev != NULL, return 0;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+	ASSERT(idev != NULL, return 0;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
 
 	iobase = idev->io.iobase;
 
 	DEBUG(4, __FUNCTION__ "(%ld), skb->len=%d\n", jiffies, (int) skb->len);
 	
 	/* Lock transmit buffer */
-	if ( irda_lock( (void *) &dev->tbusy) == FALSE)
+	if (irda_lock((void *) &dev->tbusy) == FALSE)
 		return -EBUSY;
-
+	
 	/* Save current set */
-	set = inb( iobase+SSR);
+	set = inb(iobase+SSR);
 	
 	/* Decide if we should use PIO or DMA transfer */
-	if ( idev->io.baudrate > 115200) {
-		memcpy( idev->tx_buff.data, skb->data, skb->len);
+	if (idev->io.baudrate > 115200) {
+		memcpy(idev->tx_buff.data, skb->data, skb->len);
 		idev->tx_buff.len = skb->len;
 		idev->tx_buff.head = idev->tx_buff.data;
 		idev->tx_buff.offset = 0;
 		
-		mtt = irda_get_mtt( skb);
-	        if ( mtt > 50) {
+		mtt = irda_get_mtt(skb);
+	        if (mtt > 50) {
 			/* Adjust for timer resolution */
-			mtt /= 1000+1;
+			mtt = mtt / 1000 + 1;
 
 			/* Setup timer */
-			switch_bank( iobase, SET4);
-			outb( mtt & 0xff, iobase+TMRL);
-			outb(( mtt >> 8) & 0x0f, iobase+TMRH);
+			switch_bank(iobase, SET4);
+			outb(mtt & 0xff, iobase+TMRL);
+			outb((mtt >> 8) & 0x0f, iobase+TMRH);
 			
 			/* Start timer */
-			outb( IR_MSL_EN_TMR, iobase+IR_MSL);
+			outb(IR_MSL_EN_TMR, iobase+IR_MSL);
 			idev->io.direction = IO_XMIT;
 			
 			/* Enable timer interrupt */
-			switch_bank( iobase, SET0);
-			outb( ICR_ETMRI, iobase+ICR);
+			switch_bank(iobase, SET0);
+			outb(ICR_ETMRI, iobase+ICR);
 		} else {
-			if ( mtt)
-				udelay( mtt);
+			if (mtt)
+				udelay(mtt);
 
 			/* Enable DMA interrupt */
-			switch_bank( iobase, SET0);
-	 		outb( ICR_EDMAI, iobase+ICR);
-	     		w83977af_dma_write( idev, iobase);
+			switch_bank(iobase, SET0);
+	 		outb(ICR_EDMAI, iobase+ICR);
+	     		w83977af_dma_write(idev, iobase);
 		}
 	} else {
-		idev->tx_buff.len = async_wrap_skb( skb, idev->tx_buff.data, 
-						    idev->tx_buff.truesize);
+		idev->tx_buff.len = async_wrap_skb(skb, idev->tx_buff.data, 
+						   idev->tx_buff.truesize);
 		
 		idev->tx_buff.offset = 0;
 		idev->tx_buff.head = idev->tx_buff.data;
 		
 		/* Add interrupt on tx low level (will fire immediately) */
 		switch_bank( iobase, SET0);
-		outb( ICR_ETXTHI, iobase+ICR);
+		outb(ICR_ETXTHI, iobase+ICR);
 	}
-	dev_kfree_skb( skb);
+	dev_kfree_skb(skb);
 
 	/* Restore set register */
 	outb( set, iobase+SSR);
@@ -550,23 +550,23 @@
 	switch_bank(iobase, SET0);
 	outb( inb( iobase+HCR) & ~HCR_EN_DMA, iobase+HCR);
 	
-	setup_dma( idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
-		   DMA_MODE_WRITE);
+	setup_dma(idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
+		  DMA_MODE_WRITE);
 	
 	/* idev->media_busy = TRUE; */
 	idev->io.direction = IO_XMIT;
 	
 	/* Choose transmit DMA channel  */ 
 	switch_bank(iobase, SET2);
-	outb( inb( iobase+ADCR1) | ADCR1_D_CHSW|ADCR1_DMA_F|ADCR1_ADV_SL, 
-	      iobase+ADCR1);
+	outb(inb(iobase+ADCR1) | ADCR1_D_CHSW|ADCR1_DMA_F|ADCR1_ADV_SL, 
+	     iobase+ADCR1);
 	
 	/* Enable DMA */
- 	switch_bank( iobase, SET0);
-	outb( inb( iobase+HCR) | HCR_EN_DMA, iobase+HCR);
+ 	switch_bank(iobase, SET0);
+	outb(inb(iobase+HCR) | HCR_EN_DMA, iobase+HCR);
 	
 	/* Restore set register */
-	outb( set, iobase+SSR);
+	outb(set, iobase+SSR);
 }
 
 /*
@@ -575,7 +575,7 @@
  *    
  *
  */
-static int w83977af_pio_write( int iobase, __u8 *buf, int len, int fifo_size)
+static int w83977af_pio_write(int iobase, __u8 *buf, int len, int fifo_size)
 {
 	int actual = 0;
 	__u8 set;
@@ -586,7 +586,7 @@
 	set = inb( iobase+SSR);
 
 	switch_bank( iobase, SET0);
-	if (!( inb_p( iobase+USR) & USR_TSRE)) {
+	if (!(inb_p(iobase+USR) & USR_TSRE)) {
 		DEBUG( 4, __FUNCTION__ "(), warning, FIFO not empty yet!\n");
 
 		fifo_size -= 17;
@@ -599,11 +599,11 @@
 		outb( buf[actual++], iobase+TBR);
 	}
         
-	DEBUG( 4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n", 
-	       fifo_size, actual, len);
+	DEBUG(4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n", 
+	      fifo_size, actual, len);
 
 	/* Restore bank */
-	outb( set, iobase+SSR);
+	outb(set, iobase+SSR);
 
 	return actual;
 }
@@ -615,34 +615,34 @@
  *
  *    
  */
-void w83977af_dma_xmit_complete( struct irda_device *idev)
+void w83977af_dma_xmit_complete(struct irda_device *idev)
 {
 	int iobase;
 	__u8 set;
 
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( idev != NULL, return;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+	ASSERT(idev != NULL, return;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
 
 	iobase = idev->io.iobase;
 
 	/* Save current set */
-	set = inb( iobase+SSR);
+	set = inb(iobase+SSR);
 
 	/* Disable DMA */
 	switch_bank(iobase, SET0);
-	outb( inb(iobase+HCR) & ~HCR_EN_DMA, iobase+HCR);
+	outb(inb(iobase+HCR) & ~HCR_EN_DMA, iobase+HCR);
 	
 	/* Check for underrrun! */
-	if ( inb( iobase+AUDR) & AUDR_UNDR) {
-		DEBUG( 0, __FUNCTION__ "(), Transmit underrun!\n");
+	if (inb(iobase+AUDR) & AUDR_UNDR) {
+		DEBUG(0, __FUNCTION__ "(), Transmit underrun!\n");
 		
 		idev->stats.tx_errors++;
 		idev->stats.tx_fifo_errors++;
 
 		/* Clear bit, by writing 1 to it */
-		outb( AUDR_UNDR, iobase+AUDR);
+		outb(AUDR_UNDR, iobase+AUDR);
 	} else
 		idev->stats.tx_packets++;
 
@@ -651,10 +651,10 @@
 	idev->media_busy = FALSE;
 	
 	/* Tell the network layer, that we want more frames */
-	mark_bh( NET_BH);
+	mark_bh(NET_BH);
 
 	/* Restore set */
-	outb( set, iobase+SSR);
+	outb(set, iobase+SSR);
 }
 
 /*
@@ -664,7 +664,7 @@
  *    if it starts to receive a frame.
  *
  */
-int w83977af_dma_receive( struct irda_device *idev) 
+int w83977af_dma_receive(struct irda_device *idev) 
 {
 	int iobase;
 	__u8 set;
@@ -673,10 +673,10 @@
 	__u8 hcr;
 #endif
 
-	ASSERT( idev != NULL, return -1;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+	ASSERT(idev != NULL, return -1;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return -1;);
 
-	DEBUG( 0, __FUNCTION__ "\n");
+	DEBUG(0, __FUNCTION__ "\n");
 
 	iobase= idev->io.iobase;
 
@@ -697,8 +697,8 @@
 	set_dma_addr( idev->io.dma, virt_to_bus(idev->rx_buff.data));
 	set_dma_count( idev->io.dma, idev->rx_buff.truesize);
 #else
-	setup_dma( idev->io.dma, idev->rx_buff.data, idev->rx_buff.truesize, 
-		   DMA_MODE_READ);
+	setup_dma(idev->io.dma, idev->rx_buff.data, 
+		  idev->rx_buff.truesize, DMA_MODE_READ);
 #endif
 	/* driver->media_busy = FALSE; */
 	idev->io.direction = IO_RECV;
@@ -895,23 +895,23 @@
  *    Handle SIR interrupt
  *
  */
-static __u8 w83977af_sir_interrupt( struct irda_device *idev, int isr)
+static __u8 w83977af_sir_interrupt(struct irda_device *idev, int isr)
 {
 	int len;
 	int actual;
 	__u8 new_icr = 0;
 
-	DEBUG( 4, __FUNCTION__ "(), isr=%#x\n", isr);
+	DEBUG(4, __FUNCTION__ "(), isr=%#x\n", isr);
 	
 	/* Transmit FIFO low on data */
-	if ( isr & ISR_TXTH_I) {
+	if (isr & ISR_TXTH_I) {
 		/* Write data left in transmit buffer */
 		len = idev->tx_buff.len - idev->tx_buff.offset;
 
-		ASSERT( len > 0, return 0;);
-		actual = w83977af_pio_write( idev->io.iobase, 
-					     idev->tx_buff.head, 
-					     len, idev->io.fifo_size);
+		ASSERT(len > 0, return 0;);
+		actual = w83977af_pio_write(idev->io.iobase, 
+					    idev->tx_buff.head, 
+					    len, idev->io.fifo_size);
 		idev->tx_buff.offset += actual;
 		idev->tx_buff.head += actual;
 		
@@ -931,7 +931,7 @@
 			new_icr |= ICR_ETXTHI;
 	}
 	/* Check if transmission has completed */
-	if ( isr & ISR_TXEMP_I) {
+	if (isr & ISR_TXEMP_I) {
 		
 		/* Turn around and get ready to receive some data */
 		idev->io.direction = IO_RECV;
@@ -939,8 +939,8 @@
 	}
 
 	/* Rx FIFO threshold or timeout */
-	if ( isr & ISR_RXTH_I) {
-		w83977af_pio_receive( idev);
+	if (isr & ISR_RXTH_I) {
+		w83977af_pio_receive(idev);
 
 		/* Keep receiving */
 		new_icr |= ICR_ERBRI;
@@ -964,64 +964,64 @@
 
 	iobase = idev->io.iobase;
 
-	set = inb( iobase+SSR);
+	set = inb(iobase+SSR);
 	
 	/* End of frame detected in FIFO */
-	if ( isr & (ISR_FEND_I|ISR_FSF_I)) {
-		if ( w83977af_dma_receive_complete( idev)) {
+	if (isr & (ISR_FEND_I|ISR_FSF_I)) {
+		if (w83977af_dma_receive_complete(idev)) {
 			
 			new_icr |= ICR_EFSFI;
 		} else {
 			/* DMA not finished yet */
 
 			/* Set timer value, resolution 1 ms */
-			switch_bank( iobase, SET4);
-			outb( 0x01, iobase+TMRL); /* 1 ms */
-			outb( 0x00, iobase+TMRH);
+			switch_bank(iobase, SET4);
+			outb(0x01, iobase+TMRL); /* 1 ms */
+			outb(0x00, iobase+TMRH);
 
 			/* Start timer */
-			outb( IR_MSL_EN_TMR, iobase+IR_MSL);
+			outb(IR_MSL_EN_TMR, iobase+IR_MSL);
 
 			new_icr |= ICR_ETMRI;
 		}
 	}
 	/* Timer finished */
-	if ( isr & ISR_TMR_I) {
+	if (isr & ISR_TMR_I) {
 		/* Disable timer */
-		switch_bank( iobase, SET4);
-		outb( 0, iobase+IR_MSL);
+		switch_bank(iobase, SET4);
+		outb(0, iobase+IR_MSL);
 
 		/* Clear timer event */
 		/* switch_bank(iobase, SET0); */
 /* 		outb( ASCR_CTE, iobase+ASCR); */
 
 		/* Check if this is a TX timer interrupt */
-		if ( idev->io.direction == IO_XMIT) {
-			w83977af_dma_write( idev, iobase);
+		if (idev->io.direction == IO_XMIT) {
+			w83977af_dma_write(idev, iobase);
 
 			new_icr |= ICR_EDMAI;
 		} else {
 			/* Check if DMA has now finished */
-			w83977af_dma_receive_complete( idev);
+			w83977af_dma_receive_complete(idev);
 
 			new_icr |= ICR_EFSFI;
 		}
 	}	
 	/* Finished with DMA */
-	if ( isr & ISR_DMA_I) {
+	if (isr & ISR_DMA_I) {
 		w83977af_dma_xmit_complete( idev);
-
+		
 		/* Check if there are more frames to be transmitted */
-		if ( irda_device_txqueue_empty( idev)) {
+		if (irda_device_txqueue_empty( idev)) {
 		
 			/* Prepare for receive */
-			w83977af_dma_receive( idev);
+			w83977af_dma_receive(idev);
 			new_icr = ICR_EFSFI;
 		}
 	}
 	
 	/* Restore set */
-	outb( set, iobase+SSR);
+	outb(set, iobase+SSR);
 
 	return new_icr;
 }
@@ -1039,9 +1039,9 @@
 
 	struct irda_device *idev = (struct irda_device *) dev_id;
 
-	if ( idev == NULL) {
-		printk( KERN_WARNING "%s: irq %d for unknown device.\n", 
-			driver_name, irq);
+	if (idev == NULL) {
+		printk(KERN_WARNING "%s: irq %d for unknown device.\n", 
+		       driver_name, irq);
 		return;
 	}
 
@@ -1050,24 +1050,24 @@
 	iobase = idev->io.iobase;
 
 	/* Save current bank */
-	set = inb( iobase+SSR);
-	switch_bank( iobase, SET0);
+	set = inb(iobase+SSR);
+	switch_bank(iobase, SET0);
 	
-	icr = inb( iobase+ICR); 
-	isr = inb( iobase+ISR) & icr; /* Mask out the interesting ones */ 
+	icr = inb(iobase+ICR); 
+	isr = inb(iobase+ISR) & icr; /* Mask out the interesting ones */ 
 
-	outb( 0, iobase+ICR); /* Disable interrupts */
+	outb(0, iobase+ICR); /* Disable interrupts */
 	
-	if ( isr) {
+	if (isr) {
 		/* Dispatch interrupt handler for the current speed */
 		if ( idev->io.baudrate > 115200)
-			icr = w83977af_fir_interrupt( idev, isr);
+			icr = w83977af_fir_interrupt(idev, isr);
 		else
-			icr = w83977af_sir_interrupt( idev, isr);
+			icr = w83977af_sir_interrupt(idev, isr);
 	}
 
-	outb( icr, iobase+ICR);    /* Restore (new) interrupts */
-	outb( set, iobase+SSR);    /* Restore bank register */
+	outb(icr, iobase+ICR);    /* Restore (new) interrupts */
+	outb(set, iobase+SSR);    /* Restore bank register */
 
 	idev->netdev.interrupt = 0;
 }
@@ -1078,7 +1078,7 @@
  *    This function should put the current thread to sleep until all data 
  *    have been sent, so it is safe to f.eks. change the speed.
  */
-static void w83977af_wait_until_sent( struct irda_device *idev)
+static void w83977af_wait_until_sent(struct irda_device *idev)
 {
 	current->state = TASK_INTERRUPTIBLE;
 	schedule_timeout(6);
@@ -1090,7 +1090,7 @@
  *    Return TRUE is we are currently receiving a frame
  *
  */
-static int w83977af_is_receiving( struct irda_device *idev)
+static int w83977af_is_receiving(struct irda_device *idev)
 {
 	int status = FALSE;
 	int iobase;
@@ -1103,15 +1103,15 @@
 		iobase = idev->io.iobase;
 
 		/* Check if rx FIFO is not empty */
-		set = inb( iobase+SSR);
+		set = inb(iobase+SSR);
 		switch_bank( iobase, SET2);
 		if (( inb( iobase+RXFDTH) & 0x3f) != 0) {
 			/* We are receiving something */
 			status =  TRUE;
 		}
-		outb( set, iobase+SSR);
+		outb(set, iobase+SSR);
 	} else 
-		status = ( idev->rx_buff.state != OUTSIDE_FRAME);
+		status = (idev->rx_buff.state != OUTSIDE_FRAME);
 	
 	return status;
 }
@@ -1124,7 +1124,7 @@
  */
 static int w83977af_net_init( struct device *dev)
 {
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(0, __FUNCTION__ "()\n");
 
 	/* Set up to be a normal IrDA network device driver */
 	irda_device_setup( dev);
@@ -1147,18 +1147,18 @@
 	int iobase;
 	__u8 set;
 	
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(0, __FUNCTION__ "()\n");
 	
-	ASSERT( dev != NULL, return -1;);
+	ASSERT(dev != NULL, return -1;);
 	idev = (struct irda_device *) dev->priv;
 	
-	ASSERT( idev != NULL, return 0;);
-	ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+	ASSERT(idev != NULL, return 0;);
+	ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
 	
 	iobase = idev->io.iobase;
 
-	if (request_irq( idev->io.irq, w83977af_interrupt, 0, idev->name, 
-			 (void *) idev)) {
+	if (request_irq(idev->io.irq, w83977af_interrupt, 0, idev->name, 
+			(void *) idev)) {
 		return -EAGAIN;
 	}
 	/*
@@ -1166,7 +1166,7 @@
 	 * and clean up on failure.
 	 */
 	if (request_dma(idev->io.dma, idev->name)) {
-		free_irq( idev->io.irq, idev);
+		free_irq(idev->io.irq, idev);
 		return -EAGAIN;
 	}
 		
@@ -1176,11 +1176,11 @@
 	dev->start = 1;
 
 	/* Save current set */
-	set = inb( iobase+SSR);
+	set = inb(iobase+SSR);
 
  	/* Enable some interrupts so we can receive frames again */
  	switch_bank(iobase, SET0);
- 	if ( idev->io.baudrate > 115200) {
+ 	if (idev->io.baudrate > 115200) {
  		outb( ICR_EFSFI, iobase+ICR);
  		w83977af_dma_receive( idev);
  	} else
@@ -1250,9 +1250,7 @@
  */
 int init_module(void)
 {
-	w83977af_init();
-
-	return(0);
+	return w83977af_init();
 }
 
 /*
@@ -1265,5 +1263,4 @@
 {
 	w83977af_cleanup();
 }
-
-#endif
+#endif /* MODULE */
diff -urN linux-2.2.6-pre2/drivers/net/Makefile linux-2.2.6-pre3/drivers/net/Makefile
--- linux-2.2.6-pre2/drivers/net/Makefile	1999-03-21 07:11:36.000000000 -0800
+++ linux-2.2.6-pre3/drivers/net/Makefile	2003-08-15 15:05:39.000000000 -0700
@@ -1073,7 +1073,7 @@
 MOD_IN_SUB_DIRS += irda
 else
   ifeq ($(CONFIG_IRDA),m)
-  MOD_SUB_DIRS += irda
+  MOD_IN_SUB_DIRS += irda
   endif
 endif
 
diff -urN linux-2.2.6-pre2/drivers/scsi/NCR5380.c linux-2.2.6-pre3/drivers/scsi/NCR5380.c
--- linux-2.2.6-pre2/drivers/scsi/NCR5380.c	1998-12-18 09:47:38.000000000 -0800
+++ linux-2.2.6-pre3/drivers/scsi/NCR5380.c	2003-08-15 15:05:39.000000000 -0700
@@ -569,10 +569,6 @@
 	if (!main_running) {
 		main_running = 1;
 		NCR5380_main();
-		/* 
-		 * main_running is cleared in NCR5380_main once it can't do 
-		 * more work, and NCR5380_main exits with interrupts disabled.
-		 */
 	}
 	restore_flags(flags);
 }
@@ -702,7 +698,9 @@
 	}
 	restore_flags(flags);
 
+	spin_lock_irqsave(&io_request_lock, flags);
 	run_main();
+	spin_unlock_irqrestore(&io_request_lock, flags);
 }
 #endif				/* def USLEEP */
 
@@ -1266,6 +1264,7 @@
 	struct Scsi_Host *instance;
 	struct NCR5380_hostdata *hostdata;
 	int done;
+	unsigned long flags;
 
 	/*
 	 * We run (with interrupts disabled) until we're sure that none of 
@@ -1279,14 +1278,16 @@
 	 * this should prevent any race conditions.
 	 */
 
+	spin_unlock_irq(&io_request_lock);
+	
+	save_flags(flags);
+	
 	do {
 		cli();		/* Freeze request queues */
 		done = 1;
 		for (instance = first_instance; instance &&
 		     instance->hostt == the_template; instance = instance->next) {
-			unsigned long flags;
 			 hostdata = (struct NCR5380_hostdata *) instance->hostdata;
-			 save_flags(flags);
 			 cli();
 #ifdef USLEEP
 			if (!hostdata->connected && !hostdata->selecting) {
@@ -1365,8 +1366,6 @@
 							     TAG_NEXT)) {
 							break;
 						} else {
-							unsigned long flags;
-							save_flags(flags);
 							cli();
 							LIST(tmp, hostdata->issue_queue);
 							tmp->host_scribble = (unsigned char *)
@@ -1393,14 +1392,12 @@
 				}
 				else
 				{
-					unsigned long flags;
 					/* RvC: device failed, so we wait a long time
 					this is needed for Mustek scanners, that
 					do not respond to commands immediately
 					after a scan */
 					printk(KERN_DEBUG "scsi%d: device %d did not respond in time\n",
 						instance->host_no, tmp->target);
-					save_flags(flags);
 					cli();
 					LIST(tmp, hostdata->issue_queue);
 					tmp->host_scribble = (unsigned char *) hostdata->issue_queue;
@@ -1434,7 +1431,8 @@
 				break;
 		}		/* for instance */
 	} while (!done);
-	cli();
+	spin_lock_irq(&io_request_lock);
+  /* 	cli();*/
 	main_running = 0;
 }
 
diff -urN linux-2.2.6-pre2/drivers/scsi/pci2000.c linux-2.2.6-pre3/drivers/scsi/pci2000.c
--- linux-2.2.6-pre2/drivers/scsi/pci2000.c	1999-03-22 13:05:53.000000000 -0800
+++ linux-2.2.6-pre3/drivers/scsi/pci2000.c	2003-08-15 15:05:39.000000000 -0700
@@ -1,24 +1,22 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
  *
- * Copyright (c) 1999 Perceptive Solutions, Inc.
+ * pci2000.c - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *	File Name:		pci2000i.c
  *
  *	Revisions	1.10	Jan-21-1999
  *		- Fixed sign on message to reflect proper controller name.
@@ -28,16 +26,17 @@
  *		- Fixed control timeout to not lock up the entire system if
  *		  controller goes offline completely.
  *
- *-M*************************************************************************/
-#define PCI2000_VERSION		"1.11"
+ *	Revisions 1.12		Mar-26-1999
+ *		- Fixed spinlock and PCI configuration.
+ *
+ ****************************************************************************/
+#define PCI2000_VERSION		"1.12"
 
 #include <linux/module.h>
 
 #include <linux/kernel.h>
-#include <linux/head.h>
 #include <linux/types.h>
 #include <linux/string.h>
-#include <linux/bios32.h>
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
@@ -49,11 +48,17 @@
 #include <linux/blk.h>
 #include "scsi.h"
 #include "hosts.h"
+#include <linux/stat.h>
 
 #include "pci2000.h"
 #include "psi_roy.h"
 
-#include<linux/stat.h>
+#if LINUX_VERSION_CODE >= LINUXVERSION(2,1,95)
+#include <asm/spinlock.h>
+#endif
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,93)
+#include <linux/bios32.h>
+#endif
 
 struct proc_dir_entry Proc_Scsi_Pci2000 =
 	{ PROC_SCSI_PCI2000, 7, "pci2000", S_IFDIR | S_IRUGO | S_IXUGO, 2 };
@@ -91,6 +96,7 @@
 	USHORT		 mb4;
 	USHORT		 cmd;
 	USHORT		 tag;
+	ULONG		 irqOwned;
 	DEV2000	 	 dev[MAX_BUS][MAX_UNITS];
 	}	ADAPTER2000, *PADAPTER2000;
 
@@ -234,6 +240,23 @@
 	int					pun;
 	int					bus;
 	int					z;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    int					flags;
+#else /* version >= v2.1.95 */
+    unsigned long		flags;
+#endif /* version >= v2.1.95 */
+
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /* Disable interrupts, if they aren't already disabled. */
+    save_flags (flags);
+    cli ();
+#else /* version >= v2.1.95 */
+    /*
+     * Disable interrupts, if they aren't already disabled and acquire
+     * the I/O spinlock.
+     */
+    spin_lock_irqsave (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 
 	DEB(printk ("\npci2000 recieved interrupt "));
 	for ( z = 0; z < NumAdapters;  z++ )										// scan for interrupt to process
@@ -252,7 +275,7 @@
 	if ( !shost )
 		{
 		DEB (printk ("\npci2000: not my interrupt"));
-		return;
+		goto irq_return;
 		}
 
 	padapter = HOSTDATA(shost);
@@ -276,7 +299,7 @@
 
 	outb_p (0xFF, padapter->tag);												// clear the op interrupt
 	outb_p (CMD_DONE, padapter->cmd);											// complete the op
-	return;																		// done, but, with what?
+	goto irq_return;;																		// done, but, with what?
 
 irqProceed:;
 	if ( tag & ERR08_TAGGED )												// is there an error here?
@@ -284,7 +307,7 @@
 		if ( WaitReady (padapter) )
 			{
 			OpDone (SCpnt, DID_TIME_OUT << 16);
-			return;
+			goto irq_return;;
 			}
 
 		outb_p (tag0, padapter->mb0);										// get real error code
@@ -292,7 +315,7 @@
 		if ( WaitReady (padapter) )											// wait for controller to suck up the op
 			{
 			OpDone (SCpnt, DID_TIME_OUT << 16);
-			return;
+			goto irq_return;;
 			}
 
 		error = inl (padapter->mb0);										// get error data
@@ -305,24 +328,40 @@
 			if ( bus )														// are we doint SCSI commands?
 				{
 				OpDone (SCpnt, (DID_OK << 16) | 2);
-				return;
+				goto irq_return;;
 				}
 			if ( *SCpnt->cmnd == SCSIOP_TEST_UNIT_READY )
 				OpDone (SCpnt, (DRIVER_SENSE << 24) | (DID_OK << 16) | 2);	// test caller we have sense data too
 			else
 				OpDone (SCpnt, DID_ERROR << 16);
-			return;
+			goto irq_return;;
 			}
 		OpDone (SCpnt, DID_ERROR << 16);
-		return;
+		goto irq_return;;
 		}
 
 	outb_p (0xFF, padapter->tag);											// clear the op interrupt
 	outb_p (CMD_DONE, padapter->cmd);										// complete the op
 	OpDone (SCpnt, DID_OK << 16);
+
+irq_return:;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /*
+     * Restore the original flags which will enable interrupts
+     * if and only if they were enabled on entry.
+     */
+    restore_flags (flags);
+#else /* version >= v2.1.95 */
+    /*
+     * Release the I/O spinlock and restore the original flags
+     * which will enable interrupts if and only if they were
+     * enabled on entry.
+     */
+    spin_unlock_irqrestore (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 	}
 /****************************************************************
- *	Name:	Pci2220i_QueueCommand
+ *	Name:	Pci2000_QueueCommand
  *
  *	Description:	Process a queued command from the SCSI manager.
  *
@@ -511,7 +550,7 @@
 			if ( cmd )
 				break;
 		default:
-			DEB (printk ("pci2220i_queuecommand: Unsupported command %02X\n", *cdb));
+			DEB (printk ("pci2000_queuecommand: Unsupported command %02X\n", *cdb));
 			OpDone (SCpnt, DID_ERROR << 16);
 			return 0;
 		}
@@ -538,7 +577,7 @@
 	SCpnt->SCp.Status++;
 	}
 /****************************************************************
- *	Name:	Pci2220i_Command
+ *	Name:	Pci2000_Command
  *
  *	Description:	Process a command from the SCSI manager.
  *
@@ -559,90 +598,121 @@
 	return SCpnt->result;
 	}
 /****************************************************************
- *	Name:	Pci2220i_Detect
+ *	Name:	Pci2000_Detect
  *
  *	Description:	Detect and initialize our boards.
  *
  *	Parameters:		tpnt - Pointer to SCSI host template structure.
  *
- *	Returns:		Number of adapters found.
+ *	Returns:		Number of adapters installed.
  *
  ****************************************************************/
 int Pci2000_Detect (Scsi_Host_Template *tpnt)
 	{
-	int					pci_index = 0;
+	int					found = 0;
+	int					installed = 0;
 	struct Scsi_Host   *pshost;
 	PADAPTER2000	    padapter;
 	int					z, zz;
 	int					setirq;
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+	struct pci_dev	   *pdev = NULL;
+#else
+	UCHAR	pci_bus, pci_device_fn;
+#endif
 
-	if ( pcibios_present () )
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+	if ( !pci_present () )
+#else
+	if ( !pcibios_present () )
+#endif
 		{
-		for ( pci_index = 0;  pci_index <= MAXADAPTER;  ++pci_index )
-			{
-			UCHAR	pci_bus, pci_device_fn;
+		printk ("pci2000: PCI BIOS not present\n");
+		return 0;
+		}
 
-			if ( pcibios_find_device (VENDOR_PSI, DEVICE_ROY_1, pci_index, &pci_bus, &pci_device_fn) != 0 )
-				break;
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+	while ( (pdev = pci_find_device (VENDOR_PSI, DEVICE_ROY_1, pdev)) != NULL )
+#else
+	while ( !pcibios_find_device (VENDOR_PSI, DEVICE_ROY_1, found, &pci_bus, &pci_device_fn) )
+#endif
+		{
+		pshost = scsi_register (tpnt, sizeof(ADAPTER2000));
+		padapter = HOSTDATA(pshost);
 
-			pshost = scsi_register (tpnt, sizeof(ADAPTER2000));
-			padapter = HOSTDATA(pshost);
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+		padapter->basePort = pdev->base_address[1] & 0xFFFE;
+#else
+		pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_1, &padapter->basePort);
+		padapter->basePort &= 0xFFFE;
+#endif
+		DEB (printk ("\nBase Regs = %#04X", padapter->basePort));			// get the base I/O port address
+		padapter->mb0	= padapter->basePort + RTR_MAILBOX;		   			// get the 32 bit mail boxes
+		padapter->mb1	= padapter->basePort + RTR_MAILBOX + 4;
+		padapter->mb2	= padapter->basePort + RTR_MAILBOX + 8;
+		padapter->mb3	= padapter->basePort + RTR_MAILBOX + 12;
+		padapter->mb4	= padapter->basePort + RTR_MAILBOX + 16;
+		padapter->cmd	= padapter->basePort + RTR_LOCAL_DOORBELL;			// command register
+		padapter->tag	= padapter->basePort + RTR_PCI_DOORBELL;			// tag/response register
 
-			pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_1, &padapter->basePort);
-			padapter->basePort &= 0xFFFE;
-			DEB (printk ("\nBase Regs = %#04X", padapter->basePort));			// get the base I/O port address
-			padapter->mb0	= padapter->basePort + RTR_MAILBOX;		   			// get the 32 bit mail boxes
-			padapter->mb1	= padapter->basePort + RTR_MAILBOX + 4;
-			padapter->mb2	= padapter->basePort + RTR_MAILBOX + 8;
-			padapter->mb3	= padapter->basePort + RTR_MAILBOX + 12;
-			padapter->mb4	= padapter->basePort + RTR_MAILBOX + 16;
-			padapter->cmd	= padapter->basePort + RTR_LOCAL_DOORBELL;			// command register
-			padapter->tag	= padapter->basePort + RTR_PCI_DOORBELL;			// tag/response register
-
-			if ( WaitReady (padapter) )
-				goto unregister;
-			outb_p (0x84, padapter->mb0);
-			outb_p (CMD_SPECIFY, padapter->cmd);
-			if ( WaitReady (padapter) )
-				goto unregister;
-
-			pcibios_read_config_byte (pci_bus, pci_device_fn, PCI_INTERRUPT_LINE, &pshost->irq);
-			setirq = 1;
-			for ( z = 0;  z < pci_index;  z++ )									// scan for shared interrupts
-				{
-				if ( PsiHost[z]->irq == pshost->irq )							// if shared then, don't posses
-					setirq = 0;
-				}
-			if ( setirq )														// if not shared, posses
+		if ( WaitReady (padapter) )
+			goto unregister;
+		outb_p (0x84, padapter->mb0);
+		outb_p (CMD_SPECIFY, padapter->cmd);
+		if ( WaitReady (padapter) )
+			goto unregister;
+
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+		pshost->irq = pdev->irq;
+#else
+		pcibios_read_config_byte (pci_bus, pci_device_fn, PCI_INTERRUPT_LINE, &pshost->irq);
+#endif
+		setirq = 1;
+		padapter->irqOwned = 0;
+		for ( z = 0;  z < installed;  z++ )									// scan for shared interrupts
+			{
+			if ( PsiHost[z]->irq == pshost->irq )							// if shared then, don't posses
+				setirq = 0;
+			}
+		if ( setirq )												// if not shared, posses
+			{
+			if ( request_irq (pshost->irq, Irq_Handler, SA_SHIRQ, "pci2000", padapter) < 0 )
 				{
-				if ( request_irq (pshost->irq, Irq_Handler, 0, "pci2000", NULL) )
+				if ( request_irq (pshost->irq, Irq_Handler, SA_INTERRUPT | SA_SHIRQ, "pci2000", padapter) < 0 )
 					{
-					printk ("Unable to allocate IRQ for PSI-2000 controller.\n");
+					printk ("Unable to allocate IRQ for PCI-2000 controller.\n");
 					goto unregister;
 					}
 				}
-			PsiHost[pci_index]	= pshost;										// save SCSI_HOST pointer
+			padapter->irqOwned = pshost->irq;						// set IRQ as owned
+			}
+		PsiHost[installed]	= pshost;										// save SCSI_HOST pointer
 
-			pshost->unique_id	= padapter->basePort;
-			pshost->max_id		= 16;
-			pshost->max_channel	= 1;
-
-			for ( zz = 0;  zz < MAX_BUS;  zz++ )
-				for ( z = 0; z < MAX_UNITS;  z++ )
-					padapter->dev[zz][z].tag = 0;
+		pshost->io_port		= padapter->basePort;
+		pshost->n_io_port	= 0xFF;
+		pshost->unique_id	= padapter->basePort;
+		pshost->max_id		= 16;
+		pshost->max_channel	= 1;
+
+		for ( zz = 0;  zz < MAX_BUS;  zz++ )
+			for ( z = 0; z < MAX_UNITS;  z++ )
+				padapter->dev[zz][z].tag = 0;
 			
-			printk("\nPSI-2000 Intelligent Storage SCSI CONTROLLER: at I/O = %X  IRQ = %d\n", padapter->basePort, pshost->irq);
-			printk("Version %s, Compiled %s %s\n\n", PCI2000_VERSION,  __DATE__, __TIME__);
+		printk("\nPSI-2000 Intelligent Storage SCSI CONTROLLER: at I/O = %X  IRQ = %d\n", padapter->basePort, pshost->irq);
+		printk("Version %s, Compiled %s %s\n\n", PCI2000_VERSION,  __DATE__, __TIME__);
+		found++;
+		if ( ++installed < MAXADAPTER )
 			continue;
+		break;
 unregister:;
-			scsi_unregister (pshost);
-			}
+		scsi_unregister (pshost);
+		found++;
 		}
-	NumAdapters = pci_index;
-	return pci_index;
+	NumAdapters = installed;
+	return installed;
 	}
 /****************************************************************
- *	Name:	Pci2220i_Abort
+ *	Name:	Pci2000_Abort
  *
  *	Description:	Process the Abort command from the SCSI manager.
  *
@@ -657,7 +727,7 @@
 	return SCSI_ABORT_SNOOZE;
 	}
 /****************************************************************
- *	Name:	Pci2220i_Reset
+ *	Name:	Pci2000_Reset
  *
  *	Description:	Process the Reset command from the SCSI manager.
  *
@@ -675,11 +745,34 @@
 	{
 	return SCSI_RESET_PUNT;
 	}
+/****************************************************************
+ *	Name:	Pci2000_Release
+ *
+ *	Description:	Release resources allocated for a single each adapter.
+ *
+ *	Parameters:		pshost - Pointer to SCSI command structure.
+ *
+ *	Returns:		zero.
+ *
+ ****************************************************************/
+int Pci2000_Release (struct Scsi_Host *pshost)
+	{
+    PADAPTER2000	padapter = HOSTDATA (pshost);
 
-#include "sd.h"
+	if ( padapter->irqOwned )
+#if LINUX_VERSION_CODE < LINUXVERSION(1,3,70)
+	    free_irq (pshost->irq);
+#else /* version >= v1.3.70 */
+		free_irq (pshost->irq, padapter);
+#endif /* version >= v1.3.70 */
+    release_region (pshost->io_port, pshost->n_io_port);
+    scsi_unregister(pshost);
+    return 0;
+	}
 
+#include "sd.h"
 /****************************************************************
- *	Name:	Pci2220i_BiosParam
+ *	Name:	Pci2000_BiosParam
  *
  *	Description:	Process the biosparam request from the SCSI manager to
  *					return C/H/S data.
@@ -713,7 +806,7 @@
 
 #ifdef MODULE
 /* Eventually this will go into an include file, but this will be later */
-Scsi_Host_Template driver_template = PCI2220I;
+Scsi_Host_Template driver_template = PCI2000;
 
 #include "scsi_module.c"
 #endif
diff -urN linux-2.2.6-pre2/drivers/scsi/pci2000.h linux-2.2.6-pre3/drivers/scsi/pci2000.h
--- linux-2.2.6-pre2/drivers/scsi/pci2000.h	1999-03-22 13:05:53.000000000 -0800
+++ linux-2.2.6-pre3/drivers/scsi/pci2000.h	2003-08-15 15:05:39.000000000 -0700
@@ -1,29 +1,23 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
  *
- * Copyright (c) 1997 Perceptive Solutions, Inc.
+ * pci2000.h - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *	File Name:		pci2000.h
- *
- *	Description:	Header file for the SCSI driver for the PCI-2000
- *					interface card.
- *
- *-M*************************************************************************/
+ ****************************************************************************/
 #ifndef _PCI2000_H
 #define _PCI2000_H
 
@@ -33,6 +27,11 @@
 #ifndef	PSI_EIDE_SCSIOP
 #define	PSI_EIDE_SCSIOP	1
 
+#ifndef LINUX_VERSION_CODE
+#include <linux/version.h>
+#endif 
+#define	LINUXVERSION(v,p,s)    (((v)<<16) + ((p)<<8) + (s))
+
 /************************************************/
 /*		definition of standard data types		*/
 /************************************************/
@@ -194,6 +193,7 @@
 int Pci2000_QueueCommand	(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
 int Pci2000_Abort			(Scsi_Cmnd *SCpnt);
 int Pci2000_Reset			(Scsi_Cmnd *SCpnt, unsigned int flags);
+int Pci2000_Release			(struct Scsi_Host *pshost);
 int Pci2000_BiosParam		(Disk *disk, kdev_t dev, int geom[]);
 
 #ifndef NULL
@@ -202,12 +202,43 @@
 
 extern struct proc_dir_entry Proc_Scsi_Pci2000;
 
+#if LINUX_VERSION_CODE >= LINUXVERSION(2,1,75)
+#define PCI2000 {																\
+		next:						NULL,										\
+		module:						NULL,										\
+		proc_dir:					&Proc_Scsi_Pci2000,							\
+		proc_info:					NULL,	/* let's not bloat the kernel */	\
+		name:						"PCI-2000 SCSI Intelligent Disk Controller",\
+		detect:						Pci2000_Detect,								\
+		release:					Pci2000_Release,							\
+		info:						NULL,	/* let's not bloat the kernel */	\
+		command:					Pci2000_Command,							\
+		queuecommand:				Pci2000_QueueCommand,						\
+		eh_strategy_handler:		NULL,										\
+		eh_abort_handler:			NULL,										\
+		eh_device_reset_handler:	NULL,										\
+		eh_bus_reset_handler:		NULL,										\
+		eh_host_reset_handler:		NULL,										\
+		abort:						Pci2000_Abort,								\
+		reset:						Pci2000_Reset,								\
+		slave_attach:				NULL,										\
+		bios_param:					Pci2000_BiosParam,							\
+		can_queue:					16,											\
+		this_id:					-1,											\
+		sg_tablesize:				16,											\
+		cmd_per_lun:				1,											\
+		present:					0,											\
+		unchecked_isa_dma:			0,											\
+		use_clustering:				DISABLE_CLUSTERING,							\
+		use_new_eh_code:			0											\
+		}
+#else
 #define PCI2000 { NULL, NULL,							\
 			&Proc_Scsi_Pci2000,/* proc_dir_entry */		\
 			NULL,		                				\
 			"PCI-2000 SCSI Intelligent Disk Controller",\
 			Pci2000_Detect,								\
-			NULL,										\
+			Pci2000_Release,							\
 			NULL,	 									\
 			Pci2000_Command,							\
 			Pci2000_QueueCommand,						\
@@ -222,5 +253,6 @@
 			0, 											\
 			0, 											\
 			DISABLE_CLUSTERING }
+#endif
 
 #endif
diff -urN linux-2.2.6-pre2/drivers/scsi/pci2220i.c linux-2.2.6-pre3/drivers/scsi/pci2220i.c
--- linux-2.2.6-pre2/drivers/scsi/pci2220i.c	1999-03-22 13:05:53.000000000 -0800
+++ linux-2.2.6-pre3/drivers/scsi/pci2220i.c	2003-08-15 15:05:39.000000000 -0700
@@ -1,35 +1,36 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-22220I device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
  *
- * Copyright (c) 1999 Perceptive Solutions, Inc.
+ * pci2220i.c - Linux Host Driver for PCI-2220I EIDE RAID Adapters
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *	File Name:		pci2220i.c
  *
- *	Description:	SCSI driver for the PCI2220I EIDE interface card.
+ *	Revisions 1.10		Mar-26-1999
+ *		- Updated driver for RAID and hot reconstruct support.
  *
- *-M*************************************************************************/
+ *	Revisions 1.11		Mar-26-1999
+ *		- Fixed spinlock and PCI configuration.
+ *
+ ****************************************************************************/
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/head.h>
 #include <linux/types.h>
 #include <linux/string.h>
-#include <linux/bios32.h>
+#include <linux/malloc.h>
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
@@ -46,7 +47,14 @@
 #include "hosts.h"
 #include "pci2220i.h"
 
-#define	PCI2220I_VERSION		"1.10"
+#if LINUX_VERSION_CODE >= LINUXVERSION(2,1,95)
+#include <asm/spinlock.h>
+#endif
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,93)
+#include <linux/bios32.h>
+#endif
+
+#define	PCI2220I_VERSION		"1.11"
 //#define	READ_CMD				IDE_COMMAND_READ
 //#define	WRITE_CMD				IDE_COMMAND_WRITE
 //#define	MAX_BUS_MASTER_BLOCKS	1		// This is the maximum we can bus master
@@ -119,6 +127,7 @@
 	USHORT		 timingMode;			// timing mode currently set for adapter
 	USHORT		 timingPIO;				// TRUE if PIO timing is active
 	ULONG		 timingAddress;			// address to use on adapter for current timing mode
+	ULONG		 irqOwned;				// owned IRQ or zero if shared
 	OUR_DEVICE	 device[DALE_MAXDRIVES];
 	DISK_MIRROR	*raidData[8];
 	ULONG		 startSector;
@@ -135,9 +144,9 @@
 	USHORT		 demoFail;				// flag for RAID failure demonstration
 	USHORT		 survivor;
 	USHORT		 failinprog;
-	USHORT		 timeoutReconRetry;
 	struct timer_list	reconTimer;	
 	struct timer_list	timer;
+	UCHAR		*kBuffer;
 	}	ADAPTER2220I, *PADAPTER2220I;
 
 #define HOSTDATA(host) ((PADAPTER2220I)&host->hostdata)
@@ -155,7 +164,6 @@
 static			SETUP			DaleSetup;
 static			DISK_MIRROR		DiskMirror[2];
 static			ULONG			ModeArray[] = {DALE_DATA_MODE2, DALE_DATA_MODE3, DALE_DATA_MODE4, DALE_DATA_MODE4P};
-static			UCHAR			Buffer[SECTORSXFER * BYTES_PER_SECTOR];
 
 static void ReconTimerExpiry (unsigned long data);
 
@@ -523,7 +531,7 @@
  ****************************************************************/
 static ULONG InlineIdentify (PADAPTER2220I padapter, UCHAR spigot, UCHAR device)
 	{
-	PIDENTIFY_DATA	pid = (PIDENTIFY_DATA)Buffer;
+	PIDENTIFY_DATA	pid = (PIDENTIFY_DATA)padapter->kBuffer;
 
 	SelectSpigot (padapter, spigot | 0x80);						// select the spigot
 	outb_p (device << 4, padapter->regLba24);				// select the drive
@@ -532,10 +540,51 @@
 	WriteCommand (padapter, IDE_COMMAND_IDENTIFY);	
 	if ( WaitDrq (padapter) )
 		return 0;
-	insw (padapter->regData, Buffer, sizeof (IDENTIFY_DATA) >> 1);
+	insw (padapter->regData, padapter->kBuffer, sizeof (IDENTIFY_DATA) >> 1);
 	return (pid->LBATotalSectors - 1);
 	}
 /****************************************************************
+ *	Name:	InlineReadSignature	:LOCAL
+ *
+ *	Description:	Do an inline read RAID sigature.
+ *
+ *	Parameters:		padapter - Pointer adapter data structure.
+ *					pdev	 - Pointer to device.
+ *					index	 - index of data to read.
+ *
+ *	Returns:		Zero if no error or status register contents on error.
+ *
+ ****************************************************************/
+static UCHAR InlineReadSignature (PADAPTER2220I padapter, POUR_DEVICE pdev, int index)
+	{
+	UCHAR	status;
+	UCHAR	spigot = 1 << index;
+	ULONG	zl = pdev->lastsectorlba[index];
+
+	SelectSpigot (padapter, spigot | 0x80);				// select the spigot without interrupts
+	outb_p (pdev->byte6 | ((UCHAR *)&zl)[3], padapter->regLba24);		
+	status = WaitReady (padapter);
+	if ( !status )
+		{
+		outb_p (((UCHAR *)&zl)[2], padapter->regLba16);
+		outb_p (((UCHAR *)&zl)[1], padapter->regLba8); 
+		outb_p (((UCHAR *)&zl)[0], padapter->regLba0);
+		outb_p (1, padapter->regSectCount);
+		WriteCommand (padapter, IDE_COMMAND_READ);
+		status = WaitDrq (padapter);
+		if ( !status )
+			{
+			insw (padapter->regData, padapter->kBuffer, BYTES_PER_SECTOR / 2);
+			((ULONG *)(&pdev->DiskMirror[index]))[0] = ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[0];
+			((ULONG *)(&pdev->DiskMirror[index]))[1] = ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[1];
+			// some drives assert DRQ before IRQ so let's make sure we clear the IRQ
+			WaitReady (padapter);
+			return 0;			
+			}
+		}
+	return status;
+	}
+/****************************************************************
  *	Name:	DecodeError	:LOCAL
  *
  *	Description:	Decode and process device errors.
@@ -619,9 +668,9 @@
 	StartTimer (padapter);	
 	padapter->expectingIRQ = TRUE;
 	
-	outsw (padapter->regData, Buffer, DISK_MIRROR_POSITION / 2);
-	outsw (padapter->regData, &pdev->DiskMirror[index], sizeof (DISK_MIRROR) / 2);
-	outsw (padapter->regData, Buffer, ((512 - (DISK_MIRROR_POSITION + sizeof (DISK_MIRROR))) / 2));
+	((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[0] = ((ULONG *)(&pdev->DiskMirror[index]))[0];
+	((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[1] = ((ULONG *)(&pdev->DiskMirror[index]))[1];
+	outsw (padapter->regData, padapter->kBuffer, BYTES_PER_SECTOR / 2);
 	return FALSE;
 	}
 /*******************************************************************************************************
@@ -640,7 +689,7 @@
 	{
 	UCHAR			 spigot;
 	
-	DEB (printk ("\npci2000i:  Initialize failover process - survivor = %d", padapter->survivor));
+	DEB (printk ("\npci2220i:  Initialize failover process - survivor = %d", padapter->survivor));
 	pdev->raid = FALSE;									//initializes system for non raid mode
 	pdev->hotRecon = 0;
 	padapter->reconOn = FALSE;
@@ -674,71 +723,75 @@
 	{
 	PADAPTER2220I	padapter = (PADAPTER2220I)data;
 	POUR_DEVICE		pdev = padapter->pdev;
-	ULONG			flags;
 	UCHAR			status = IDE_STATUS_BUSY;
 	UCHAR			temp, temp1;
-
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    int					flags;
+#else /* version >= v2.1.95 */
+    unsigned long		flags;
+#endif /* version >= v2.1.95 */
+
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /* Disable interrupts, if they aren't already disabled. */
+    save_flags (flags);
+    cli ();
+#else /* version >= v2.1.95 */
+    /*
+     * Disable interrupts, if they aren't already disabled and acquire
+     * the I/O spinlock.
+     */
+    spin_lock_irqsave (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 	DEB (printk ("\nPCI2220I: Timeout expired "));
-	save_flags (flags);
-	cli ();
 
 	if ( padapter->failinprog )
 		{
 		DEB (printk ("in failover process"));
-		restore_flags (flags);
 		OpDone (padapter, DecodeError (padapter, inb_p (padapter->regStatCmd)));
-		return;
+		goto timerExpiryDone;
 		}
 	
 	while ( padapter->reconPhase )
 		{
 		DEB (printk ("in recon phase %X", padapter->reconPhase));
-		if ( --padapter->timeoutReconRetry )
-			{
-			StartTimer (padapter);
-			return;
-			}
 		switch ( padapter->reconPhase )
 			{
 			case RECON_PHASE_MARKING:
 			case RECON_PHASE_LAST:
 				padapter->survivor = (pdev->spigot ^ 3) >> 1;
-				restore_flags (flags);
 				DEB (printk ("\npci2220i: FAILURE 1"));
 				if ( InitFailover (padapter, pdev) )
 					OpDone (padapter, DID_ERROR << 16);
-				return;
+				goto timerExpiryDone;
 			
 			case RECON_PHASE_READY:
 				OpDone (padapter, DID_ERROR << 16);
-				return;
+				goto timerExpiryDone;
 
 			case RECON_PHASE_COPY:
 				padapter->survivor = (pdev->spigot) >> 1;
-				restore_flags (flags);
 				DEB (printk ("\npci2220i: FAILURE 2"));
+				DEB (printk ("\n       spig/stat = %X", inb_p (padapter->regStatSel));
 				if ( InitFailover (padapter, pdev) )
 					OpDone (padapter, DID_ERROR << 16);
-				return;
+				goto timerExpiryDone;
 
 			case RECON_PHASE_UPDATE:
 				padapter->survivor = (pdev->spigot) >> 1;
-				restore_flags (flags);
-				DEB (printk ("\npci2220i: FAILURE 3"));
+				DEB (printk ("\npci2220i: FAILURE 3")));
 				if ( InitFailover (padapter, pdev) )
 					OpDone (padapter, DID_ERROR << 16);
-				return;
+				goto timerExpiryDone;
 
 			case RECON_PHASE_END:
 				padapter->survivor = (pdev->spigot) >> 1;
-				restore_flags (flags);
 				DEB (printk ("\npci2220i: FAILURE 4"));
 				if ( InitFailover (padapter, pdev) )
 					OpDone (padapter, DID_ERROR << 16);
-				return;
+				goto timerExpiryDone;
 			
 			default:
-				return;
+				goto timerExpiryDone;
 			}
 		}
 	
@@ -779,14 +832,13 @@
 							padapter->survivor = 1;
 						else
 							padapter->survivor = 0;
-						restore_flags (flags);
-				DEB (printk ("\npci2220i: FAILURE 5"));
+						DEB (printk ("\npci2220i: FAILURE 5"));
 						if ( InitFailover (padapter, pdev) )
 							{
 							status = inb_p (padapter->regStatCmd);
 							break;
 							}
-						return;
+						goto timerExpiryDone;
 						}
 					}
 				}
@@ -794,14 +846,13 @@
 				{
 				DEB (printk ("in RAID read operation"));
 				padapter->survivor = (pdev->spigot ^ 3) >> 1;
-				restore_flags (flags);
 				DEB (printk ("\npci2220i: FAILURE 6"));
 				if ( InitFailover (padapter, pdev) )
 					{
 					status = inb_p (padapter->regStatCmd);
 					break;
 					}
-				return;
+				goto timerExpiryDone;
 				}
 			}
 		else
@@ -812,8 +863,23 @@
 		break;
 		}
 	
-	restore_flags (flags);
 	OpDone (padapter, DecodeError (padapter, status));
+
+timerExpiryDone:;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /*
+     * Restore the original flags which will enable interrupts
+     * if and only if they were enabled on entry.
+     */
+    restore_flags (flags);
+#else /* version >= v2.1.95 */
+    /*
+     * Release the I/O spinlock and restore the original flags
+     * which will enable interrupts if and only if they were
+     * enabled on entry.
+     */
+    spin_unlock_irqrestore (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 	}
 /****************************************************************
  *	Name:			SetReconstruct	:LOCAL
@@ -854,15 +920,31 @@
 	USHORT			minmode;
 	ULONG			zl;
 	UCHAR			zc;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    int				flags;
+#else /* version >= v2.1.95 */
+    unsigned long	flags;
+#endif /* version >= v2.1.95 */
+
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /* Disable interrupts, if they aren't already disabled. */
+    save_flags (flags);
+    cli ();
+#else /* version >= v2.1.95 */
+    /*
+     * Disable interrupts, if they aren't already disabled and acquire
+     * the I/O spinlock.
+     */
+    spin_lock_irqsave (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 
 	padapter = (PADAPTER2220I)data;
 	if ( padapter->SCpnt )
-		return;
+		goto reconTimerExpiry;
 
 	pdev = padapter->device;
-	pid = (PIDENTIFY_DATA)Buffer;
+	pid = (PIDENTIFY_DATA)padapter->kBuffer;
 	padapter->reconTimer.data = 0;
-	padapter->timeoutReconRetry = 2;
 	padapter->pdev = pdev;
 	if ( padapter->reconIsStarting )
 		{
@@ -875,7 +957,7 @@
 			{
 			if ( (pdev->DiskMirror[0].status & UCBF_MATCHED) && (pdev->DiskMirror[1].status & UCBF_MATCHED) )
 				{
-				return;
+				goto reconTimerExpiry;
 				}
 
 			if ( pdev->DiskMirror[0].status & UCBF_SURVIVOR )				// is first drive survivor?
@@ -900,7 +982,7 @@
 			}
 
 		if ( !pdev->hotRecon )
-			return;
+			goto reconTimerExpiry;
 
 		zc = ((inb_p (padapter->regStatSel) >> 3) | inb_p (padapter->regStatSel)) & 0x83;		// mute the alarm
 		outb_p (zc | pdev->hotRecon | 0x40, padapter->regFail);
@@ -976,15 +1058,15 @@
 			padapter->reconPhase = RECON_PHASE_FAILOVER;
 				DEB (printk ("\npci2220i: FAILURE 7"));
 			InitFailover (padapter, pdev);
-			return;
+			goto reconTimerExpiry;
 			}
 
 		pdev->raid = TRUE;
 	
 		if ( WriteSignature (padapter, pdev, pdev->spigot, pdev->mirrorRecon ^ 1) )
-			return;
+			goto reconTimerExpiry;
 		padapter->reconPhase = RECON_PHASE_MARKING;
-		return;
+		goto reconTimerExpiry;
 		}
 
 	//**********************************
@@ -999,10 +1081,10 @@
 			padapter->reconPhase = RECON_PHASE_FAILOVER;
 				DEB (printk ("\npci2220i: FAILURE 8"));
 			InitFailover (padapter, pdev);
-			return;
+			goto reconTimerExpiry;
 			}
 		padapter->reconPhase = RECON_PHASE_UPDATE;
-		return;
+		goto reconTimerExpiry;
 		}
 
 	zl = pdev->DiskMirror[pdev->mirrorRecon].reconstructPoint;	
@@ -1016,7 +1098,7 @@
 		outb_p (pdev->byte6 | ((UCHAR *)(&zl))[3], padapter->regLba24);// select the drive
 		SelectSpigot (padapter, pdev->spigot);
 		if ( WaitReady (padapter) )
-			return;
+			goto reconTimerExpiry;
 
 		SelectSpigot (padapter, pdev->hotRecon);
 		if ( WaitReady (padapter) )
@@ -1025,7 +1107,7 @@
 			padapter->reconPhase = RECON_PHASE_FAILOVER;
 				DEB (printk ("\npci2220i: FAILURE 9"));
 			InitFailover (padapter, pdev);
-			return;
+			goto reconTimerExpiry;
 			}
 	
 		SelectSpigot (padapter, 3);
@@ -1040,15 +1122,30 @@
 		StartTimer (padapter);
 		SelectSpigot (padapter, pdev->spigot);
 		WriteCommand (padapter, READ_CMD);
-		return;
+		goto reconTimerExpiry;
 		}
 
 	pdev->DiskMirror[pdev->mirrorRecon].status = UCBF_MIRRORED | UCBF_MATCHED;
 	pdev->DiskMirror[pdev->mirrorRecon ^ 1].status = UCBF_MIRRORED | UCBF_MATCHED;
 	if ( WriteSignature (padapter, pdev, pdev->spigot, pdev->mirrorRecon ^ 1) )
-		return;
+		goto reconTimerExpiry;
 	padapter->reconPhase = RECON_PHASE_LAST;
-	return;
+
+reconTimerExpiry:;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /*
+     * Restore the original flags which will enable interrupts
+     * if and only if they were enabled on entry.
+     */
+    restore_flags (flags);
+#else /* version >= v2.1.95 */
+    /*
+     * Release the I/O spinlock and restore the original flags
+     * which will enable interrupts if and only if they were
+     * enabled on entry.
+     */
+    spin_unlock_irqrestore (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 	}
 /****************************************************************
  *	Name:	Irq_Handler	:LOCAL
@@ -1072,6 +1169,23 @@
 	UCHAR				status1;
 	int					z;
 	ULONG				zl;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    int					flags;
+#else /* version >= v2.1.95 */
+    unsigned long		flags;
+#endif /* version >= v2.1.95 */
+
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /* Disable interrupts, if they aren't already disabled. */
+    save_flags (flags);
+    cli ();
+#else /* version >= v2.1.95 */
+    /*
+     * Disable interrupts, if they aren't already disabled and acquire
+     * the I/O spinlock.
+     */
+    spin_lock_irqsave (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 
 //	DEB (printk ("\npci2220i recieved interrupt\n"));
 
@@ -1090,7 +1204,7 @@
 	if ( !shost )
 		{
 		DEB (printk ("\npci2220i: not my interrupt"));
-		return;
+		goto irq_return;
 		}
 
 	padapter = HOSTDATA(shost);
@@ -1101,7 +1215,7 @@
 		{
 		DEB(printk ("\npci2220i Unsolicited interrupt\n"));
 		STOP_HERE ();
-		return;
+		goto irq_return;
 		}
 	padapter->expectingIRQ = 0;
 	outb_p (0x08, padapter->regDmaCmdStat);									// cancel interrupt from DMA engine
@@ -1125,7 +1239,7 @@
 				OpDone (padapter, DID_OK << 16);
 			else
 				Pci2220i_QueueCommand (SCpnt, SCpnt->scsi_done);
-			return;		
+			goto irq_return;		
 			}
 		}
 
@@ -1142,24 +1256,24 @@
 					if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
 						{
 						padapter->survivor = (pdev->spigot ^ 3) >> 1;
-				DEB (printk ("\npci2220i: FAILURE 10"));
+						DEB (printk ("\npci2220i: FAILURE 10"));
 						if ( InitFailover (padapter, pdev) )
 							OpDone (padapter, DecodeError (padapter, status));
-						return;
+						goto irq_return;
 						}
 					if ( WriteSignature (padapter, pdev, pdev->hotRecon, pdev->mirrorRecon) )
 						{
 						padapter->survivor = (pdev->spigot) >> 1;
-				DEB (printk ("\npci2220i: FAILURE 11"));
+						DEB (printk ("\npci2220i: FAILURE 11"));
 						if ( InitFailover (padapter, pdev) )
 							OpDone (padapter, DecodeError (padapter, status));
-						return;
+						goto irq_return;
 						}
 					padapter->reconPhase = RECON_PHASE_END;	
-					return;
+					goto irq_return;
 					}
 				OpDone (padapter, DID_OK << 16);
-				return;
+				goto irq_return;
 
 			case RECON_PHASE_READY:
 				status = inb_p (padapter->regStatCmd);						// read the device status
@@ -1167,7 +1281,7 @@
 					{
 					del_timer (&padapter->timer);
 					OpDone (padapter, DecodeError (padapter, status));
-					return;
+					goto irq_return;
 					}
 				SelectSpigot (padapter, pdev->hotRecon);
 				if ( WaitDrq (padapter) )
@@ -1177,25 +1291,25 @@
 				DEB (printk ("\npci2220i: FAILURE 12"));
 					if ( InitFailover (padapter, pdev) )
 						OpDone (padapter, DecodeError (padapter, status));
-					return;
+					goto irq_return;
 					}
 				SelectSpigot (padapter, pdev->spigot | 0x40);
 				padapter->reconPhase = RECON_PHASE_COPY;
 				padapter->expectingIRQ = TRUE;
 				if ( padapter->timingPIO )
 					{
-					insw (padapter->regData, Buffer, padapter->reconSize * (BYTES_PER_SECTOR / 2));
+					insw (padapter->regData, padapter->kBuffer, padapter->reconSize * (BYTES_PER_SECTOR / 2));
 					}
 				else
 					{
 					outl (padapter->timingAddress, padapter->regDmaAddrLoc);
-					outl (virt_to_bus (Buffer), padapter->regDmaAddrPci);
+					outl (virt_to_bus (padapter->kBuffer), padapter->regDmaAddrPci);
 					outl (padapter->reconSize * BYTES_PER_SECTOR, padapter->regDmaCount);
 					outb_p (8, padapter->regDmaDesc);						// read operation
 					outb_p (1, padapter->regDmaMode);						// no interrupt
 					outb_p (0x03, padapter->regDmaCmdStat);					// kick the DMA engine in gear
 					}
-				return;
+				goto irq_return;
 
 			case RECON_PHASE_COPY:
 				pdev->DiskMirror[pdev->mirrorRecon].reconstructPoint += padapter->reconSize;
@@ -1207,14 +1321,13 @@
 				if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
 					{
 					padapter->survivor = (pdev->spigot) >> 1;
-				DEB (printk ("\npci2220i: FAILURE 13"));
-				DEB (printk ("  status = %X  error = %X", status, inb_p (padapter->regError)));
+					DEB (printk ("\npci2220i: FAILURE 13"));
 					if ( InitFailover (padapter, pdev) )
 						OpDone (padapter, DecodeError (padapter, status));
-					return;
+					goto irq_return;
 					}
 				OpDone (padapter, DID_OK << 16);
-				return;
+				goto irq_return;
 
 			case RECON_PHASE_END:
 				status = inb_p (padapter->regStatCmd);						// read the device status
@@ -1225,15 +1338,15 @@
 				DEB (printk ("\npci2220i: FAILURE 14"));
 					if ( InitFailover (padapter, pdev) )
 						OpDone (padapter, DecodeError (padapter, status));
-					return;
+					goto irq_return;
 					}
 				padapter->reconOn = FALSE;
 				pdev->hotRecon = 0;
 				OpDone (padapter, DID_OK << 16);
-				return;
+				goto irq_return;
 
 			default:
-				return;
+				goto irq_return;
 			}
 		}
 		
@@ -1251,7 +1364,7 @@
 						del_timer (&padapter->timer);
 				DEB (printk ("\npci2220i: FAILURE 15"));
 						if ( !InitFailover (padapter, pdev) )
-							return;
+							goto irq_return;
 						}
 					break;	
 					}
@@ -1270,7 +1383,7 @@
 				else
 					BusMaster (padapter, 1, 1);
 				padapter->expectingIRQ = TRUE;
-				return;
+				goto irq_return;
 				}
 			status = 0;
 			break;
@@ -1295,7 +1408,7 @@
 				SelectSpigot (padapter, pdev->spigot | 0x80);
 				DEB (printk ("\npci2220i: FAILURE 16  status = %X  error = %X", status, inb_p (padapter->regError)));
 					if ( !InitFailover (padapter, pdev) )
-						return;
+						goto irq_return;
 					}
 				break;
 				}
@@ -1307,7 +1420,7 @@
 					del_timer (&padapter->timer);
 				DEB (printk ("\npci2220i: FAILURE 17  status = %X  error = %X", status1, inb_p (padapter->regError)));
 					if ( !InitFailover (padapter, pdev) )
-						return;
+						goto irq_return;
 					status = status1;
 					break;
 					}
@@ -1320,13 +1433,13 @@
 						del_timer (&padapter->timer);
 				DEB (printk ("\npci2220i: FAILURE 18"));
 						if ( !InitFailover (padapter, pdev) )
-							return;
+							goto irq_return;
 						SelectSpigot (padapter, status | 0x80);				
 						status = inb_p (padapter->regStatCmd);								// read the device status
 						break;
 						}
 					padapter->expectingIRQ = TRUE;
-					return;
+					goto irq_return;
 					}
 				status = 0;
 				break;
@@ -1338,7 +1451,7 @@
 				if ( status )
 					break;
 				padapter->expectingIRQ = TRUE;
-				return;
+				goto irq_return;
 				}
 			status = 0;
 			break;
@@ -1346,7 +1459,7 @@
 		case IDE_COMMAND_IDENTIFY:
 			{
 			PINQUIRYDATA	pinquiryData  = SCpnt->request_buffer;
-			PIDENTIFY_DATA	pid = (PIDENTIFY_DATA)Buffer;
+			PIDENTIFY_DATA	pid = (PIDENTIFY_DATA)padapter->kBuffer;
 
 			status = inb_p (padapter->regStatCmd);
 			if ( status & IDE_STATUS_DRQ )
@@ -1399,6 +1512,21 @@
 		zl = DID_OK << 16;
 
 	OpDone (padapter, zl);
+irq_return:;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /*
+     * Restore the original flags which will enable interrupts
+     * if and only if they were enabled on entry.
+     */
+    restore_flags (flags);
+#else /* version >= v2.1.95 */
+    /*
+     * Release the I/O spinlock and restore the original flags
+     * which will enable interrupts if and only if they were
+     * enabled on entry.
+     */
+    spin_unlock_irqrestore (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 	}
 /****************************************************************
  *	Name:	Pci2220i_QueueCommand
@@ -1652,12 +1780,13 @@
  *
  *	Parameters:		tpnt - Pointer to SCSI host template structure.
  *
- *	Returns:		Number of adapters found.
+ *	Returns:		Number of adapters installed.
  *
  ****************************************************************/
 int Pci2220i_Detect (Scsi_Host_Template *tpnt)
 	{
-	int					pci_index = 0;
+	int					found = 0;
+	int					installed = 0;
 	struct Scsi_Host   *pshost;
 	PADAPTER2220I	    padapter;
 	int					unit;
@@ -1667,174 +1796,223 @@
 	int					setirq;
 	UCHAR				spigot1 = FALSE;
 	UCHAR				spigot2 = FALSE;
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+	struct pci_dev	   *pdev = NULL;
+#else
+	UCHAR				pci_bus, pci_device_fn;
+#endif
 
-	if ( pcibios_present () )
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+	if ( !pci_present () )
+#else
+	if ( !pcibios_present () )
+#endif
 		{
-		for ( pci_index = 0;  pci_index <= MAXADAPTER;  ++pci_index )
-			{
-			UCHAR	pci_bus, pci_device_fn;
+		printk ("pci2220i: PCI BIOS not present\n");
+		return 0;
+		}
 
-			if ( pcibios_find_device (VENDOR_PSI, DEVICE_DALE_1, pci_index, &pci_bus, &pci_device_fn) != 0 )
-				break;
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+	while ( (pdev = pci_find_device (VENDOR_PSI, DEVICE_DALE_1, pdev)) != NULL )
+#else
+	while ( !pcibios_find_device (VENDOR_PSI, DEVICE_DALE_1, found, &pci_bus, &pci_device_fn) )
+#endif
+		{
+		pshost = scsi_register (tpnt, sizeof(ADAPTER2220I));
+		padapter = HOSTDATA(pshost);
+		memset (padapter, 0, sizeof (ADAPTER2220I));
 
-			pshost = scsi_register (tpnt, sizeof(ADAPTER2220I));
-			padapter = HOSTDATA(pshost);
-			memset (padapter, 0, sizeof (ADAPTER2220I));
-
-			pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_1, &zs);
-			zs &= 0xFFFE;
-			padapter->basePort = zs;
-			padapter->regRemap		= zs + RTR_LOCAL_REMAP;				// 32 bit local space remap
-			padapter->regDesc		= zs + RTR_REGIONS;	  				// 32 bit local region descriptor
-			padapter->regRange		= zs + RTR_LOCAL_RANGE;				// 32 bit local range
-			padapter->regIrqControl	= zs + RTR_INT_CONTROL_STATUS;		// 16 bit interupt control and status
-			padapter->regScratchPad	= zs + RTR_MAILBOX;	  				// 16 byte scratchpad I/O base address
-
-			pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_2, &zs);
-			zs &= 0xFFFE;
-			padapter->regBase		= zs;
-			padapter->regData		= zs + REG_DATA;					// data register I/O address
-			padapter->regError		= zs + REG_ERROR;					// error register I/O address
-			padapter->regSectCount	= zs + REG_SECTOR_COUNT;			// sector count register I/O address
-			padapter->regLba0		= zs + REG_LBA_0;					// least significant byte of LBA
-			padapter->regLba8		= zs + REG_LBA_8;					// next least significant byte of LBA
-			padapter->regLba16		= zs + REG_LBA_16;					// next most significan byte of LBA
-			padapter->regLba24		= zs + REG_LBA_24;					// head and most 4 significant bits of LBA
-			padapter->regStatCmd	= zs + REG_STAT_CMD;				// status on read and command on write register
-			padapter->regStatSel	= zs + REG_STAT_SEL;				// board status on read and spigot select on write register
-			padapter->regFail		= zs + REG_FAIL;
-			padapter->regAltStat	= zs + REG_ALT_STAT;
-
-			padapter->regDmaDesc	= zs + RTL_DMA1_DESC_PTR;			// address of the DMA discriptor register for direction of transfer
-			padapter->regDmaCmdStat	= zs + RTL_DMA_COMMAND_STATUS + 1;	// Byte #1 of DMA command status register
-			padapter->regDmaAddrPci	= zs + RTL_DMA1_PCI_ADDR;			// 32 bit register for PCI address of DMA
-			padapter->regDmaAddrLoc	= zs + RTL_DMA1_LOCAL_ADDR;			// 32 bit register for local bus address of DMA
-			padapter->regDmaCount	= zs + RTL_DMA1_COUNT;				// 32 bit register for DMA transfer count
-			padapter->regDmaMode	= zs + RTL_DMA1_MODE + 1;			// 32 bit register for DMA mode control
-
-			if ( !inb_p (padapter->regScratchPad + DALE_NUM_DRIVES) )	// if no devices on this board
-				goto unregister;
-
-			pcibios_read_config_byte (pci_bus, pci_device_fn, PCI_INTERRUPT_LINE, &pshost->irq);
-			setirq = 1;
-			for ( z = 0;  z < pci_index;  z++ )							// scan for shared interrupts
-				{
-				if ( PsiHost[z]->irq == pshost->irq )					// if shared then, don't posses
-					setirq = 0;
-				}
-			if ( setirq )												// if not shared, posses
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+		zs = pdev->base_address[1] & 0xFFFE;
+#else
+		pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_1, &zs);
+		zs &= 0xFFFE;
+#endif
+		padapter->basePort = zs;
+		padapter->regRemap		= zs + RTR_LOCAL_REMAP;				// 32 bit local space remap
+		padapter->regDesc		= zs + RTR_REGIONS;	  				// 32 bit local region descriptor
+		padapter->regRange		= zs + RTR_LOCAL_RANGE;				// 32 bit local range
+		padapter->regIrqControl	= zs + RTR_INT_CONTROL_STATUS;		// 16 bit interupt control and status
+		padapter->regScratchPad	= zs + RTR_MAILBOX;	  				// 16 byte scratchpad I/O base address
+
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+		zs = pdev->base_address[2] & 0xFFFE;
+#else
+		pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_2, &zs);
+		zs &= 0xFFFE;
+#endif
+		padapter->regBase		= zs;
+		padapter->regData		= zs + REG_DATA;					// data register I/O address
+		padapter->regError		= zs + REG_ERROR;					// error register I/O address
+		padapter->regSectCount	= zs + REG_SECTOR_COUNT;			// sector count register I/O address
+		padapter->regLba0		= zs + REG_LBA_0;					// least significant byte of LBA
+		padapter->regLba8		= zs + REG_LBA_8;					// next least significant byte of LBA
+		padapter->regLba16		= zs + REG_LBA_16;					// next most significan byte of LBA
+		padapter->regLba24		= zs + REG_LBA_24;					// head and most 4 significant bits of LBA
+		padapter->regStatCmd	= zs + REG_STAT_CMD;				// status on read and command on write register
+		padapter->regStatSel	= zs + REG_STAT_SEL;				// board status on read and spigot select on write register
+		padapter->regFail		= zs + REG_FAIL;
+		padapter->regAltStat	= zs + REG_ALT_STAT;
+
+		padapter->regDmaDesc	= zs + RTL_DMA1_DESC_PTR;			// address of the DMA discriptor register for direction of transfer
+		padapter->regDmaCmdStat	= zs + RTL_DMA_COMMAND_STATUS + 1;	// Byte #1 of DMA command status register
+		padapter->regDmaAddrPci	= zs + RTL_DMA1_PCI_ADDR;			// 32 bit register for PCI address of DMA
+		padapter->regDmaAddrLoc	= zs + RTL_DMA1_LOCAL_ADDR;			// 32 bit register for local bus address of DMA
+		padapter->regDmaCount	= zs + RTL_DMA1_COUNT;				// 32 bit register for DMA transfer count
+		padapter->regDmaMode	= zs + RTL_DMA1_MODE + 1;			// 32 bit register for DMA mode control
+
+		if ( !inb_p (padapter->regScratchPad + DALE_NUM_DRIVES) )	// if no devices on this board
+			goto unregister;
+
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+		pshost->irq = pdev->irq;
+#else
+		pcibios_read_config_byte (pci_bus, pci_device_fn, PCI_INTERRUPT_LINE, &pshost->irq);
+#endif
+		setirq = 1;
+		for ( z = 0;  z < installed;  z++ )							// scan for shared interrupts
+			{
+			if ( PsiHost[z]->irq == pshost->irq )					// if shared then, don't posses
+				setirq = 0;
+			}
+		if ( setirq )												// if not shared, posses
+			{
+			if ( request_irq (pshost->irq, Irq_Handler, SA_SHIRQ, "pci2220i", padapter) < 0 )
 				{
-				if ( request_irq (pshost->irq, Irq_Handler, 0, "pci2220i", NULL) )
+				if ( request_irq (pshost->irq, Irq_Handler, SA_INTERRUPT | SA_SHIRQ, "pci2220i", padapter) < 0 )
 					{
-					printk ("Unable to allocate IRQ for PSI-2220I controller.\n");
+					printk ("Unable to allocate IRQ for PCI-2220I controller.\n");
 					goto unregister;
 					}
 				}
-			PsiHost[pci_index]	= pshost;								// save SCSI_HOST pointer
-
-			pshost->unique_id	= padapter->regBase;
-			pshost->max_id		= 4;
-
-			outb_p (0x01, padapter->regRange);							// fix our range register because other drivers want to tromp on it
-
-			padapter->timingMode = inb_p (padapter->regScratchPad + DALE_TIMING_MODE);
-			if ( padapter->timingMode >= 2 )
-				padapter->timingAddress	= ModeArray[padapter->timingMode - 2];
-			else
-				padapter->timingPIO = TRUE;
+			padapter->irqOwned = pshost->irq;						// set IRQ as owned
+			}
+		padapter->kBuffer = kmalloc (SECTORSXFER * BYTES_PER_SECTOR, GFP_DMA | GFP_ATOMIC);
+		if ( !padapter->kBuffer )
+			{
+			printk ("Unable to allocate DMA buffer for PCI-2220I controller.\n");
+#if LINUX_VERSION_CODE < LINUXVERSION(1,3,70)
+			free_irq (pshost->irq);
+#else /* version >= v1.3.70 */
+			free_irq (pshost->irq, padapter);
+#endif /* version >= v1.3.70 */
+			goto unregister;
+			}
+		PsiHost[installed]	= pshost;								// save SCSI_HOST pointer
+
+		pshost->io_port		= padapter->basePort;
+		pshost->n_io_port	= 0xFF;
+		pshost->unique_id	= padapter->regBase;
+		pshost->max_id		= 4;
+
+		outb_p (0x01, padapter->regRange);							// fix our range register because other drivers want to tromp on it
+
+		padapter->timingMode = inb_p (padapter->regScratchPad + DALE_TIMING_MODE);
+		if ( padapter->timingMode >= 2 )
+			padapter->timingAddress	= ModeArray[padapter->timingMode - 2];
+		else
+			padapter->timingPIO = TRUE;
 			
-			ReadFlash (padapter, &DaleSetup, DALE_FLASH_SETUP, sizeof (SETUP));
-			for ( z = 0;  z < inb_p (padapter->regScratchPad + DALE_NUM_DRIVES);  ++z )
-				{
-				unit = inb_p (padapter->regScratchPad + DALE_CHANNEL_DEVICE_0 + z) & 0x0F;
-				padapter->device[z].device	 = inb_p (padapter->regScratchPad + DALE_SCRATH_DEVICE_0 + unit);
-				padapter->device[z].byte6	 = (UCHAR)(((unit & 1) << 4) | 0xE0);
-				padapter->device[z].spigot	 = (UCHAR)(1 << (unit >> 1));
-				padapter->device[z].sectors	 = DaleSetup.setupDevice[unit].sectors;
-				padapter->device[z].heads	 = DaleSetup.setupDevice[unit].heads;
-				padapter->device[z].cylinders = DaleSetup.setupDevice[unit].cylinders;
-				padapter->device[z].blocks	 = DaleSetup.setupDevice[unit].blocks;
-
-				if ( !z )
-					{
-					ReadFlash (padapter, &DiskMirror, DALE_FLASH_RAID, sizeof (DiskMirror));
-					DiskMirror[0].status = inb_p (padapter->regScratchPad + DALE_RAID_0_STATUS);		
-					DiskMirror[1].status = inb_p (padapter->regScratchPad + DALE_RAID_1_STATUS);		
-					if ( (DiskMirror[0].signature == SIGNATURE) && (DiskMirror[1].signature == SIGNATURE) &&
-					     (DiskMirror[0].pairIdentifier == (DiskMirror[1].pairIdentifier ^ 1)) )
-						{			 
-						raidon = TRUE;
-						}	
-
-					memcpy (padapter->device[z].DiskMirror, DiskMirror, sizeof (DiskMirror));
-					padapter->raidData[0] = &padapter->device[z].DiskMirror[0];
-					padapter->raidData[2] = &padapter->device[z].DiskMirror[1];
+		ReadFlash (padapter, &DaleSetup, DALE_FLASH_SETUP, sizeof (SETUP));
+		for ( z = 0;  z < inb_p (padapter->regScratchPad + DALE_NUM_DRIVES);  ++z )
+			{
+			unit = inb_p (padapter->regScratchPad + DALE_CHANNEL_DEVICE_0 + z) & 0x0F;
+			padapter->device[z].device	 = inb_p (padapter->regScratchPad + DALE_SCRATH_DEVICE_0 + unit);
+			padapter->device[z].byte6	 = (UCHAR)(((unit & 1) << 4) | 0xE0);
+			padapter->device[z].spigot	 = (UCHAR)(1 << (unit >> 1));
+			padapter->device[z].sectors	 = DaleSetup.setupDevice[unit].sectors;
+			padapter->device[z].heads	 = DaleSetup.setupDevice[unit].heads;
+			padapter->device[z].cylinders = DaleSetup.setupDevice[unit].cylinders;
+			padapter->device[z].blocks	 = DaleSetup.setupDevice[unit].blocks;
+
+			if ( !z )
+				{
+				ReadFlash (padapter, &DiskMirror, DALE_FLASH_RAID, sizeof (DiskMirror));
+				DiskMirror[0].status = inb_p (padapter->regScratchPad + DALE_RAID_0_STATUS);		
+				DiskMirror[1].status = inb_p (padapter->regScratchPad + DALE_RAID_1_STATUS);		
+				if ( (DiskMirror[0].signature == SIGNATURE) && (DiskMirror[1].signature == SIGNATURE) &&
+				     (DiskMirror[0].pairIdentifier == (DiskMirror[1].pairIdentifier ^ 1)) )
+					{			 
+					raidon = TRUE;
+					}	
+
+				memcpy (padapter->device[z].DiskMirror, DiskMirror, sizeof (DiskMirror));
+				padapter->raidData[0] = &padapter->device[z].DiskMirror[0];
+				padapter->raidData[2] = &padapter->device[z].DiskMirror[1];
 				
-					if ( raidon )
-						{
-						padapter->device[z].lastsectorlba[0] = InlineIdentify (padapter, 1, 0);
-						padapter->device[z].lastsectorlba[1] = InlineIdentify (padapter, 2, 0);
+				if ( raidon )
+					{
+					padapter->device[z].lastsectorlba[0] = InlineIdentify (padapter, 1, 0);
+					padapter->device[z].lastsectorlba[1] = InlineIdentify (padapter, 2, 0);
 						
-						if ( !(DiskMirror[1].status & UCBF_SURVIVOR) && padapter->device[z].lastsectorlba[0] )
-							spigot1 = TRUE;
-						if ( !(DiskMirror[0].status & UCBF_SURVIVOR) && padapter->device[z].lastsectorlba[1] )
-							spigot2 = TRUE;
-						if ( DiskMirror[0].status & UCBF_SURVIVOR & DiskMirror[1].status & UCBF_SURVIVOR )
-							spigot1 = TRUE;
+					if ( !(DiskMirror[1].status & UCBF_SURVIVOR) && padapter->device[z].lastsectorlba[0] )
+						spigot1 = TRUE;
+					if ( !(DiskMirror[0].status & UCBF_SURVIVOR) && padapter->device[z].lastsectorlba[1] )
+						spigot2 = TRUE;
+					if ( DiskMirror[0].status & UCBF_SURVIVOR & DiskMirror[1].status & UCBF_SURVIVOR )
+						spigot1 = TRUE;
+
+					if ( spigot1 && (DiskMirror[0].status & UCBF_REBUILD) )
+						InlineReadSignature (padapter, &padapter->device[z], 0);
+					if ( spigot2 && (DiskMirror[1].status & UCBF_REBUILD) )
+						InlineReadSignature (padapter, &padapter->device[z], 1);
 
-						if ( spigot1 && spigot2 )
+					if ( spigot1 && spigot2 )
+						{
+						padapter->device[z].raid = 1;
+						if ( DiskMirror[0].status & UCBF_REBUILD )
+							padapter->device[z].spigot = 2;
+						else
+							padapter->device[z].spigot = 1;
+						if ( (DiskMirror[0].status & UCBF_REBUILD) || (DiskMirror[1].status & UCBF_REBUILD) )
+							{
+							padapter->reconOn = padapter->reconIsStarting = TRUE;
+							}
+						}
+					else
+						{
+						if ( spigot1 )
 							{
-							padapter->device[z].raid = 1;
 							if ( DiskMirror[0].status & UCBF_REBUILD )
-								padapter->device[z].spigot = 2;
-							else
-								padapter->device[z].spigot = 1;
-							if ( (DiskMirror[0].status & UCBF_REBUILD) || (DiskMirror[1].status & UCBF_REBUILD) )
-								{
-								padapter->reconOn = padapter->reconIsStarting = TRUE;
-								}
+								goto unregister;
+							DiskMirror[0].status = UCBF_MIRRORED | UCBF_SURVIVOR;
+							padapter->device[z].spigot = 1;
 							}
 						else
 							{
-							if ( spigot1 )
-								{
-								if ( DiskMirror[0].status & UCBF_REBUILD )
-									goto unregister;
-								DiskMirror[0].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-								padapter->device[z].spigot = 1;
-								}
-							else
-								{
-								if ( DiskMirror[1].status & UCBF_REBUILD )
-									goto unregister;
-								DiskMirror[1].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-								padapter->device[z].spigot = 2;
-								}
-							if ( DaleSetup.rebootRebuil )
-								padapter->reconOn = padapter->reconIsStarting = TRUE;
+							if ( DiskMirror[1].status & UCBF_REBUILD )
+								goto unregister;
+							DiskMirror[1].status = UCBF_MIRRORED | UCBF_SURVIVOR;
+							padapter->device[z].spigot = 2;
 							}
-				
-						break;
+						if ( DaleSetup.rebootRebuil )
+							padapter->reconOn = padapter->reconIsStarting = TRUE;
 						}
+				
+					break;
 					}
 				}
+			}
 			
-			init_timer (&padapter->timer);
-			padapter->timer.function = TimerExpiry;
-			padapter->timer.data = (unsigned long)padapter;
-			init_timer (&padapter->reconTimer);
-			padapter->reconTimer.function = ReconTimerExpiry;
-			padapter->reconTimer.data = (unsigned long)padapter;
-			printk("\nPCI-2220I EIDE CONTROLLER: at I/O = %X/%X  IRQ = %d\n", padapter->basePort, padapter->regBase, pshost->irq);
-			printk("Version %s, Compiled %s %s\n\n", PCI2220I_VERSION, __DATE__, __TIME__);
-			NumAdapters++;
+		init_timer (&padapter->timer);
+		padapter->timer.function = TimerExpiry;
+		padapter->timer.data = (unsigned long)padapter;
+		init_timer (&padapter->reconTimer);
+		padapter->reconTimer.function = ReconTimerExpiry;
+		padapter->reconTimer.data = (unsigned long)padapter;
+		printk("\nPCI-2220I EIDE CONTROLLER: at I/O = %X/%X  IRQ = %d\n", padapter->basePort, padapter->regBase, pshost->irq);
+		printk("Version %s, Compiled %s %s\n\n", PCI2220I_VERSION, __DATE__, __TIME__);
+		found++;
+		if ( ++installed < MAXADAPTER )
 			continue;
+		break;;
 unregister:;
-			scsi_unregister (pshost);
-			}
+		scsi_unregister (pshost);
+		found++;
 		}
 	
-	return NumAdapters;
+	NumAdapters = installed;
+	return installed;
 	}
 /****************************************************************
  *	Name:	Pci2220i_Abort
@@ -1869,6 +2047,47 @@
 	{
 	return SCSI_RESET_PUNT;
 	}
+/****************************************************************
+ *	Name:	Pci2220i_Release
+ *
+ *	Description:	Release resources allocated for a single each adapter.
+ *
+ *	Parameters:		pshost - Pointer to SCSI command structure.
+ *
+ *	Returns:		zero.
+ *
+ ****************************************************************/
+int Pci2220i_Release (struct Scsi_Host *pshost)
+	{
+    PADAPTER2220I	padapter = HOSTDATA (pshost);
+
+	if ( padapter->reconOn )
+		{
+		padapter->reconOn = FALSE;						// shut down the hot reconstruct
+		if ( padapter->reconPhase )
+			udelay (300000);
+		if ( padapter->reconTimer.data )				// is the timer running?
+			{
+			del_timer (&padapter->reconTimer);
+			padapter->reconTimer.data = 0;
+			}
+		}
+
+	// save RAID status on the board
+	outb_p (DiskMirror[0].status, padapter->regScratchPad + DALE_RAID_0_STATUS);		
+	outb_p (DiskMirror[1].status, padapter->regScratchPad + DALE_RAID_1_STATUS);		
+
+	if ( padapter->irqOwned )
+#if LINUX_VERSION_CODE < LINUXVERSION(1,3,70)
+		free_irq (pshost->irq);
+#else /* version >= v1.3.70 */
+		free_irq (pshost->irq, padapter);
+#endif /* version >= v1.3.70 */
+    release_region (pshost->io_port, pshost->n_io_port);
+	kfree (padapter->kBuffer);
+    scsi_unregister(pshost);
+    return 0;
+	}
 
 #include "sd.h"
 
diff -urN linux-2.2.6-pre2/drivers/scsi/pci2220i.h linux-2.2.6-pre3/drivers/scsi/pci2220i.h
--- linux-2.2.6-pre2/drivers/scsi/pci2220i.h	1999-03-22 13:05:53.000000000 -0800
+++ linux-2.2.6-pre3/drivers/scsi/pci2220i.h	2003-08-15 15:05:39.000000000 -0700
@@ -1,33 +1,34 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
  *
- * Copyright (c) 1999 Perceptive Solutions, Inc.
+ * pci2220i.h - Linux Host Driver for PCI-2220i EIDE Adapters
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *	File Name:		pci2220i.h
- *
- *	Description:	Header file for the SCSI driver for the PCI2220I
- *					EIDE interface card.
- *
- *-M*************************************************************************/
+ ****************************************************************************/
+#ifndef _PCI2220I_H
+#define _PCI2220I_H
 
 #ifndef	PSI_EIDE_SCSIOP
 #define	PSI_EIDE_SCSIOP	1
 
+#ifndef LINUX_VERSION_CODE
+#include <linux/version.h>
+#endif 
+#define	LINUXVERSION(v,p,s)    (((v)<<16) + ((p)<<8) + (s))
+
 /************************************************/
 /*		Some defines that we like 				*/
 /************************************************/
@@ -281,10 +282,11 @@
 
 // function prototypes
 int Pci2220i_Detect			(Scsi_Host_Template *tpnt);
-int Pci2220i_Command			(Scsi_Cmnd *SCpnt);
+int Pci2220i_Command		(Scsi_Cmnd *SCpnt);
 int Pci2220i_QueueCommand	(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
 int Pci2220i_Abort			(Scsi_Cmnd *SCpnt);
 int Pci2220i_Reset			(Scsi_Cmnd *SCpnt, unsigned int flags);
+int Pci2220i_Release		(struct Scsi_Host *pshost);
 int Pci2220i_BiosParam		(Disk *disk, kdev_t dev, int geom[]);
 
 #ifndef NULL
@@ -293,12 +295,43 @@
 
 extern struct proc_dir_entry Proc_Scsi_Pci2220i;
 
+#if LINUX_VERSION_CODE >= LINUXVERSION(2,1,75)
+#define PCI2220I {															\
+		next:						NULL,									\
+		module:						NULL,									\
+		proc_dir:					&Proc_Scsi_Pci2220i,					\
+		proc_info:					NULL,	/* let's not bloat the kernel */\
+		name:						"PCI-2220I EIDE Disk Controller",		\
+		detect:						Pci2220i_Detect,						\
+		release:					Pci2220i_Release,						\
+		info:						NULL,	/* let's not bloat the kernel */\
+		command:					Pci2220i_Command,						\
+		queuecommand:				Pci2220i_QueueCommand,					\
+		eh_strategy_handler:		NULL,									\
+		eh_abort_handler:			NULL,									\
+		eh_device_reset_handler:	NULL,									\
+		eh_bus_reset_handler:		NULL,									\
+		eh_host_reset_handler:		NULL,									\
+		abort:						Pci2220i_Abort,							\
+		reset:						Pci2220i_Reset,							\
+		slave_attach:				NULL,									\
+		bios_param:					Pci2220i_BiosParam,						\
+		can_queue:					1,										\
+		this_id:					-1,										\
+		sg_tablesize:				SG_NONE,								\
+		cmd_per_lun:				1,										\
+		present:					0,										\
+		unchecked_isa_dma:			0,										\
+		use_clustering:				DISABLE_CLUSTERING,						\
+		use_new_eh_code:			0										\
+		}
+#else
 #define PCI2220I { NULL, NULL,						\
 			&Proc_Scsi_Pci2220i,/* proc_dir_entry */\
 			NULL,		                			\
 			"PCI-2220I EIDE Disk Controller",		\
 			Pci2220i_Detect,						\
-			NULL,									\
+			Pci2220i_Release,						\
 			NULL,	 								\
 			Pci2220i_Command,						\
 			Pci2220i_QueueCommand,					\
@@ -313,4 +346,6 @@
 			0, 										\
 			0, 										\
 			DISABLE_CLUSTERING }
+#endif
 
+#endif
diff -urN linux-2.2.6-pre2/drivers/scsi/psi240i.c linux-2.2.6-pre3/drivers/scsi/psi240i.c
--- linux-2.2.6-pre2/drivers/scsi/psi240i.c	1998-09-09 08:56:58.000000000 -0700
+++ linux-2.2.6-pre3/drivers/scsi/psi240i.c	2003-08-15 15:05:39.000000000 -0700
@@ -129,7 +129,7 @@
 			outsw (pports[PORT_DATA], padapter->buffer, (USHORT)padapter->ide.ide.ide[2] * 256);
 			return 0;
 			}
-		}	while ( timer > jiffies );									// test for timeout
+		}	while ( time_after(timer, jiffies) );									// test for timeout
 
 	padapter->ide.ide.ides.cmd = 0;									// null out the command byte
 	return 1;
@@ -169,7 +169,7 @@
 
 			return 0;
 			}
-		}	while ( timer > jiffies );									// test for timeout
+		}	while ( time_after(timer, jiffies) );									// test for timeout
 
 	padapter->ide.ide.ides.cmd = 0;									// null out the command byte
 	return status;
@@ -264,7 +264,7 @@
 	UCHAR				status;
 	int					z;
 
-	DEB(printk ("\npsi240i recieved interrupt\n"));
+	DEB(printk ("\npsi240i received interrupt\n"));
 
 	shost = PsiHost[irq - 10];
 	if ( !shost )
diff -urN linux-2.2.6-pre2/drivers/scsi/psi_dale.h linux-2.2.6-pre3/drivers/scsi/psi_dale.h
--- linux-2.2.6-pre2/drivers/scsi/psi_dale.h	1999-03-22 13:05:53.000000000 -0800
+++ linux-2.2.6-pre3/drivers/scsi/psi_dale.h	2003-08-15 15:05:39.000000000 -0700
@@ -1,29 +1,23 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
  *
- * Copyright (c) 1999 Perceptive Solutions, Inc.
+ * psi_dalei.h - Linux Host Driver for PCI-2220i EIDE Adapters
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *	File Name:		psi_dale.h
- *
- *	Description:	This file contains the interface defines and
- *					error codes.
- *
- *-M*************************************************************************/
+ ****************************************************************************/
 
 /************************************************/
 /*		Dale PCI setup							*/
diff -urN linux-2.2.6-pre2/drivers/scsi/psi_roy.h linux-2.2.6-pre3/drivers/scsi/psi_roy.h
--- linux-2.2.6-pre2/drivers/scsi/psi_roy.h	1999-03-22 13:05:53.000000000 -0800
+++ linux-2.2.6-pre3/drivers/scsi/psi_roy.h	2003-08-15 15:05:39.000000000 -0700
@@ -1,29 +1,23 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
  *
- * Copyright (c) 1997 Perceptive Solutions, Inc.
+ * psi_roy.h - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *	File Name:	psi_roy.h
- *
- *	Description:	This file contains the host interface command and
- *					error codes.
- *
- *-M*************************************************************************/
+ ****************************************************************************/
 
 #ifndef	ROY_HOST
 #define	ROY_HOST
diff -urN linux-2.2.6-pre2/drivers/scsi/qlogicfc_asm.c linux-2.2.6-pre3/drivers/scsi/qlogicfc_asm.c
--- linux-2.2.6-pre2/drivers/scsi/qlogicfc_asm.c	1999-02-24 16:27:54.000000000 -0800
+++ linux-2.2.6-pre3/drivers/scsi/qlogicfc_asm.c	2003-08-15 15:05:39.000000000 -0700
@@ -3,2983 +3,3290 @@
  * 	 --- ISP2100 Fabric Initiator/Target Firmware ---               *
  *									*
  *									*
- *									*
+ ************************************************************************
+ *                                                                      *
+ *                              NOTICE                                  *
+ *                                                                      *
+ *                 COPYRIGHT 1998 QLOGIC CORPORATION                    *
+ *                       ALL RIGHTS RESERVED                            *
+ *                                                                      *
  ************************************************************************
  */
+
 /*
- *	Firmware Version 1.13.00 (18:06 May 04, 1998)
+ *	Firmware Version 1.15.19 (14:58 Jan 19, 1999)
  */
 
-unsigned short risc_code_version = 1*1024+13;
+unsigned short risc_code_version = 1*1024+15;
 
-unsigned char firmware_version[] = {1,13,0};
+unsigned char firmware_version[] = {1,15,19};
+
+#define FW_VERSION_STRING "1.15.19"
 
 unsigned short risc_code_addr01 = 0x1000 ;
 
 unsigned short risc_code01[] = { 
-	0x0078, 0x1029, 0x0000, 0x5c95, 0x0000, 0x2043, 0x4f50, 0x5952,
+	0x0078, 0x1029, 0x0000, 0x65e6, 0x0000, 0x2043, 0x4f50, 0x5952,
 	0x4947, 0x4854, 0x2031, 0x3939, 0x3620, 0x514c, 0x4f47, 0x4943,
 	0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
 	0x3231, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
-	0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3133, 0x2020, 0x2020,
-	0x2400, 0x20c1, 0x0021, 0x20a1, 0x6c95, 0x2009, 0x0000, 0x20a9,
-	0x076b, 0x41a4, 0x3400, 0x20c9, 0x71ff, 0x2091, 0x2000, 0x2059,
-	0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x1e36, 0x2051, 0x6d00,
-	0x2a70, 0x705b, 0x8c00, 0x705f, 0xffff, 0x7057, 0x8bf9, 0x7063,
-	0x0300, 0x1078, 0x1264, 0x20a1, 0x7400, 0x715c, 0x810d, 0x810d,
+	0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3135, 0x2020, 0x2020,
+	0x2400, 0x20c1, 0x0021, 0x20a1, 0x75e6, 0x2009, 0x0000, 0x20a9,
+	0x071a, 0x41a4, 0x3400, 0x20c9, 0x7aff, 0x2091, 0x2000, 0x2059,
+	0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x20a0, 0x2051, 0x7600,
+	0x2a70, 0x705b, 0x9500, 0x705f, 0xffff, 0x7057, 0x94f9, 0x7063,
+	0x0300, 0x1078, 0x1282, 0x20a1, 0x7d00, 0x715c, 0x810d, 0x810d,
 	0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0007, 0xa112, 0xa00e,
 	0x21a8, 0x41a4, 0x3400, 0x8211, 0x00c0, 0x1058, 0x715c, 0x3400,
 	0xa102, 0x0040, 0x1068, 0x0048, 0x1068, 0x20a8, 0xa00e, 0x41a4,
-	0x1078, 0x122b, 0x1078, 0x134e, 0x1078, 0x14d3, 0x1078, 0x17d7,
-	0x1078, 0x324a, 0x1078, 0x54fc, 0x1078, 0x12d9, 0x1078, 0x2191,
-	0x1078, 0x3875, 0x1078, 0x3655, 0x1078, 0x4064, 0x1078, 0x1c35,
-	0x1078, 0x4213, 0x1078, 0x3d73, 0x1078, 0x1b5d, 0x1078, 0x1c14,
+	0x1078, 0x1249, 0x1078, 0x136e, 0x1078, 0x14f3, 0x1078, 0x19c8,
+	0x1078, 0x3615, 0x1078, 0x5b94, 0x1078, 0x12f9, 0x1078, 0x242f,
+	0x1078, 0x3c56, 0x1078, 0x3a2e, 0x1078, 0x4494, 0x1078, 0x1e5b,
+	0x1078, 0x46d3, 0x1078, 0x4174, 0x1078, 0x1d7a, 0x1078, 0x1e3a,
 	0x2091, 0x3009, 0x7823, 0x0000, 0x0090, 0x109d, 0x7820, 0xa086,
 	0x0002, 0x00c0, 0x109d, 0x7823, 0x4000, 0x0068, 0x1095, 0x781b,
 	0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, 0x7003, 0x0000,
 	0x2001, 0x017f, 0x2003, 0x0000, 0x2a70, 0x7000, 0xa08e, 0x0003,
-	0x00c0, 0x10bd, 0x1078, 0x2a96, 0x1078, 0x21b9, 0x1078, 0x38c5,
-	0x1078, 0x373c, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
-	0x10c1, 0x1078, 0x4078, 0x0078, 0x10a4, 0x1079, 0x10c5, 0x0078,
-	0x10aa, 0x1078, 0x52d8, 0x0078, 0x10b9, 0x10cf, 0x10d0, 0x1151,
-	0x10cd, 0x11aa, 0x1228, 0x1229, 0x122a, 0x1078, 0x12b7, 0x007c,
-	0x127e, 0x0f7e, 0x2091, 0x8000, 0x1078, 0x2aec, 0x2079, 0x0100,
-	0x7844, 0xa005, 0x00c0, 0x1142, 0x2011, 0x318e, 0x1078, 0x40d1,
+	0x00c0, 0x10bd, 0x1078, 0x2d8d, 0x1078, 0x2457, 0x1078, 0x3ca6,
+	0x1078, 0x3b19, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
+	0x10c1, 0x1078, 0x44ac, 0x0078, 0x10a4, 0x1079, 0x10c5, 0x0078,
+	0x10aa, 0x1078, 0x5866, 0x0078, 0x10b9, 0x10cf, 0x10d0, 0x114b,
+	0x10cd, 0x11c6, 0x1246, 0x1247, 0x1248, 0x1078, 0x12d5, 0x007c,
+	0x127e, 0x0f7e, 0x2091, 0x8000, 0x1078, 0x2eb2, 0x2079, 0x0100,
+	0x7844, 0xa005, 0x00c0, 0x113c, 0x2011, 0x3542, 0x1078, 0x456e,
 	0x780f, 0x00ff, 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, 0x8010,
-	0x73b8, 0x1078, 0x2a53, 0x1078, 0x5129, 0x2011, 0x0004, 0x1078,
-	0x6135, 0x1078, 0x35ef, 0x70c7, 0x0000, 0x70bf, 0x0000, 0x70c3,
-	0x0000, 0x1078, 0x1145, 0x2011, 0x0000, 0x2079, 0x6d51, 0x7804,
+	0x73b8, 0x1078, 0x2d4a, 0x1078, 0x56b1, 0x2011, 0x0004, 0x1078,
+	0x6953, 0x1078, 0x39c8, 0x70c7, 0x0000, 0x70bf, 0x0000, 0x70c3,
+	0x0000, 0x1078, 0x113f, 0x2011, 0x0000, 0x2079, 0x7651, 0x7804,
 	0xd0ac, 0x0040, 0x1104, 0xc295, 0x70a4, 0xa005, 0x0040, 0x1109,
 	0xc29d, 0x72be, 0xa296, 0x0004, 0x0040, 0x112a, 0x2011, 0x0001,
-	0x1078, 0x6135, 0x708b, 0x0000, 0x708f, 0xffff, 0x7003, 0x0002,
-	0x0f7f, 0x1078, 0x1ee6, 0x2011, 0x0005, 0x1078, 0x5232, 0x1078,
-	0x476a, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, 0x127f,
-	0x0078, 0x1144, 0x7003, 0x0003, 0x2001, 0x0000, 0x1078, 0x1dc9,
-	0x2011, 0x0000, 0x1078, 0x5232, 0x2011, 0x0000, 0x1078, 0x523c,
-	0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, 0x1078, 0x476a,
-	0x1078, 0x4821, 0x0f7f, 0x127f, 0x007c, 0x0c7e, 0x20a9, 0x0082,
-	0x2009, 0x007e, 0x1078, 0x342f, 0x8108, 0x00f0, 0x114a, 0x0c7f,
-	0x007c, 0x127e, 0x2091, 0x8000, 0x708c, 0xa086, 0xffff, 0x0040,
-	0x115f, 0x1078, 0x1ee6, 0x1078, 0x476a, 0x0078, 0x11a8, 0x70bc,
-	0xd09c, 0x0040, 0x1187, 0xd084, 0x0040, 0x1187, 0x0f7e, 0x2079,
-	0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c, 0x0040, 0x1187,
-	0x70c0, 0xa086, 0xffff, 0x0040, 0x1183, 0x1078, 0x1fdb, 0x1078,
-	0x476a, 0x2011, 0x0001, 0x2019, 0x0000, 0x1078, 0x2013, 0x1078,
-	0x476a, 0x0078, 0x11a8, 0x70c4, 0xa005, 0x00c0, 0x11a8, 0x7088,
-	0xa005, 0x00c0, 0x11a8, 0x7003, 0x0003, 0x708f, 0xffff, 0x2001,
-	0x0000, 0x1078, 0x1dc9, 0x1078, 0x2ad1, 0x2001, 0x6f11, 0x2004,
-	0xa086, 0x0005, 0x00c0, 0x11a0, 0x2011, 0x0000, 0x1078, 0x5232,
-	0x2011, 0x0000, 0x1078, 0x523c, 0x1078, 0x476a, 0x1078, 0x4821,
-	0x127f, 0x007c, 0x017e, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079,
-	0x0100, 0x7843, 0x0000, 0x7924, 0xd1b4, 0x0040, 0x11b9, 0x7827,
-	0x0040, 0xd19c, 0x0040, 0x11be, 0x7827, 0x0008, 0x007e, 0x037e,
-	0x157e, 0x7900, 0xa18a, 0x0003, 0x0050, 0x11e4, 0x7954, 0xd1ac,
-	0x00c0, 0x11e4, 0x2009, 0x00f8, 0x1078, 0x3233, 0x7843, 0x0090,
-	0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x00c0, 0x11dc,
-	0x7824, 0xd0ac, 0x00c0, 0x1218, 0x00f0, 0x11d4, 0x2001, 0x0001,
-	0x1078, 0x1dc9, 0x0078, 0x1221, 0x7853, 0x0000, 0x782f, 0x0020,
-	0x20a9, 0x0008, 0x00e0, 0x11ea, 0x2091, 0x6000, 0x00f0, 0x11ea,
-	0x7853, 0x0400, 0x782f, 0x0000, 0x2009, 0x00f8, 0x1078, 0x3233,
-	0x20a9, 0x000e, 0x0005, 0x00f0, 0x11fa, 0x7853, 0x1400, 0x7843,
-	0x0090, 0x7843, 0x0010, 0x2019, 0x61a8, 0x7854, 0x0005, 0x0005,
-	0xd08c, 0x0040, 0x120f, 0x7824, 0xd0ac, 0x00c0, 0x1218, 0x8319,
-	0x00c0, 0x1205, 0x2001, 0x0001, 0x1078, 0x1dc9, 0x0078, 0x121f,
-	0x7828, 0xc09d, 0x782a, 0x7827, 0x0008, 0x7827, 0x0040, 0x7853,
-	0x0400, 0x157f, 0x037f, 0x007f, 0x127f, 0x0f7f, 0x017f, 0x007c,
-	0x007c, 0x007c, 0x007c, 0x2a70, 0x2009, 0x0100, 0x2104, 0xa082,
-	0x0002, 0x0048, 0x1237, 0x704f, 0xffff, 0x0078, 0x1239, 0x704f,
-	0x0000, 0x7053, 0xffff, 0x7067, 0x0000, 0x706b, 0x0000, 0x2061,
-	0x6f00, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f,
-	0x0200, 0x6013, 0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f,
-	0x07d0, 0x2061, 0x6f08, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b,
-	0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b,
-	0x0001, 0x601f, 0x0000, 0x007c, 0x1078, 0x128a, 0x2011, 0x0000,
-	0x81ff, 0x0040, 0x1289, 0xa186, 0x0001, 0x00c0, 0x1279, 0x705f,
-	0x8fff, 0x7057, 0x7c01, 0x7063, 0x0100, 0x705b, 0x7c00, 0x0078,
-	0x1287, 0xa186, 0x0002, 0x00c0, 0x1281, 0x2011, 0x0000, 0x0078,
-	0x1287, 0xa186, 0x0005, 0x00c0, 0x1287, 0x2011, 0x0001, 0x1078,
-	0x12b1, 0x007c, 0x2009, 0x0000, 0x2011, 0x0000, 0x1078, 0x12b1,
-	0x2019, 0xaaaa, 0x2061, 0xffff, 0x2362, 0x2c24, 0x2061, 0x7fff,
-	0x2c04, 0xa406, 0x0040, 0x129f, 0xc18d, 0x0078, 0x12ac, 0xc185,
-	0x2011, 0x0001, 0x1078, 0x12b1, 0x2061, 0xffff, 0x2362, 0x2c04,
-	0xa306, 0x00c0, 0x12ac, 0xc195, 0x2011, 0x0001, 0x1078, 0x12b1,
-	0x007c, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x007c, 0x2091,
-	0x8000, 0x0068, 0x12b9, 0x007e, 0x017e, 0x2079, 0x0000, 0x7818,
-	0xa084, 0x0000, 0x00c0, 0x12bf, 0x017f, 0x792e, 0x007f, 0x782a,
-	0x007f, 0x7826, 0x7823, 0x8002, 0x781b, 0x0001, 0x2091, 0x5000,
-	0x2091, 0x4080, 0x2079, 0x6d00, 0x7803, 0x0005, 0x0078, 0x12d6,
-	0x007c, 0x2071, 0x6d00, 0x7158, 0x712e, 0x2021, 0x0001, 0xa190,
-	0x002d, 0xa298, 0x002d, 0x0048, 0x12ef, 0x705c, 0xa302, 0x00c8,
-	0x12ef, 0x220a, 0x2208, 0x2310, 0x8420, 0x0078, 0x12e1, 0x200b,
+	0x1078, 0x6953, 0x708b, 0x0000, 0x708f, 0xffff, 0x7003, 0x0002,
+	0x0f7f, 0x1078, 0x2150, 0x2011, 0x0005, 0x1078, 0x57c0, 0x1078,
+	0x4c7a, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, 0x127f,
+	0x0078, 0x113e, 0x708b, 0x0000, 0x708f, 0xffff, 0x7003, 0x0002,
+	0x2011, 0x0005, 0x1078, 0x57c0, 0x1078, 0x4c7a, 0x0c7e, 0x2061,
+	0x0100, 0x60e3, 0x0008, 0x0c7f, 0x0f7f, 0x127f, 0x007c, 0x0c7e,
+	0x20a9, 0x0082, 0x2009, 0x007e, 0x1078, 0x380d, 0x8108, 0x00f0,
+	0x1144, 0x0c7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x708c, 0xa086,
+	0xffff, 0x0040, 0x1159, 0x1078, 0x2150, 0x1078, 0x4c7a, 0x0078,
+	0x11c4, 0x70bc, 0xd09c, 0x0040, 0x1181, 0xd084, 0x0040, 0x1181,
+	0x0f7e, 0x2079, 0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c,
+	0x0040, 0x1181, 0x70c0, 0xa086, 0xffff, 0x0040, 0x117d, 0x1078,
+	0x2245, 0x1078, 0x4c7a, 0x2011, 0x0001, 0x2019, 0x0000, 0x1078,
+	0x227d, 0x1078, 0x4c7a, 0x0078, 0x11c4, 0x70c4, 0xa005, 0x00c0,
+	0x11c4, 0x7088, 0xa005, 0x00c0, 0x11c4, 0x2001, 0x7652, 0x2004,
+	0xd0ac, 0x0040, 0x11a7, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009,
+	0x0000, 0x017e, 0x1078, 0x3825, 0x00c0, 0x119a, 0x6000, 0xd0ec,
+	0x00c0, 0x11a2, 0x017f, 0x8108, 0x00f0, 0x1191, 0x0c7f, 0x157f,
+	0x0078, 0x11a7, 0x017f, 0x0c7f, 0x157f, 0x0078, 0x11c4, 0x7003,
+	0x0003, 0x708f, 0xffff, 0x2001, 0x0000, 0x1078, 0x202b, 0x1078,
+	0x2dc8, 0x2001, 0x7837, 0x2004, 0xa086, 0x0005, 0x00c0, 0x11bc,
+	0x2011, 0x0000, 0x1078, 0x57c0, 0x2011, 0x0000, 0x1078, 0x57ca,
+	0x1078, 0x4c7a, 0x1078, 0x4d3a, 0x127f, 0x007c, 0x017e, 0x0f7e,
+	0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x7940, 0xa18c, 0x0010,
+	0x7942, 0x7924, 0xd1b4, 0x0040, 0x11d7, 0x7827, 0x0040, 0xd19c,
+	0x0040, 0x11dc, 0x7827, 0x0008, 0x007e, 0x037e, 0x157e, 0x7900,
+	0xa18a, 0x0003, 0x0050, 0x1202, 0x7954, 0xd1ac, 0x00c0, 0x1202,
+	0x2009, 0x00f8, 0x1078, 0x35e4, 0x7843, 0x0090, 0x7843, 0x0010,
+	0x20a9, 0x09c4, 0x7820, 0xd09c, 0x00c0, 0x11fa, 0x7824, 0xd0ac,
+	0x00c0, 0x1236, 0x00f0, 0x11f2, 0x2001, 0x0001, 0x1078, 0x202b,
+	0x0078, 0x123f, 0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0008,
+	0x00e0, 0x1208, 0x2091, 0x6000, 0x00f0, 0x1208, 0x7853, 0x0400,
+	0x782f, 0x0000, 0x2009, 0x00f8, 0x1078, 0x35e4, 0x20a9, 0x000e,
+	0x0005, 0x00f0, 0x1218, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843,
+	0x0010, 0x2019, 0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040,
+	0x122d, 0x7824, 0xd0ac, 0x00c0, 0x1236, 0x8319, 0x00c0, 0x1223,
+	0x2001, 0x0001, 0x1078, 0x202b, 0x0078, 0x123d, 0x7828, 0xc09d,
+	0x782a, 0x7827, 0x0008, 0x7827, 0x0040, 0x7853, 0x0400, 0x157f,
+	0x037f, 0x007f, 0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c,
+	0x007c, 0x2a70, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
+	0x1255, 0x704f, 0xffff, 0x0078, 0x1257, 0x704f, 0x0000, 0x7053,
+	0xffff, 0x7067, 0x0000, 0x706b, 0x0000, 0x2061, 0x7820, 0x6003,
+	0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f, 0x0200, 0x6013,
+	0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f, 0x07d0, 0x2061,
+	0x7828, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b, 0x0000, 0x600f,
+	0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b, 0x0001, 0x601f,
+	0x0000, 0x007c, 0x1078, 0x12a8, 0x2011, 0x0000, 0x81ff, 0x0040,
+	0x12a7, 0xa186, 0x0001, 0x00c0, 0x1297, 0x705f, 0x8fff, 0x7057,
+	0x8501, 0x7063, 0x0100, 0x705b, 0x8500, 0x0078, 0x12a5, 0xa186,
+	0x0002, 0x00c0, 0x129f, 0x2011, 0x0000, 0x0078, 0x12a5, 0xa186,
+	0x0005, 0x00c0, 0x12a5, 0x2011, 0x0001, 0x1078, 0x12cf, 0x007c,
+	0x2009, 0x0000, 0x2011, 0x0000, 0x1078, 0x12cf, 0x2019, 0xaaaa,
+	0x2061, 0xffff, 0x2362, 0x2c24, 0x2061, 0x7fff, 0x2c04, 0xa406,
+	0x0040, 0x12bd, 0xc18d, 0x0078, 0x12ca, 0xc185, 0x2011, 0x0001,
+	0x1078, 0x12cf, 0x2061, 0xffff, 0x2362, 0x2c04, 0xa306, 0x00c0,
+	0x12ca, 0xc195, 0x2011, 0x0001, 0x1078, 0x12cf, 0x007c, 0x3800,
+	0xa084, 0xfffc, 0xa205, 0x20c0, 0x007c, 0x2091, 0x8000, 0x0068,
+	0x12d7, 0x007e, 0x017e, 0x2079, 0x0000, 0x7818, 0xa084, 0x0000,
+	0x00c0, 0x12dd, 0x017f, 0x792e, 0x007f, 0x782a, 0x007f, 0x7826,
+	0x3900, 0x783a, 0x7823, 0x8002, 0x781b, 0x0001, 0x2091, 0x5000,
+	0x2091, 0x4080, 0x2079, 0x7600, 0x7803, 0x0005, 0x0078, 0x12f6,
+	0x007c, 0x2071, 0x7600, 0x7158, 0x712e, 0x2021, 0x0001, 0xa190,
+	0x002d, 0xa298, 0x002d, 0x0048, 0x130f, 0x705c, 0xa302, 0x00c8,
+	0x130f, 0x220a, 0x2208, 0x2310, 0x8420, 0x0078, 0x1301, 0x200b,
 	0x0000, 0x749e, 0x74a2, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000,
-	0x2071, 0x6d00, 0x70a0, 0xa0ea, 0x0010, 0x00c8, 0x1302, 0xa06e,
-	0x0078, 0x130c, 0x8001, 0x70a2, 0x702c, 0x2068, 0x2d04, 0x702e,
+	0x2071, 0x7600, 0x70a0, 0xa0ea, 0x0010, 0x00c8, 0x1322, 0xa06e,
+	0x0078, 0x132c, 0x8001, 0x70a2, 0x702c, 0x2068, 0x2d04, 0x702e,
 	0x206b, 0x0000, 0x6807, 0x0000, 0x127f, 0x0e7f, 0x007c, 0x0e7e,
-	0x2071, 0x6d00, 0x127e, 0x2091, 0x8000, 0x70a0, 0x8001, 0x00c8,
-	0x131c, 0xa06e, 0x0078, 0x1325, 0x70a2, 0x702c, 0x2068, 0x2d04,
+	0x2071, 0x7600, 0x127e, 0x2091, 0x8000, 0x70a0, 0x8001, 0x00c8,
+	0x133c, 0xa06e, 0x0078, 0x1345, 0x70a2, 0x702c, 0x2068, 0x2d04,
 	0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x127f, 0x0e7f, 0x007c,
-	0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0x6d00, 0x702c, 0x206a,
+	0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0x7600, 0x702c, 0x206a,
 	0x2d00, 0x702e, 0x70a0, 0x8000, 0x70a2, 0x127f, 0x0e7f, 0x007c,
-	0x8dff, 0x0040, 0x1344, 0x6804, 0x6807, 0x0000, 0x007e, 0x1078,
-	0x1328, 0x0d7f, 0x0078, 0x1338, 0x007c, 0x0e7e, 0x2071, 0x6d00,
+	0x8dff, 0x0040, 0x1364, 0x6804, 0x6807, 0x0000, 0x007e, 0x1078,
+	0x1348, 0x0d7f, 0x0078, 0x1358, 0x007c, 0x0e7e, 0x2071, 0x7600,
 	0x70a0, 0xa08a, 0x0010, 0xa00d, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
-	0x6f31, 0x7007, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071,
+	0x7859, 0x7007, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071,
 	0x0000, 0x7010, 0xa085, 0x8004, 0x7012, 0x0e7f, 0x007c, 0x0e7e,
-	0x2270, 0x700b, 0x0000, 0x2071, 0x6f31, 0x7018, 0xa088, 0x6f3a,
+	0x2270, 0x700b, 0x0000, 0x2071, 0x7859, 0x7018, 0xa088, 0x7862,
 	0x220a, 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x00c0,
-	0x1377, 0x0f7e, 0x2079, 0x0010, 0x1078, 0x1388, 0x0f7f, 0x0e7f,
-	0x007c, 0x0e7e, 0x2071, 0x6f31, 0x7004, 0xa005, 0x00c0, 0x1386,
-	0x0f7e, 0x2079, 0x0010, 0x1078, 0x1388, 0x0f7f, 0x0e7f, 0x007c,
-	0x7000, 0x0079, 0x138b, 0x138f, 0x13f9, 0x1416, 0x1416, 0x7018,
-	0x711c, 0xa106, 0x00c0, 0x1397, 0x7007, 0x0000, 0x007c, 0x0d7e,
-	0xa180, 0x6f3a, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007,
+	0x1397, 0x0f7e, 0x2079, 0x0010, 0x1078, 0x13a8, 0x0f7f, 0x0e7f,
+	0x007c, 0x0e7e, 0x2071, 0x7859, 0x7004, 0xa005, 0x00c0, 0x13a6,
+	0x0f7e, 0x2079, 0x0010, 0x1078, 0x13a8, 0x0f7f, 0x0e7f, 0x007c,
+	0x7000, 0x0079, 0x13ab, 0x13af, 0x1419, 0x1436, 0x1436, 0x7018,
+	0x711c, 0xa106, 0x00c0, 0x13b7, 0x7007, 0x0000, 0x007c, 0x0d7e,
+	0xa180, 0x7862, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007,
 	0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c,
 	0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804,
-	0x0d7f, 0xd084, 0x0040, 0x13b9, 0x7007, 0x0001, 0x1078, 0x13be,
-	0x007c, 0x7007, 0x0002, 0x1078, 0x13d4, 0x007c, 0x017e, 0x027e,
-	0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x13c9, 0x2110,
+	0x0d7f, 0xd084, 0x0040, 0x13d9, 0x7007, 0x0001, 0x1078, 0x13de,
+	0x007c, 0x7007, 0x0002, 0x1078, 0x13f4, 0x007c, 0x017e, 0x027e,
+	0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x13e9, 0x2110,
 	0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
 	0x0041, 0x027f, 0x017f, 0x007c, 0x017e, 0x027e, 0x137e, 0x147e,
 	0x157e, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c,
-	0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x13e8, 0x2110, 0xa006,
+	0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1408, 0x2110, 0xa006,
 	0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
 	0x0001, 0x3300, 0x7016, 0x157f, 0x147f, 0x137f, 0x027f, 0x017f,
-	0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0x6dc5, 0x20a1, 0x0018,
+	0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0x76e5, 0x20a1, 0x0018,
 	0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
 	0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x700b,
-	0x6dc0, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e,
-	0x157e, 0x2001, 0x6df4, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026,
-	0x2001, 0x6df5, 0x20ac, 0x53a6, 0x2099, 0x6df6, 0x20a1, 0x0018,
+	0x76e0, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e,
+	0x157e, 0x2001, 0x7714, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026,
+	0x2001, 0x7715, 0x20ac, 0x53a6, 0x2099, 0x7716, 0x20a1, 0x0018,
 	0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
 	0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, 0x7002, 0x700b,
-	0x6df1, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e,
-	0x2071, 0x6f31, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002,
-	0xd1fc, 0x0040, 0x1459, 0xa18c, 0x0700, 0x0040, 0x1456, 0x7008,
-	0xa080, 0x0002, 0x2003, 0x0200, 0x0078, 0x1459, 0x7004, 0x1079,
-	0x145d, 0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x1388, 0x1465, 0x1487,
-	0x14a1, 0x14ca, 0x1463, 0x0078, 0x1463, 0x137e, 0x147e, 0x157e,
+	0x7711, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e,
+	0x2071, 0x7859, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002,
+	0xd1fc, 0x0040, 0x1479, 0xa18c, 0x0700, 0x0040, 0x1476, 0x7008,
+	0xa080, 0x0002, 0x2003, 0x0200, 0x0078, 0x1479, 0x7004, 0x1079,
+	0x147d, 0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x13a8, 0x1485, 0x14a7,
+	0x14c1, 0x14ea, 0x1483, 0x0078, 0x1483, 0x137e, 0x147e, 0x157e,
 	0x7014, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x7010, 0x20a8,
 	0x53a5, 0x3400, 0x7016, 0x157f, 0x147f, 0x137f, 0x700c, 0xa005,
-	0x0040, 0x148e, 0x1078, 0x13be, 0x007c, 0x7008, 0xa080, 0x0002,
-	0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x1388, 0x007c, 0x700c,
-	0xa005, 0x0040, 0x148e, 0x1078, 0x13d4, 0x007c, 0x0d7e, 0x7008,
+	0x0040, 0x14ae, 0x1078, 0x13de, 0x007c, 0x7008, 0xa080, 0x0002,
+	0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x13a8, 0x007c, 0x700c,
+	0xa005, 0x0040, 0x14ae, 0x1078, 0x13f4, 0x007c, 0x0d7e, 0x7008,
 	0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, 0x682e, 0x783c,
-	0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x1388,
-	0x007c, 0x137e, 0x147e, 0x157e, 0x2001, 0x6dc3, 0x2004, 0xa080,
+	0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x13a8,
+	0x007c, 0x137e, 0x147e, 0x157e, 0x2001, 0x76e3, 0x2004, 0xa080,
 	0x000d, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020,
-	0x53a5, 0x2001, 0x6dc5, 0x2004, 0xd0bc, 0x0040, 0x14c0, 0x2001,
-	0x6dce, 0x2004, 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5,
-	0x157f, 0x147f, 0x137f, 0x7007, 0x0000, 0x1078, 0x396e, 0x1078,
-	0x1388, 0x007c, 0x2001, 0x6df3, 0x2003, 0x0100, 0x7007, 0x0000,
-	0x1078, 0x1388, 0x007c, 0x127e, 0x2091, 0x2100, 0x2079, 0x0030,
-	0x2071, 0x6f42, 0x7003, 0x0000, 0x700f, 0x6f48, 0x7013, 0x6f48,
+	0x53a5, 0x2001, 0x76e5, 0x2004, 0xd0bc, 0x0040, 0x14e0, 0x2001,
+	0x76ee, 0x2004, 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5,
+	0x157f, 0x147f, 0x137f, 0x7007, 0x0000, 0x1078, 0x3d4f, 0x1078,
+	0x13a8, 0x007c, 0x2001, 0x7713, 0x2003, 0x0100, 0x7007, 0x0000,
+	0x1078, 0x13a8, 0x007c, 0x127e, 0x2091, 0x2100, 0x2079, 0x0030,
+	0x2071, 0x786a, 0x7003, 0x0000, 0x700f, 0x7870, 0x7013, 0x7870,
 	0x780f, 0x0070, 0x127f, 0x007c, 0x6934, 0xa184, 0x0007, 0x0079,
-	0x14e9, 0x14f1, 0x151b, 0x14f1, 0x14f1, 0x14f1, 0x1500, 0x14f1,
-	0x14f5, 0xa085, 0x0001, 0x0078, 0x1531, 0x684c, 0xd0bc, 0x0040,
-	0x14f1, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x1523,
-	0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0, 0x14f1, 0x684c, 0xd0ac,
-	0x0040, 0x14f1, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084,
-	0x000f, 0xa080, 0x1a82, 0x2004, 0x6832, 0xa006, 0x682e, 0x682a,
-	0x6858, 0x0078, 0x152b, 0x684c, 0xd0ac, 0x0040, 0x14f1, 0xa006,
-	0x682e, 0x682a, 0x6858, 0xa18c, 0x000f, 0xa188, 0x1a82, 0x210c,
-	0x6932, 0x2d08, 0x691a, 0x6826, 0x684c, 0xc0dd, 0x684e, 0xa006,
-	0x680a, 0x007c, 0x82ff, 0x0040, 0x1545, 0xa280, 0x0004, 0x0d7e,
-	0x206c, 0x684c, 0xd0dc, 0x00c0, 0x1541, 0x1078, 0x14e4, 0x10c0,
-	0x12b7, 0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e,
-	0x027e, 0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005,
-	0x00c0, 0x1559, 0x7206, 0x2001, 0x156d, 0x007e, 0x2260, 0x0078,
-	0x164f, 0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108,
-	0xa182, 0x6f63, 0x0048, 0x1566, 0x2009, 0x6f48, 0x710e, 0x7000,
-	0xa005, 0x00c0, 0x156d, 0x1078, 0x1638, 0x127f, 0x007c, 0x127e,
-	0x027e, 0x037e, 0x0c7e, 0x007e, 0x2091, 0x2100, 0x007f, 0x047f,
-	0x037f, 0x027f, 0x0c7e, 0x0d7e, 0x2460, 0x6110, 0x2168, 0x6a62,
-	0x6b5e, 0xa005, 0x0040, 0x15bc, 0x6808, 0xa005, 0x0040, 0x15ea,
-	0x7000, 0xa005, 0x00c0, 0x158e, 0x0078, 0x15b4, 0x700c, 0x7110,
-	0xa106, 0x00c0, 0x15ba, 0x7004, 0xa406, 0x00c0, 0x15b4, 0x2001,
-	0x0005, 0x2004, 0xd08c, 0x00c0, 0x15ee, 0x2001, 0x0207, 0x2004,
-	0xd09c, 0x00c0, 0x1597, 0x7804, 0xa084, 0x6000, 0x0040, 0x15ae,
-	0xa086, 0x6000, 0x0040, 0x15ae, 0x0078, 0x1597, 0x7803, 0x0004,
-	0x7003, 0x0000, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x5591,
-	0x0078, 0x15ee, 0x0078, 0x15ee, 0x6808, 0xa005, 0x0040, 0x15ea,
-	0x7000, 0xa005, 0x00c0, 0x15c6, 0x0078, 0x15ea, 0x700c, 0x7110,
-	0xa106, 0x00c0, 0x15ba, 0x7004, 0xa406, 0x00c0, 0x15ea, 0x2001,
-	0x0005, 0x2004, 0xd08c, 0x00c0, 0x15ee, 0x2001, 0x0207, 0x2004,
-	0xd09c, 0x00c0, 0x15cf, 0x7804, 0xa084, 0x6000, 0x0040, 0x15e6,
-	0xa086, 0x6000, 0x0040, 0x15e6, 0x0078, 0x15cf, 0x7803, 0x0004,
-	0x7003, 0x0000, 0x2009, 0x0048, 0x1078, 0x5591, 0x0d7f, 0x0c7f,
-	0x127f, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x6f42, 0x7000, 0xa086,
-	0x0000, 0x0040, 0x1635, 0x7004, 0xac06, 0x00c0, 0x1626, 0x2079,
-	0x0030, 0x7804, 0xd0fc, 0x00c0, 0x1622, 0x2001, 0x0207, 0x2004,
-	0xd09c, 0x00c0, 0x1601, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
-	0x160d, 0x7908, 0xd1ec, 0x00c0, 0x1619, 0x2009, 0x0009, 0x0078,
-	0x161b, 0x2009, 0x0019, 0x7803, 0x0002, 0x7902, 0x7003, 0x0003,
-	0x0078, 0x1635, 0x1078, 0x16e5, 0x0078, 0x15f6, 0x157e, 0x20a9,
-	0x0009, 0x2009, 0x6f48, 0x2104, 0xac06, 0x00c0, 0x1630, 0x200a,
-	0xa188, 0x0003, 0x00f0, 0x162b, 0x157f, 0x0e7f, 0x0f7f, 0x007c,
-	0x700c, 0x7110, 0xa106, 0x00c0, 0x1640, 0x7003, 0x0000, 0x007c,
-	0x2104, 0x7006, 0x2060, 0x8108, 0x211c, 0x8108, 0x2124, 0x8108,
-	0xa182, 0x6f63, 0x0048, 0x164e, 0x2009, 0x6f48, 0x7112, 0x8cff,
-	0x00c0, 0x1658, 0x7803, 0x0019, 0x7003, 0x0003, 0x0078, 0x167b,
-	0x6010, 0x2068, 0x2d58, 0x6828, 0xa406, 0x00c0, 0x1663, 0x682c,
-	0xa306, 0x0040, 0x1667, 0x1078, 0x1aa2, 0x00c0, 0x1652, 0x6824,
-	0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f,
-	0x2009, 0x0011, 0x1078, 0x167c, 0x0040, 0x167a, 0x2009, 0x0001,
-	0x1078, 0x167c, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x16e0, 0xa03e,
-	0x2730, 0x6850, 0xd0fc, 0x00c0, 0x169b, 0x0d7e, 0x2804, 0xac68,
-	0x2900, 0x0079, 0x168b, 0x16ca, 0x16ab, 0x16ab, 0x16ca, 0x16ca,
-	0x16c2, 0x16ca, 0x16ab, 0x16ca, 0x16b1, 0x16b1, 0x16ca, 0x16ca,
-	0x16ca, 0x16ca, 0x16b1, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c,
-	0x6c20, 0x0d7e, 0xd99c, 0x0040, 0x16cd, 0x2804, 0xac68, 0x6f08,
-	0x6e0c, 0x0078, 0x16cd, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078,
-	0x16cd, 0x7b0c, 0xd3bc, 0x0040, 0x16ba, 0x7b08, 0xa39c, 0x0fff,
-	0x0078, 0x16bb, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c,
-	0x0078, 0x16cd, 0x0d7f, 0x1078, 0x1a3f, 0x00c0, 0x167c, 0xa00e,
-	0x0078, 0x16e0, 0x0d7f, 0x1078, 0x12b7, 0x7b22, 0x7a26, 0x7d32,
+	0x1509, 0x1511, 0x1557, 0x1511, 0x1511, 0x1511, 0x153c, 0x1520,
+	0x1515, 0xa085, 0x0001, 0x0078, 0x1571, 0x684c, 0xd0bc, 0x0040,
+	0x1511, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x155f,
+	0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x1511, 0x684c, 0xd0bc,
+	0x0040, 0x1511, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a,
+	0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x1c84, 0x2004,
+	0x6832, 0x6858, 0x0078, 0x1567, 0xa18c, 0x00ff, 0xa186, 0x0015,
+	0x00c0, 0x1511, 0x684c, 0xd0ac, 0x0040, 0x1511, 0x6804, 0x681a,
+	0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x1c84, 0x2004,
+	0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078, 0x1567, 0x684c,
+	0xd0ac, 0x0040, 0x1511, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c,
+	0x000f, 0xa188, 0x1c84, 0x210c, 0x6932, 0x2d08, 0x691a, 0x6826,
+	0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980,
+	0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a,
+	0x2004, 0x82ff, 0x0040, 0x158c, 0xa280, 0x0004, 0x0d7e, 0x206c,
+	0x684c, 0xd0dc, 0x00c0, 0x1588, 0x1078, 0x1504, 0x10c0, 0x12d5,
+	0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e, 0x027e,
+	0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005, 0x00c0,
+	0x15a0, 0x7206, 0x2001, 0x15b4, 0x007e, 0x2260, 0x0078, 0x16cc,
+	0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182,
+	0x788b, 0x0048, 0x15ad, 0x2009, 0x7870, 0x710e, 0x7000, 0xa005,
+	0x00c0, 0x15b4, 0x1078, 0x16b5, 0x127f, 0x007c, 0x127e, 0x027e,
+	0x037e, 0x0c7e, 0x007e, 0x2091, 0x2100, 0x007f, 0x047f, 0x037f,
+	0x027f, 0x0d7e, 0x0c7e, 0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e,
+	0xa005, 0x0040, 0x1608, 0x6808, 0xa005, 0x0040, 0x166e, 0x7000,
+	0xa005, 0x00c0, 0x15d5, 0x0078, 0x1602, 0x700c, 0x7110, 0xa106,
+	0x00c0, 0x1672, 0x7004, 0xa406, 0x00c0, 0x1602, 0x2001, 0x0005,
+	0x2004, 0xd08c, 0x0040, 0x15eb, 0x047e, 0x1078, 0x178d, 0x047f,
+	0x2460, 0x0078, 0x15cb, 0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0,
+	0x15de, 0x7804, 0xa084, 0x6000, 0x0040, 0x15fc, 0xa086, 0x6000,
+	0x0040, 0x15fc, 0x0078, 0x15de, 0x7803, 0x0004, 0x7003, 0x0000,
+	0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x5c29, 0x0078, 0x1672,
+	0x6808, 0xa005, 0x0040, 0x166e, 0x7000, 0xa005, 0x00c0, 0x1612,
+	0x0078, 0x166e, 0x700c, 0x7110, 0xa106, 0x00c0, 0x161b, 0x7004,
+	0xa406, 0x00c0, 0x166e, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040,
+	0x1628, 0x047e, 0x1078, 0x178d, 0x047f, 0x2460, 0x0078, 0x1608,
+	0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0, 0x161b, 0x2001, 0x0005,
+	0x2004, 0xd08c, 0x00c0, 0x1621, 0x7804, 0xa084, 0x6000, 0x0040,
+	0x163f, 0xa086, 0x6000, 0x0040, 0x163f, 0x0078, 0x161b, 0x7007,
+	0x0000, 0xa016, 0x2218, 0x7000, 0xa08e, 0x0001, 0x0040, 0x1660,
+	0xa08e, 0x0002, 0x00c0, 0x166e, 0x0c7e, 0x0e7e, 0x6818, 0x2060,
+	0x1078, 0x1c59, 0x2804, 0xac70, 0x6034, 0xd09c, 0x00c0, 0x165c,
+	0x7308, 0x720c, 0x0078, 0x165e, 0x7310, 0x7214, 0x0e7f, 0x0c7f,
+	0x7820, 0xa318, 0x7824, 0xa211, 0x6810, 0xa300, 0x6812, 0x6814,
+	0xa201, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000, 0x2009, 0x0048,
+	0x1078, 0x5c29, 0x0c7f, 0x0d7f, 0x127f, 0x007c, 0x0f7e, 0x0e7e,
+	0x2071, 0x786a, 0x7000, 0xa086, 0x0000, 0x0040, 0x16b2, 0x7004,
+	0xac06, 0x00c0, 0x16a3, 0x2079, 0x0030, 0x7804, 0xd0fc, 0x00c0,
+	0x169f, 0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0, 0x1685, 0x7803,
+	0x0004, 0x7804, 0xd0ac, 0x00c0, 0x1691, 0x7803, 0x0002, 0x7803,
+	0x0009, 0x7003, 0x0003, 0x7007, 0x0000, 0x0078, 0x16a3, 0x1078,
+	0x178d, 0x0078, 0x167a, 0x157e, 0x20a9, 0x0009, 0x2009, 0x7870,
+	0x2104, 0xac06, 0x00c0, 0x16ad, 0x200a, 0xa188, 0x0003, 0x00f0,
+	0x16a8, 0x157f, 0x0e7f, 0x0f7f, 0x007c, 0x700c, 0x7110, 0xa106,
+	0x00c0, 0x16bd, 0x7003, 0x0000, 0x007c, 0x2104, 0x7006, 0x2060,
+	0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0x788b, 0x0048,
+	0x16cb, 0x2009, 0x7870, 0x7112, 0x8cff, 0x00c0, 0x16d3, 0x1078,
+	0x1958, 0x0078, 0x16fa, 0x6010, 0x2068, 0x2d58, 0x6828, 0xa406,
+	0x00c0, 0x16de, 0x682c, 0xa306, 0x0040, 0x16e2, 0x1078, 0x1ca4,
+	0x00c0, 0x16cf, 0x684c, 0xd0f4, 0x00c0, 0x16cf, 0x6824, 0x2050,
+	0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x2009,
+	0x0011, 0x1078, 0x16fb, 0x0040, 0x16f9, 0x2009, 0x0001, 0x1078,
+	0x16fb, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x1788, 0xa03e, 0x2730,
+	0x6850, 0xd0fc, 0x00c0, 0x171a, 0x0d7e, 0x2804, 0xac68, 0x2900,
+	0x0079, 0x170a, 0x176a, 0x172a, 0x172a, 0x176a, 0x176a, 0x1762,
+	0x176a, 0x172a, 0x176a, 0x1730, 0x1730, 0x176a, 0x176a, 0x176a,
+	0x1759, 0x1730, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20,
+	0x0d7e, 0xd99c, 0x0040, 0x176d, 0x2804, 0xac68, 0x6f08, 0x6e0c,
+	0x0078, 0x176d, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078, 0x176d,
+	0x7b0c, 0xd3bc, 0x0040, 0x1751, 0x7004, 0x0e7e, 0x2070, 0x701c,
+	0x0e7f, 0xa086, 0x0008, 0x00c0, 0x1751, 0x7b08, 0xa39c, 0x0fff,
+	0x2d20, 0x0d7f, 0x0d7e, 0x6a14, 0x82ff, 0x00c0, 0x174c, 0x6810,
+	0xa302, 0x0048, 0x174c, 0x6b10, 0x2011, 0x0000, 0x2468, 0x0078,
+	0x1753, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0078,
+	0x176d, 0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e,
+	0x00c0, 0x176a, 0x0d7f, 0x1078, 0x1c40, 0x00c0, 0x16fb, 0xa00e,
+	0x0078, 0x1788, 0x0d7f, 0x1078, 0x12d5, 0x7b22, 0x7a26, 0x7d32,
 	0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x0d7f,
-	0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x1078, 0x1a3f,
-	0x007c, 0x1078, 0x12b7, 0x1078, 0x12b7, 0x127e, 0x2091, 0x2100,
+	0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x2300, 0x6b10,
+	0xa302, 0x6812, 0x2200, 0x6a14, 0xa203, 0x6816, 0x1078, 0x1c40,
+	0x007c, 0x1078, 0x12d5, 0x1078, 0x12d5, 0x127e, 0x2091, 0x2100,
 	0x007e, 0x017e, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002,
-	0xa184, 0x0700, 0x00c0, 0x16e3, 0xa184, 0x0003, 0xa086, 0x0003,
-	0x0040, 0x16e3, 0x7000, 0x0079, 0x16fd, 0x1701, 0x1703, 0x1779,
-	0x17c0, 0x1078, 0x12b7, 0x8001, 0x7002, 0xa184, 0x0880, 0x00c0,
-	0x1718, 0x8aff, 0x0040, 0x175b, 0x2009, 0x0001, 0x1078, 0x167c,
-	0x0040, 0x17d3, 0x2009, 0x0001, 0x1078, 0x167c, 0x0078, 0x17d3,
-	0x7803, 0x0004, 0x7003, 0x0000, 0xd1dc, 0x0040, 0x1751, 0x027e,
-	0x037e, 0x6b28, 0x6a2c, 0x7820, 0x686e, 0xa31a, 0x7824, 0x6872,
-	0xa213, 0x6b2a, 0x6a2e, 0x037f, 0x027f, 0x7830, 0x681e, 0x7834,
-	0x6822, 0x1078, 0x1a58, 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800,
-	0x6832, 0x7003, 0x0000, 0x6850, 0xc0fd, 0x6852, 0x6808, 0x8001,
-	0x680a, 0x00c0, 0x174d, 0x684c, 0xd0e4, 0x0040, 0x174d, 0x7004,
-	0x2060, 0x2009, 0x0048, 0x1078, 0x5591, 0x1078, 0x1638, 0x0078,
-	0x17d3, 0x057e, 0x7d0c, 0xd5bc, 0x00c0, 0x1758, 0x1078, 0x6c41,
-	0x057f, 0x0078, 0x1773, 0x684c, 0xc0f5, 0x684e, 0x7814, 0xa005,
-	0x00c0, 0x1773, 0x7003, 0x0000, 0x6808, 0x8001, 0x680a, 0x00c0,
-	0x176f, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x5591, 0x1078,
-	0x1638, 0x0078, 0x17d3, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078,
-	0x17d3, 0x8001, 0x7002, 0xd194, 0x0040, 0x178b, 0x7804, 0xd0fc,
-	0x00c0, 0x16ed, 0x8aff, 0x0040, 0x17d3, 0x2009, 0x0001, 0x1078,
-	0x167c, 0x0078, 0x17d3, 0xa184, 0x0880, 0x00c0, 0x1798, 0x8aff,
-	0x0040, 0x17d3, 0x2009, 0x0001, 0x1078, 0x167c, 0x0078, 0x17d3,
-	0x7803, 0x0004, 0x7003, 0x0000, 0xd1dc, 0x0040, 0x17b9, 0x027e,
-	0x037e, 0x6b28, 0x6a2c, 0x1078, 0x1a58, 0x0d7e, 0x2804, 0xac68,
-	0x6034, 0xd09c, 0x00c0, 0x17b2, 0x6808, 0xa31a, 0x680c, 0xa213,
-	0x0078, 0x17b6, 0x6810, 0xa31a, 0x6814, 0xa213, 0x0d7f, 0x0078,
-	0x1723, 0x057e, 0x7d0c, 0x1078, 0x6c41, 0x057f, 0x0078, 0x1773,
-	0x7003, 0x0000, 0x7004, 0xa00d, 0x0040, 0x17d1, 0x6808, 0x8001,
-	0x680a, 0x00c0, 0x17d1, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078,
-	0x5591, 0x1078, 0x1638, 0x017f, 0x007f, 0x127f, 0x007c, 0x0e7e,
-	0x2071, 0x6f63, 0x7003, 0x0000, 0x0e7f, 0x007c, 0x0d7e, 0xa280,
-	0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1836, 0x6934, 0xa184,
-	0x0007, 0x0079, 0x17eb, 0x17f3, 0x1821, 0x17f3, 0x17f3, 0x17f3,
-	0x1806, 0x17f3, 0x17f5, 0x1078, 0x12b7, 0x684c, 0xd0b4, 0x0040,
-	0x192f, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c,
-	0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1829, 0xa18c, 0x00ff,
-	0xa186, 0x0015, 0x00c0, 0x1836, 0x684c, 0xd0b4, 0x0040, 0x192f,
-	0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080,
-	0x1a82, 0x2004, 0x6832, 0x6958, 0xa006, 0x682e, 0x682a, 0x0078,
-	0x1832, 0x684c, 0xd0b4, 0x0040, 0x16e1, 0x6958, 0xa006, 0x682e,
-	0x682a, 0x2d00, 0x681a, 0x6834, 0xa084, 0x000f, 0xa080, 0x1a82,
-	0x2004, 0x6832, 0x6926, 0x684c, 0xc0dd, 0x684e, 0x0d7f, 0x007c,
-	0x0f7e, 0x2079, 0x0020, 0x7804, 0xd0fc, 0x10c0, 0x1933, 0x0e7e,
-	0x0d7e, 0x2071, 0x6f63, 0x7000, 0xa005, 0x00c0, 0x18b2, 0x0c7e,
-	0x7206, 0xa280, 0x0004, 0x205c, 0x7004, 0x2068, 0x6818, 0x0d7e,
-	0x2068, 0x686c, 0x7812, 0x6890, 0x0f7e, 0x20e1, 0x9040, 0x2079,
-	0x0200, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x0f7f, 0x0d7f,
-	0x2b68, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034,
-	0xa0cc, 0x000f, 0x6908, 0xa184, 0x0007, 0x0040, 0x1874, 0x017e,
-	0x2009, 0x0008, 0xa102, 0x017f, 0xa108, 0x791a, 0x7116, 0x701e,
-	0x680c, 0xa081, 0x0000, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012,
-	0x7004, 0x692c, 0x6814, 0xa106, 0x00c0, 0x188b, 0x6928, 0x6810,
-	0xa106, 0x0040, 0x1898, 0x037e, 0x047e, 0x6b14, 0x6c10, 0x1078,
-	0x1aa2, 0x047f, 0x037f, 0x0040, 0x1898, 0x0c7f, 0x0078, 0x18b2,
-	0x8aff, 0x00c0, 0x18a0, 0x0c7f, 0xa085, 0x0001, 0x0078, 0x18b2,
-	0x127e, 0x2091, 0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x1078,
-	0x18b6, 0x0040, 0x18af, 0x2009, 0x0001, 0x1078, 0x18b6, 0x127f,
-	0x0c7f, 0xa006, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x077e, 0x067e,
-	0x057e, 0x047e, 0x037e, 0x027e, 0x8aff, 0x0040, 0x1928, 0x700c,
-	0x7214, 0xa202, 0x7010, 0x7218, 0xa203, 0x0048, 0x1927, 0xa03e,
-	0x2730, 0x6850, 0xd0fc, 0x00c0, 0x18e3, 0x0d7e, 0x2804, 0xac68,
-	0x2900, 0x0079, 0x18d3, 0x1909, 0x18f3, 0x18f3, 0x1909, 0x1909,
-	0x1901, 0x1909, 0x18f3, 0x1909, 0x18f9, 0x18f9, 0x1909, 0x1909,
-	0x1909, 0x1909, 0x18f9, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c,
-	0x6c20, 0xd99c, 0x0040, 0x190d, 0x0d7e, 0x2804, 0xac68, 0x6f08,
-	0x6e0c, 0x0078, 0x190c, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078,
-	0x190c, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0078,
-	0x190c, 0x0d7f, 0x1078, 0x1a3f, 0x00c0, 0x18bc, 0xa00e, 0x0078,
-	0x1928, 0x0d7f, 0x1078, 0x12b7, 0x0d7f, 0x7b22, 0x7a26, 0x7d32,
-	0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x6828,
-	0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x700c, 0xa300, 0x700e,
-	0x7010, 0xa201, 0x7012, 0x1078, 0x1a3f, 0x0078, 0x1928, 0xa006,
-	0x027f, 0x037f, 0x047f, 0x057f, 0x067f, 0x077f, 0x007c, 0x1078,
-	0x12b7, 0x1078, 0x12b7, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e,
-	0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x2079, 0x0020, 0x2071, 0x6f63,
-	0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700,
-	0x00c0, 0x1931, 0x7000, 0x0079, 0x194d, 0x1a09, 0x1951, 0x19d6,
-	0x1a07, 0x8001, 0x7002, 0xd19c, 0x00c0, 0x1965, 0x8aff, 0x0040,
-	0x199a, 0x2009, 0x0001, 0x1078, 0x18b6, 0x0040, 0x1a09, 0x2009,
-	0x0001, 0x1078, 0x18b6, 0x0078, 0x1a09, 0x7803, 0x0004, 0xd194,
-	0x0040, 0x1975, 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1990,
-	0x684c, 0xc0f5, 0x684e, 0x0078, 0x1990, 0x027e, 0x037e, 0x6b28,
-	0x6a2c, 0x701c, 0xa005, 0x10c0, 0x1a11, 0x7820, 0x686e, 0xa31a,
-	0x7824, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x037f, 0x027f, 0x7830,
-	0x681e, 0x7834, 0x6822, 0x1078, 0x1a58, 0x6850, 0xc0fd, 0x6852,
-	0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000,
-	0x0078, 0x1a09, 0x711c, 0x81ff, 0x0040, 0x19af, 0x7922, 0x7827,
+	0xa184, 0x0700, 0x00c0, 0x178b, 0xa184, 0x0003, 0xa086, 0x0003,
+	0x0040, 0x178b, 0x7000, 0x0079, 0x17a5, 0x17ad, 0x17af, 0x1887,
+	0x18ef, 0x1906, 0x17ad, 0x17ad, 0x17ad, 0x1078, 0x12d5, 0x8001,
+	0x7002, 0xa184, 0x0880, 0x00c0, 0x17c4, 0x8aff, 0x0040, 0x1827,
+	0x2009, 0x0001, 0x1078, 0x16fb, 0x0040, 0x1918, 0x2009, 0x0001,
+	0x1078, 0x16fb, 0x0078, 0x1918, 0x7803, 0x0004, 0x7003, 0x0000,
+	0xd1bc, 0x00c0, 0x180f, 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x7820,
+	0x686e, 0xa31a, 0x7824, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x7820,
+	0x6910, 0xa100, 0x6812, 0x7824, 0x6914, 0xa101, 0x6816, 0x037f,
+	0x027f, 0x7830, 0x681e, 0x7834, 0x6822, 0x1078, 0x1c59, 0x2a00,
+	0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x6850,
+	0xc0fd, 0x6852, 0x6808, 0x8001, 0x680a, 0x00c0, 0x1801, 0x684c,
+	0xd0e4, 0x0040, 0x1801, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078,
+	0x5c29, 0x7808, 0xd0ec, 0x00c0, 0x180b, 0x7803, 0x0009, 0x7003,
+	0x0004, 0x0078, 0x1918, 0x1078, 0x16b5, 0x0078, 0x1918, 0x057e,
+	0x7d0c, 0xd5bc, 0x00c0, 0x1816, 0x1078, 0x7592, 0x057f, 0x1078,
+	0x191c, 0x682b, 0xffff, 0x682f, 0xffff, 0x697c, 0x6912, 0x6980,
+	0x6916, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1918, 0x684c,
+	0xc0f5, 0x684e, 0x7814, 0xa005, 0x00c0, 0x183f, 0x7003, 0x0000,
+	0x6808, 0x8001, 0x680a, 0x00c0, 0x183b, 0x7004, 0x2060, 0x2009,
+	0x0048, 0x1078, 0x5c29, 0x1078, 0x16b5, 0x0078, 0x1918, 0x7814,
+	0x6910, 0xa102, 0x6812, 0x6914, 0xa183, 0x0000, 0x6816, 0x7814,
+	0x7908, 0xa18c, 0x0fff, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214,
+	0xa10a, 0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b,
+	0x1078, 0x1983, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001,
+	0x7804, 0xd0fc, 0x0040, 0x1860, 0x7803, 0x0002, 0x7803, 0x0004,
+	0x780f, 0x0070, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048,
+	0x1078, 0x5c29, 0x1078, 0x19a6, 0x0040, 0x183b, 0x7908, 0xd1ec,
+	0x00c0, 0x187e, 0x2009, 0x0009, 0x0078, 0x1880, 0x2009, 0x0019,
+	0x7902, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1918, 0x8001,
+	0x7002, 0xd194, 0x0040, 0x1899, 0x7804, 0xd0fc, 0x00c0, 0x1795,
+	0x8aff, 0x0040, 0x1918, 0x2009, 0x0001, 0x1078, 0x16fb, 0x0078,
+	0x1918, 0xa184, 0x0880, 0x00c0, 0x18a6, 0x8aff, 0x0040, 0x1918,
+	0x2009, 0x0001, 0x1078, 0x16fb, 0x0078, 0x1918, 0x7803, 0x0004,
+	0x7003, 0x0000, 0xd1bc, 0x00c0, 0x18da, 0x027e, 0x037e, 0x6b28,
+	0x6a2c, 0x1078, 0x1c59, 0x0d7e, 0x0f7e, 0x2d78, 0x2804, 0xac68,
+	0x6034, 0xd09c, 0x00c0, 0x18ca, 0x6808, 0x2008, 0xa31a, 0x680c,
+	0xa213, 0x7810, 0xa100, 0x7812, 0x690c, 0x7814, 0xa101, 0x7816,
+	0x0078, 0x18d6, 0x6810, 0x2008, 0xa31a, 0x6814, 0xa213, 0x7810,
+	0xa100, 0x7812, 0x6914, 0x7814, 0xa101, 0x7816, 0x0f7f, 0x0d7f,
+	0x0078, 0x17cf, 0x057e, 0x7d0c, 0x1078, 0x7592, 0x057f, 0x1078,
+	0x191c, 0x682b, 0xffff, 0x682f, 0xffff, 0x697c, 0x6912, 0x6980,
+	0x6916, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1918, 0x7803,
+	0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, 0x0040, 0x1902, 0x6808,
+	0x8001, 0x680a, 0x00c0, 0x1902, 0x7004, 0x2060, 0x2009, 0x0048,
+	0x1078, 0x5c29, 0x1078, 0x16b5, 0x0078, 0x1918, 0x7803, 0x0004,
+	0x7003, 0x0000, 0x7004, 0x2060, 0x6010, 0xa005, 0x0040, 0x1902,
+	0x2068, 0x6808, 0x8000, 0x680a, 0x6c28, 0x6b2c, 0x1078, 0x16cc,
+	0x017f, 0x007f, 0x127f, 0x007c, 0x1078, 0x192d, 0x20e1, 0x9028,
+	0x700f, 0x7870, 0x7013, 0x7870, 0x2001, 0x015d, 0x200c, 0x810a,
+	0x2102, 0x2001, 0x0138, 0x2202, 0x007c, 0x2001, 0x0138, 0x2014,
+	0x2003, 0x0000, 0x2021, 0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc,
+	0x00c0, 0x194a, 0x2001, 0x0109, 0x201c, 0xa39c, 0x0048, 0x00c0,
+	0x194a, 0x2001, 0x0111, 0x201c, 0x83ff, 0x00c0, 0x194a, 0x8421,
+	0x00c0, 0x1934, 0x007c, 0x2011, 0x0201, 0x2009, 0x003c, 0x2204,
+	0xa005, 0x00c0, 0x1957, 0x8109, 0x00c0, 0x194f, 0x007c, 0x007c,
+	0x1078, 0x194b, 0x0040, 0x1980, 0x7908, 0xd1ec, 0x00c0, 0x1970,
+	0x1078, 0x19a6, 0x0040, 0x1970, 0x7803, 0x0009, 0x7904, 0xd1fc,
+	0x0040, 0x1966, 0x7803, 0x0006, 0x1078, 0x194b, 0x0040, 0x1980,
+	0x780c, 0xd0a4, 0x00c0, 0x1980, 0x7007, 0x0000, 0x1078, 0x19a6,
+	0x0040, 0x1982, 0x7803, 0x0019, 0x7003, 0x0003, 0x0078, 0x1982,
+	0x1078, 0x191c, 0x007c, 0x3c00, 0x007e, 0x0e7e, 0x2071, 0x0200,
+	0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x192d, 0x20e1, 0x7000,
+	0x7324, 0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f,
+	0x712e, 0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001,
+	0x0138, 0x2202, 0x0e7f, 0x007f, 0x20e0, 0x007c, 0x3c00, 0x007e,
+	0x7908, 0xa18c, 0x0fff, 0xa182, 0x0009, 0x0048, 0x19b3, 0xa085,
+	0x0001, 0x0078, 0x19c5, 0x2001, 0x020a, 0x81ff, 0x0040, 0x19be,
+	0x20e1, 0x6000, 0x200c, 0x200c, 0x200c, 0x200c, 0x20e1, 0x7000,
+	0x200c, 0x200c, 0x7003, 0x0000, 0xa006, 0x007f, 0x20e0, 0x007c,
+	0x0e7e, 0x2071, 0x788b, 0x7003, 0x0000, 0x0e7f, 0x007c, 0x0d7e,
+	0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1a4a, 0x6934,
+	0xa184, 0x0007, 0x0079, 0x19dc, 0x19e4, 0x1a35, 0x19e4, 0x19e4,
+	0x19e4, 0x1a1a, 0x19f7, 0x19e6, 0x1078, 0x12d5, 0x684c, 0xd0b4,
+	0x0040, 0x1b4c, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
+	0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1a3d, 0x6834,
+	0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x19e4, 0x684c, 0xd0b4,
+	0x0040, 0x1b4c, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
+	0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080, 0x000d,
+	0x2004, 0xa084, 0x000f, 0xa080, 0x1c84, 0x2004, 0x6832, 0x6958,
+	0x0078, 0x1a46, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0, 0x1a4a,
+	0x684c, 0xd0b4, 0x0040, 0x1b4c, 0x6804, 0x681a, 0xa080, 0x000d,
+	0x2004, 0xa084, 0x000f, 0xa080, 0x1c84, 0x2004, 0x6832, 0x6958,
+	0xa006, 0x682e, 0x682a, 0x0078, 0x1a46, 0x684c, 0xd0b4, 0x0040,
+	0x1789, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a, 0x6834,
+	0xa084, 0x000f, 0xa080, 0x1c84, 0x2004, 0x6832, 0x6926, 0x684c,
+	0xc0dd, 0x684e, 0x0d7f, 0x007c, 0x0f7e, 0x2079, 0x0020, 0x7804,
+	0xd0fc, 0x10c0, 0x1b50, 0x0e7e, 0x0d7e, 0x2071, 0x788b, 0x7000,
+	0xa005, 0x00c0, 0x1ac6, 0x0c7e, 0x7206, 0xa280, 0x0004, 0x205c,
+	0x7004, 0x2068, 0x6818, 0x0d7e, 0x2068, 0x686c, 0x7812, 0x6890,
+	0x0f7e, 0x20e1, 0x9040, 0x2079, 0x0200, 0x781a, 0x2079, 0x0100,
+	0x8004, 0x78d6, 0x0f7f, 0x0d7f, 0x2b68, 0x6824, 0x2050, 0x6818,
+	0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x6908, 0xa184,
+	0x0007, 0x0040, 0x1a88, 0x017e, 0x2009, 0x0008, 0xa102, 0x017f,
+	0xa108, 0x791a, 0x7116, 0x701e, 0x680c, 0xa081, 0x0000, 0x781e,
+	0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c, 0x6814, 0xa106,
+	0x00c0, 0x1a9f, 0x6928, 0x6810, 0xa106, 0x0040, 0x1aac, 0x037e,
+	0x047e, 0x6b14, 0x6c10, 0x1078, 0x1ca4, 0x047f, 0x037f, 0x0040,
+	0x1aac, 0x0c7f, 0x0078, 0x1ac6, 0x8aff, 0x00c0, 0x1ab4, 0x0c7f,
+	0xa085, 0x0001, 0x0078, 0x1ac6, 0x127e, 0x2091, 0x8000, 0x2079,
+	0x0020, 0x2009, 0x0001, 0x1078, 0x1aca, 0x0040, 0x1ac3, 0x2009,
+	0x0001, 0x1078, 0x1aca, 0x127f, 0x0c7f, 0xa006, 0x0d7f, 0x0e7f,
+	0x0f7f, 0x007c, 0x077e, 0x067e, 0x057e, 0x047e, 0x037e, 0x027e,
+	0x8aff, 0x0040, 0x1b45, 0x700c, 0x7214, 0xa202, 0x7010, 0x7218,
+	0xa203, 0x0048, 0x1b44, 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0,
+	0x1af7, 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079, 0x1ae7, 0x1b26,
+	0x1b07, 0x1b07, 0x1b26, 0x1b26, 0x1b1e, 0x1b26, 0x1b07, 0x1b26,
+	0x1b0d, 0x1b0d, 0x1b26, 0x1b26, 0x1b26, 0x1b15, 0x1b0d, 0xc0fc,
+	0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0xd99c, 0x0040, 0x1b2a,
+	0x0d7e, 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078, 0x1b29, 0x6b08,
+	0x6a0c, 0x6d00, 0x6c04, 0x0078, 0x1b29, 0x6b10, 0x6a14, 0x6d00,
+	0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x1b29, 0x0d7f, 0x0d7e, 0x6834,
+	0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1b26, 0x0d7f, 0x1078,
+	0x1c40, 0x00c0, 0x1ad0, 0xa00e, 0x0078, 0x1b45, 0x0d7f, 0x1078,
+	0x12d5, 0x0d7f, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e,
+	0x7902, 0x7000, 0x8000, 0x7002, 0x6828, 0xa300, 0x682a, 0x682c,
+	0xa201, 0x682e, 0x700c, 0xa300, 0x700e, 0x7010, 0xa201, 0x7012,
+	0x1078, 0x1c40, 0x0078, 0x1b45, 0xa006, 0x027f, 0x037f, 0x047f,
+	0x057f, 0x067f, 0x077f, 0x007c, 0x1078, 0x12d5, 0x1078, 0x12d5,
+	0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x0f7e, 0x0e7e, 0x0d7e,
+	0x0c7e, 0x2079, 0x0020, 0x2071, 0x788b, 0x2b68, 0x6818, 0x2060,
+	0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x00c0, 0x1b4e, 0x7000,
+	0x0079, 0x1b6a, 0x1c11, 0x1b6e, 0x1bde, 0x1c0f, 0x8001, 0x7002,
+	0xd19c, 0x00c0, 0x1b82, 0x8aff, 0x0040, 0x1ba1, 0x2009, 0x0001,
+	0x1078, 0x1aca, 0x0040, 0x1c11, 0x2009, 0x0001, 0x1078, 0x1aca,
+	0x0078, 0x1c11, 0x7803, 0x0004, 0xd194, 0x0040, 0x1b92, 0x6850,
+	0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1b97, 0x684c, 0xc0f5, 0x684e,
+	0x0078, 0x1b97, 0x1078, 0x1c59, 0x6850, 0xc0fd, 0x6852, 0x2a00,
+	0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x0078,
+	0x1c11, 0x711c, 0x81ff, 0x0040, 0x1bb7, 0x7918, 0x7922, 0x7827,
 	0x0000, 0x7803, 0x0001, 0x7000, 0x8000, 0x7002, 0x700c, 0xa100,
-	0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078, 0x1a09, 0x0f7e,
+	0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078, 0x1c11, 0x0f7e,
 	0x027e, 0x781c, 0x007e, 0x7818, 0x007e, 0x2079, 0x0100, 0x7a14,
 	0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x7820, 0xd0bc, 0x00c0,
-	0x19bd, 0x79c8, 0x007f, 0xa102, 0x78ca, 0x79c4, 0x007f, 0xa102,
+	0x1bc5, 0x79c8, 0x007f, 0xa102, 0x78ca, 0x79c4, 0x007f, 0xa102,
 	0x78c6, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x027f, 0x0f7f,
-	0x7803, 0x0008, 0x7003, 0x0000, 0x0078, 0x1a09, 0x8001, 0x7002,
-	0xd194, 0x0040, 0x19eb, 0x7804, 0xd0fc, 0x00c0, 0x1943, 0xd19c,
-	0x00c0, 0x1a05, 0x8aff, 0x0040, 0x1a09, 0x2009, 0x0001, 0x1078,
-	0x18b6, 0x0078, 0x1a09, 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x1078,
-	0x1a58, 0x0d7e, 0x2804, 0xac68, 0x6034, 0xd09c, 0x00c0, 0x19fe,
-	0x6808, 0xa31a, 0x680c, 0xa213, 0x0078, 0x1a02, 0x6810, 0xa31a,
-	0x6814, 0xa213, 0x0d7f, 0x0078, 0x1979, 0x0078, 0x1975, 0x1078,
-	0x12b7, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x017f, 0x007f, 0x127f,
-	0x007c, 0x7920, 0xa108, 0x7922, 0x7924, 0xa189, 0x0000, 0x7926,
-	0x7930, 0xa10a, 0x7932, 0x7934, 0xa18b, 0x0000, 0x7936, 0x007c,
-	0x0f7e, 0x0e7e, 0x2071, 0x6f63, 0x7000, 0xa086, 0x0000, 0x0040,
-	0x1a3c, 0x2079, 0x0020, 0x7804, 0xa084, 0x0003, 0x0040, 0x1a36,
-	0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0, 0x1a32, 0x20e1, 0x9040,
-	0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x0f7f, 0x007c, 0x8840,
-	0x2804, 0xa005, 0x00c0, 0x1a53, 0x6004, 0xa005, 0x0040, 0x1a55,
-	0x681a, 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x1a82, 0x2044,
-	0x88ff, 0x1040, 0x12b7, 0x8a51, 0x007c, 0x2051, 0x0000, 0x007c,
-	0x8a50, 0x8841, 0x2804, 0xa005, 0x00c0, 0x1a72, 0x2c00, 0xad06,
-	0x0040, 0x1a67, 0x6000, 0xa005, 0x00c0, 0x1a67, 0x2d00, 0x2060,
-	0x681a, 0x6034, 0xa084, 0x000f, 0xa080, 0x1a92, 0x2044, 0x88ff,
-	0x1040, 0x12b7, 0x007c, 0x0000, 0x0011, 0x0015, 0x0019, 0x001d,
-	0x0021, 0x0025, 0x0029, 0x0000, 0x000f, 0x0015, 0x001b, 0x0021,
-	0x0027, 0x0000, 0x0000, 0x1a78, 0x1a74, 0x0000, 0x0000, 0x8000,
-	0x0000, 0x1a78, 0x0000, 0x1a7f, 0x1a7c, 0x0000, 0x0000, 0x0000,
-	0x0000, 0x1a7f, 0x0000, 0x1a7a, 0x1a7a, 0x0000, 0x0000, 0x8000,
-	0x0000, 0x1a7a, 0x0000, 0x1a80, 0x1a80, 0x0000, 0x0000, 0x0000,
-	0x0000, 0x1a80, 0x0a7e, 0x097e, 0x087e, 0x6858, 0xa055, 0x0040,
-	0x1b28, 0x2d60, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x1a82, 0xa986,
-	0x0007, 0x0040, 0x1ab7, 0xa986, 0x000f, 0x00c0, 0x1abb, 0x605c,
-	0xa422, 0x6060, 0xa31a, 0x2804, 0xa045, 0x00c0, 0x1ac9, 0x0050,
-	0x1ac3, 0x0078, 0x1b28, 0x6004, 0xa065, 0x0040, 0x1b28, 0x0078,
-	0x1aaa, 0x2804, 0xa005, 0x0040, 0x1ae7, 0xac68, 0xd99c, 0x00c0,
-	0x1ad7, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0078, 0x1adb, 0x6810,
-	0xa422, 0x6814, 0xa31b, 0x0048, 0x1af5, 0x2300, 0xa405, 0x0040,
-	0x1aed, 0x8a51, 0x0040, 0x1b28, 0x8840, 0x0078, 0x1ac9, 0x6004,
-	0xa065, 0x0040, 0x1b28, 0x0078, 0x1aaa, 0x8a51, 0x8840, 0x2b68,
-	0x6850, 0xc0fc, 0x6852, 0x0078, 0x1b22, 0x8422, 0x8420, 0x831a,
-	0xa399, 0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f, 0xd99c,
-	0x00c0, 0x1b10, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b,
-	0x1048, 0x12b7, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078, 0x1b1c,
-	0x6910, 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048, 0x12b7,
-	0x6800, 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850,
-	0xc0fd, 0x6852, 0x007f, 0x007f, 0x007f, 0xa006, 0x0078, 0x1b2d,
-	0x087f, 0x097f, 0x0a7f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0005,
-	0x2004, 0xa084, 0x0007, 0x0079, 0x1b35, 0x1b3d, 0x1b3e, 0x1b41,
-	0x1b44, 0x1b49, 0x1b4c, 0x1b51, 0x1b56, 0x007c, 0x1078, 0x1933,
-	0x007c, 0x1078, 0x16e5, 0x007c, 0x1078, 0x16e5, 0x1078, 0x1933,
-	0x007c, 0x1078, 0x143e, 0x007c, 0x1078, 0x1933, 0x1078, 0x143e,
-	0x007c, 0x1078, 0x16e5, 0x1078, 0x143e, 0x007c, 0x1078, 0x16e5,
-	0x1078, 0x1933, 0x1078, 0x143e, 0x007c, 0x127e, 0x2091, 0x2300,
-	0x2079, 0x0200, 0x2071, 0x7280, 0x2069, 0x6d00, 0x2009, 0x0004,
-	0x7912, 0x7916, 0x1078, 0x1df6, 0x781b, 0x0002, 0x20e1, 0x8700,
-	0x127f, 0x007c, 0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007,
-	0x0079, 0x1b7a, 0x1b9e, 0x1b82, 0x1b86, 0x1b8a, 0x1b90, 0x1b94,
-	0x1b98, 0x1b9c, 0x1078, 0x3d7c, 0x0078, 0x1b9e, 0x1078, 0x3db0,
-	0x0078, 0x1b9e, 0x1078, 0x3d7c, 0x1078, 0x3db0, 0x0078, 0x1b9e,
-	0x1078, 0x1ba0, 0x0078, 0x1b9e, 0x1078, 0x1ba0, 0x0078, 0x1b9e,
-	0x1078, 0x1ba0, 0x0078, 0x1b9e, 0x1078, 0x1ba0, 0x127f, 0x007c,
-	0x007e, 0x017e, 0x027e, 0x7930, 0xa184, 0x0003, 0x0040, 0x1baa,
-	0x1078, 0x12b7, 0xa184, 0x0030, 0x0040, 0x1bbb, 0x6a00, 0xa286,
-	0x0003, 0x00c0, 0x1bb5, 0x1078, 0x12b7, 0x1078, 0x31cb, 0x20e1,
-	0x9010, 0x0078, 0x1bc7, 0xa184, 0x00c0, 0x0040, 0x1bc1, 0x1078,
-	0x12b7, 0xa184, 0x0300, 0x0040, 0x1bc7, 0x20e1, 0x9020, 0x7932,
-	0x027f, 0x017f, 0x007f, 0x007c, 0x017e, 0x0e7e, 0x0f7e, 0x2071,
-	0x6d00, 0x7128, 0x2001, 0x6f03, 0x2102, 0x2001, 0x6f0b, 0x2102,
-	0xa182, 0x0211, 0x00c8, 0x1be0, 0x2009, 0x0008, 0x0078, 0x1c0a,
-	0xa182, 0x0259, 0x00c8, 0x1be8, 0x2009, 0x0007, 0x0078, 0x1c0a,
-	0xa182, 0x02c1, 0x00c8, 0x1bf0, 0x2009, 0x0006, 0x0078, 0x1c0a,
-	0xa182, 0x0349, 0x00c8, 0x1bf8, 0x2009, 0x0005, 0x0078, 0x1c0a,
-	0xa182, 0x0421, 0x00c8, 0x1c00, 0x2009, 0x0004, 0x0078, 0x1c0a,
-	0xa182, 0x0581, 0x00c8, 0x1c08, 0x2009, 0x0003, 0x0078, 0x1c0a,
-	0x2009, 0x0002, 0x2079, 0x0200, 0x7912, 0x7916, 0x1078, 0x1df6,
-	0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x127e, 0x2091, 0x2200, 0x2061,
-	0x0100, 0x2071, 0x6d00, 0x6024, 0x6026, 0x6033, 0x00ef, 0x60e7,
-	0x0000, 0x60eb, 0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043,
-	0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x0caf, 0x600f,
-	0x00ff, 0x602b, 0x002f, 0x127f, 0x007c, 0x2001, 0x6d2d, 0x2003,
-	0x0000, 0x2001, 0x6d2c, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091,
-	0x2200, 0x007e, 0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0,
-	0x1c4d, 0xa184, 0x0007, 0x0079, 0x1c53, 0xa195, 0x0004, 0xa284,
-	0x0007, 0x0079, 0x1c53, 0x1c7f, 0x1c5b, 0x1c5f, 0x1c63, 0x1c69,
-	0x1c6d, 0x1c73, 0x1c79, 0x1078, 0x4226, 0x0078, 0x1c7f, 0x1078,
-	0x42e4, 0x0078, 0x1c7f, 0x1078, 0x42e4, 0x1078, 0x4226, 0x0078,
-	0x1c7f, 0x1078, 0x1c84, 0x0078, 0x1c7f, 0x1078, 0x4226, 0x1078,
-	0x1c84, 0x0078, 0x1c7f, 0x1078, 0x42e4, 0x1078, 0x1c84, 0x0078,
-	0x1c7f, 0x1078, 0x42e4, 0x1078, 0x4226, 0x1078, 0x1c84, 0x027f,
-	0x017f, 0x007f, 0x127f, 0x007c, 0xd1ac, 0x0040, 0x1d24, 0x017e,
-	0x047e, 0x0c7e, 0x644c, 0x74ba, 0xa48c, 0xff00, 0xa196, 0xff00,
-	0x0040, 0x1cb3, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040,
-	0x1cb3, 0x7130, 0xd18c, 0x00c0, 0x1cb3, 0x2011, 0x6d52, 0x2214,
-	0xd2ec, 0x0040, 0x1ca7, 0xc18d, 0x7132, 0x0078, 0x1cb3, 0x6240,
-	0xa294, 0x0010, 0x0040, 0x1cf2, 0x6248, 0xa294, 0xff00, 0xa296,
-	0xff00, 0x00c0, 0x1cf2, 0x2011, 0x8013, 0x1078, 0x2a53, 0x7130,
-	0xc185, 0x7132, 0x2011, 0x6d52, 0x220c, 0xd1a4, 0x0040, 0x1cda,
-	0x017e, 0x2009, 0x0001, 0x2011, 0x0100, 0x1078, 0x41f4, 0x2019,
-	0x000e, 0x1078, 0x6b8f, 0xa484, 0x00ff, 0xa080, 0x2091, 0x200c,
-	0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x1078,
-	0x6bf7, 0x017f, 0xd1ac, 0x00c0, 0x1ce3, 0x2019, 0x0004, 0x1078,
-	0x202f, 0x0078, 0x1cf2, 0x157e, 0x20a9, 0x007f, 0x2009, 0x0000,
-	0x1078, 0x3447, 0x00c0, 0x1cee, 0x1078, 0x3256, 0x8108, 0x00f0,
-	0x1ce8, 0x157f, 0x0c7f, 0x047f, 0x6043, 0x0000, 0x2009, 0x00f7,
-	0x1078, 0x3233, 0x2011, 0x0003, 0x1078, 0x5232, 0x2011, 0x0002,
-	0x1078, 0x523c, 0x1078, 0x5148, 0x1078, 0x414c, 0x037e, 0x2019,
-	0x0000, 0x1078, 0x51da, 0x037f, 0x60e3, 0x0000, 0x017f, 0x2001,
-	0x6d00, 0x2014, 0xa296, 0x0004, 0x00c0, 0x1d1c, 0xd19c, 0x00c0,
-	0x1d1c, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x6d20,
-	0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0040, 0x1d9d, 0x017e,
-	0x6220, 0xd2b4, 0x0040, 0x1d5b, 0x1078, 0x414c, 0x1078, 0x4fe5,
-	0x6027, 0x0004, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000,
-	0x0040, 0x1d3e, 0x6803, 0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e,
-	0x2061, 0x6f10, 0x6028, 0xa09a, 0x0002, 0x00c8, 0x1d4e, 0x8000,
-	0x602a, 0x0c7f, 0x1078, 0x4fd7, 0x0078, 0x1d9c, 0x2019, 0x6f19,
-	0x2304, 0xa065, 0x0040, 0x1d58, 0x2009, 0x0014, 0x1078, 0x5591,
-	0x0c7f, 0x0078, 0x1d9c, 0xd2bc, 0x0040, 0x1d9c, 0x1078, 0x415a,
-	0x6017, 0x0010, 0x6027, 0x0004, 0x0d7e, 0x2069, 0x0140, 0x6804,
-	0xa084, 0x4000, 0x0040, 0x1d70, 0x6803, 0x1000, 0x6803, 0x0000,
-	0x0d7f, 0x0c7e, 0x2061, 0x6f10, 0x6044, 0xa09a, 0x0002, 0x00c8,
-	0x1d91, 0x8000, 0x6046, 0x603c, 0x0c7f, 0xa005, 0x0040, 0x1d9c,
-	0x1078, 0x4151, 0xa080, 0x0007, 0x2004, 0xa086, 0x0006, 0x00c0,
-	0x1d8d, 0x6017, 0x0012, 0x0078, 0x1d9c, 0x6017, 0x0016, 0x0078,
-	0x1d9c, 0x2019, 0x6f1f, 0x2304, 0xa065, 0x0040, 0x1d9b, 0x2009,
-	0x004a, 0x1078, 0x5591, 0x0c7f, 0x017f, 0xd19c, 0x0040, 0x1dc5,
-	0x017e, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x1078, 0x5232,
-	0x2011, 0x0002, 0x1078, 0x523c, 0x1078, 0x5148, 0x1078, 0x414c,
-	0x037e, 0x2019, 0x0000, 0x1078, 0x51da, 0x037f, 0x60e3, 0x0000,
-	0x1078, 0x6c5f, 0x1078, 0x6c7d, 0x2001, 0x6d00, 0x2003, 0x0004,
-	0x6027, 0x0008, 0x1078, 0x11aa, 0x017f, 0xa18c, 0xffd0, 0x6126,
-	0x007c, 0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e, 0x127e, 0x2091,
-	0x8000, 0x2071, 0x6d00, 0x71b0, 0x70b2, 0xa116, 0x0040, 0x1def,
-	0x81ff, 0x0040, 0x1de1, 0x2011, 0x8011, 0x1078, 0x2a53, 0x0078,
-	0x1def, 0x2011, 0x8012, 0x1078, 0x2a53, 0x037e, 0x0c7e, 0x2061,
-	0x0100, 0x2019, 0x0028, 0x1078, 0x202f, 0x0c7f, 0x037f, 0x127f,
-	0x0f7f, 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c, 0x0c7e, 0x0f7e,
-	0x007e, 0x027e, 0x2061, 0x0100, 0xa190, 0x1e09, 0x2204, 0x60f2,
-	0xa190, 0x1e12, 0x2204, 0x60ee, 0x027f, 0x007f, 0x0f7f, 0x0c7f,
-	0x007c, 0x083e, 0x083e, 0x083e, 0x0580, 0x0420, 0x0348, 0x02c0,
-	0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x0140, 0x00f8,
-	0x00d0, 0x00b0, 0x00a0, 0x2028, 0x2130, 0xa094, 0xff00, 0x00c0,
-	0x1e24, 0x81ff, 0x0040, 0x1e28, 0x1078, 0x3f00, 0x0078, 0x1e2f,
-	0xa080, 0x2091, 0x200c, 0xa18c, 0xff00, 0x810f, 0xa006, 0x007c,
-	0xa080, 0x2091, 0x200c, 0xa18c, 0x00ff, 0x007c, 0x1e56, 0x1e5a,
-	0x1e5e, 0x1e64, 0x1e6a, 0x1e70, 0x1e76, 0x1e7e, 0x1e86, 0x1e8c,
-	0x1e92, 0x1e9a, 0x1ea2, 0x1eaa, 0x1eb2, 0x1ebc, 0x1ec6, 0x1ec6,
-	0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6,
-	0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x107e, 0x007e,
-	0x0078, 0x1edf, 0x107e, 0x007e, 0x0078, 0x1edf, 0x107e, 0x007e,
-	0x1078, 0x1c3e, 0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1c3e,
-	0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1b2e, 0x0078, 0x1edf,
-	0x107e, 0x007e, 0x1078, 0x1b2e, 0x0078, 0x1edf, 0x107e, 0x007e,
-	0x1078, 0x1c3e, 0x1078, 0x1b2e, 0x0078, 0x1edf, 0x107e, 0x007e,
-	0x1078, 0x1c3e, 0x1078, 0x1b2e, 0x0078, 0x1edf, 0x107e, 0x007e,
-	0x1078, 0x1b72, 0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1b72,
-	0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1c3e, 0x1078, 0x1b72,
-	0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1c3e, 0x1078, 0x1b72,
-	0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1b2e, 0x1078, 0x1b72,
-	0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1b2e, 0x1078, 0x1b72,
-	0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1c3e, 0x1078, 0x1b2e,
-	0x1078, 0x1b72, 0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1c3e,
-	0x1078, 0x1b2e, 0x1078, 0x1b72, 0x0078, 0x1edf, 0x0005, 0x0078,
-	0x1ec6, 0xb084, 0x003c, 0x8004, 0x8004, 0x0079, 0x1ecf, 0x1edf,
-	0x1e5c, 0x1e60, 0x1e66, 0x1e6c, 0x1e72, 0x1e78, 0x1e80, 0x1e88,
-	0x1e8e, 0x1e94, 0x1e9c, 0x1ea4, 0x1eac, 0x1eb4, 0x1ebe, 0x0008,
-	0x1ec9, 0x007f, 0x107f, 0x2091, 0x8001, 0x007c, 0x0c7e, 0x027e,
-	0x2041, 0x007e, 0x70bc, 0xd09c, 0x0040, 0x1ef0, 0x2041, 0x007f,
-	0x2001, 0x010c, 0x203c, 0x727c, 0x82ff, 0x0040, 0x1f3b, 0x037e,
-	0x738c, 0xa38e, 0xffff, 0x00c0, 0x1eff, 0x2019, 0x0001, 0x8314,
-	0xa2e0, 0x73c0, 0x2c04, 0xa38c, 0x0001, 0x0040, 0x1f0c, 0xa084,
-	0xff00, 0x8007, 0x0078, 0x1f0e, 0xa084, 0x00ff, 0xa70e, 0x0040,
-	0x1f30, 0xa08e, 0x00ff, 0x0040, 0x1f36, 0x2009, 0x0000, 0x1078,
-	0x1e1b, 0x1078, 0x3410, 0x00c0, 0x1f33, 0x6004, 0xa084, 0x00ff,
-	0xa086, 0x0006, 0x00c0, 0x1f2a, 0x1078, 0x1f8d, 0x0040, 0x1f33,
-	0x0078, 0x1f30, 0x1078, 0x208d, 0x1078, 0x1fb4, 0x0040, 0x1f33,
-	0x8318, 0x0078, 0x1eff, 0x738e, 0x0078, 0x1f38, 0x708f, 0xffff,
-	0x037f, 0x0078, 0x1f8a, 0xa780, 0x2091, 0x203c, 0xa7bc, 0xff00,
-	0x873f, 0x708c, 0xa096, 0xffff, 0x0040, 0x1f4d, 0xa812, 0x00c8,
-	0x1f5d, 0x708f, 0xffff, 0x0078, 0x1f87, 0x2009, 0x0000, 0x70bc,
-	0xd09c, 0x0040, 0x1f58, 0xd094, 0x0040, 0x1f58, 0x2009, 0x007e,
-	0x2100, 0xa802, 0x20a8, 0x0078, 0x1f61, 0x2008, 0x2810, 0xa202,
-	0x20a8, 0x2700, 0x157e, 0x017e, 0xa106, 0x0040, 0x1f7e, 0x1078,
-	0x3410, 0x00c0, 0x1f87, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
-	0x00c0, 0x1f78, 0x1078, 0x1f8d, 0x0040, 0x1f87, 0x0078, 0x1f7e,
-	0x1078, 0x208d, 0x1078, 0x1fb4, 0x0040, 0x1f87, 0x017f, 0x8108,
-	0x157f, 0x00f0, 0x1f61, 0x708f, 0xffff, 0x0078, 0x1f8a, 0x017f,
-	0x157f, 0x718e, 0x027f, 0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e,
-	0x0c7e, 0x2c68, 0x1078, 0x5504, 0x0040, 0x1faf, 0x2d00, 0x601a,
-	0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x33df, 0x2001, 0x0000,
-	0x1078, 0x33f3, 0x127e, 0x2091, 0x8000, 0x7088, 0x8000, 0x708a,
-	0x127f, 0x2009, 0x0004, 0x1078, 0x5591, 0xa085, 0x0001, 0x0c7f,
-	0x0d7f, 0x077f, 0x017f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e,
-	0x2c68, 0x1078, 0x5504, 0x0040, 0x1fd6, 0x2d00, 0x601a, 0x601f,
-	0x0001, 0x2001, 0x0000, 0x1078, 0x33df, 0x2001, 0x0002, 0x1078,
-	0x33f3, 0x127e, 0x2091, 0x8000, 0x7088, 0x8000, 0x708a, 0x127f,
-	0x2009, 0x0002, 0x1078, 0x5591, 0xa085, 0x0001, 0x0c7f, 0x0d7f,
-	0x077f, 0x017f, 0x007c, 0x0c7e, 0x027e, 0x2009, 0x0080, 0x1078,
-	0x3410, 0x00c0, 0x1fe9, 0x1078, 0x1fec, 0x0040, 0x1fe9, 0x70c3,
-	0xffff, 0x027f, 0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e,
-	0x2c68, 0x1078, 0x5504, 0x0040, 0x200e, 0x2d00, 0x601a, 0x601f,
-	0x0001, 0x2001, 0x0000, 0x1078, 0x33df, 0x2001, 0x0002, 0x1078,
-	0x33f3, 0x127e, 0x2091, 0x8000, 0x70c4, 0x8000, 0x70c6, 0x127f,
-	0x2009, 0x0002, 0x1078, 0x5591, 0xa085, 0x0001, 0x0c7f, 0x0d7f,
-	0x077f, 0x017f, 0x007c, 0x0c7e, 0x0d7e, 0x2009, 0x007f, 0x1078,
-	0x3410, 0x00c0, 0x202c, 0x2c68, 0x1078, 0x5504, 0x0040, 0x202c,
-	0x2d00, 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x2009, 0x0022,
-	0x1078, 0x5591, 0xa085, 0x0001, 0x0d7f, 0x0c7f, 0x007c, 0x0e7e,
-	0x0c7e, 0x067e, 0x037e, 0x027e, 0x1078, 0x4463, 0x1078, 0x4417,
-	0x1078, 0x59ce, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078,
-	0x3447, 0x00c0, 0x2047, 0x1078, 0x35cf, 0x1078, 0x3256, 0x017f,
-	0x8108, 0x00f0, 0x203e, 0x027f, 0x037f, 0x067f, 0x0c7f, 0x0e7f,
-	0x007c, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x6218, 0x2270,
-	0x72a0, 0x027e, 0x2019, 0x0029, 0x1078, 0x445c, 0x1078, 0x43a9,
-	0x2c08, 0x1078, 0x6a57, 0x017f, 0x2e60, 0x1078, 0x35cf, 0x1078,
-	0x3256, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e,
-	0x007e, 0x6018, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x2083,
-	0x2071, 0x6d00, 0x7088, 0xa005, 0x0040, 0x2080, 0x8001, 0x708a,
-	0x007f, 0x0e7f, 0x007c, 0x2071, 0x6d00, 0x70c4, 0xa005, 0x0040,
-	0x2080, 0x8001, 0x70c6, 0x0078, 0x2080, 0x6000, 0xc08c, 0x6002,
-	0x007c, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc,
-	0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1,
-	0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6,
-	0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4,
-	0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa,
-	0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d,
-	0x809b, 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282,
-	0x8081, 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074,
-	0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a,
-	0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559,
-	0x8056, 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d,
-	0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043,
-	0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932,
-	0x4831, 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227,
-	0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18,
-	0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000,
-	0x8000, 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000,
-	0x8000, 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x3300, 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00,
-	0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900,
-	0x2800, 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200,
-	0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00,
-	0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600,
-	0x1500, 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00,
-	0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900,
-	0x8000, 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000,
-	0x8000, 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000,
-	0x8000, 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+	0x7803, 0x0008, 0x7003, 0x0000, 0x0078, 0x1c11, 0x8001, 0x7002,
+	0xd194, 0x0040, 0x1bf3, 0x7804, 0xd0fc, 0x00c0, 0x1b60, 0xd19c,
+	0x00c0, 0x1c0d, 0x8aff, 0x0040, 0x1c11, 0x2009, 0x0001, 0x1078,
+	0x1aca, 0x0078, 0x1c11, 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x1078,
+	0x1c59, 0x0d7e, 0x2804, 0xac68, 0x6034, 0xd09c, 0x00c0, 0x1c06,
+	0x6808, 0xa31a, 0x680c, 0xa213, 0x0078, 0x1c0a, 0x6810, 0xa31a,
+	0x6814, 0xa213, 0x0d7f, 0x0078, 0x1b92, 0x0078, 0x1b92, 0x1078,
+	0x12d5, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x017f, 0x007f, 0x127f,
+	0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x788b, 0x7000, 0xa086, 0x0000,
+	0x0040, 0x1c3d, 0x2079, 0x0020, 0x20e1, 0x9040, 0x7804, 0xd0fc,
+	0x0040, 0x1c24, 0x1078, 0x1b50, 0x7000, 0xa086, 0x0000, 0x00c0,
+	0x1c24, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0, 0x1c33, 0x20e1,
+	0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x0f7f, 0x007c,
+	0x8840, 0x2804, 0xa005, 0x00c0, 0x1c54, 0x6004, 0xa005, 0x0040,
+	0x1c56, 0x681a, 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x1c84,
+	0x2044, 0x88ff, 0x1040, 0x12d5, 0x8a51, 0x007c, 0x2051, 0x0000,
+	0x007c, 0x8a50, 0x8841, 0x2804, 0xa005, 0x00c0, 0x1c73, 0x2c00,
+	0xad06, 0x0040, 0x1c68, 0x6000, 0xa005, 0x00c0, 0x1c68, 0x2d00,
+	0x2060, 0x681a, 0x6034, 0xa084, 0x000f, 0xa080, 0x1c94, 0x2044,
+	0x88ff, 0x1040, 0x12d5, 0x007c, 0x0000, 0x0011, 0x0015, 0x0019,
+	0x001d, 0x0021, 0x0025, 0x0029, 0x0000, 0x000f, 0x0015, 0x001b,
+	0x0021, 0x0027, 0x0000, 0x0000, 0x0000, 0x1c79, 0x1c75, 0x0000,
+	0x0000, 0x1c83, 0x0000, 0x1c79, 0x0000, 0x1c80, 0x1c7d, 0x0000,
+	0x0000, 0x0000, 0x1c83, 0x1c80, 0x0000, 0x1c7b, 0x1c7b, 0x0000,
+	0x0000, 0x1c83, 0x0000, 0x1c7b, 0x0000, 0x1c81, 0x1c81, 0x0000,
+	0x0000, 0x0000, 0x1c83, 0x1c81, 0x0a7e, 0x097e, 0x087e, 0x6858,
+	0xa055, 0x0040, 0x1d45, 0x2d60, 0x6034, 0xa0cc, 0x000f, 0xa9c0,
+	0x1c84, 0xa986, 0x0007, 0x0040, 0x1cbd, 0xa986, 0x000e, 0x0040,
+	0x1cbd, 0xa986, 0x000f, 0x00c0, 0x1cc1, 0x605c, 0xa422, 0x6060,
+	0xa31a, 0x2804, 0xa045, 0x00c0, 0x1ccf, 0x0050, 0x1cc9, 0x0078,
+	0x1d45, 0x6004, 0xa065, 0x0040, 0x1d45, 0x0078, 0x1cac, 0x2804,
+	0xa005, 0x0040, 0x1ced, 0xac68, 0xd99c, 0x00c0, 0x1cdd, 0x6808,
+	0xa422, 0x680c, 0xa31b, 0x0078, 0x1ce1, 0x6810, 0xa422, 0x6814,
+	0xa31b, 0x0048, 0x1d0c, 0x2300, 0xa405, 0x0040, 0x1cf3, 0x8a51,
+	0x0040, 0x1d45, 0x8840, 0x0078, 0x1ccf, 0x6004, 0xa065, 0x0040,
+	0x1d45, 0x0078, 0x1cac, 0x8a51, 0x0040, 0x1d45, 0x8840, 0x2804,
+	0xa005, 0x00c0, 0x1d06, 0x6004, 0xa065, 0x0040, 0x1d45, 0x6034,
+	0xa0cc, 0x000f, 0xa9c0, 0x1c84, 0x2804, 0x2040, 0x2b68, 0x6850,
+	0xc0fc, 0x6852, 0x0078, 0x1d39, 0x8422, 0x8420, 0x831a, 0xa399,
+	0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f, 0xd99c, 0x00c0,
+	0x1d27, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x1048,
+	0x12d5, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078, 0x1d33, 0x6910,
+	0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048, 0x12d5, 0x6800,
+	0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850, 0xc0fd,
+	0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00, 0x6826, 0x007f,
+	0x007f, 0x007f, 0xa006, 0x0078, 0x1d4a, 0x087f, 0x097f, 0x0a7f,
+	0xa085, 0x0001, 0x007c, 0x2001, 0x0005, 0x2004, 0xa084, 0x0007,
+	0x0079, 0x1d52, 0x1d5a, 0x1d5b, 0x1d5e, 0x1d61, 0x1d66, 0x1d69,
+	0x1d6e, 0x1d73, 0x007c, 0x1078, 0x1b50, 0x007c, 0x1078, 0x178d,
+	0x007c, 0x1078, 0x178d, 0x1078, 0x1b50, 0x007c, 0x1078, 0x145e,
+	0x007c, 0x1078, 0x1b50, 0x1078, 0x145e, 0x007c, 0x1078, 0x178d,
+	0x1078, 0x145e, 0x007c, 0x1078, 0x178d, 0x1078, 0x1b50, 0x1078,
+	0x145e, 0x007c, 0x127e, 0x2091, 0x2300, 0x2079, 0x0200, 0x2071,
+	0x7b80, 0x2069, 0x7600, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004,
+	0x1078, 0x2058, 0x781b, 0x0002, 0x20e1, 0x8700, 0x127f, 0x007c,
+	0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007, 0x0079, 0x1d98,
+	0x1dbc, 0x1da0, 0x1da4, 0x1da8, 0x1dae, 0x1db2, 0x1db6, 0x1dba,
+	0x1078, 0x417d, 0x0078, 0x1dbc, 0x1078, 0x41ac, 0x0078, 0x1dbc,
+	0x1078, 0x417d, 0x1078, 0x41ac, 0x0078, 0x1dbc, 0x1078, 0x1dbe,
+	0x0078, 0x1dbc, 0x1078, 0x1dbe, 0x0078, 0x1dbc, 0x1078, 0x1dbe,
+	0x0078, 0x1dbc, 0x1078, 0x1dbe, 0x127f, 0x007c, 0x007e, 0x017e,
+	0x027e, 0x7930, 0xa184, 0x0003, 0x0040, 0x1dc8, 0x1078, 0x12d5,
+	0xa184, 0x0030, 0x0040, 0x1dd9, 0x6a00, 0xa286, 0x0003, 0x00c0,
+	0x1dd3, 0x1078, 0x12d5, 0x1078, 0x357b, 0x20e1, 0x9010, 0x0078,
+	0x1de5, 0xa184, 0x00c0, 0x0040, 0x1ddf, 0x1078, 0x12d5, 0xa184,
+	0x0300, 0x0040, 0x1de5, 0x20e1, 0x9020, 0x7932, 0x027f, 0x017f,
+	0x007f, 0x007c, 0x017e, 0x0e7e, 0x0f7e, 0x2071, 0x7600, 0x7128,
+	0x2001, 0x7823, 0x2102, 0x2001, 0x782b, 0x2102, 0xa182, 0x0211,
+	0x00c8, 0x1dfe, 0x2009, 0x0008, 0x0078, 0x1e28, 0xa182, 0x0259,
+	0x00c8, 0x1e06, 0x2009, 0x0007, 0x0078, 0x1e28, 0xa182, 0x02c1,
+	0x00c8, 0x1e0e, 0x2009, 0x0006, 0x0078, 0x1e28, 0xa182, 0x0349,
+	0x00c8, 0x1e16, 0x2009, 0x0005, 0x0078, 0x1e28, 0xa182, 0x0421,
+	0x00c8, 0x1e1e, 0x2009, 0x0004, 0x0078, 0x1e28, 0xa182, 0x0581,
+	0x00c8, 0x1e26, 0x2009, 0x0003, 0x0078, 0x1e28, 0x2009, 0x0002,
+	0x2079, 0x0200, 0x7912, 0xa182, 0x0005, 0x00c8, 0x1e32, 0x7916,
+	0x0078, 0x1e34, 0x7817, 0x0004, 0x1078, 0x2058, 0x0f7f, 0x0e7f,
+	0x017f, 0x007c, 0x127e, 0x2091, 0x2200, 0x2061, 0x0100, 0x2071,
+	0x7600, 0x6024, 0x6026, 0x6033, 0x00ef, 0x60e7, 0x0000, 0x60eb,
+	0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f,
+	0x0080, 0x602f, 0x0000, 0x6007, 0x0caf, 0x600f, 0x00ff, 0x602b,
+	0x002f, 0x127f, 0x007c, 0x2001, 0x762d, 0x2003, 0x0000, 0x2001,
+	0x762c, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x007e,
+	0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0, 0x1e73, 0xa184,
+	0x0007, 0x0079, 0x1e79, 0xa195, 0x0004, 0xa284, 0x0007, 0x0079,
+	0x1e79, 0x1ea5, 0x1e81, 0x1e85, 0x1e89, 0x1e8f, 0x1e93, 0x1e99,
+	0x1e9f, 0x1078, 0x46e6, 0x0078, 0x1ea5, 0x1078, 0x47d5, 0x0078,
+	0x1ea5, 0x1078, 0x47d5, 0x1078, 0x46e6, 0x0078, 0x1ea5, 0x1078,
+	0x1eaa, 0x0078, 0x1ea5, 0x1078, 0x46e6, 0x1078, 0x1eaa, 0x0078,
+	0x1ea5, 0x1078, 0x47d5, 0x1078, 0x1eaa, 0x0078, 0x1ea5, 0x1078,
+	0x47d5, 0x1078, 0x46e6, 0x1078, 0x1eaa, 0x027f, 0x017f, 0x007f,
+	0x127f, 0x007c, 0xd1ac, 0x0040, 0x1f5e, 0x017e, 0x047e, 0x0c7e,
+	0x644c, 0x74ba, 0xa48c, 0xff00, 0xa196, 0xff00, 0x0040, 0x1ed9,
+	0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040, 0x1ed9, 0x7130,
+	0xd18c, 0x00c0, 0x1ed9, 0x2011, 0x7652, 0x2214, 0xd2ec, 0x0040,
+	0x1ecd, 0xc18d, 0x7132, 0x0078, 0x1ed9, 0x6240, 0xa294, 0x0010,
+	0x0040, 0x1f1b, 0x6248, 0xa294, 0xff00, 0xa296, 0xff00, 0x00c0,
+	0x1f1b, 0x037e, 0x73b8, 0x2011, 0x8013, 0x1078, 0x2d4a, 0x037f,
+	0x7130, 0xc185, 0x7132, 0x2011, 0x7652, 0x220c, 0xd1a4, 0x0040,
+	0x1f03, 0x017e, 0x2009, 0x0001, 0x2011, 0x0100, 0x1078, 0x46b4,
+	0x2019, 0x000e, 0x1078, 0x74d9, 0xa484, 0x00ff, 0xa080, 0x232f,
+	0x200c, 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e,
+	0x1078, 0x7541, 0x017f, 0xd1ac, 0x00c0, 0x1f0c, 0x2019, 0x0004,
+	0x1078, 0x2299, 0x0078, 0x1f1b, 0x157e, 0x20a9, 0x007f, 0x2009,
+	0x0000, 0x1078, 0x3825, 0x00c0, 0x1f17, 0x1078, 0x3621, 0x8108,
+	0x00f0, 0x1f11, 0x157f, 0x0c7f, 0x047f, 0x6043, 0x0000, 0x2009,
+	0x00f7, 0x1078, 0x35e4, 0x0f7e, 0x2079, 0x7849, 0x783c, 0xa086,
+	0x0000, 0x0040, 0x1f33, 0x6027, 0x0004, 0x783f, 0x0000, 0x2079,
+	0x0140, 0x7803, 0x0000, 0x0f7f, 0x2011, 0x0003, 0x1078, 0x57c0,
+	0x2011, 0x0002, 0x1078, 0x57ca, 0x1078, 0x56d6, 0x1078, 0x45eb,
+	0x037e, 0x2019, 0x0000, 0x1078, 0x5768, 0x037f, 0x60e3, 0x0000,
+	0x017f, 0x2001, 0x7600, 0x2014, 0xa296, 0x0004, 0x00c0, 0x1f56,
+	0xd19c, 0x00c0, 0x1f56, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001,
+	0x2001, 0x7620, 0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0040,
+	0x1fff, 0x0f7e, 0x2079, 0x7849, 0x783c, 0xa086, 0x0001, 0x00c0,
+	0x1f82, 0x017e, 0x6027, 0x0004, 0x783f, 0x0000, 0x2079, 0x0140,
+	0x7803, 0x1000, 0x7803, 0x0000, 0x2079, 0x7836, 0x7807, 0x0000,
+	0x7833, 0x0000, 0x1078, 0x4c7a, 0x1078, 0x4d3a, 0x017f, 0x0f7f,
+	0x0078, 0x1fff, 0x0f7f, 0x017e, 0x6220, 0xd2b4, 0x0040, 0x1fb7,
+	0x1078, 0x45eb, 0x1078, 0x5582, 0x6027, 0x0004, 0x0d7e, 0x2069,
+	0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x1f9a, 0x6803, 0x1000,
+	0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0x7836, 0x6028, 0xa09a,
+	0x0002, 0x00c8, 0x1faa, 0x8000, 0x602a, 0x0c7f, 0x1078, 0x5574,
+	0x0078, 0x1ffe, 0x2019, 0x783f, 0x2304, 0xa065, 0x0040, 0x1fb4,
+	0x2009, 0x0027, 0x1078, 0x5c29, 0x0c7f, 0x0078, 0x1ffe, 0xd2bc,
+	0x0040, 0x1ffe, 0x1078, 0x45f9, 0x6017, 0x0010, 0x6027, 0x0004,
+	0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x1fcc,
+	0x6803, 0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0x7836,
+	0x6044, 0xa09a, 0x0002, 0x00c8, 0x1fed, 0x8000, 0x6046, 0x603c,
+	0x0c7f, 0xa005, 0x0040, 0x1ffe, 0x1078, 0x45f0, 0xa080, 0x0007,
+	0x2004, 0xa086, 0x0006, 0x00c0, 0x1fe9, 0x6017, 0x0012, 0x0078,
+	0x1ffe, 0x6017, 0x0016, 0x0078, 0x1ffe, 0x037e, 0x2019, 0x0001,
+	0x1078, 0x5768, 0x037f, 0x2019, 0x7845, 0x2304, 0xa065, 0x0040,
+	0x1ffd, 0x2009, 0x004f, 0x1078, 0x5c29, 0x0c7f, 0x017f, 0xd19c,
+	0x0040, 0x2027, 0x017e, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003,
+	0x1078, 0x57c0, 0x2011, 0x0002, 0x1078, 0x57ca, 0x1078, 0x56d6,
+	0x1078, 0x45eb, 0x037e, 0x2019, 0x0000, 0x1078, 0x5768, 0x037f,
+	0x60e3, 0x0000, 0x1078, 0x75b0, 0x1078, 0x75ce, 0x2001, 0x7600,
+	0x2003, 0x0004, 0x6027, 0x0008, 0x1078, 0x11c6, 0x017f, 0xa18c,
+	0xffd0, 0x6126, 0x007c, 0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e,
+	0x127e, 0x2091, 0x8000, 0x2071, 0x7600, 0x71b0, 0x70b2, 0xa116,
+	0x0040, 0x2051, 0x81ff, 0x0040, 0x2043, 0x2011, 0x8011, 0x1078,
+	0x2d4a, 0x0078, 0x2051, 0x2011, 0x8012, 0x1078, 0x2d4a, 0x037e,
+	0x0c7e, 0x2061, 0x0100, 0x2019, 0x0028, 0x1078, 0x2299, 0x0c7f,
+	0x037f, 0x127f, 0x0f7f, 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c,
+	0x0c7e, 0x0f7e, 0x007e, 0x027e, 0x2061, 0x0100, 0xa190, 0x2073,
+	0x2204, 0x60f2, 0xa192, 0x0005, 0x00c8, 0x206a, 0xa190, 0x207c,
+	0x0078, 0x206c, 0x2011, 0x2080, 0x2204, 0x60ee, 0x027f, 0x007f,
+	0x0f7f, 0x0c7f, 0x007c, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420,
+	0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8,
+	0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028, 0x2130, 0xa094,
+	0xff00, 0x00c0, 0x208e, 0x81ff, 0x0040, 0x2092, 0x1078, 0x4330,
+	0x0078, 0x2099, 0xa080, 0x232f, 0x200c, 0xa18c, 0xff00, 0x810f,
+	0xa006, 0x007c, 0xa080, 0x232f, 0x200c, 0xa18c, 0x00ff, 0x007c,
+	0x20c0, 0x20c4, 0x20c8, 0x20ce, 0x20d4, 0x20da, 0x20e0, 0x20e8,
+	0x20f0, 0x20f6, 0x20fc, 0x2104, 0x210c, 0x2114, 0x211c, 0x2126,
+	0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130,
+	0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130,
+	0x107e, 0x007e, 0x0078, 0x2149, 0x107e, 0x007e, 0x0078, 0x2149,
+	0x107e, 0x007e, 0x1078, 0x1e64, 0x0078, 0x2149, 0x107e, 0x007e,
+	0x1078, 0x1e64, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1d4b,
+	0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1d4b, 0x0078, 0x2149,
+	0x107e, 0x007e, 0x1078, 0x1e64, 0x1078, 0x1d4b, 0x0078, 0x2149,
+	0x107e, 0x007e, 0x1078, 0x1e64, 0x1078, 0x1d4b, 0x0078, 0x2149,
+	0x107e, 0x007e, 0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e,
+	0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1e64,
+	0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1e64,
+	0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1d4b,
+	0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1d4b,
+	0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1e64,
+	0x1078, 0x1d4b, 0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e,
+	0x1078, 0x1e64, 0x1078, 0x1d4b, 0x1078, 0x1d90, 0x0078, 0x2149,
+	0x0005, 0x0078, 0x2130, 0xb084, 0x003c, 0x8004, 0x8004, 0x0079,
+	0x2139, 0x2149, 0x20c6, 0x20ca, 0x20d0, 0x20d6, 0x20dc, 0x20e2,
+	0x20ea, 0x20f2, 0x20f8, 0x20fe, 0x2106, 0x210e, 0x2116, 0x211e,
+	0x2128, 0x0008, 0x2133, 0x007f, 0x107f, 0x2091, 0x8001, 0x007c,
+	0x0c7e, 0x027e, 0x2041, 0x007e, 0x70bc, 0xd09c, 0x0040, 0x215a,
+	0x2041, 0x007f, 0x2001, 0x010c, 0x203c, 0x727c, 0x82ff, 0x0040,
+	0x21a5, 0x037e, 0x738c, 0xa38e, 0xffff, 0x00c0, 0x2169, 0x2019,
+	0x0001, 0x8314, 0xa2e0, 0x7cc0, 0x2c04, 0xa38c, 0x0001, 0x0040,
+	0x2176, 0xa084, 0xff00, 0x8007, 0x0078, 0x2178, 0xa084, 0x00ff,
+	0xa70e, 0x0040, 0x219a, 0xa08e, 0x00ff, 0x0040, 0x21a0, 0x2009,
+	0x0000, 0x1078, 0x2085, 0x1078, 0x37ee, 0x00c0, 0x219d, 0x6004,
+	0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2194, 0x1078, 0x21f7,
+	0x0040, 0x219d, 0x0078, 0x219a, 0x1078, 0x22fb, 0x1078, 0x221e,
+	0x0040, 0x219d, 0x8318, 0x0078, 0x2169, 0x738e, 0x0078, 0x21a2,
+	0x708f, 0xffff, 0x037f, 0x0078, 0x21f4, 0xa780, 0x232f, 0x203c,
+	0xa7bc, 0xff00, 0x873f, 0x708c, 0xa096, 0xffff, 0x0040, 0x21b7,
+	0xa812, 0x00c8, 0x21c7, 0x708f, 0xffff, 0x0078, 0x21f1, 0x2009,
+	0x0000, 0x70bc, 0xd09c, 0x0040, 0x21c2, 0xd094, 0x0040, 0x21c2,
+	0x2009, 0x007e, 0x2100, 0xa802, 0x20a8, 0x0078, 0x21cb, 0x2008,
+	0x2810, 0xa202, 0x20a8, 0x2700, 0x157e, 0x017e, 0xa106, 0x0040,
+	0x21e8, 0x1078, 0x37ee, 0x00c0, 0x21f1, 0x6004, 0xa084, 0x00ff,
+	0xa086, 0x0006, 0x00c0, 0x21e2, 0x1078, 0x21f7, 0x0040, 0x21f1,
+	0x0078, 0x21e8, 0x1078, 0x22fb, 0x1078, 0x221e, 0x0040, 0x21f1,
+	0x017f, 0x8108, 0x157f, 0x00f0, 0x21cb, 0x708f, 0xffff, 0x0078,
+	0x21f4, 0x017f, 0x157f, 0x718e, 0x027f, 0x0c7f, 0x007c, 0x017e,
+	0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5b9c, 0x0040, 0x2219,
+	0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x37bd,
+	0x2001, 0x0000, 0x1078, 0x37d1, 0x127e, 0x2091, 0x8000, 0x7088,
+	0x8000, 0x708a, 0x127f, 0x2009, 0x0004, 0x1078, 0x5c29, 0xa085,
+	0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x017e, 0x077e,
+	0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5b9c, 0x0040, 0x2240, 0x2d00,
+	0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x37bd, 0x2001,
+	0x0002, 0x1078, 0x37d1, 0x127e, 0x2091, 0x8000, 0x7088, 0x8000,
+	0x708a, 0x127f, 0x2009, 0x0002, 0x1078, 0x5c29, 0xa085, 0x0001,
+	0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e, 0x027e, 0x2009,
+	0x0080, 0x1078, 0x37ee, 0x00c0, 0x2253, 0x1078, 0x2256, 0x0040,
+	0x2253, 0x70c3, 0xffff, 0x027f, 0x0c7f, 0x007c, 0x017e, 0x077e,
+	0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5b9c, 0x0040, 0x2278, 0x2d00,
+	0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x37bd, 0x2001,
+	0x0002, 0x1078, 0x37d1, 0x127e, 0x2091, 0x8000, 0x70c4, 0x8000,
+	0x70c6, 0x127f, 0x2009, 0x0002, 0x1078, 0x5c29, 0xa085, 0x0001,
+	0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e, 0x0d7e, 0x2009,
+	0x007f, 0x1078, 0x37ee, 0x00c0, 0x2296, 0x2c68, 0x1078, 0x5b9c,
+	0x0040, 0x2296, 0x2d00, 0x601a, 0x6312, 0x601f, 0x0001, 0x620a,
+	0x2009, 0x0022, 0x1078, 0x5c29, 0xa085, 0x0001, 0x0d7f, 0x0c7f,
+	0x007c, 0x0e7e, 0x0c7e, 0x067e, 0x037e, 0x027e, 0x1078, 0x4969,
+	0x1078, 0x4919, 0x1078, 0x6103, 0x20a9, 0x007f, 0x2009, 0x0000,
+	0x017e, 0x1078, 0x3825, 0x00c0, 0x22b1, 0x1078, 0x39a6, 0x1078,
+	0x3621, 0x017f, 0x8108, 0x00f0, 0x22a8, 0x027f, 0x037f, 0x067f,
+	0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e,
+	0x6218, 0x2270, 0x72a0, 0x027e, 0x2019, 0x0029, 0x1078, 0x4962,
+	0x1078, 0x48a5, 0x2c08, 0x1078, 0x737b, 0x017f, 0x2e60, 0x1078,
+	0x39a6, 0x6210, 0x6314, 0x1078, 0x3621, 0x6212, 0x6316, 0x017f,
+	0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x007e, 0x6018,
+	0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x22f1, 0x2071, 0x7600,
+	0x7088, 0xa005, 0x0040, 0x22ee, 0x8001, 0x708a, 0x007f, 0x0e7f,
+	0x007c, 0x2071, 0x7600, 0x70c4, 0xa005, 0x0040, 0x22ee, 0x8001,
+	0x70c6, 0x0078, 0x22ee, 0x6000, 0xc08c, 0x6002, 0x007c, 0x0e7e,
+	0x0c7e, 0x037e, 0x027e, 0x017e, 0x157e, 0x81ff, 0x00c0, 0x230c,
+	0x20a9, 0x0001, 0x0078, 0x2310, 0x20a9, 0x007f, 0x2011, 0x0000,
+	0x027e, 0xa2e0, 0x7720, 0x2c64, 0x8cff, 0x0040, 0x2322, 0x2019,
+	0x0029, 0x1078, 0x4962, 0x1078, 0x48a5, 0x2c08, 0x1078, 0x737b,
+	0x1078, 0x39a6, 0x027f, 0x8210, 0x00f0, 0x2310, 0x027e, 0x027f,
+	0x157f, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x7eef,
+	0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9,
+	0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd,
+	0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3,
+	0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2,
+	0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7,
+	0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098,
+	0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080,
+	0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072,
+	0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067,
+	0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055,
+	0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b,
+	0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a,
+	0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e,
+	0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025,
+	0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010,
+	0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800,
+	0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000,
+	0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000,
+	0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000,
+	0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000,
+	0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000,
+	0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000,
+	0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000,
+	0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000,
+	0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000,
+	0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500,
+	0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000,
 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x2071, 0x6d6d, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016,
-	0x703a, 0x703e, 0x7033, 0x6d7d, 0x7037, 0x6d7d, 0x7007, 0x0001,
-	0x2061, 0x6d9d, 0x6003, 0x0002, 0x007c, 0x0090, 0x21b8, 0x0068,
-	0x21b8, 0x2071, 0x6d6d, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x21b8,
-	0x2a60, 0x7820, 0xa08e, 0x0069, 0x00c0, 0x229c, 0x0079, 0x223c,
-	0x007c, 0x2071, 0x6d6d, 0x7004, 0x0079, 0x21be, 0x21c2, 0x21c3,
-	0x21cd, 0x21df, 0x007c, 0x0090, 0x21cc, 0x0068, 0x21cc, 0x2b78,
-	0x7818, 0xd084, 0x0040, 0x21eb, 0x007c, 0x2b78, 0x2061, 0x6d9d,
-	0x6008, 0xa08e, 0x0100, 0x0040, 0x21da, 0xa086, 0x0200, 0x0040,
-	0x2294, 0x007c, 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010,
-	0x2068, 0x6834, 0xa086, 0x0103, 0x0040, 0x21e7, 0x007c, 0x2a60,
-	0x2b78, 0x7018, 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8,
-	0x21f4, 0x61b0, 0x0079, 0x21fc, 0x2100, 0xa08a, 0x0033, 0x00c8,
-	0x2290, 0x61b0, 0x0079, 0x223c, 0x2272, 0x22a4, 0x22ac, 0x22b0,
-	0x22b8, 0x22be, 0x22c2, 0x22cb, 0x22cf, 0x22d7, 0x22db, 0x2290,
-	0x2290, 0x2290, 0x22df, 0x2290, 0x22ef, 0x2306, 0x231d, 0x2399,
-	0x239e, 0x23cb, 0x2416, 0x2425, 0x2446, 0x247c, 0x2486, 0x2493,
-	0x24a6, 0x24be, 0x24c7, 0x2504, 0x250a, 0x2290, 0x251a, 0x2290,
-	0x2290, 0x2290, 0x2290, 0x2290, 0x251e, 0x2524, 0x2290, 0x2290,
-	0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x252c, 0x2290,
-	0x2290, 0x2290, 0x2290, 0x2290, 0x2539, 0x253f, 0x2290, 0x2290,
-	0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290,
-	0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290,
-	0x2290, 0x2290, 0x2290, 0x2290, 0x22d7, 0x22db, 0x2290, 0x2290,
-	0x2551, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290,
-	0x2290, 0x2290, 0x2290, 0x2290, 0x259e, 0x265d, 0x2671, 0x2678,
-	0x26db, 0x2736, 0x2741, 0x2783, 0x2790, 0x279d, 0x27a0, 0x2555,
-	0x27c9, 0x2811, 0x281e, 0x28fd, 0x29cb, 0x29f2, 0x2ade, 0x713c,
-	0x0078, 0x2272, 0x2021, 0x4000, 0x1078, 0x2a2d, 0x127e, 0x2091,
-	0x8000, 0x0068, 0x227f, 0x7818, 0xd084, 0x0040, 0x2282, 0x127f,
-	0x0078, 0x2276, 0x781b, 0x0001, 0x7c22, 0x7926, 0x7a2a, 0x7b2e,
-	0x2091, 0x4080, 0x7007, 0x0001, 0x2091, 0x5000, 0x127f, 0x007c,
-	0x2021, 0x4001, 0x0078, 0x2274, 0x2021, 0x4002, 0x0078, 0x2274,
-	0x2021, 0x4003, 0x0078, 0x2274, 0x2021, 0x4005, 0x0078, 0x2274,
-	0x2021, 0x4006, 0x0078, 0x2274, 0xa02e, 0x2520, 0x7b28, 0x7a2c,
-	0x7824, 0x7930, 0x0078, 0x2a3c, 0x7823, 0x0004, 0x7824, 0x007a,
-	0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078, 0x2a40,
-	0x7924, 0x7828, 0x2114, 0x200a, 0x0078, 0x2272, 0x7924, 0x2114,
-	0x0078, 0x2272, 0x2099, 0x0009, 0x20a1, 0x0009, 0x20a9, 0x0007,
-	0x53a3, 0x0078, 0x2272, 0x7824, 0x2060, 0x0078, 0x22e1, 0x2009,
-	0x0001, 0x2011, 0x000d, 0x2019, 0x0000, 0x0078, 0x2272, 0x7d38,
-	0x7c3c, 0x0078, 0x22a6, 0x7d38, 0x7c3c, 0x0078, 0x22b2, 0x2061,
-	0x1000, 0x610c, 0xa006, 0x2c14, 0xa200, 0x8c60, 0x8109, 0x00c0,
-	0x22e3, 0x2010, 0xa005, 0x0040, 0x2272, 0x0078, 0x2298, 0x2061,
-	0x6d51, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x22a0, 0x8019, 0x0040,
-	0x22a0, 0x604a, 0x6142, 0x782c, 0x6052, 0x7828, 0x6056, 0xa006,
-	0x605a, 0x605e, 0x1078, 0x3890, 0x0078, 0x2272, 0x2061, 0x6d51,
-	0x7824, 0x7930, 0xa11a, 0x00c8, 0x22a0, 0x8019, 0x0040, 0x22a0,
-	0x604e, 0x6146, 0x782c, 0x6062, 0x7828, 0x6066, 0xa006, 0x606a,
-	0x606e, 0x1078, 0x366e, 0x0078, 0x2272, 0xa02e, 0x2520, 0x81ff,
-	0x00c0, 0x229c, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1,
-	0x6d74, 0x41a1, 0x1078, 0x2a04, 0x0040, 0x229c, 0x2009, 0x0020,
-	0x1078, 0x2a3c, 0x701b, 0x2335, 0x007c, 0x6834, 0x2008, 0xa084,
-	0x00ff, 0xa096, 0x0011, 0x0040, 0x2341, 0xa096, 0x0019, 0x00c0,
-	0x229c, 0x810f, 0xa18c, 0x00ff, 0x0040, 0x229c, 0x710e, 0x700c,
-	0x8001, 0x0040, 0x2372, 0x700e, 0x1078, 0x2a04, 0x0040, 0x229c,
-	0x2009, 0x0020, 0x2061, 0x6d9d, 0x6224, 0x6328, 0x642c, 0x6530,
-	0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
-	0x1078, 0x2a3c, 0x701b, 0x2365, 0x007c, 0x6834, 0xa084, 0x00ff,
-	0xa096, 0x0002, 0x0040, 0x2370, 0xa096, 0x000a, 0x00c0, 0x229c,
-	0x0078, 0x2347, 0x7010, 0x2068, 0x6838, 0xc0fd, 0x683a, 0x1078,
-	0x3344, 0x00c0, 0x2380, 0x7007, 0x0003, 0x701b, 0x2382, 0x007c,
-	0x1078, 0x372d, 0x127e, 0x2091, 0x8000, 0x20a9, 0x0005, 0x2099,
-	0x6d74, 0x530a, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000,
-	0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009, 0x0020, 0x127f, 0x0078,
-	0x2a40, 0x6198, 0x7824, 0x609a, 0x0078, 0x2272, 0x2091, 0x8000,
-	0x7823, 0x4000, 0x7827, 0x4953, 0x782b, 0x5020, 0x782f, 0x2020,
-	0x2009, 0x017f, 0x2104, 0x7832, 0x3f00, 0x7836, 0x2061, 0x0100,
-	0x6200, 0x2061, 0x0200, 0x603c, 0x8007, 0xa205, 0x783a, 0x2009,
-	0x04fd, 0x2104, 0x783e, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091,
-	0x4080, 0x2071, 0x0010, 0x20c1, 0x00f0, 0xa08a, 0x0003, 0x00c8,
-	0x0427, 0x0078, 0x0423, 0x81ff, 0x00c0, 0x229c, 0x1078, 0x2a1c,
-	0x0040, 0x22a0, 0x7c28, 0x7d2c, 0x1078, 0x3592, 0xd28c, 0x00c0,
-	0x23dd, 0x1078, 0x3522, 0x0078, 0x23df, 0x1078, 0x355e, 0x00c0,
-	0x2409, 0x2061, 0x7400, 0x127e, 0x2091, 0x8000, 0x6000, 0xa086,
-	0x0000, 0x0040, 0x23f7, 0x6010, 0xa06d, 0x0040, 0x23f7, 0x683c,
-	0xa406, 0x00c0, 0x23f7, 0x6840, 0xa506, 0x0040, 0x2402, 0x127f,
-	0xace0, 0x0008, 0x2001, 0x6d15, 0x2004, 0xac02, 0x00c8, 0x229c,
-	0x0078, 0x23e3, 0x1078, 0x5f5d, 0x127f, 0x0040, 0x229c, 0x0078,
-	0x2272, 0xa00e, 0x2001, 0x0005, 0x1078, 0x372d, 0x127e, 0x2091,
-	0x8000, 0x1078, 0x36a1, 0x127f, 0x0078, 0x2272, 0x81ff, 0x00c0,
-	0x229c, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x1078, 0x34d7, 0x1078,
-	0x35a3, 0x0040, 0x229c, 0x0078, 0x2272, 0x81ff, 0x00c0, 0x229c,
-	0x1078, 0x2a1c, 0x0040, 0x22a0, 0x2031, 0x000f, 0x1078, 0x34d7,
-	0x8631, 0x00c8, 0x242e, 0x2019, 0x0005, 0x1078, 0x35c4, 0x0040,
-	0x229c, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x22a0, 0x8003, 0x800b,
-	0x810b, 0xa108, 0x1078, 0x40de, 0x0078, 0x2272, 0x127e, 0x2091,
-	0x8000, 0x81ff, 0x00c0, 0x2476, 0x2029, 0x00ff, 0x644c, 0x2400,
-	0xa506, 0x0040, 0x2470, 0x2508, 0x1078, 0x3447, 0x00c0, 0x2470,
-	0x2031, 0x000f, 0x1078, 0x34d7, 0x8631, 0x00c8, 0x245a, 0x2019,
-	0x0004, 0x1078, 0x35c4, 0x0040, 0x2476, 0x7824, 0xa08a, 0x1000,
-	0x00c8, 0x2479, 0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x40de,
-	0x8529, 0x00c8, 0x244f, 0x127f, 0x0078, 0x2272, 0x127f, 0x0078,
-	0x229c, 0x127f, 0x0078, 0x22a0, 0x1078, 0x2a1c, 0x0040, 0x22a0,
-	0x1078, 0x3507, 0x1078, 0x3592, 0x0078, 0x2272, 0x81ff, 0x00c0,
-	0x229c, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x1078, 0x34f0, 0x1078,
-	0x3592, 0x0078, 0x2272, 0x81ff, 0x00c0, 0x229c, 0x1078, 0x2a1c,
-	0x0040, 0x22a0, 0x1078, 0x3561, 0x0040, 0x229c, 0x1078, 0x338c,
-	0x1078, 0x351b, 0x1078, 0x3592, 0x0078, 0x2272, 0x1078, 0x2a1c,
-	0x0040, 0x22a0, 0x1078, 0x34d7, 0x62a0, 0x2019, 0x0005, 0x0c7e,
-	0x1078, 0x35cf, 0x0c7f, 0x1078, 0x445c, 0x1078, 0x43a9, 0x2c08,
-	0x1078, 0x6a57, 0x1078, 0x3592, 0x0078, 0x2272, 0x1078, 0x2a1c,
-	0x0040, 0x22a0, 0x1078, 0x3592, 0x2208, 0x0078, 0x2272, 0x157e,
-	0x0d7e, 0x0e7e, 0x2069, 0x6ddf, 0x6810, 0x6914, 0xa10a, 0x00c8,
-	0x24d3, 0x2009, 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, 0x0000,
-	0x20a9, 0x007e, 0x2069, 0x6e00, 0x2d04, 0xa075, 0x0040, 0x24e8,
-	0x704c, 0x1078, 0x24f2, 0xa210, 0x7080, 0x1078, 0x24f2, 0xa318,
-	0x8d68, 0x00f0, 0x24dc, 0x2300, 0xa218, 0x0e7f, 0x0d7f, 0x157f,
-	0x0078, 0x2272, 0x0f7e, 0x017e, 0xa07d, 0x0040, 0x2501, 0x2001,
-	0x0000, 0x8000, 0x2f0c, 0x81ff, 0x0040, 0x2501, 0x2178, 0x0078,
-	0x24f9, 0x017f, 0x0f7f, 0x007c, 0x2069, 0x6ddf, 0x6910, 0x629c,
-	0x0078, 0x2272, 0x81ff, 0x00c0, 0x229c, 0x614c, 0xa190, 0x2091,
-	0x2214, 0xa294, 0x00ff, 0x6068, 0xa084, 0xff00, 0xa215, 0x6364,
-	0x0078, 0x2272, 0x613c, 0x6240, 0x0078, 0x2272, 0x1078, 0x2a1c,
-	0x0040, 0x22a0, 0x0078, 0x2272, 0x1078, 0x2a1c, 0x0040, 0x22a0,
-	0x6244, 0x6338, 0x0078, 0x2272, 0x613c, 0x6240, 0x7824, 0x603e,
-	0x7b28, 0x6342, 0x2069, 0x6d51, 0x831f, 0xa305, 0x6816, 0x0078,
-	0x2272, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x0078, 0x2272, 0x1078,
-	0x2a1c, 0x0040, 0x22a0, 0x7828, 0xa00d, 0x0040, 0x22a0, 0x782c,
-	0xa005, 0x0040, 0x22a0, 0x6244, 0x6146, 0x6338, 0x603a, 0x0078,
-	0x2272, 0x7d38, 0x7c3c, 0x0078, 0x231f, 0x7824, 0xa09c, 0x00ff,
-	0xa39a, 0x0003, 0x00c8, 0x229c, 0x624c, 0xa084, 0xff00, 0x8007,
-	0xa206, 0x00c0, 0x256d, 0x2001, 0x6d40, 0x2009, 0x000c, 0x7a2c,
-	0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2a40, 0x81ff, 0x00c0, 0x229c,
-	0x1078, 0x2a1c, 0x0040, 0x22a0, 0x6004, 0xa084, 0x00ff, 0xa086,
-	0x0006, 0x00c0, 0x229c, 0x0c7e, 0x1078, 0x2a04, 0x0c7f, 0x0040,
-	0x229c, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x6223,
-	0x0040, 0x229c, 0x7007, 0x0003, 0x701b, 0x258f, 0x007c, 0x6830,
-	0xa086, 0x0100, 0x0040, 0x229c, 0xad80, 0x000e, 0x2009, 0x000c,
-	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2a40, 0x1078, 0x2a04,
-	0x0040, 0x229c, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
-	0x1078, 0x2a3c, 0x701b, 0x25ad, 0x007c, 0xade8, 0x000d, 0x6800,
-	0xa005, 0x0040, 0x22a0, 0x6804, 0xd0ac, 0x0040, 0x25ba, 0xd0a4,
-	0x0040, 0x22a0, 0xd094, 0x0040, 0x25c5, 0x0c7e, 0x2061, 0x0100,
-	0x6104, 0xa18c, 0xffdf, 0x6106, 0x0c7f, 0xd08c, 0x0040, 0x25d0,
-	0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18d, 0x0010, 0x6106, 0x0c7f,
-	0x2009, 0x0100, 0x210c, 0xa18a, 0x0002, 0x0048, 0x25e5, 0xd084,
-	0x0040, 0x25e5, 0x6828, 0xa08a, 0x007f, 0x00c8, 0x22a0, 0xa088,
-	0x2091, 0x210c, 0xa18c, 0x00ff, 0x6152, 0xd0dc, 0x0040, 0x25ee,
-	0x6828, 0xa08a, 0x007f, 0x00c8, 0x22a0, 0x604e, 0x6808, 0xa08a,
-	0x0100, 0x0048, 0x22a0, 0xa08a, 0x0841, 0x00c8, 0x22a0, 0xa084,
-	0x0007, 0x00c0, 0x22a0, 0x680c, 0xa005, 0x0040, 0x22a0, 0x6810,
-	0xa005, 0x0040, 0x22a0, 0x6848, 0x6940, 0xa10a, 0x00c8, 0x22a0,
-	0x8001, 0x0040, 0x22a0, 0x684c, 0x6944, 0xa10a, 0x00c8, 0x22a0,
-	0x8001, 0x0040, 0x22a0, 0x20a9, 0x001c, 0x2d98, 0x2069, 0x6d51,
-	0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x613e, 0x8007, 0xa084,
-	0x00ff, 0x6042, 0x1078, 0x3890, 0x1078, 0x366e, 0x6000, 0xa086,
-	0x0000, 0x00c0, 0x265b, 0x6808, 0x602a, 0x1078, 0x1bcc, 0x6818,
-	0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016,
-	0x611a, 0x621e, 0x6322, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e,
-	0x6312, 0x1078, 0x4168, 0x0c7e, 0x2061, 0x0100, 0x602f, 0x0040,
-	0x602f, 0x0000, 0x0c7f, 0x60b4, 0xa005, 0x0040, 0x2657, 0x6003,
-	0x0001, 0x2091, 0x301d, 0x1078, 0x31cb, 0x0078, 0x265b, 0x6003,
-	0x0004, 0x2091, 0x301d, 0x0078, 0x2272, 0x6000, 0xa086, 0x0000,
-	0x0040, 0x229c, 0x2069, 0x6d51, 0x7830, 0x6842, 0x7834, 0x6846,
-	0x2d00, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078,
-	0x2a40, 0x81ff, 0x00c0, 0x229c, 0x1078, 0x31cb, 0x0078, 0x2272,
-	0x81ff, 0x00c0, 0x229c, 0x617c, 0x81ff, 0x0040, 0x2692, 0x703f,
-	0x0000, 0x2001, 0x73c0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c,
-	0x7d38, 0x127e, 0x2091, 0x8000, 0x1078, 0x2a40, 0x701b, 0x226f,
-	0x127f, 0x007c, 0x703f, 0x0001, 0x0d7e, 0x2069, 0x73c0, 0x20a9,
-	0x0040, 0x20a1, 0x73c0, 0x2019, 0xffff, 0x43a4, 0x654c, 0xa588,
-	0x2091, 0x210c, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002,
-	0x2100, 0xa506, 0x0040, 0x26c4, 0x1078, 0x3447, 0x00c0, 0x26c4,
-	0x6014, 0x821c, 0x0048, 0x26bc, 0xa398, 0x73c0, 0xa085, 0xff00,
-	0x8007, 0x201a, 0x0078, 0x26c3, 0xa398, 0x73c0, 0x2324, 0xa4a4,
-	0xff00, 0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x00c8,
-	0x26cb, 0x0078, 0x26a8, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a,
-	0x0d7f, 0x20a9, 0x0040, 0x20a1, 0x73c0, 0x2099, 0x73c0, 0x1078,
-	0x3213, 0x0078, 0x2681, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x0c7e,
-	0x1078, 0x2a04, 0x0c7f, 0x0040, 0x229c, 0x2001, 0x6d52, 0x2004,
-	0xd0b4, 0x0040, 0x2708, 0x6000, 0xd08c, 0x00c0, 0x2708, 0x6004,
-	0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2708, 0x6837, 0x0000,
-	0x6838, 0xc0fd, 0x683a, 0x1078, 0x625b, 0x0040, 0x229c, 0x7007,
-	0x0003, 0x701b, 0x2704, 0x007c, 0x1078, 0x2a1c, 0x0040, 0x22a0,
-	0x20a9, 0x0029, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9,
-	0x0002, 0xac80, 0x0004, 0x2098, 0xad80, 0x0004, 0x20a0, 0x1078,
-	0x3213, 0x20a9, 0x0004, 0xac80, 0x0006, 0x2098, 0xad80, 0x0006,
-	0x20a0, 0x1078, 0x3213, 0x20a9, 0x0004, 0xac80, 0x000a, 0x2098,
-	0xad80, 0x000a, 0x20a0, 0x1078, 0x3213, 0x2d00, 0x2009, 0x0029,
-	0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2a40, 0x81ff, 0x00c0,
-	0x229c, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x1078, 0x35ae, 0x0078,
-	0x2272, 0x81ff, 0x00c0, 0x229c, 0x7828, 0xa08a, 0x1000, 0x00c8,
-	0x22a0, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x2031, 0x000f, 0x1078,
-	0x34d7, 0x8631, 0x00c8, 0x274f, 0x2019, 0x0004, 0x1078, 0x35c4,
-	0x7924, 0x810f, 0x7a28, 0x1078, 0x275f, 0x0078, 0x2272, 0xa186,
-	0x00ff, 0x0040, 0x2767, 0x1078, 0x2777, 0x0078, 0x2776, 0x2029,
-	0x007e, 0x2061, 0x6d00, 0x644c, 0x2400, 0xa506, 0x0040, 0x2773,
-	0x2508, 0x1078, 0x2777, 0x8529, 0x00c8, 0x276c, 0x007c, 0x1078,
-	0x3447, 0x00c0, 0x2782, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108,
-	0x1078, 0x40de, 0x007c, 0x81ff, 0x00c0, 0x229c, 0x1078, 0x2a1c,
-	0x0040, 0x22a0, 0x1078, 0x34d7, 0x1078, 0x35b9, 0x0078, 0x2272,
-	0x81ff, 0x00c0, 0x229c, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x1078,
-	0x34d7, 0x1078, 0x35a3, 0x0078, 0x2272, 0x6100, 0x0078, 0x2272,
-	0x1078, 0x2a1c, 0x0040, 0x22a0, 0x6004, 0xa086, 0x0707, 0x0040,
-	0x22a0, 0x2001, 0x6d00, 0x2004, 0xa086, 0x0003, 0x00c0, 0x229c,
-	0x0d7e, 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x27b9, 0xace8,
-	0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a, 0x6b04,
-	0x831f, 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200, 0x0078,
-	0x2272, 0x81ff, 0x00c0, 0x229c, 0x7828, 0xa08a, 0x1000, 0x00c8,
-	0x22a0, 0x7924, 0xa184, 0x00ff, 0xa082, 0x0010, 0x00c8, 0x22a0,
-	0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff, 0x0040, 0x27e6, 0xa182,
-	0x007f, 0x00c8, 0x22a0, 0x2100, 0x1078, 0x1e30, 0x027e, 0x0c7e,
-	0x127e, 0x2091, 0x8000, 0x2061, 0x6f23, 0x601b, 0x0000, 0x601f,
-	0x0000, 0x2061, 0x6d00, 0x6003, 0x0001, 0x2061, 0x0100, 0x6030,
-	0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043, 0x0090, 0x6043,
-	0x0010, 0x2009, 0x001e, 0x2011, 0x31f0, 0x1078, 0x415f, 0x7924,
-	0x810f, 0x7a28, 0x1078, 0x275f, 0x127f, 0x0c7f, 0x027f, 0x0078,
-	0x2272, 0x7924, 0xa18c, 0xff00, 0x810f, 0x0c7e, 0x1078, 0x3410,
-	0x2c08, 0x0c7f, 0x00c0, 0x22a0, 0x0078, 0x2272, 0x81ff, 0x00c0,
-	0x229c, 0x60bc, 0xd09c, 0x0040, 0x229c, 0x1078, 0x2a04, 0x0040,
-	0x229c, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x2a3c,
-	0x701b, 0x2833, 0x007c, 0x2009, 0x0080, 0x1078, 0x3447, 0x00c0,
-	0x229c, 0x0d7e, 0xade8, 0x000d, 0x6900, 0x6a08, 0x6b0c, 0x6c10,
-	0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0040, 0x28a7, 0xa0be,
-	0x0112, 0x0040, 0x28a7, 0xa0be, 0x0113, 0x0040, 0x28a7, 0xa0be,
-	0x0114, 0x0040, 0x28a7, 0xa0be, 0x0117, 0x0040, 0x28a7, 0xa0be,
-	0x011a, 0x0040, 0x28a7, 0xa0be, 0x0121, 0x0040, 0x289d, 0xa0be,
-	0x0131, 0x0040, 0x289d, 0xa0be, 0x0171, 0x0040, 0x28a7, 0xa0be,
-	0x01a1, 0x00c0, 0x2870, 0x6830, 0x8007, 0x6832, 0x0078, 0x28ad,
-	0xa0be, 0x0212, 0x0040, 0x28a3, 0xa0be, 0x0213, 0x0040, 0x28a3,
-	0xa0be, 0x0214, 0x0040, 0x2895, 0xa0be, 0x0217, 0x0040, 0x288f,
-	0xa0be, 0x021a, 0x00c0, 0x2889, 0x6838, 0x8007, 0x683a, 0x0078,
-	0x28a7, 0xa0be, 0x0300, 0x0040, 0x28a7, 0x0078, 0x229c, 0xad80,
-	0x0010, 0x20a9, 0x0007, 0x1078, 0x28d9, 0xad80, 0x000e, 0x20a9,
-	0x0001, 0x1078, 0x28d9, 0x0078, 0x28a7, 0xad80, 0x000c, 0x1078,
-	0x28e7, 0x0078, 0x28ad, 0xad80, 0x000e, 0x1078, 0x28e7, 0xad80,
-	0x000c, 0x20a9, 0x0001, 0x1078, 0x28d9, 0x0c7e, 0x1078, 0x2a04,
-	0x0040, 0x28ce, 0x6837, 0x0119, 0x684f, 0x0020, 0x685b, 0x0001,
-	0x810b, 0x697e, 0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92,
-	0x6996, 0x689b, 0x0000, 0x0c7f, 0x0d7f, 0x1078, 0x623f, 0x0040,
-	0x229c, 0x7007, 0x0003, 0x701b, 0x28d2, 0x007c, 0x0c7f, 0x0d7f,
-	0x0078, 0x229c, 0x6820, 0xa086, 0x8001, 0x0040, 0x229c, 0x0078,
-	0x2272, 0x017e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a,
-	0x8108, 0x280a, 0x8108, 0x00f0, 0x28db, 0x017f, 0x007c, 0x017e,
-	0x0a7e, 0x0b7e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054,
-	0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108,
-	0x280a, 0x0b7f, 0x0a7f, 0x017f, 0x007c, 0x81ff, 0x00c0, 0x229c,
-	0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0081, 0x0048, 0x22a0,
-	0xa182, 0x00ff, 0x00c8, 0x22a0, 0x7a2c, 0x7b28, 0x6064, 0xa306,
-	0x00c0, 0x2918, 0x6068, 0xa206, 0x00c0, 0x2918, 0x0078, 0x22a0,
-	0x0c7e, 0x1078, 0x297b, 0x2c68, 0x0c7f, 0x0040, 0x2939, 0xa0c6,
-	0x4007, 0x00c0, 0x2926, 0x7c26, 0x0078, 0x2936, 0xa0c6, 0x4008,
-	0x00c0, 0x292e, 0x7f26, 0x7e2a, 0x0078, 0x2936, 0xa0c6, 0x4009,
-	0x00c0, 0x2934, 0x0078, 0x2936, 0x2001, 0x4006, 0x2020, 0x0078,
-	0x2274, 0x017e, 0x0b7e, 0x0c7e, 0x0e7e, 0x2c70, 0x1078, 0x5504,
-	0x0040, 0x2969, 0x2d00, 0x601a, 0x2e58, 0x0e7f, 0x0e7e, 0x0c7e,
-	0x1078, 0x2a04, 0x0c7f, 0x2b70, 0x0040, 0x229c, 0x6837, 0x0000,
-	0x2d00, 0x6012, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x33df,
-	0x2001, 0x0002, 0x1078, 0x33f3, 0x127e, 0x2091, 0x8000, 0x7088,
-	0x8000, 0x708a, 0x127f, 0x2009, 0x0002, 0x1078, 0x5591, 0xa085,
-	0x0001, 0x0e7f, 0x0c7f, 0x0b7f, 0x017f, 0x0040, 0x229c, 0x7007,
-	0x0003, 0x701b, 0x2974, 0x007c, 0x6830, 0xa086, 0x0100, 0x00c0,
-	0x2272, 0x0078, 0x229c, 0x0e7e, 0x0d7e, 0x2029, 0x0000, 0x2021,
-	0x0081, 0x20a9, 0x007e, 0x2071, 0x6e81, 0x2e04, 0xa005, 0x00c0,
-	0x298f, 0x2100, 0xa406, 0x0040, 0x29c0, 0x0078, 0x29b4, 0x2068,
-	0x6f10, 0x2700, 0xa306, 0x00c0, 0x29a5, 0x6e14, 0x2600, 0xa206,
-	0x00c0, 0x29a5, 0x2400, 0xa106, 0x00c0, 0x29a1, 0x2d60, 0x0078,
-	0x29c6, 0x2001, 0x4007, 0x0078, 0x29c7, 0x2400, 0xa106, 0x00c0,
-	0x29b4, 0x6e14, 0x87ff, 0x00c0, 0x29b0, 0x86ff, 0x0040, 0x29c0,
-	0x2001, 0x4008, 0x0078, 0x29c7, 0x8420, 0x8e70, 0x00f0, 0x2985,
-	0x2001, 0x4009, 0x0078, 0x29c7, 0x2001, 0x0001, 0x0078, 0x29c7,
-	0x1078, 0x3410, 0x00c0, 0x29bc, 0x6312, 0x6216, 0xa006, 0xa005,
-	0x0d7f, 0x0e7f, 0x007c, 0x81ff, 0x00c0, 0x229c, 0x1078, 0x2a04,
-	0x0040, 0x229c, 0x6837, 0x0000, 0x7824, 0xa005, 0x0040, 0x22a0,
-	0xa096, 0x00ff, 0x0040, 0x29e0, 0xa092, 0x0004, 0x00c8, 0x22a0,
-	0x2010, 0x2d18, 0x1078, 0x2013, 0x0040, 0x229c, 0x7007, 0x0003,
-	0x701b, 0x29eb, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x229c,
-	0x0078, 0x2272, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0081,
-	0x0048, 0x22a0, 0xa182, 0x00ff, 0x00c8, 0x22a0, 0x1078, 0x615b,
-	0x1078, 0x342f, 0x0078, 0x2272, 0x1078, 0x12f4, 0x0040, 0x2a1b,
-	0xa006, 0x6802, 0x7010, 0xa005, 0x00c0, 0x2a13, 0x2d00, 0x7012,
-	0x7016, 0x0078, 0x2a19, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006,
-	0x7016, 0xad80, 0x000d, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff,
-	0x1078, 0x3447, 0x00c0, 0x2a2a, 0xa6b4, 0x00ff, 0xa682, 0x0010,
-	0x0048, 0x2a2b, 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff,
-	0x0040, 0x2a38, 0x2168, 0x6904, 0x1078, 0x1328, 0x0078, 0x2a2f,
-	0x7112, 0x7116, 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x2a42,
-	0x2031, 0x0000, 0x2061, 0x6d9d, 0x6606, 0x6112, 0x600e, 0x6226,
-	0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x135f, 0x7007, 0x0002,
-	0x701b, 0x2272, 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079,
-	0x0000, 0x2001, 0x6d7b, 0x2004, 0xa005, 0x00c0, 0x2a6e, 0x0068,
-	0x2a6e, 0x7818, 0xd084, 0x00c0, 0x2a6e, 0x781b, 0x0001, 0x7a22,
-	0x7b26, 0x7c2a, 0x2091, 0x4080, 0x0078, 0x2a93, 0x017e, 0x0c7e,
-	0x0e7e, 0x2071, 0x6d6d, 0x7138, 0xa182, 0x0004, 0x0048, 0x2a7c,
-	0x7030, 0x2060, 0x0078, 0x2a8d, 0x7030, 0xa0e0, 0x0008, 0xac82,
-	0x6d9d, 0x0048, 0x2a85, 0x2061, 0x6d7d, 0x2c00, 0x7032, 0x81ff,
-	0x00c0, 0x2a8b, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a,
-	0x0e7f, 0x0c7f, 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071,
-	0x6d6d, 0x7038, 0xa005, 0x0040, 0x2acf, 0x127e, 0x2091, 0x8000,
-	0x0068, 0x2ace, 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0,
-	0x2acd, 0x0c7e, 0x781b, 0x0001, 0x7034, 0x2060, 0x2c04, 0x7822,
-	0x6004, 0x7826, 0x6008, 0x782a, 0x2091, 0x4080, 0x7038, 0x8001,
-	0x703a, 0xa005, 0x00c0, 0x2ac3, 0x7033, 0x6d7d, 0x7037, 0x6d7d,
-	0x0c7f, 0x0078, 0x2acd, 0xac80, 0x0008, 0xa0fa, 0x6d9d, 0x0048,
-	0x2acb, 0x2001, 0x6d7d, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f,
-	0x007c, 0x027e, 0x2001, 0x6d52, 0x2004, 0xd0c4, 0x0040, 0x2adc,
-	0x2011, 0x8014, 0x1078, 0x2a53, 0x027f, 0x007c, 0x81ff, 0x00c0,
-	0x229c, 0x127e, 0x2091, 0x8000, 0x6030, 0xc08d, 0x6032, 0x1078,
-	0x31cb, 0x127f, 0x0078, 0x2272, 0x127e, 0x0c7e, 0x0e7e, 0x2061,
-	0x0100, 0x2071, 0x6d00, 0x6044, 0xd0a4, 0x00c0, 0x2b11, 0xd084,
-	0x0040, 0x2afe, 0x1078, 0x2c34, 0x0078, 0x2b11, 0xd08c, 0x0040,
-	0x2b05, 0x1078, 0x2b4b, 0x0078, 0x2b11, 0xd094, 0x0040, 0x2b0c,
-	0x1078, 0x2b2c, 0x0078, 0x2b11, 0xd09c, 0x0040, 0x2b11, 0x1078,
-	0x2b15, 0x0e7f, 0x0c7f, 0x127f, 0x007c, 0x6043, 0x0040, 0x6043,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071,
+	0x766d, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a, 0x703e,
+	0x7033, 0x767d, 0x7037, 0x767d, 0x7007, 0x0001, 0x2061, 0x76bd,
+	0x6003, 0x0002, 0x007c, 0x0090, 0x2456, 0x0068, 0x2456, 0x2071,
+	0x766d, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x2456, 0x2a60, 0x7820,
+	0xa08e, 0x0069, 0x00c0, 0x253d, 0x0079, 0x24da, 0x007c, 0x2071,
+	0x766d, 0x7004, 0x0079, 0x245c, 0x2460, 0x2461, 0x246b, 0x247d,
+	0x007c, 0x0090, 0x246a, 0x0068, 0x246a, 0x2b78, 0x7818, 0xd084,
+	0x0040, 0x2489, 0x007c, 0x2b78, 0x2061, 0x76bd, 0x6008, 0xa08e,
+	0x0100, 0x0040, 0x2478, 0xa086, 0x0200, 0x0040, 0x2535, 0x007c,
+	0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010, 0x2068, 0x6834,
+	0xa086, 0x0103, 0x0040, 0x2485, 0x007c, 0x2a60, 0x2b78, 0x7018,
+	0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8, 0x2492, 0x61b0,
+	0x0079, 0x249a, 0x2100, 0xa08a, 0x0036, 0x00c8, 0x2531, 0x61b0,
+	0x0079, 0x24da, 0x2513, 0x2545, 0x254d, 0x2551, 0x2559, 0x255f,
+	0x2563, 0x256c, 0x2570, 0x2578, 0x257c, 0x2531, 0x2531, 0x2531,
+	0x2580, 0x2531, 0x2590, 0x25a7, 0x25be, 0x263a, 0x263f, 0x266c,
+	0x26b9, 0x26c8, 0x26e9, 0x271f, 0x2729, 0x2736, 0x2749, 0x2761,
+	0x276a, 0x27a7, 0x27ad, 0x2531, 0x27bd, 0x2531, 0x2531, 0x2531,
+	0x2531, 0x2531, 0x27c1, 0x27c7, 0x2531, 0x2531, 0x2531, 0x2531,
+	0x2531, 0x2531, 0x2531, 0x2531, 0x27cf, 0x2531, 0x2531, 0x2531,
+	0x2531, 0x2531, 0x27dc, 0x27e2, 0x2531, 0x2531, 0x2531, 0x2531,
+	0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531,
+	0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531,
+	0x2531, 0x2531, 0x2578, 0x257c, 0x2531, 0x2531, 0x27f4, 0x2531,
+	0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531,
+	0x2531, 0x2531, 0x2841, 0x290e, 0x2922, 0x2929, 0x298c, 0x29e7,
+	0x29f2, 0x2a34, 0x2a41, 0x2a4e, 0x2a51, 0x27f8, 0x2a7a, 0x2ac1,
+	0x2ace, 0x2bc8, 0x2cb6, 0x2cdd, 0x2dd5, 0x2de3, 0x2df0, 0x2e2a,
+	0x713c, 0x0078, 0x2513, 0x2021, 0x4000, 0x1078, 0x2d24, 0x127e,
+	0x2091, 0x8000, 0x0068, 0x2520, 0x7818, 0xd084, 0x0040, 0x2523,
+	0x127f, 0x0078, 0x2517, 0x781b, 0x0001, 0x7c22, 0x7926, 0x7a2a,
+	0x7b2e, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091, 0x5000, 0x127f,
+	0x007c, 0x2021, 0x4001, 0x0078, 0x2515, 0x2021, 0x4002, 0x0078,
+	0x2515, 0x2021, 0x4003, 0x0078, 0x2515, 0x2021, 0x4005, 0x0078,
+	0x2515, 0x2021, 0x4006, 0x0078, 0x2515, 0xa02e, 0x2520, 0x7b28,
+	0x7a2c, 0x7824, 0x7930, 0x0078, 0x2d33, 0x7823, 0x0004, 0x7824,
+	0x007a, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078,
+	0x2d37, 0x7924, 0x7828, 0x2114, 0x200a, 0x0078, 0x2513, 0x7924,
+	0x2114, 0x0078, 0x2513, 0x2099, 0x0009, 0x20a1, 0x0009, 0x20a9,
+	0x0007, 0x53a3, 0x0078, 0x2513, 0x7824, 0x2060, 0x0078, 0x2582,
+	0x2009, 0x0001, 0x2011, 0x000f, 0x2019, 0x0013, 0x0078, 0x2513,
+	0x7d38, 0x7c3c, 0x0078, 0x2547, 0x7d38, 0x7c3c, 0x0078, 0x2553,
+	0x2061, 0x1000, 0x610c, 0xa006, 0x2c14, 0xa200, 0x8c60, 0x8109,
+	0x00c0, 0x2584, 0x2010, 0xa005, 0x0040, 0x2513, 0x0078, 0x2539,
+	0x2061, 0x7651, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x2541, 0x8019,
+	0x0040, 0x2541, 0x604a, 0x6142, 0x782c, 0x6052, 0x7828, 0x6056,
+	0xa006, 0x605a, 0x605e, 0x1078, 0x3c71, 0x0078, 0x2513, 0x2061,
+	0x7651, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x2541, 0x8019, 0x0040,
+	0x2541, 0x604e, 0x6146, 0x782c, 0x6062, 0x7828, 0x6066, 0xa006,
+	0x606a, 0x606e, 0x1078, 0x3a47, 0x0078, 0x2513, 0xa02e, 0x2520,
+	0x81ff, 0x00c0, 0x253d, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005,
+	0x20a1, 0x7674, 0x41a1, 0x1078, 0x2cfb, 0x0040, 0x253d, 0x2009,
+	0x0020, 0x1078, 0x2d33, 0x701b, 0x25d6, 0x007c, 0x6834, 0x2008,
+	0xa084, 0x00ff, 0xa096, 0x0011, 0x0040, 0x25e2, 0xa096, 0x0019,
+	0x00c0, 0x253d, 0x810f, 0xa18c, 0x00ff, 0x0040, 0x253d, 0x710e,
+	0x700c, 0x8001, 0x0040, 0x2613, 0x700e, 0x1078, 0x2cfb, 0x0040,
+	0x253d, 0x2009, 0x0020, 0x2061, 0x76bd, 0x6224, 0x6328, 0x642c,
+	0x6530, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
+	0x0000, 0x1078, 0x2d33, 0x701b, 0x2606, 0x007c, 0x6834, 0xa084,
+	0x00ff, 0xa096, 0x0002, 0x0040, 0x2611, 0xa096, 0x000a, 0x00c0,
+	0x253d, 0x0078, 0x25e8, 0x7010, 0x2068, 0x6838, 0xc0fd, 0x683a,
+	0x1078, 0x3722, 0x00c0, 0x2621, 0x7007, 0x0003, 0x701b, 0x2623,
+	0x007c, 0x1078, 0x3b0a, 0x127e, 0x2091, 0x8000, 0x20a9, 0x0005,
+	0x2099, 0x7674, 0x530a, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1,
+	0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009, 0x0020, 0x127f,
+	0x0078, 0x2d37, 0x6198, 0x7824, 0x609a, 0x0078, 0x2513, 0x2091,
+	0x8000, 0x7823, 0x4000, 0x7827, 0x4953, 0x782b, 0x5020, 0x782f,
+	0x2020, 0x2009, 0x017f, 0x2104, 0x7832, 0x3f00, 0x7836, 0x2061,
+	0x0100, 0x6200, 0x2061, 0x0200, 0x603c, 0x8007, 0xa205, 0x783a,
+	0x2009, 0x04fd, 0x2104, 0x783e, 0x781b, 0x0001, 0x2091, 0x5000,
+	0x2091, 0x4080, 0x2071, 0x0010, 0x20c1, 0x00f0, 0xa08a, 0x0003,
+	0x00c8, 0x0427, 0x0078, 0x0423, 0x81ff, 0x00c0, 0x253d, 0x1078,
+	0x2d13, 0x0040, 0x2541, 0x7c28, 0x7d2c, 0x1078, 0x3969, 0xd28c,
+	0x00c0, 0x267e, 0x1078, 0x38f9, 0x0078, 0x2680, 0x1078, 0x3935,
+	0x00c0, 0x26aa, 0x2061, 0x7d00, 0x127e, 0x2091, 0x8000, 0x6000,
+	0xa086, 0x0000, 0x0040, 0x2698, 0x6010, 0xa06d, 0x0040, 0x2698,
+	0x683c, 0xa406, 0x00c0, 0x2698, 0x6840, 0xa506, 0x0040, 0x26a3,
+	0x127f, 0xace0, 0x0008, 0x2001, 0x7615, 0x2004, 0xac02, 0x00c8,
+	0x253d, 0x0078, 0x2684, 0x1078, 0x6738, 0x127f, 0x0040, 0x253d,
+	0x0078, 0x2513, 0xa00e, 0x2001, 0x0005, 0x1078, 0x3b0a, 0x127e,
+	0x2091, 0x8000, 0x1078, 0x6b47, 0x1078, 0x3a7a, 0x127f, 0x0078,
+	0x2513, 0x81ff, 0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541,
+	0x1078, 0x38ae, 0x1078, 0x397a, 0x0040, 0x253d, 0x0078, 0x2513,
+	0x81ff, 0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541, 0x2031,
+	0x000f, 0x1078, 0x38ae, 0x8631, 0x00c8, 0x26d1, 0x2019, 0x0005,
+	0x1078, 0x399b, 0x0040, 0x253d, 0x7828, 0xa08a, 0x1000, 0x00c8,
+	0x2541, 0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x457b, 0x0078,
+	0x2513, 0x127e, 0x2091, 0x8000, 0x81ff, 0x00c0, 0x2719, 0x2029,
+	0x00ff, 0x644c, 0x2400, 0xa506, 0x0040, 0x2713, 0x2508, 0x1078,
+	0x3825, 0x00c0, 0x2713, 0x2031, 0x000f, 0x1078, 0x38ae, 0x8631,
+	0x00c8, 0x26fd, 0x2019, 0x0004, 0x1078, 0x399b, 0x0040, 0x2719,
+	0x7824, 0xa08a, 0x1000, 0x00c8, 0x271c, 0x8003, 0x800b, 0x810b,
+	0xa108, 0x1078, 0x457b, 0x8529, 0x00c8, 0x26f2, 0x127f, 0x0078,
+	0x2513, 0x127f, 0x0078, 0x253d, 0x127f, 0x0078, 0x2541, 0x1078,
+	0x2d13, 0x0040, 0x2541, 0x1078, 0x38de, 0x1078, 0x3969, 0x0078,
+	0x2513, 0x81ff, 0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541,
+	0x1078, 0x38c7, 0x1078, 0x3969, 0x0078, 0x2513, 0x81ff, 0x00c0,
+	0x253d, 0x1078, 0x2d13, 0x0040, 0x2541, 0x1078, 0x3938, 0x0040,
+	0x253d, 0x1078, 0x376a, 0x1078, 0x38f2, 0x1078, 0x3969, 0x0078,
+	0x2513, 0x1078, 0x2d13, 0x0040, 0x2541, 0x1078, 0x38ae, 0x62a0,
+	0x2019, 0x0005, 0x0c7e, 0x1078, 0x39a6, 0x0c7f, 0x1078, 0x4962,
+	0x1078, 0x48a5, 0x2c08, 0x1078, 0x737b, 0x1078, 0x3969, 0x0078,
+	0x2513, 0x1078, 0x2d13, 0x0040, 0x2541, 0x1078, 0x3969, 0x2208,
+	0x0078, 0x2513, 0x157e, 0x0d7e, 0x0e7e, 0x2069, 0x76ff, 0x6810,
+	0x6914, 0xa10a, 0x00c8, 0x2776, 0x2009, 0x0000, 0x6816, 0x2011,
+	0x0000, 0x2019, 0x0000, 0x20a9, 0x007e, 0x2069, 0x7720, 0x2d04,
+	0xa075, 0x0040, 0x278b, 0x704c, 0x1078, 0x2795, 0xa210, 0x7080,
+	0x1078, 0x2795, 0xa318, 0x8d68, 0x00f0, 0x277f, 0x2300, 0xa218,
+	0x0e7f, 0x0d7f, 0x157f, 0x0078, 0x2513, 0x0f7e, 0x017e, 0xa07d,
+	0x0040, 0x27a4, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff, 0x0040,
+	0x27a4, 0x2178, 0x0078, 0x279c, 0x017f, 0x0f7f, 0x007c, 0x2069,
+	0x76ff, 0x6910, 0x629c, 0x0078, 0x2513, 0x81ff, 0x00c0, 0x253d,
+	0x614c, 0xa190, 0x232f, 0x2214, 0xa294, 0x00ff, 0x6068, 0xa084,
+	0xff00, 0xa215, 0x6364, 0x0078, 0x2513, 0x613c, 0x6240, 0x0078,
+	0x2513, 0x1078, 0x2d13, 0x0040, 0x2541, 0x0078, 0x2513, 0x1078,
+	0x2d13, 0x0040, 0x2541, 0x6244, 0x6338, 0x0078, 0x2513, 0x613c,
+	0x6240, 0x7824, 0x603e, 0x7b28, 0x6342, 0x2069, 0x7651, 0x831f,
+	0xa305, 0x6816, 0x0078, 0x2513, 0x1078, 0x2d13, 0x0040, 0x2541,
+	0x0078, 0x2513, 0x1078, 0x2d13, 0x0040, 0x2541, 0x7828, 0xa00d,
+	0x0040, 0x2541, 0x782c, 0xa005, 0x0040, 0x2541, 0x6244, 0x6146,
+	0x6338, 0x603a, 0x0078, 0x2513, 0x7d38, 0x7c3c, 0x0078, 0x25c0,
+	0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x00c8, 0x253d, 0x624c,
+	0xa084, 0xff00, 0x8007, 0xa206, 0x00c0, 0x2810, 0x2001, 0x7640,
+	0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2d37,
+	0x81ff, 0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541, 0x6004,
+	0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x253d, 0x0c7e, 0x1078,
+	0x2cfb, 0x0c7f, 0x0040, 0x253d, 0x6837, 0x0000, 0x6838, 0xc0fd,
+	0x683a, 0x1078, 0x6a41, 0x0040, 0x253d, 0x7007, 0x0003, 0x701b,
+	0x2832, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x253d, 0xad80,
+	0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078,
+	0x2d37, 0x1078, 0x2cfb, 0x0040, 0x253d, 0x2009, 0x001c, 0x7a2c,
+	0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x2d33, 0x701b, 0x2850, 0x007c,
+	0xade8, 0x000d, 0x6800, 0xa005, 0x0040, 0x2541, 0x6804, 0xd0ac,
+	0x0040, 0x285d, 0xd0a4, 0x0040, 0x2541, 0xd094, 0x0040, 0x2868,
+	0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18c, 0xffdf, 0x6106, 0x0c7f,
+	0xd08c, 0x0040, 0x2873, 0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18d,
+	0x0010, 0x6106, 0x0c7f, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0002,
+	0x0048, 0x2888, 0xd084, 0x0040, 0x2888, 0x6a28, 0xa28a, 0x007f,
+	0x00c8, 0x2541, 0xa288, 0x232f, 0x210c, 0xa18c, 0x00ff, 0x6152,
+	0xd0dc, 0x0040, 0x2891, 0x6828, 0xa08a, 0x007f, 0x00c8, 0x2541,
+	0x604e, 0x6808, 0xa08a, 0x0100, 0x0048, 0x2541, 0xa08a, 0x0841,
+	0x00c8, 0x2541, 0xa084, 0x0007, 0x00c0, 0x2541, 0x680c, 0xa005,
+	0x0040, 0x2541, 0x6810, 0xa005, 0x0040, 0x2541, 0x6848, 0x6940,
+	0xa10a, 0x00c8, 0x2541, 0x8001, 0x0040, 0x2541, 0x684c, 0x6944,
+	0xa10a, 0x00c8, 0x2541, 0x8001, 0x0040, 0x2541, 0x20a9, 0x001c,
+	0x2d98, 0x2069, 0x7651, 0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff,
+	0x613e, 0x8007, 0xa084, 0x00ff, 0x6042, 0x1078, 0x3c71, 0x1078,
+	0x3a47, 0x6000, 0xa086, 0x0000, 0x00c0, 0x290c, 0x6808, 0x602a,
+	0x1078, 0x1dea, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f,
+	0x8217, 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4,
+	0x0040, 0x28ec, 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f,
+	0x8217, 0x831f, 0x0078, 0x28ee, 0xa084, 0xf0ff, 0x6006, 0x610a,
+	0x620e, 0x6312, 0x1078, 0x4607, 0x0c7e, 0x2061, 0x0100, 0x602f,
+	0x0040, 0x602f, 0x0000, 0x0c7f, 0x60b4, 0xa005, 0x0040, 0x2908,
+	0x6003, 0x0001, 0x2091, 0x301d, 0x1078, 0x357b, 0x0078, 0x290c,
+	0x6003, 0x0004, 0x2091, 0x301d, 0x0078, 0x2513, 0x6000, 0xa086,
+	0x0000, 0x0040, 0x253d, 0x2069, 0x7651, 0x7830, 0x6842, 0x7834,
+	0x6846, 0x2d00, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
+	0x0078, 0x2d37, 0x81ff, 0x00c0, 0x253d, 0x1078, 0x357b, 0x0078,
+	0x2513, 0x81ff, 0x00c0, 0x253d, 0x617c, 0x81ff, 0x0040, 0x2943,
+	0x703f, 0x0000, 0x2001, 0x7cc0, 0x2009, 0x0040, 0x7a2c, 0x7b28,
+	0x7c3c, 0x7d38, 0x127e, 0x2091, 0x8000, 0x1078, 0x2d37, 0x701b,
+	0x2510, 0x127f, 0x007c, 0x703f, 0x0001, 0x0d7e, 0x2069, 0x7cc0,
+	0x20a9, 0x0040, 0x20a1, 0x7cc0, 0x2019, 0xffff, 0x43a4, 0x654c,
+	0xa588, 0x232f, 0x210c, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011,
+	0x0002, 0x2100, 0xa506, 0x0040, 0x2975, 0x1078, 0x3825, 0x00c0,
+	0x2975, 0x6014, 0x821c, 0x0048, 0x296d, 0xa398, 0x7cc0, 0xa085,
+	0xff00, 0x8007, 0x201a, 0x0078, 0x2974, 0xa398, 0x7cc0, 0x2324,
+	0xa4a4, 0xff00, 0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080,
+	0x00c8, 0x297c, 0x0078, 0x2959, 0x8201, 0x8007, 0x2d0c, 0xa105,
+	0x206a, 0x0d7f, 0x20a9, 0x0040, 0x20a1, 0x7cc0, 0x2099, 0x7cc0,
+	0x1078, 0x35c4, 0x0078, 0x2932, 0x1078, 0x2d13, 0x0040, 0x2541,
+	0x0c7e, 0x1078, 0x2cfb, 0x0c7f, 0x0040, 0x253d, 0x2001, 0x7652,
+	0x2004, 0xd0b4, 0x0040, 0x29b9, 0x6000, 0xd08c, 0x00c0, 0x29b9,
+	0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x29b9, 0x6837,
+	0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x6a79, 0x0040, 0x253d,
+	0x7007, 0x0003, 0x701b, 0x29b5, 0x007c, 0x1078, 0x2d13, 0x0040,
+	0x2541, 0x20a9, 0x0029, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3,
+	0x20a9, 0x0002, 0xac80, 0x0004, 0x2098, 0xad80, 0x0004, 0x20a0,
+	0x1078, 0x35c4, 0x20a9, 0x0004, 0xac80, 0x0006, 0x2098, 0xad80,
+	0x0006, 0x20a0, 0x1078, 0x35c4, 0x20a9, 0x0004, 0xac80, 0x000a,
+	0x2098, 0xad80, 0x000a, 0x20a0, 0x1078, 0x35c4, 0x2d00, 0x2009,
+	0x0029, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2d37, 0x81ff,
+	0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541, 0x1078, 0x3985,
+	0x0078, 0x2513, 0x81ff, 0x00c0, 0x253d, 0x7828, 0xa08a, 0x1000,
+	0x00c8, 0x2541, 0x1078, 0x2d13, 0x0040, 0x2541, 0x2031, 0x000f,
+	0x1078, 0x38ae, 0x8631, 0x00c8, 0x2a00, 0x2019, 0x0004, 0x1078,
+	0x399b, 0x7924, 0x810f, 0x7a28, 0x1078, 0x2a10, 0x0078, 0x2513,
+	0xa186, 0x00ff, 0x0040, 0x2a18, 0x1078, 0x2a28, 0x0078, 0x2a27,
+	0x2029, 0x007e, 0x2061, 0x7600, 0x644c, 0x2400, 0xa506, 0x0040,
+	0x2a24, 0x2508, 0x1078, 0x2a28, 0x8529, 0x00c8, 0x2a1d, 0x007c,
+	0x1078, 0x3825, 0x00c0, 0x2a33, 0x2200, 0x8003, 0x800b, 0x810b,
+	0xa108, 0x1078, 0x457b, 0x007c, 0x81ff, 0x00c0, 0x253d, 0x1078,
+	0x2d13, 0x0040, 0x2541, 0x1078, 0x38ae, 0x1078, 0x3990, 0x0078,
+	0x2513, 0x81ff, 0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541,
+	0x1078, 0x38ae, 0x1078, 0x397a, 0x0078, 0x2513, 0x6100, 0x0078,
+	0x2513, 0x1078, 0x2d13, 0x0040, 0x2541, 0x6004, 0xa086, 0x0707,
+	0x0040, 0x2541, 0x2001, 0x7600, 0x2004, 0xa086, 0x0003, 0x00c0,
+	0x253d, 0x0d7e, 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x2a6a,
+	0xace8, 0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a,
+	0x6b04, 0x831f, 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200,
+	0x0078, 0x2513, 0x7824, 0xa084, 0x00ff, 0xa086, 0x00ff, 0x0040,
+	0x2a84, 0x81ff, 0x00c0, 0x253d, 0x7828, 0xa08a, 0x1000, 0x00c8,
+	0x2541, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff, 0x0040,
+	0x2a98, 0xa182, 0x007f, 0x00c8, 0x2541, 0x2100, 0x1078, 0x209a,
+	0x027e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x2061, 0x7849, 0x601b,
+	0x0000, 0x601f, 0x0000, 0x2061, 0x0100, 0x6030, 0xa084, 0x00ff,
+	0x810f, 0xa105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009,
+	0x001e, 0x2011, 0x35a0, 0x1078, 0x45fe, 0x7924, 0xa18c, 0xff00,
+	0x810f, 0x7a28, 0x1078, 0x2a10, 0x127f, 0x0c7f, 0x027f, 0x0078,
+	0x2513, 0x7924, 0xa18c, 0xff00, 0x810f, 0x0c7e, 0x1078, 0x37ee,
+	0x2c08, 0x0c7f, 0x00c0, 0x2541, 0x0078, 0x2513, 0x81ff, 0x00c0,
+	0x253d, 0x60bc, 0xd09c, 0x0040, 0x253d, 0x1078, 0x2cfb, 0x0040,
+	0x253d, 0x6823, 0x0000, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
+	0x1078, 0x2d33, 0x701b, 0x2ae5, 0x007c, 0x2009, 0x0080, 0x1078,
+	0x3825, 0x00c0, 0x2af2, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
+	0x0040, 0x2af6, 0x2021, 0x400a, 0x0078, 0x2515, 0x0d7e, 0xade8,
+	0x000d, 0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820,
+	0xa0be, 0x0100, 0x0040, 0x2b68, 0xa0be, 0x0112, 0x0040, 0x2b68,
+	0xa0be, 0x0113, 0x0040, 0x2b68, 0xa0be, 0x0114, 0x0040, 0x2b68,
+	0xa0be, 0x0117, 0x0040, 0x2b68, 0xa0be, 0x011a, 0x0040, 0x2b68,
+	0xa0be, 0x0121, 0x0040, 0x2b5e, 0xa0be, 0x0131, 0x0040, 0x2b5e,
+	0xa0be, 0x0171, 0x0040, 0x2b68, 0xa0be, 0x0173, 0x0040, 0x2b68,
+	0xa0be, 0x01a1, 0x00c0, 0x2b31, 0x6830, 0x8007, 0x6832, 0x0078,
+	0x2b6e, 0xa0be, 0x0212, 0x0040, 0x2b64, 0xa0be, 0x0213, 0x0040,
+	0x2b64, 0xa0be, 0x0214, 0x0040, 0x2b56, 0xa0be, 0x0217, 0x0040,
+	0x2b50, 0xa0be, 0x021a, 0x00c0, 0x2b4a, 0x6838, 0x8007, 0x683a,
+	0x0078, 0x2b68, 0xa0be, 0x0300, 0x0040, 0x2b68, 0x0078, 0x2541,
+	0xad80, 0x0010, 0x20a9, 0x0007, 0x1078, 0x2ba4, 0xad80, 0x000e,
+	0x20a9, 0x0001, 0x1078, 0x2ba4, 0x0078, 0x2b68, 0xad80, 0x000c,
+	0x1078, 0x2bb2, 0x0078, 0x2b6e, 0xad80, 0x000e, 0x1078, 0x2bb2,
+	0xad80, 0x000c, 0x20a9, 0x0001, 0x1078, 0x2ba4, 0x0c7e, 0x1078,
+	0x2cfb, 0x0040, 0x2b99, 0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119,
+	0x684f, 0x0020, 0x685b, 0x0001, 0x810b, 0x697e, 0x6883, 0x0000,
+	0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b, 0x0000, 0x0c7f,
+	0x0d7f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000,
+	0x1078, 0x6a5d, 0x0040, 0x253d, 0x7007, 0x0003, 0x701b, 0x2b9d,
+	0x007c, 0x0c7f, 0x0d7f, 0x0078, 0x253d, 0x6820, 0xa086, 0x8001,
+	0x0040, 0x253d, 0x0078, 0x2513, 0x017e, 0x2008, 0x2044, 0x8000,
+	0x204c, 0x8000, 0x290a, 0x8108, 0x280a, 0x8108, 0x00f0, 0x2ba6,
+	0x017f, 0x007c, 0x017e, 0x0a7e, 0x0b7e, 0x2008, 0x2044, 0x8000,
+	0x204c, 0x8000, 0x2054, 0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a,
+	0x8108, 0x290a, 0x8108, 0x280a, 0x0b7f, 0x0a7f, 0x017f, 0x007c,
+	0x81ff, 0x00c0, 0x253d, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f,
+	0xa182, 0x0080, 0x0048, 0x2541, 0xa182, 0x00ff, 0x00c8, 0x2541,
+	0x7a2c, 0x7b28, 0x6064, 0xa306, 0x00c0, 0x2be6, 0x6068, 0xa24e,
+	0x0040, 0x2541, 0xa9cc, 0xff00, 0x0040, 0x2541, 0x0c7e, 0x1078,
+	0x2c5a, 0x2c68, 0x0c7f, 0x0040, 0x2c0d, 0xa0c6, 0x4000, 0x00c0,
+	0x2bf3, 0x0078, 0x2c0a, 0xa0c6, 0x4007, 0x00c0, 0x2bfa, 0x2408,
+	0x0078, 0x2c0a, 0xa0c6, 0x4008, 0x00c0, 0x2c02, 0x2708, 0x2610,
+	0x0078, 0x2c0a, 0xa0c6, 0x4009, 0x00c0, 0x2c08, 0x0078, 0x2c0a,
+	0x2001, 0x4006, 0x2020, 0x0078, 0x2515, 0x017e, 0x0b7e, 0x0c7e,
+	0x0e7e, 0x2c70, 0x1078, 0x5b9c, 0x0040, 0x2c48, 0x2d00, 0x601a,
+	0x2e58, 0x0e7f, 0x0e7e, 0x0c7e, 0x1078, 0x2cfb, 0x0c7f, 0x2b70,
+	0x0040, 0x253d, 0x6837, 0x0000, 0x2d00, 0x6012, 0x6833, 0x0000,
+	0x6838, 0xc0fd, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x22bb,
+	0x127f, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x37bd, 0x2001,
+	0x0002, 0x1078, 0x37d1, 0x127e, 0x2091, 0x8000, 0x7088, 0x8000,
+	0x708a, 0x127f, 0x2009, 0x0002, 0x1078, 0x5c29, 0xa085, 0x0001,
+	0x0e7f, 0x0c7f, 0x0b7f, 0x017f, 0x0040, 0x253d, 0x7007, 0x0003,
+	0x701b, 0x2c53, 0x007c, 0x6830, 0xa086, 0x0100, 0x00c0, 0x2513,
+	0x0078, 0x253d, 0x0e7e, 0x0d7e, 0x2029, 0x0000, 0x2021, 0x0080,
+	0x20a9, 0x007f, 0x2071, 0x77a0, 0x2e04, 0xa005, 0x00c0, 0x2c6e,
+	0x2100, 0xa406, 0x0040, 0x2cab, 0x0078, 0x2c9f, 0x2068, 0x6f10,
+	0x2700, 0xa306, 0x00c0, 0x2c90, 0x6e14, 0x2600, 0xa206, 0x00c0,
+	0x2c90, 0x2400, 0xa106, 0x00c0, 0x2c8c, 0x2d60, 0xd884, 0x0040,
+	0x2cb1, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2cb1,
+	0x2001, 0x4000, 0x0078, 0x2cb2, 0x2001, 0x4007, 0x0078, 0x2cb2,
+	0x2400, 0xa106, 0x00c0, 0x2c9f, 0x6e14, 0x87ff, 0x00c0, 0x2c9b,
+	0x86ff, 0x0040, 0x2cab, 0x2001, 0x4008, 0x0078, 0x2cb2, 0x8420,
+	0x8e70, 0x00f0, 0x2c64, 0x2001, 0x4009, 0x0078, 0x2cb2, 0x2001,
+	0x0001, 0x0078, 0x2cb2, 0x1078, 0x37ee, 0x00c0, 0x2ca7, 0x6312,
+	0x6216, 0xa006, 0xa005, 0x0d7f, 0x0e7f, 0x007c, 0x81ff, 0x00c0,
+	0x253d, 0x1078, 0x2cfb, 0x0040, 0x253d, 0x6837, 0x0000, 0x7824,
+	0xa005, 0x0040, 0x2541, 0xa096, 0x00ff, 0x0040, 0x2ccb, 0xa092,
+	0x0004, 0x00c8, 0x2541, 0x2010, 0x2d18, 0x1078, 0x227d, 0x0040,
+	0x253d, 0x7007, 0x0003, 0x701b, 0x2cd6, 0x007c, 0x6830, 0xa086,
+	0x0100, 0x0040, 0x253d, 0x0078, 0x2513, 0x81ff, 0x00c0, 0x253d,
+	0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048, 0x2541,
+	0xa182, 0x00ff, 0x00c8, 0x2541, 0x127e, 0x2091, 0x8000, 0x1078,
+	0x697f, 0x00c0, 0x2cf8, 0x1078, 0x380d, 0x127f, 0x0078, 0x2513,
+	0x127f, 0x0078, 0x253d, 0x1078, 0x132f, 0x0040, 0x2d12, 0xa006,
+	0x6802, 0x7010, 0xa005, 0x00c0, 0x2d0a, 0x2d00, 0x7012, 0x7016,
+	0x0078, 0x2d10, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016,
+	0xad80, 0x000d, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x1078,
+	0x3825, 0x00c0, 0x2d21, 0xa6b4, 0x00ff, 0xa682, 0x0010, 0x0048,
+	0x2d22, 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff, 0x0040,
+	0x2d2f, 0x2168, 0x6904, 0x1078, 0x1348, 0x0078, 0x2d26, 0x7112,
+	0x7116, 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x2d39, 0x2031,
+	0x0000, 0x2061, 0x76bd, 0x6606, 0x6112, 0x600e, 0x6226, 0x632a,
+	0x642e, 0x6532, 0x2c10, 0x1078, 0x137f, 0x7007, 0x0002, 0x701b,
+	0x2513, 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079, 0x0000,
+	0x2001, 0x767b, 0x2004, 0xa005, 0x00c0, 0x2d65, 0x0068, 0x2d65,
+	0x7818, 0xd084, 0x00c0, 0x2d65, 0x781b, 0x0001, 0x7a22, 0x7b26,
+	0x7c2a, 0x2091, 0x4080, 0x0078, 0x2d8a, 0x017e, 0x0c7e, 0x0e7e,
+	0x2071, 0x766d, 0x7138, 0xa182, 0x0008, 0x0048, 0x2d73, 0x7030,
+	0x2060, 0x0078, 0x2d84, 0x7030, 0xa0e0, 0x0008, 0xac82, 0x76bd,
+	0x0048, 0x2d7c, 0x2061, 0x767d, 0x2c00, 0x7032, 0x81ff, 0x00c0,
+	0x2d82, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a, 0x0e7f,
+	0x0c7f, 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071, 0x766d,
+	0x7038, 0xa005, 0x0040, 0x2dc6, 0x127e, 0x2091, 0x8000, 0x0068,
+	0x2dc5, 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x2dc4,
+	0x0c7e, 0x781b, 0x0001, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004,
+	0x7826, 0x6008, 0x782a, 0x2091, 0x4080, 0x7038, 0x8001, 0x703a,
+	0xa005, 0x00c0, 0x2dba, 0x7033, 0x767d, 0x7037, 0x767d, 0x0c7f,
+	0x0078, 0x2dc4, 0xac80, 0x0008, 0xa0fa, 0x76bd, 0x0048, 0x2dc2,
+	0x2001, 0x767d, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f, 0x007c,
+	0x027e, 0x2001, 0x7652, 0x2004, 0xd0c4, 0x0040, 0x2dd3, 0x2011,
+	0x8014, 0x1078, 0x2d4a, 0x027f, 0x007c, 0x81ff, 0x00c0, 0x253d,
+	0x127e, 0x2091, 0x8000, 0x6030, 0xc08d, 0x6032, 0x1078, 0x357b,
+	0x127f, 0x0078, 0x2513, 0x7824, 0x2008, 0xa18c, 0xfffd, 0x00c0,
+	0x2dee, 0x61c8, 0xa10d, 0x61ca, 0x0078, 0x2513, 0x0078, 0x2541,
+	0x81ff, 0x00c0, 0x253d, 0x6000, 0xa086, 0x0003, 0x00c0, 0x253d,
+	0x2001, 0x7652, 0x2004, 0xd0a4, 0x00c0, 0x253d, 0x1078, 0x2d13,
+	0x0040, 0x2541, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
+	0x2e0d, 0x7828, 0xa005, 0x0040, 0x2513, 0x0c7e, 0x1078, 0x2cfb,
+	0x0c7f, 0x0040, 0x253d, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838,
+	0xc0fd, 0x683a, 0x1078, 0x6ae6, 0x0040, 0x253d, 0x7007, 0x0003,
+	0x701b, 0x2e23, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x253d,
+	0x0078, 0x2513, 0x2001, 0x7600, 0x2004, 0xa086, 0x0003, 0x00c0,
+	0x253d, 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x2cfb,
+	0x0040, 0x253d, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000,
+	0x702f, 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x1078, 0x3825,
+	0x00c0, 0x2e70, 0x6004, 0xa0c6, 0x0707, 0x0040, 0x2e70, 0xa084,
+	0x00ff, 0xa0c6, 0x0006, 0x00c0, 0x2e70, 0x87ff, 0x0040, 0x2e63,
+	0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078,
+	0x2bb2, 0x0078, 0x2e6c, 0xac80, 0x000a, 0x2098, 0x3400, 0x20a9,
+	0x0004, 0x53a3, 0x1078, 0x2bb2, 0x21a2, 0x94a0, 0xa6b0, 0x0005,
+	0x8108, 0xa186, 0x007e, 0x0040, 0x2e7b, 0xa686, 0x0028, 0x0040,
+	0x2e84, 0x0078, 0x2e46, 0x86ff, 0x00c0, 0x2e82, 0x7120, 0x810b,
+	0x0078, 0x2513, 0x702f, 0x0001, 0x711e, 0x7020, 0xa600, 0x7022,
+	0x772a, 0x2061, 0x76bd, 0x6007, 0x0000, 0x6612, 0x7024, 0x600e,
+	0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x137f, 0x7007,
+	0x0002, 0x701b, 0x2e9c, 0x007c, 0x702c, 0xa005, 0x00c0, 0x2eae,
+	0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061, 0x76bd,
+	0x6224, 0x6328, 0x642c, 0x6530, 0x0078, 0x2e46, 0x7120, 0x810b,
+	0x0078, 0x2513, 0x127e, 0x0c7e, 0x0e7e, 0x2061, 0x0100, 0x2071,
+	0x7600, 0x6044, 0xd0a4, 0x00c0, 0x2edb, 0xd084, 0x0040, 0x2ec4,
+	0x1078, 0x3004, 0x0078, 0x2ed7, 0xd08c, 0x0040, 0x2ecb, 0x1078,
+	0x2f1b, 0x0078, 0x2ed7, 0xd094, 0x0040, 0x2ed2, 0x1078, 0x2efe,
+	0x0078, 0x2ed7, 0xd09c, 0x0040, 0x2ed7, 0x1078, 0x2ee5, 0x0e7f,
+	0x0c7f, 0x127f, 0x007c, 0x017e, 0x6128, 0xd19c, 0x00c0, 0x2ee2,
+	0xc19d, 0x612a, 0x017f, 0x0078, 0x2ed7, 0x6043, 0x0040, 0x6043,
 	0x0000, 0x706f, 0x0000, 0x7087, 0x0001, 0x70a7, 0x0000, 0x2009,
-	0x73c0, 0x200b, 0x0000, 0x7073, 0x000f, 0x2009, 0x000f, 0x2011,
-	0x3187, 0x1078, 0x415f, 0x007c, 0x7070, 0xa005, 0x00c0, 0x2b4a,
-	0x2011, 0x3187, 0x1078, 0x40d1, 0x6043, 0x0020, 0x6043, 0x0000,
-	0x6044, 0xd08c, 0x00c0, 0x2b46, 0x7003, 0x0001, 0x7083, 0x0000,
-	0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x2b4a, 0x7077, 0x0000,
-	0x0078, 0x2b4a, 0x007c, 0x7074, 0xa08a, 0x0003, 0x00c8, 0x2b54,
-	0x1079, 0x2b57, 0x0078, 0x2b56, 0x1078, 0x12b7, 0x007c, 0x2b5a,
-	0x2ba9, 0x2c33, 0x0f7e, 0x7077, 0x0001, 0x20e1, 0xa000, 0x20e1,
-	0x8700, 0x1078, 0x1bcc, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2079,
-	0x7200, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, 0x780f,
+	0x7cc0, 0x200b, 0x0000, 0x707f, 0x0000, 0x7073, 0x000f, 0x2009,
+	0x000f, 0x2011, 0x353b, 0x1078, 0x45fe, 0x007c, 0x7070, 0xa005,
+	0x00c0, 0x2f1a, 0x2011, 0x353b, 0x1078, 0x456e, 0x6043, 0x0020,
+	0x6043, 0x0000, 0x6044, 0xd08c, 0x00c0, 0x2f16, 0x7083, 0x0000,
+	0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x2f1a, 0x7077, 0x0000,
+	0x0078, 0x2f1a, 0x007c, 0x7074, 0xa08a, 0x0003, 0x00c8, 0x2f24,
+	0x1079, 0x2f27, 0x0078, 0x2f26, 0x1078, 0x12d5, 0x007c, 0x2f2a,
+	0x2f79, 0x3003, 0x0f7e, 0x7077, 0x0001, 0x20e1, 0xa000, 0x20e1,
+	0x8700, 0x1078, 0x1dea, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2079,
+	0x7b00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, 0x780f,
 	0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000, 0x781f,
 	0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000, 0x782f,
-	0x0000, 0x2079, 0x720c, 0x207b, 0x1101, 0x7807, 0x0000, 0x2099,
-	0x6d05, 0x20a1, 0x720e, 0x20a9, 0x0004, 0x53a3, 0x2079, 0x7212,
-	0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0x7200, 0x20a1, 0x020b,
+	0x0000, 0x2079, 0x7b0c, 0x207b, 0x1101, 0x7807, 0x0000, 0x2099,
+	0x7605, 0x20a1, 0x7b0e, 0x20a9, 0x0004, 0x53a3, 0x2079, 0x7b12,
+	0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0x7b00, 0x20a1, 0x020b,
 	0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000, 0x1078,
-	0x31b2, 0x0f7f, 0x707b, 0x0000, 0x6043, 0x0008, 0x6043, 0x0000,
-	0x007c, 0x0d7e, 0x7078, 0x707b, 0x0000, 0xa025, 0x0040, 0x2c1d,
-	0x6020, 0xd0b4, 0x00c0, 0x2c1b, 0x7184, 0x81ff, 0x0040, 0x2c04,
-	0xa486, 0x000c, 0x00c0, 0x2c0f, 0xa480, 0x0018, 0x8004, 0x20a8,
-	0x2011, 0x7280, 0x2019, 0x7200, 0x220c, 0x2304, 0xa106, 0x00c0,
-	0x2bdb, 0x8210, 0x8318, 0x00f0, 0x2bc4, 0x6043, 0x0004, 0x608b,
+	0x3562, 0x0f7f, 0x707b, 0x0000, 0x6043, 0x0008, 0x6043, 0x0000,
+	0x007c, 0x0d7e, 0x7078, 0x707b, 0x0000, 0xa025, 0x0040, 0x2fed,
+	0x6020, 0xd0b4, 0x00c0, 0x2feb, 0x7184, 0x81ff, 0x0040, 0x2fd4,
+	0xa486, 0x000c, 0x00c0, 0x2fdf, 0xa480, 0x0018, 0x8004, 0x20a8,
+	0x2011, 0x7b80, 0x2019, 0x7b00, 0x220c, 0x2304, 0xa106, 0x00c0,
+	0x2fab, 0x8210, 0x8318, 0x00f0, 0x2f94, 0x6043, 0x0004, 0x608b,
 	0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x7077, 0x0002, 0x7083,
-	0x0002, 0x0078, 0x2c1b, 0x2069, 0x7280, 0x6930, 0xa18e, 0x1101,
-	0x00c0, 0x2c0f, 0x6834, 0xa005, 0x00c0, 0x2c0f, 0x6900, 0xa18c,
-	0x00ff, 0x00c0, 0x2bef, 0x6804, 0xa005, 0x0040, 0x2c04, 0x2011,
-	0x728e, 0x2019, 0x6d05, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102,
-	0x0048, 0x2c02, 0x00c0, 0x2c0f, 0x8210, 0x8318, 0x00f0, 0x2bf5,
-	0x0078, 0x2c0f, 0x7087, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000,
-	0x2099, 0x7280, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043,
-	0x0008, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x2c1b, 0x60c3,
-	0x000c, 0x1078, 0x31b2, 0x0d7f, 0x007c, 0x6020, 0xd0b4, 0x00c0,
-	0x2c1b, 0x60c3, 0x000c, 0x2011, 0x6f1a, 0x2013, 0x0000, 0x707b,
+	0x0002, 0x0078, 0x2feb, 0x2069, 0x7b80, 0x6930, 0xa18e, 0x1101,
+	0x00c0, 0x2fdf, 0x6834, 0xa005, 0x00c0, 0x2fdf, 0x6900, 0xa18c,
+	0x00ff, 0x00c0, 0x2fbf, 0x6804, 0xa005, 0x0040, 0x2fd4, 0x2011,
+	0x7b8e, 0x2019, 0x7605, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102,
+	0x0048, 0x2fd2, 0x00c0, 0x2fdf, 0x8210, 0x8318, 0x00f0, 0x2fc5,
+	0x0078, 0x2fdf, 0x7087, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000,
+	0x2099, 0x7b80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043,
+	0x0008, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x2feb, 0x60c3,
+	0x000c, 0x1078, 0x3562, 0x0d7f, 0x007c, 0x6020, 0xd0b4, 0x00c0,
+	0x2feb, 0x60c3, 0x000c, 0x2011, 0x7840, 0x2013, 0x0000, 0x707b,
 	0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x1078,
-	0x4fdc, 0x0078, 0x2c1b, 0x007c, 0x7080, 0xa08a, 0x001d, 0x00c8,
-	0x2c3d, 0x1079, 0x2c40, 0x0078, 0x2c3f, 0x1078, 0x12b7, 0x007c,
-	0x2c64, 0x2c73, 0x2ca6, 0x2cbb, 0x2ced, 0x2d17, 0x2d49, 0x2d73,
-	0x2da5, 0x2dcb, 0x2e1a, 0x2e3c, 0x2e60, 0x2e76, 0x2e9c, 0x2eaf,
-	0x2eb8, 0x2ed1, 0x2f01, 0x2f2b, 0x2f5b, 0x2f85, 0x2fce, 0x3003,
-	0x3025, 0x3063, 0x3087, 0x30a0, 0x30ad, 0x7003, 0x0007, 0x6004,
+	0x5579, 0x0078, 0x2feb, 0x007c, 0x7080, 0xa08a, 0x001d, 0x00c8,
+	0x300d, 0x1079, 0x3010, 0x0078, 0x300f, 0x1078, 0x12d5, 0x007c,
+	0x3034, 0x3043, 0x3074, 0x3089, 0x30b9, 0x30e1, 0x3111, 0x313b,
+	0x316b, 0x3191, 0x31da, 0x31fc, 0x3220, 0x3236, 0x325e, 0x3271,
+	0x327a, 0x3293, 0x32c1, 0x32e9, 0x3317, 0x3341, 0x3384, 0x33b5,
+	0x33d7, 0x3415, 0x343b, 0x3454, 0x3461, 0x7003, 0x0007, 0x6004,
 	0xa084, 0xfff9, 0x6006, 0x007c, 0x608b, 0xbc94, 0x608f, 0xf0f0,
-	0x6043, 0x0002, 0x7083, 0x0001, 0x2009, 0x07d0, 0x2011, 0x318e,
-	0x1078, 0x40c4, 0x007c, 0x0f7e, 0x7078, 0xa086, 0x0014, 0x00c0,
-	0x2ca4, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x2ca4, 0x2079,
-	0x7280, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x2ca2, 0x7834, 0xa005,
-	0x00c0, 0x2ca2, 0x7a38, 0xd2fc, 0x0040, 0x2c98, 0x70a4, 0xa005,
-	0x00c0, 0x2c98, 0x2019, 0x002a, 0x1078, 0x202f, 0x70a7, 0x0001,
-	0x2011, 0x318e, 0x1078, 0x40d1, 0x7083, 0x0010, 0x1078, 0x2eb8,
-	0x0078, 0x2ca4, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0003,
-	0x6043, 0x0004, 0x1078, 0x321b, 0x20a3, 0x1102, 0x20a3, 0x0000,
-	0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x2cb2, 0x60c3, 0x0014,
-	0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x2ceb,
-	0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0014, 0x00c0, 0x2ce7,
-	0x2079, 0x7280, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x2ce7, 0x7834,
-	0xa005, 0x00c0, 0x2ce7, 0x7a38, 0xd2fc, 0x0040, 0x2ce1, 0x70a4,
-	0xa005, 0x00c0, 0x2ce1, 0x2019, 0x002a, 0x1078, 0x202f, 0x70a7,
-	0x0001, 0x7083, 0x0004, 0x1078, 0x2ced, 0x0078, 0x2ceb, 0x7083,
-	0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0005, 0x1078,
-	0x321b, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, 0x728e,
-	0x706c, 0xa005, 0x00c0, 0x2d09, 0x714c, 0xa186, 0xffff, 0x0040,
-	0x2d09, 0x1078, 0x3152, 0x0040, 0x2d09, 0x2019, 0x002a, 0x1078,
-	0x202f, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x31b2, 0x007c, 0x0f7e,
-	0x7078, 0xa005, 0x0040, 0x2d47, 0x2011, 0x318e, 0x1078, 0x40d1,
-	0xa086, 0x0014, 0x00c0, 0x2d43, 0x2079, 0x7280, 0x7a30, 0xa296,
-	0x1103, 0x00c0, 0x2d43, 0x7834, 0xa005, 0x00c0, 0x2d43, 0x7a38,
-	0xd2fc, 0x0040, 0x2d3d, 0x70a4, 0xa005, 0x00c0, 0x2d3d, 0x2019,
-	0x002a, 0x1078, 0x202f, 0x70a7, 0x0001, 0x7083, 0x0006, 0x1078,
-	0x2d49, 0x0078, 0x2d47, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f,
-	0x007c, 0x7083, 0x0007, 0x1078, 0x321b, 0x20a3, 0x1104, 0x20a3,
-	0x0000, 0x3430, 0x2011, 0x728e, 0x706c, 0xa005, 0x00c0, 0x2d65,
-	0x7150, 0xa186, 0xffff, 0x0040, 0x2d65, 0xa180, 0x2091, 0x200c,
-	0xa18c, 0xff00, 0x810f, 0x1078, 0x3152, 0x20a9, 0x0008, 0x2298,
+	0x6043, 0x0002, 0x7083, 0x0001, 0x2009, 0x07d0, 0x2011, 0x3542,
+	0x1078, 0x4561, 0x007c, 0x0f7e, 0x7078, 0xa086, 0x0014, 0x00c0,
+	0x3072, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x3072, 0x2079,
+	0x7b80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3070, 0x7834, 0xa005,
+	0x00c0, 0x3070, 0x7a38, 0xd2fc, 0x0040, 0x3066, 0x70a4, 0xa005,
+	0x00c0, 0x3066, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x2011, 0x3542,
+	0x1078, 0x456e, 0x7083, 0x0010, 0x1078, 0x327a, 0x0078, 0x3072,
+	0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0003, 0x6043, 0x0004,
+	0x1078, 0x35cc, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9, 0x000a,
+	0x20a3, 0x0000, 0x00f0, 0x3080, 0x60c3, 0x0014, 0x1078, 0x3562,
+	0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x30b7, 0x2011, 0x3542,
+	0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x30b3, 0x2079, 0x7b80,
+	0x7a30, 0xa296, 0x1102, 0x00c0, 0x30b3, 0x7834, 0xa005, 0x00c0,
+	0x30b3, 0x7a38, 0xd2fc, 0x0040, 0x30ad, 0x70a4, 0xa005, 0x00c0,
+	0x30ad, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083, 0x0004, 0x1078,
+	0x30b9, 0x0078, 0x30b7, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f,
+	0x007c, 0x7083, 0x0005, 0x1078, 0x35cc, 0x20a3, 0x1103, 0x20a3,
+	0x0000, 0x3430, 0x2011, 0x7b8e, 0x706c, 0xa005, 0x00c0, 0x30d3,
+	0x714c, 0xa186, 0xffff, 0x0040, 0x30d3, 0x1078, 0x3506, 0x0040,
+	0x30d3, 0x1078, 0x35fb, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6,
+	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x3562,
+	0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x310f, 0x2011, 0x3542,
+	0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x310b, 0x2079, 0x7b80,
+	0x7a30, 0xa296, 0x1103, 0x00c0, 0x310b, 0x7834, 0xa005, 0x00c0,
+	0x310b, 0x7a38, 0xd2fc, 0x0040, 0x3105, 0x70a4, 0xa005, 0x00c0,
+	0x3105, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083, 0x0006, 0x1078,
+	0x3111, 0x0078, 0x310f, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f,
+	0x007c, 0x7083, 0x0007, 0x1078, 0x35cc, 0x20a3, 0x1104, 0x20a3,
+	0x0000, 0x3430, 0x2011, 0x7b8e, 0x706c, 0xa005, 0x00c0, 0x312d,
+	0x7150, 0xa186, 0xffff, 0x0040, 0x312d, 0xa180, 0x232f, 0x200c,
+	0xa18c, 0xff00, 0x810f, 0x1078, 0x3506, 0x20a9, 0x0008, 0x2298,
 	0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
-	0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x2da3,
-	0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0014, 0x00c0, 0x2d9f,
-	0x2079, 0x7280, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x2d9f, 0x7834,
-	0xa005, 0x00c0, 0x2d9f, 0x7a38, 0xd2fc, 0x0040, 0x2d99, 0x70a4,
-	0xa005, 0x00c0, 0x2d99, 0x2019, 0x002a, 0x1078, 0x202f, 0x70a7,
-	0x0001, 0x7083, 0x0008, 0x1078, 0x2da5, 0x0078, 0x2da3, 0x7083,
-	0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0009, 0x1078,
-	0x321b, 0x20a3, 0x1105, 0x20a3, 0x0100, 0x3430, 0x706c, 0xa005,
-	0x00c0, 0x2db8, 0x1078, 0x30bc, 0x0040, 0x2dc8, 0x0078, 0x2dc2,
-	0x20a9, 0x0008, 0x2099, 0x728e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x31b2, 0x0078, 0x2dca,
-	0x1078, 0x2c5d, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x2e18,
-	0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0014, 0x00c0, 0x2e14,
-	0x2079, 0x7280, 0x7a30, 0xa296, 0x1105, 0x00c0, 0x2e14, 0x7834,
-	0x2011, 0x0100, 0xa21e, 0x00c0, 0x2dfb, 0x7a38, 0xd2fc, 0x0040,
-	0x2df3, 0x70a4, 0xa005, 0x00c0, 0x2df3, 0x2019, 0x002a, 0x1078,
-	0x202f, 0x70a7, 0x0001, 0x707f, 0x0001, 0x7083, 0x000a, 0x1078,
-	0x2e1a, 0x0078, 0x2e18, 0xa005, 0x00c0, 0x2e14, 0x7a38, 0xd2fc,
-	0x0040, 0x2e0c, 0x70a4, 0xa005, 0x00c0, 0x2e0c, 0x2019, 0x002a,
-	0x1078, 0x202f, 0x70a7, 0x0001, 0x707f, 0x0000, 0x7083, 0x000e,
-	0x1078, 0x2e9c, 0x0078, 0x2e18, 0x7083, 0x0002, 0x707b, 0x0000,
-	0x0f7f, 0x007c, 0x7083, 0x000b, 0x2011, 0x720e, 0x22a0, 0x20a9,
+	0x1078, 0x3562, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3169,
+	0x2011, 0x3542, 0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x3165,
+	0x2079, 0x7b80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3165, 0x7834,
+	0xa005, 0x00c0, 0x3165, 0x7a38, 0xd2fc, 0x0040, 0x315f, 0x70a4,
+	0xa005, 0x00c0, 0x315f, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083,
+	0x0008, 0x1078, 0x316b, 0x0078, 0x3169, 0x7083, 0x0002, 0x707b,
+	0x0000, 0x0f7f, 0x007c, 0x7083, 0x0009, 0x1078, 0x35cc, 0x20a3,
+	0x1105, 0x20a3, 0x0100, 0x3430, 0x706c, 0xa005, 0x00c0, 0x317e,
+	0x1078, 0x3470, 0x0040, 0x318e, 0x0078, 0x3188, 0x20a9, 0x0008,
+	0x2099, 0x7b8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
+	0x60c3, 0x0014, 0x1078, 0x3562, 0x0078, 0x3190, 0x1078, 0x302d,
+	0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x31d8, 0x2011, 0x3542,
+	0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x31d4, 0x2079, 0x7b80,
+	0x7a30, 0xa296, 0x1105, 0x00c0, 0x31d4, 0x7834, 0x2011, 0x0100,
+	0xa21e, 0x00c0, 0x31bd, 0x7a38, 0xd2fc, 0x0040, 0x31b7, 0x70a4,
+	0xa005, 0x00c0, 0x31b7, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083,
+	0x000a, 0x1078, 0x31da, 0x0078, 0x31d8, 0xa005, 0x00c0, 0x31d4,
+	0x7a38, 0xd2fc, 0x0040, 0x31cc, 0x70a4, 0xa005, 0x00c0, 0x31cc,
+	0x1078, 0x35fb, 0x70a7, 0x0001, 0x707f, 0x0000, 0x7083, 0x000e,
+	0x1078, 0x325e, 0x0078, 0x31d8, 0x7083, 0x0002, 0x707b, 0x0000,
+	0x0f7f, 0x007c, 0x7083, 0x000b, 0x2011, 0x7b0e, 0x22a0, 0x20a9,
 	0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009, 0x0000,
-	0x41a4, 0x1078, 0x321b, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x6030,
+	0x41a4, 0x1078, 0x35cc, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x6030,
 	0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6, 0x60c3,
-	0x0084, 0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040,
-	0x2e5e, 0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0084, 0x00c0,
-	0x2e5a, 0x2079, 0x7280, 0x7a30, 0xa296, 0x1106, 0x00c0, 0x2e5a,
-	0x7834, 0xa005, 0x00c0, 0x2e5a, 0x7083, 0x000c, 0x1078, 0x2e60,
-	0x0078, 0x2e5e, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c,
-	0x7083, 0x000d, 0x1078, 0x321b, 0x20a3, 0x1107, 0x20a3, 0x0000,
-	0x2099, 0x728e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x60c3, 0x0084, 0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078,
-	0xa005, 0x0040, 0x2e9a, 0x2011, 0x318e, 0x1078, 0x40d1, 0xa086,
-	0x0084, 0x00c0, 0x2e96, 0x2079, 0x7280, 0x7a30, 0xa296, 0x1107,
-	0x00c0, 0x2e96, 0x7834, 0xa005, 0x00c0, 0x2e96, 0x1078, 0x320d,
-	0x7083, 0x000e, 0x1078, 0x2e9c, 0x0078, 0x2e9a, 0x7083, 0x0002,
-	0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x000f, 0x707b, 0x0000,
-	0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004,
-	0x2009, 0x07d0, 0x2011, 0x318e, 0x1078, 0x40c4, 0x007c, 0x7078,
-	0xa005, 0x0040, 0x2eb7, 0x2011, 0x318e, 0x1078, 0x40d1, 0x007c,
-	0x7083, 0x0011, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x7280,
-	0x20a1, 0x020b, 0x7478, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084,
-	0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014, 0x1078, 0x31b2,
-	0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x2eff, 0x2011, 0x318e,
-	0x1078, 0x40d1, 0xa086, 0x0014, 0x00c0, 0x2efd, 0x2079, 0x7280,
-	0x7a30, 0xa296, 0x1103, 0x00c0, 0x2efd, 0x7834, 0xa005, 0x00c0,
-	0x2efd, 0x7a38, 0xd2fc, 0x0040, 0x2ef7, 0x70a4, 0xa005, 0x00c0,
-	0x2ef7, 0x2019, 0x002a, 0x1078, 0x202f, 0x70a7, 0x0001, 0x7083,
-	0x0012, 0x1078, 0x2f01, 0x0078, 0x2eff, 0x707b, 0x0000, 0x0f7f,
-	0x007c, 0x7083, 0x0013, 0x1078, 0x3227, 0x20a3, 0x1103, 0x20a3,
-	0x0000, 0x3430, 0x2011, 0x728e, 0x706c, 0xa005, 0x00c0, 0x2f1d,
-	0x714c, 0xa186, 0xffff, 0x0040, 0x2f1d, 0x1078, 0x3152, 0x0040,
-	0x2f1d, 0x2019, 0x002a, 0x1078, 0x202f, 0x20a9, 0x0008, 0x2298,
-	0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
-	0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x2f59,
-	0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0014, 0x00c0, 0x2f57,
-	0x2079, 0x7280, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x2f57, 0x7834,
-	0xa005, 0x00c0, 0x2f57, 0x7a38, 0xd2fc, 0x0040, 0x2f51, 0x70a4,
-	0xa005, 0x00c0, 0x2f51, 0x2019, 0x002a, 0x1078, 0x202f, 0x70a7,
-	0x0001, 0x7083, 0x0014, 0x1078, 0x2f5b, 0x0078, 0x2f59, 0x707b,
-	0x0000, 0x0f7f, 0x007c, 0x7083, 0x0015, 0x1078, 0x3227, 0x20a3,
-	0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0x728e, 0x706c, 0xa006,
-	0x00c0, 0x2f77, 0x7150, 0xa186, 0xffff, 0x0040, 0x2f77, 0xa180,
-	0x2091, 0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x3152, 0x20a9,
-	0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x60c3, 0x0014, 0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005,
-	0x0040, 0x2fcc, 0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0014,
-	0x00c0, 0x2fca, 0x2079, 0x7280, 0x7a30, 0xa296, 0x1105, 0x00c0,
-	0x2fca, 0x7834, 0x2011, 0x0100, 0xa21e, 0x00c0, 0x2fb1, 0x7a38,
-	0xd2fc, 0x0040, 0x2fad, 0x70a4, 0xa005, 0x00c0, 0x2fad, 0x2019,
-	0x002a, 0x1078, 0x202f, 0x70a7, 0x0001, 0x707f, 0x0001, 0x0078,
-	0x2fc4, 0xa005, 0x00c0, 0x2fca, 0x7a38, 0xd2fc, 0x0040, 0x2fc2,
-	0x70a4, 0xa005, 0x00c0, 0x2fc2, 0x2019, 0x002a, 0x1078, 0x202f,
-	0x70a7, 0x0001, 0x707f, 0x0000, 0x7083, 0x0016, 0x1078, 0x2fce,
-	0x0078, 0x2fcc, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x20e1, 0x9080,
-	0x20e1, 0x4000, 0x2099, 0x7280, 0x20a1, 0x020b, 0x20a9, 0x000e,
-	0x53a6, 0x3430, 0x2011, 0x728e, 0x707c, 0xa005, 0x0040, 0x2fe4,
-	0x7083, 0x0017, 0x0078, 0x2fe6, 0x7083, 0x001b, 0x706c, 0xa005,
-	0x00c0, 0x2ff0, 0x1078, 0x30bc, 0x0040, 0x3000, 0x0078, 0x2ffa,
-	0x20a9, 0x0008, 0x2099, 0x728e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x31b2, 0x0078, 0x3002,
-	0x1078, 0x2c5d, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3023,
-	0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0084, 0x00c0, 0x3021,
-	0x2079, 0x7280, 0x7a30, 0xa296, 0x1106, 0x00c0, 0x3021, 0x7834,
-	0xa005, 0x00c0, 0x3021, 0x7083, 0x0018, 0x1078, 0x3025, 0x0078,
-	0x3023, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0019, 0x1078,
-	0x3227, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, 0x2099, 0x728e,
-	0x2039, 0x720e, 0x27a0, 0x20a9, 0x0040, 0x53a3, 0x2728, 0x2514,
-	0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007,
-	0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0, 0x720e, 0x2414,
-	0xa38c, 0x0001, 0x0040, 0x3050, 0xa294, 0xff00, 0x0078, 0x3053,
-	0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9,
-	0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084,
-	0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3085,
-	0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0084, 0x00c0, 0x3083,
-	0x2079, 0x7280, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x3083, 0x7834,
-	0xa005, 0x00c0, 0x3083, 0x1078, 0x320d, 0x7083, 0x001a, 0x1078,
-	0x3087, 0x0078, 0x3085, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083,
-	0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x7280, 0x20a1,
-	0x020b, 0x7478, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8,
-	0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078, 0x31b2, 0x007c,
-	0x7078, 0xa005, 0x0040, 0x30ac, 0x2011, 0x318e, 0x1078, 0x40d1,
-	0x7083, 0x001c, 0x1078, 0x30ad, 0x007c, 0x707b, 0x0000, 0x608b,
-	0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0001, 0x2009, 0x07d0, 0x2011,
-	0x318e, 0x1078, 0x40c4, 0x007c, 0x087e, 0x097e, 0x2029, 0x6d52,
-	0x252c, 0x20a9, 0x0008, 0x2041, 0x720e, 0x28a0, 0x2099, 0x728e,
-	0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0040, 0x30d2,
-	0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x00c0,
-	0x30e4, 0xd5d4, 0x0040, 0x30df, 0x8210, 0x0078, 0x30e0, 0x8211,
-	0x00f0, 0x30d2, 0x0078, 0x3149, 0x82ff, 0x00c0, 0x30f6, 0xd5d4,
-	0x0040, 0x30f0, 0xa1a6, 0x3fff, 0x0040, 0x30dc, 0x0078, 0x30f4,
-	0xa1a6, 0x3fff, 0x0040, 0x3149, 0xa18d, 0xc000, 0x20a9, 0x0010,
-	0x2019, 0x0001, 0xd5d4, 0x0040, 0x30ff, 0x2019, 0x0010, 0x2120,
-	0xd5d4, 0x0040, 0x3106, 0x8423, 0x0078, 0x3107, 0x8424, 0x00c8,
-	0x3114, 0xd5d4, 0x0040, 0x310f, 0x8319, 0x0078, 0x3110, 0x8318,
-	0x00f0, 0x3100, 0x0078, 0x3149, 0x23a8, 0x2021, 0x0001, 0x8426,
-	0x8425, 0x00f0, 0x3118, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0040,
-	0x312c, 0x007e, 0x2039, 0x0007, 0x2200, 0xa73a, 0x007f, 0x27a8,
-	0xa5a8, 0x0010, 0x00f0, 0x3128, 0x754e, 0xa5c8, 0x2091, 0x292c,
-	0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304,
-	0xa405, 0x201a, 0x706f, 0x0001, 0x26a0, 0x2898, 0x20a9, 0x0008,
-	0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0xa085, 0x0001, 0x0078,
-	0x314f, 0xa006, 0x0078, 0x314f, 0xa006, 0x1078, 0x12b7, 0x097f,
-	0x087f, 0x007c, 0x2118, 0x2021, 0x0000, 0x2001, 0x0007, 0xa39a,
-	0x0010, 0x0048, 0x315f, 0x8420, 0x8001, 0x0078, 0x3157, 0x2118,
-	0x84ff, 0x0040, 0x3168, 0xa39a, 0x0010, 0x8421, 0x00c0, 0x3163,
-	0x2021, 0x0001, 0x83ff, 0x0040, 0x3171, 0x8423, 0x8319, 0x00c0,
-	0x316d, 0xa238, 0x2704, 0xa42c, 0x00c0, 0x3186, 0xa405, 0x203a,
-	0x714e, 0xa1a0, 0x2091, 0x242c, 0xa5ac, 0x00ff, 0x6532, 0x60e7,
-	0x0000, 0x65ea, 0x706f, 0x0001, 0xa084, 0x0000, 0x007c, 0x0e7e,
-	0x2071, 0x6d00, 0x7073, 0x0000, 0x0e7f, 0x007c, 0x0e7e, 0x0f7e,
-	0x2079, 0x0100, 0x2071, 0x0140, 0x1078, 0x4fe5, 0x7004, 0xa084,
-	0x4000, 0x0040, 0x319f, 0x7003, 0x1000, 0x7003, 0x0000, 0x127e,
-	0x2091, 0x8000, 0x2071, 0x6d00, 0x7003, 0x0001, 0x2071, 0x6d20,
+	0x0084, 0x1078, 0x3562, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040,
+	0x321e, 0x2011, 0x3542, 0x1078, 0x456e, 0xa086, 0x0084, 0x00c0,
+	0x321a, 0x2079, 0x7b80, 0x7a30, 0xa296, 0x1106, 0x00c0, 0x321a,
+	0x7834, 0xa005, 0x00c0, 0x321a, 0x7083, 0x000c, 0x1078, 0x3220,
+	0x0078, 0x321e, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c,
+	0x7083, 0x000d, 0x1078, 0x35cc, 0x20a3, 0x1107, 0x20a3, 0x0000,
+	0x2099, 0x7b8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3,
+	0x0000, 0x60c3, 0x0084, 0x1078, 0x3562, 0x007c, 0x0f7e, 0x7078,
+	0xa005, 0x0040, 0x325c, 0x2011, 0x3542, 0x1078, 0x456e, 0xa086,
+	0x0084, 0x00c0, 0x3258, 0x2079, 0x7b80, 0x7a30, 0xa296, 0x1107,
+	0x00c0, 0x3258, 0x7834, 0xa005, 0x00c0, 0x3258, 0x707f, 0x0001,
+	0x1078, 0x35be, 0x7083, 0x000e, 0x1078, 0x325e, 0x0078, 0x325c,
+	0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x000f,
+	0x707b, 0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005,
+	0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x3542, 0x1078, 0x4561,
+	0x007c, 0x7078, 0xa005, 0x0040, 0x3279, 0x2011, 0x3542, 0x1078,
+	0x456e, 0x007c, 0x7083, 0x0011, 0x20e1, 0x9080, 0x20e1, 0x4000,
+	0x2099, 0x7b80, 0x20a1, 0x020b, 0x7478, 0xa480, 0x0018, 0xa080,
+	0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014,
+	0x1078, 0x3562, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x32bf,
+	0x2011, 0x3542, 0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x32bd,
+	0x2079, 0x7b80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x32bd, 0x7834,
+	0xa005, 0x00c0, 0x32bd, 0x7a38, 0xd2fc, 0x0040, 0x32b7, 0x70a4,
+	0xa005, 0x00c0, 0x32b7, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083,
+	0x0012, 0x1078, 0x32c1, 0x0078, 0x32bf, 0x707b, 0x0000, 0x0f7f,
+	0x007c, 0x7083, 0x0013, 0x1078, 0x35d8, 0x20a3, 0x1103, 0x20a3,
+	0x0000, 0x3430, 0x2011, 0x7b8e, 0x706c, 0xa005, 0x00c0, 0x32db,
+	0x714c, 0xa186, 0xffff, 0x0040, 0x32db, 0x1078, 0x3506, 0x0040,
+	0x32db, 0x1078, 0x35fb, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6,
+	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x3562,
+	0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3315, 0x2011, 0x3542,
+	0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x3313, 0x2079, 0x7b80,
+	0x7a30, 0xa296, 0x1104, 0x00c0, 0x3313, 0x7834, 0xa005, 0x00c0,
+	0x3313, 0x7a38, 0xd2fc, 0x0040, 0x330d, 0x70a4, 0xa005, 0x00c0,
+	0x330d, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083, 0x0014, 0x1078,
+	0x3317, 0x0078, 0x3315, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083,
+	0x0015, 0x1078, 0x35d8, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430,
+	0x2011, 0x7b8e, 0x706c, 0xa006, 0x00c0, 0x3333, 0x7150, 0xa186,
+	0xffff, 0x0040, 0x3333, 0xa180, 0x232f, 0x200c, 0xa18c, 0xff00,
+	0x810f, 0x1078, 0x3506, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6,
+	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x3562,
+	0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3382, 0x2011, 0x3542,
+	0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x3380, 0x2079, 0x7b80,
+	0x7a30, 0xa296, 0x1105, 0x00c0, 0x3380, 0x7834, 0x2011, 0x0100,
+	0xa21e, 0x00c0, 0x3369, 0x7a38, 0xd2fc, 0x0040, 0x3367, 0x70a4,
+	0xa005, 0x00c0, 0x3367, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x0078,
+	0x337a, 0xa005, 0x00c0, 0x3380, 0x7a38, 0xd2fc, 0x0040, 0x3378,
+	0x70a4, 0xa005, 0x00c0, 0x3378, 0x1078, 0x35fb, 0x70a7, 0x0001,
+	0x707f, 0x0000, 0x7083, 0x0016, 0x1078, 0x3384, 0x0078, 0x3382,
+	0x707b, 0x0000, 0x0f7f, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000,
+	0x2099, 0x7b80, 0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430,
+	0x2011, 0x7b8e, 0x7083, 0x0017, 0x0078, 0x3398, 0x7083, 0x001b,
+	0x706c, 0xa005, 0x00c0, 0x33a2, 0x1078, 0x3470, 0x0040, 0x33b2,
+	0x0078, 0x33ac, 0x20a9, 0x0008, 0x2099, 0x7b8e, 0x26a0, 0x53a6,
+	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x3562,
+	0x0078, 0x33b4, 0x1078, 0x302d, 0x007c, 0x0f7e, 0x7078, 0xa005,
+	0x0040, 0x33d5, 0x2011, 0x3542, 0x1078, 0x456e, 0xa086, 0x0084,
+	0x00c0, 0x33d3, 0x2079, 0x7b80, 0x7a30, 0xa296, 0x1106, 0x00c0,
+	0x33d3, 0x7834, 0xa005, 0x00c0, 0x33d3, 0x7083, 0x0018, 0x1078,
+	0x33d7, 0x0078, 0x33d5, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083,
+	0x0019, 0x1078, 0x35d8, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430,
+	0x2099, 0x7b8e, 0x2039, 0x7b0e, 0x27a0, 0x20a9, 0x0040, 0x53a3,
+	0x2728, 0x2514, 0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294,
+	0x00ff, 0x8007, 0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0,
+	0x7b0e, 0x2414, 0xa38c, 0x0001, 0x0040, 0x3402, 0xa294, 0xff00,
+	0x0078, 0x3405, 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798,
+	0x26a0, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
+	0x60c3, 0x0084, 0x1078, 0x3562, 0x007c, 0x0f7e, 0x7078, 0xa005,
+	0x0040, 0x3439, 0x2011, 0x3542, 0x1078, 0x456e, 0xa086, 0x0084,
+	0x00c0, 0x3437, 0x2079, 0x7b80, 0x7a30, 0xa296, 0x1107, 0x00c0,
+	0x3437, 0x7834, 0xa005, 0x00c0, 0x3437, 0x707f, 0x0001, 0x1078,
+	0x35be, 0x7083, 0x001a, 0x1078, 0x343b, 0x0078, 0x3439, 0x707b,
+	0x0000, 0x0f7f, 0x007c, 0x7083, 0x001b, 0x20e1, 0x9080, 0x20e1,
+	0x4000, 0x2099, 0x7b80, 0x20a1, 0x020b, 0x7478, 0xa480, 0x0018,
+	0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3,
+	0x0084, 0x1078, 0x3562, 0x007c, 0x7078, 0xa005, 0x0040, 0x3460,
+	0x2011, 0x3542, 0x1078, 0x456e, 0x7083, 0x001c, 0x1078, 0x3461,
+	0x007c, 0x707b, 0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043,
+	0x0001, 0x2009, 0x07d0, 0x2011, 0x3542, 0x1078, 0x4561, 0x007c,
+	0x087e, 0x097e, 0x2029, 0x7652, 0x252c, 0x20a9, 0x0008, 0x2041,
+	0x7b0e, 0x28a0, 0x2099, 0x7b8e, 0x53a3, 0x20a9, 0x0008, 0x2011,
+	0x0007, 0xd5d4, 0x0040, 0x3486, 0x2011, 0x0000, 0x2800, 0xa200,
+	0x200c, 0xa1a6, 0xffff, 0x00c0, 0x3498, 0xd5d4, 0x0040, 0x3493,
+	0x8210, 0x0078, 0x3494, 0x8211, 0x00f0, 0x3486, 0x0078, 0x34fd,
+	0x82ff, 0x00c0, 0x34aa, 0xd5d4, 0x0040, 0x34a4, 0xa1a6, 0x3fff,
+	0x0040, 0x3490, 0x0078, 0x34a8, 0xa1a6, 0x3fff, 0x0040, 0x34fd,
+	0xa18d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0040,
+	0x34b3, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0040, 0x34ba, 0x8423,
+	0x0078, 0x34bb, 0x8424, 0x00c8, 0x34c8, 0xd5d4, 0x0040, 0x34c3,
+	0x8319, 0x0078, 0x34c4, 0x8318, 0x00f0, 0x34b4, 0x0078, 0x34fd,
+	0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x00f0, 0x34cc, 0x2328,
+	0x8529, 0xa2be, 0x0007, 0x0040, 0x34e0, 0x007e, 0x2039, 0x0007,
+	0x2200, 0xa73a, 0x007f, 0x27a8, 0xa5a8, 0x0010, 0x00f0, 0x34dc,
+	0x754e, 0xa5c8, 0x232f, 0x292c, 0xa5ac, 0x00ff, 0x6532, 0x60e7,
+	0x0000, 0x65ea, 0x2018, 0x2304, 0xa405, 0x201a, 0x706f, 0x0001,
+	0x26a0, 0x2898, 0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3,
+	0x0000, 0xa085, 0x0001, 0x0078, 0x3503, 0xa006, 0x0078, 0x3503,
+	0xa006, 0x1078, 0x12d5, 0x097f, 0x087f, 0x007c, 0x2118, 0x2021,
+	0x0000, 0x2001, 0x0007, 0xa39a, 0x0010, 0x0048, 0x3513, 0x8420,
+	0x8001, 0x0078, 0x350b, 0x2118, 0x84ff, 0x0040, 0x351c, 0xa39a,
+	0x0010, 0x8421, 0x00c0, 0x3517, 0x2021, 0x0001, 0x83ff, 0x0040,
+	0x3525, 0x8423, 0x8319, 0x00c0, 0x3521, 0xa238, 0x2704, 0xa42c,
+	0x00c0, 0x353a, 0xa405, 0x203a, 0x714e, 0xa1a0, 0x232f, 0x242c,
+	0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0001,
+	0xa084, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x7600, 0x7073, 0x0000,
+	0x0e7f, 0x007c, 0x0e7e, 0x0f7e, 0x2079, 0x0100, 0x2071, 0x0140,
+	0x1078, 0x5582, 0x7004, 0xa084, 0x4000, 0x0040, 0x3553, 0x7003,
+	0x1000, 0x7003, 0x0000, 0x127e, 0x2091, 0x8000, 0x2071, 0x7620,
 	0x2073, 0x0000, 0x7843, 0x0090, 0x7843, 0x0010, 0x127f, 0x0f7f,
-	0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x2011, 0x6f1a, 0x2013,
+	0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x2011, 0x7840, 0x2013,
 	0x0000, 0x707b, 0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3, 0x0056,
-	0x60a7, 0x9575, 0x1078, 0x4fdc, 0x2009, 0x07d0, 0x2011, 0x318e,
-	0x1078, 0x415f, 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e, 0x2091,
-	0x8000, 0x2009, 0x00f7, 0x1078, 0x3233, 0x2061, 0x6f23, 0x601b,
-	0x0000, 0x601f, 0x0000, 0x2061, 0x6d00, 0x6003, 0x0001, 0x2061,
+	0x60a7, 0x9575, 0x1078, 0x5579, 0x2009, 0x07d0, 0x2011, 0x3542,
+	0x1078, 0x45fe, 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e, 0x2091,
+	0x8000, 0x2009, 0x00f7, 0x1078, 0x35e4, 0x2061, 0x7849, 0x601b,
+	0x0000, 0x601f, 0x0000, 0x2061, 0x7600, 0x6003, 0x0001, 0x2061,
 	0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x001e, 0x2011,
-	0x31f0, 0x1078, 0x40c4, 0x127f, 0x0c7f, 0x027f, 0x017f, 0x007c,
+	0x35a0, 0x1078, 0x4561, 0x127f, 0x0c7f, 0x027f, 0x017f, 0x007c,
 	0x0e7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x0100, 0x1078,
-	0x4fe5, 0x2071, 0x0140, 0xa084, 0x4000, 0x0040, 0x3203, 0x7003,
-	0x1000, 0x7003, 0x0000, 0x2001, 0x0001, 0x1078, 0x1dc9, 0x1078,
-	0x31cb, 0x127f, 0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040, 0x20a1,
-	0x73c0, 0x2099, 0x728e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0,
-	0x00f0, 0x3213, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
-	0x7200, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c, 0x20e1,
-	0x9080, 0x20e1, 0x4000, 0x2099, 0x7280, 0x20a1, 0x020b, 0x20a9,
-	0x000c, 0x53a6, 0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100, 0x810f,
-	0x2001, 0x6d2c, 0x2004, 0xa005, 0x00c0, 0x3244, 0x6030, 0xa084,
-	0x00ff, 0xa105, 0x0078, 0x3246, 0xa185, 0x00f7, 0x604a, 0x007f,
-	0x0c7f, 0x007c, 0x157e, 0x20a9, 0x00ff, 0x2009, 0x6e00, 0xa006,
-	0x200a, 0x8108, 0x00f0, 0x3250, 0x157f, 0x007c, 0x0d7e, 0x037e,
-	0x157e, 0x137e, 0x147e, 0x2069, 0x6d51, 0xa006, 0x6002, 0x6007,
-	0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x2091, 0x231c, 0xa39c,
-	0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, 0x23a0, 0x40a4,
-	0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, 0x603e, 0x6042,
-	0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062, 0x6066, 0x606a,
-	0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082, 0x6086, 0x608a,
-	0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x61a2, 0x604a, 0x6810,
-	0x603a, 0x680c, 0x6046, 0x147f, 0x137f, 0x157f, 0x037f, 0x0d7f,
-	0x007c, 0x127e, 0x2091, 0x8000, 0x6944, 0xa1b4, 0x00ff, 0xa682,
-	0x0010, 0x00c8, 0x3337, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff,
-	0x00c8, 0x333d, 0xa188, 0x6e00, 0x2104, 0xa065, 0x0040, 0x3316,
-	0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x331c, 0x6078,
-	0xa00d, 0x0040, 0x32c1, 0xa680, 0x6c84, 0x2004, 0xa10c, 0x00c0,
-	0x3310, 0x607c, 0xa00d, 0x0040, 0x32dd, 0xa680, 0x6c84, 0x2004,
-	0xa10c, 0x0040, 0x32dd, 0x694c, 0xd1fc, 0x00c0, 0x32d3, 0x1078,
-	0x33d0, 0x0078, 0x330b, 0x1078, 0x33a1, 0x694c, 0xd1ec, 0x00c0,
-	0x330b, 0x1078, 0x34f0, 0x0078, 0x330b, 0x694c, 0xa184, 0xa000,
-	0x0040, 0x32fb, 0xd1ec, 0x0040, 0x32f4, 0xd1fc, 0x0040, 0x32ec,
-	0x1078, 0x3507, 0x0078, 0x32f7, 0xa680, 0x6c84, 0x200c, 0x607c,
-	0xa105, 0x607e, 0x0078, 0x32fb, 0xd1fc, 0x0040, 0x32fb, 0x1078,
-	0x33a1, 0x0078, 0x330b, 0x6050, 0xa00d, 0x0040, 0x3306, 0x2d00,
-	0x200a, 0x6803, 0x0000, 0x6052, 0x0078, 0x330b, 0x2d00, 0x6052,
-	0x604e, 0x6803, 0x0000, 0x1078, 0x4346, 0xa006, 0x127f, 0x007c,
-	0x2001, 0x0005, 0x2009, 0x0000, 0x0078, 0x3341, 0x2001, 0x0028,
-	0x2009, 0x0000, 0x0078, 0x3341, 0xa082, 0x0006, 0x0048, 0x32b7,
-	0x2009, 0x6d0c, 0x210c, 0xd18c, 0x0040, 0x332a, 0x2001, 0x0004,
-	0x0078, 0x3333, 0xd184, 0x0040, 0x3331, 0x2001, 0x0004, 0x0078,
-	0x3333, 0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x3341, 0x2001,
-	0x0029, 0x2009, 0x0000, 0x0078, 0x3341, 0x2001, 0x0029, 0x2009,
-	0x0000, 0xa005, 0x127f, 0x007c, 0x6944, 0xa1b4, 0x00ff, 0xa682,
-	0x0010, 0x00c8, 0x3386, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff,
-	0x00c8, 0x3376, 0xa188, 0x6e00, 0x2104, 0xa065, 0x0040, 0x3376,
-	0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x337c, 0x684c,
-	0xd0ec, 0x0040, 0x3369, 0x1078, 0x3507, 0x1078, 0x33a1, 0x0078,
-	0x3371, 0x1078, 0x33a1, 0x684c, 0xd0fc, 0x0040, 0x3371, 0x1078,
-	0x34f0, 0x1078, 0x351b, 0xa006, 0x0078, 0x338a, 0x2001, 0x0028,
-	0x2009, 0x0000, 0x0078, 0x338a, 0xa082, 0x0006, 0x0048, 0x335f,
-	0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x338a, 0x2001, 0x0029,
-	0x2009, 0x0000, 0xa005, 0x007c, 0x127e, 0x2091, 0x8000, 0x6050,
-	0xa00d, 0x0040, 0x339a, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052,
-	0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0078,
-	0x3398, 0x127e, 0x2091, 0x8000, 0x604c, 0xa005, 0x0040, 0x33ad,
-	0x6802, 0x2d00, 0x604e, 0x127f, 0x007c, 0x2d00, 0x6052, 0x604e,
-	0x6803, 0x0000, 0x0078, 0x33ab, 0x127e, 0x2091, 0x8000, 0x604c,
-	0xa06d, 0x0040, 0x33c2, 0x6800, 0xa005, 0x00c0, 0x33c0, 0x6052,
-	0x604e, 0xad05, 0x127f, 0x007c, 0x604c, 0xa06d, 0x0040, 0x33cf,
-	0x6800, 0xa005, 0x00c0, 0x33cd, 0x6052, 0x604e, 0xad05, 0x007c,
-	0x6803, 0x0000, 0x6084, 0xa00d, 0x0040, 0x33da, 0x2d00, 0x200a,
-	0x6086, 0x007c, 0x2d00, 0x6086, 0x6082, 0x0078, 0x33d9, 0x127e,
-	0x0c7e, 0x027e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005,
-	0x0040, 0x33ed, 0xc285, 0x0078, 0x33ee, 0xc284, 0x6202, 0x027f,
-	0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218,
-	0x2260, 0x6204, 0xa294, 0xff00, 0xa215, 0x6206, 0x0c7f, 0x127f,
+	0x5582, 0x2071, 0x0140, 0x7004, 0xa084, 0x4000, 0x0040, 0x35b4,
+	0x7003, 0x1000, 0x7003, 0x0000, 0x2001, 0x0001, 0x1078, 0x202b,
+	0x1078, 0x357b, 0x127f, 0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040,
+	0x20a1, 0x7cc0, 0x2099, 0x7b8e, 0x3304, 0x8007, 0x20a2, 0x9398,
+	0x94a0, 0x00f0, 0x35c4, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000,
+	0x2099, 0x7b00, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c,
+	0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x7b80, 0x20a1, 0x020b,
+	0x20a9, 0x000c, 0x53a6, 0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100,
+	0x810f, 0x2001, 0x762c, 0x2004, 0xa005, 0x00c0, 0x35f5, 0x6030,
+	0xa084, 0x00ff, 0xa105, 0x0078, 0x35f7, 0xa185, 0x00f7, 0x604a,
+	0x007f, 0x0c7f, 0x007c, 0x017e, 0x047e, 0x2001, 0x7652, 0x2004,
+	0xd0a4, 0x0040, 0x360e, 0xa006, 0x2020, 0x2009, 0x002a, 0x1078,
+	0x7541, 0x2001, 0x760c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a,
+	0x1078, 0x2299, 0x047f, 0x017f, 0x007c, 0x157e, 0x20a9, 0x00ff,
+	0x2009, 0x7720, 0xa006, 0x200a, 0x8108, 0x00f0, 0x361b, 0x157f,
+	0x007c, 0x0d7e, 0x037e, 0x157e, 0x137e, 0x147e, 0x2069, 0x7651,
+	0xa006, 0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198,
+	0x232f, 0x231c, 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98,
+	0x0006, 0x23a0, 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0,
+	0x40a4, 0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e,
+	0x6062, 0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e,
+	0x6082, 0x6086, 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e,
+	0x61a2, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0x6814, 0xa084,
+	0x00ff, 0x6042, 0x147f, 0x137f, 0x157f, 0x037f, 0x0d7f, 0x007c,
+	0x127e, 0x2091, 0x8000, 0x6944, 0xa1b4, 0x00ff, 0xa682, 0x0010,
+	0x00c8, 0x3715, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x00c8,
+	0x371b, 0x2001, 0x760c, 0x2004, 0xa084, 0x0003, 0x00c0, 0x36fe,
+	0xa188, 0x7720, 0x2104, 0xa065, 0x0040, 0x36ec, 0x6004, 0xa084,
+	0x00ff, 0xa08e, 0x0006, 0x00c0, 0x36f2, 0x6078, 0xa00d, 0x0040,
+	0x3697, 0xa680, 0x75d5, 0x2004, 0xa10c, 0x00c0, 0x36e6, 0x607c,
+	0xa00d, 0x0040, 0x36b3, 0xa680, 0x75d5, 0x2004, 0xa10c, 0x0040,
+	0x36b3, 0x694c, 0xd1fc, 0x00c0, 0x36a9, 0x1078, 0x37ae, 0x0078,
+	0x36e1, 0x1078, 0x377f, 0x694c, 0xd1ec, 0x00c0, 0x36e1, 0x1078,
+	0x38c7, 0x0078, 0x36e1, 0x694c, 0xa184, 0xa000, 0x0040, 0x36d1,
+	0xd1ec, 0x0040, 0x36ca, 0xd1fc, 0x0040, 0x36c2, 0x1078, 0x38de,
+	0x0078, 0x36cd, 0xa680, 0x75d5, 0x200c, 0x607c, 0xa105, 0x607e,
+	0x0078, 0x36d1, 0xd1fc, 0x0040, 0x36d1, 0x1078, 0x377f, 0x0078,
+	0x36e1, 0x6050, 0xa00d, 0x0040, 0x36dc, 0x2d00, 0x200a, 0x6803,
+	0x0000, 0x6052, 0x0078, 0x36e1, 0x2d00, 0x6052, 0x604e, 0x6803,
+	0x0000, 0x1078, 0x4844, 0xa006, 0x127f, 0x007c, 0x2001, 0x0005,
+	0x2009, 0x0000, 0x0078, 0x371f, 0x2001, 0x0028, 0x2009, 0x0000,
+	0x0078, 0x371f, 0xa082, 0x0006, 0x00c8, 0x36fe, 0x60a0, 0xd0bc,
+	0x0040, 0x368d, 0x2001, 0x0028, 0x0078, 0x3711, 0x2009, 0x760c,
+	0x210c, 0xd18c, 0x0040, 0x3708, 0x2001, 0x0004, 0x0078, 0x3711,
+	0xd184, 0x0040, 0x370f, 0x2001, 0x0004, 0x0078, 0x3711, 0x2001,
+	0x0029, 0x2009, 0x0000, 0x0078, 0x371f, 0x2001, 0x0029, 0x2009,
+	0x0000, 0x0078, 0x371f, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005,
+	0x127f, 0x007c, 0x6944, 0xa1b4, 0x00ff, 0xa682, 0x0010, 0x00c8,
+	0x3764, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x00c8, 0x3754,
+	0xa188, 0x7720, 0x2104, 0xa065, 0x0040, 0x3754, 0x6004, 0xa084,
+	0x00ff, 0xa08e, 0x0006, 0x00c0, 0x375a, 0x684c, 0xd0ec, 0x0040,
+	0x3747, 0x1078, 0x38de, 0x1078, 0x377f, 0x0078, 0x374f, 0x1078,
+	0x377f, 0x684c, 0xd0fc, 0x0040, 0x374f, 0x1078, 0x38c7, 0x1078,
+	0x38f2, 0xa006, 0x0078, 0x3768, 0x2001, 0x0028, 0x2009, 0x0000,
+	0x0078, 0x3768, 0xa082, 0x0006, 0x0048, 0x373d, 0x2001, 0x0029,
+	0x2009, 0x0000, 0x0078, 0x3768, 0x2001, 0x0029, 0x2009, 0x0000,
+	0xa005, 0x007c, 0x127e, 0x2091, 0x8000, 0x6050, 0xa00d, 0x0040,
+	0x3778, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x127f, 0x007c,
+	0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0078, 0x3776, 0x127e,
+	0x2091, 0x8000, 0x604c, 0xa005, 0x0040, 0x378b, 0x6802, 0x2d00,
+	0x604e, 0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000,
+	0x0078, 0x3789, 0x127e, 0x2091, 0x8000, 0x604c, 0xa06d, 0x0040,
+	0x37a0, 0x6800, 0xa005, 0x00c0, 0x379e, 0x6052, 0x604e, 0xad05,
+	0x127f, 0x007c, 0x604c, 0xa06d, 0x0040, 0x37ad, 0x6800, 0xa005,
+	0x00c0, 0x37ab, 0x6052, 0x604e, 0xad05, 0x007c, 0x6803, 0x0000,
+	0x6084, 0xa00d, 0x0040, 0x37b8, 0x2d00, 0x200a, 0x6086, 0x007c,
+	0x2d00, 0x6086, 0x6082, 0x0078, 0x37b7, 0x127e, 0x0c7e, 0x027e,
+	0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0040, 0x37cb,
+	0xc285, 0x0078, 0x37cc, 0xc284, 0x6202, 0x027f, 0x0c7f, 0x127f,
 	0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204,
-	0xa294, 0x00ff, 0x8007, 0xa215, 0x6206, 0x0c7f, 0x127f, 0x007c,
-	0x027e, 0xa182, 0x00ff, 0x0048, 0x3419, 0xa085, 0x0001, 0x0078,
-	0x342d, 0xa190, 0x6e00, 0x2204, 0xa065, 0x00c0, 0x342c, 0x017e,
-	0x0d7e, 0x1078, 0x12f4, 0x2d60, 0x0d7f, 0x017f, 0x0040, 0x3415,
-	0x2c00, 0x2012, 0x1078, 0x3256, 0xa006, 0x027f, 0x007c, 0x027e,
-	0xa182, 0x00ff, 0x0048, 0x3438, 0xa085, 0x0001, 0x0078, 0x3445,
-	0x0d7e, 0xa190, 0x6e00, 0x2204, 0xa06d, 0x0040, 0x3443, 0x2013,
-	0x0000, 0x1078, 0x1328, 0x0d7f, 0xa006, 0x027f, 0x007c, 0x017e,
-	0xa182, 0x00ff, 0x0048, 0x3450, 0xa085, 0x0001, 0x0078, 0x3457,
-	0xa188, 0x6e00, 0x2104, 0xa065, 0x0040, 0x344c, 0xa006, 0x017f,
-	0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x600b, 0x0000, 0x600f,
-	0x0000, 0x6000, 0xc08c, 0x6002, 0x2069, 0x728e, 0x6808, 0x605e,
-	0x6810, 0x6062, 0x6138, 0xa10a, 0x0048, 0x346f, 0x603a, 0x6814,
-	0x6066, 0x2099, 0x7296, 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004,
-	0x53a3, 0x2099, 0x729a, 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004,
-	0x53a3, 0x2069, 0x72ae, 0x6904, 0xa18c, 0x00ff, 0x810f, 0x6808,
-	0xa084, 0x00ff, 0xa105, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072,
-	0x6818, 0x6076, 0xa182, 0x0211, 0x00c8, 0x349a, 0x2009, 0x0008,
-	0x0078, 0x34c4, 0xa182, 0x0259, 0x00c8, 0x34a2, 0x2009, 0x0007,
-	0x0078, 0x34c4, 0xa182, 0x02c1, 0x00c8, 0x34aa, 0x2009, 0x0006,
-	0x0078, 0x34c4, 0xa182, 0x0349, 0x00c8, 0x34b2, 0x2009, 0x0005,
-	0x0078, 0x34c4, 0xa182, 0x0421, 0x00c8, 0x34ba, 0x2009, 0x0004,
-	0x0078, 0x34c4, 0xa182, 0x0581, 0x00c8, 0x34c2, 0x2009, 0x0003,
-	0x0078, 0x34c4, 0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f,
-	0x0d7f, 0x007c, 0x0e7e, 0x2071, 0x728d, 0x2e04, 0x6896, 0x2071,
-	0x728e, 0x7004, 0x689a, 0x701c, 0x689e, 0x0e7f, 0x007c, 0x2001,
-	0x6c84, 0xa600, 0x2004, 0x127e, 0x2091, 0x8000, 0x6178, 0xa10d,
-	0x617a, 0x127f, 0x007c, 0x2001, 0x6c84, 0xa600, 0x2004, 0x8002,
-	0x127e, 0x2091, 0x8000, 0x6178, 0xa10c, 0x617a, 0x127f, 0x007c,
-	0x2001, 0x6c84, 0xa600, 0x2004, 0x8002, 0x127e, 0x2091, 0x8000,
-	0x617c, 0xa10c, 0x617e, 0x127f, 0x0078, 0x3500, 0x1078, 0x338c,
-	0x1078, 0x3561, 0x00c0, 0x34fe, 0x1078, 0x351b, 0x007c, 0x2001,
-	0x6c84, 0xa600, 0x2004, 0x127e, 0x2091, 0x8000, 0x617c, 0xa10d,
-	0x617e, 0x127f, 0x0078, 0x3516, 0x1078, 0x33d0, 0x1078, 0x3525,
-	0x00c0, 0x3514, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x4346,
-	0x127f, 0x007c, 0xa01e, 0x0078, 0x3527, 0x2019, 0x0001, 0xa00e,
-	0x127e, 0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x00c0,
-	0x3547, 0x8dff, 0x0040, 0x355c, 0x83ff, 0x0040, 0x353f, 0x6844,
-	0xa084, 0x00ff, 0xa606, 0x0040, 0x354c, 0x0078, 0x3547, 0x683c,
-	0xa406, 0x00c0, 0x3547, 0x6840, 0xa506, 0x0040, 0x354c, 0x2d08,
-	0x6800, 0x2068, 0x0078, 0x3531, 0x6a00, 0x604c, 0xad06, 0x00c0,
-	0x3554, 0x624e, 0x0078, 0x3557, 0xa180, 0x0000, 0x2202, 0x82ff,
-	0x00c0, 0x355c, 0x6152, 0x8dff, 0x127f, 0x007c, 0xa01e, 0x0078,
-	0x3563, 0x2019, 0x0001, 0xa00e, 0x6080, 0x2068, 0x8dff, 0x0040,
-	0x3591, 0x83ff, 0x0040, 0x3574, 0x6844, 0xa084, 0x00ff, 0xa606,
-	0x0040, 0x3581, 0x0078, 0x357c, 0x683c, 0xa406, 0x00c0, 0x357c,
-	0x6840, 0xa506, 0x0040, 0x3581, 0x2d08, 0x6800, 0x2068, 0x0078,
-	0x3566, 0x6a00, 0x6080, 0xad06, 0x00c0, 0x3589, 0x6282, 0x0078,
-	0x358c, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x3591, 0x6186,
-	0x8dff, 0x007c, 0x2001, 0x6c84, 0xa600, 0x2004, 0x6178, 0xa10c,
-	0x0040, 0x359c, 0x2011, 0x0001, 0x617c, 0xa10c, 0x0040, 0x35a2,
-	0xa295, 0x0002, 0x007c, 0x1078, 0x35ec, 0x0040, 0x35ab, 0x1078,
-	0x61f8, 0x0078, 0x35ad, 0xa085, 0x0001, 0x007c, 0x1078, 0x35ec,
-	0x0040, 0x35b6, 0x1078, 0x6187, 0x0078, 0x35b8, 0xa085, 0x0001,
-	0x007c, 0x1078, 0x35ec, 0x0040, 0x35c1, 0x1078, 0x61cd, 0x0078,
-	0x35c3, 0xa085, 0x0001, 0x007c, 0x1078, 0x35ec, 0x0040, 0x35cc,
-	0x1078, 0x61a3, 0x0078, 0x35ce, 0xa085, 0x0001, 0x007c, 0x127e,
-	0x007e, 0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d, 0x0040, 0x35e4,
-	0x6800, 0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
-	0x36a1, 0x007f, 0x0078, 0x35d5, 0x6083, 0x0000, 0x6087, 0x0000,
-	0x0d7f, 0x007f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c, 0x0f7e,
-	0x2079, 0x6d51, 0x7804, 0xd0a4, 0x0040, 0x3618, 0x157e, 0x0c7e,
-	0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3447, 0x00c0,
-	0x360c, 0x6004, 0xa084, 0xff00, 0x8007, 0xa086, 0x0006, 0x00c0,
-	0x360c, 0x6000, 0xc0ed, 0x6002, 0x017f, 0x8108, 0x00f0, 0x35fc,
-	0x0c7f, 0x157f, 0x2009, 0x07d0, 0x2011, 0x361a, 0x1078, 0x415f,
-	0x0f7f, 0x007c, 0x2011, 0x361a, 0x1078, 0x40d1, 0x157e, 0x0c7e,
-	0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3447, 0x00c0,
-	0x3646, 0x6000, 0xd0ec, 0x0040, 0x3646, 0x047e, 0x62a0, 0xa294,
-	0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0x6bf7, 0x6000,
-	0xc0e5, 0xc0ec, 0x6002, 0x2019, 0x0029, 0x1078, 0x445c, 0x1078,
-	0x43a9, 0x2009, 0x0000, 0x1078, 0x6a57, 0x047f, 0x017f, 0x8108,
-	0x00f0, 0x3624, 0x0c7f, 0x157f, 0x007c, 0x0c7e, 0x6018, 0x2060,
-	0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x2071, 0x6ddf, 0x7003,
-	0x0001, 0x7007, 0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b,
-	0x0000, 0x701f, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b,
-	0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x007c, 0x0e7e, 0x2071,
-	0x6ddf, 0x684c, 0xa005, 0x00c0, 0x367c, 0x7028, 0xc085, 0x702a,
-	0xa085, 0x0001, 0x0078, 0x369f, 0x6a60, 0x7236, 0x6b64, 0x733a,
-	0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e,
-	0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x8007, 0x8006, 0x8006,
-	0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x726e,
-	0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006, 0x0e7f,
-	0x007c, 0x0e7e, 0x6838, 0xd0fc, 0x00c0, 0x36f2, 0x6804, 0xa00d,
-	0x0040, 0x36c0, 0x0d7e, 0x0e7e, 0x2071, 0x6d00, 0x027e, 0xa016,
-	0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x00c0,
-	0x36b1, 0x702e, 0x70a0, 0xa200, 0x70a2, 0x027f, 0x0e7f, 0x0d7f,
-	0x2071, 0x6ddf, 0x701c, 0xa005, 0x00c0, 0x3703, 0x0068, 0x3701,
-	0x2071, 0x6d51, 0x7004, 0xd09c, 0x0040, 0x3701, 0x6934, 0xa186,
-	0x0103, 0x00c0, 0x3714, 0x6948, 0x6844, 0xa105, 0x00c0, 0x36f4,
-	0x2009, 0x8020, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x3701,
-	0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091,
-	0x4080, 0x2071, 0x6d00, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70a0,
-	0x8000, 0x70a2, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100, 0x00c0,
-	0x3701, 0x6868, 0xa005, 0x00c0, 0x3701, 0x2009, 0x8020, 0x0078,
-	0x36da, 0x2071, 0x6ddf, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000,
-	0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x3711, 0x6902, 0x0078,
-	0x3712, 0x711e, 0x0078, 0x36f2, 0xa18c, 0x00ff, 0xa18e, 0x0017,
-	0x0040, 0x371e, 0xa18e, 0x001f, 0x00c0, 0x3701, 0x684c, 0xd0cc,
-	0x0040, 0x3701, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0,
-	0x3701, 0x2009, 0x8021, 0x0078, 0x36da, 0x007e, 0x6837, 0x0103,
-	0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4,
-	0x007f, 0x684a, 0x6952, 0x007c, 0x2071, 0x6ddf, 0x7004, 0x0079,
-	0x3741, 0x3749, 0x3758, 0x37e4, 0x37e5, 0x37f5, 0x37fb, 0x374a,
-	0x37d2, 0x007c, 0x127e, 0x2091, 0x8000, 0x0068, 0x3757, 0x2009,
-	0x000d, 0x7030, 0x200a, 0x2091, 0x4080, 0x7007, 0x0001, 0x127f,
-	0x701c, 0xa06d, 0x0040, 0x37d1, 0x0e7e, 0x2071, 0x6d51, 0x7004,
-	0xd09c, 0x0040, 0x37b3, 0x6934, 0xa186, 0x0103, 0x00c0, 0x378d,
-	0x6948, 0x6844, 0xa105, 0x00c0, 0x37a6, 0x2009, 0x8020, 0x127e,
-	0x2091, 0x8000, 0x0068, 0x3789, 0x2071, 0x0000, 0x7018, 0xd084,
-	0x00c0, 0x3789, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b,
-	0x0001, 0x2091, 0x4080, 0x127f, 0x0e7f, 0x1078, 0x382e, 0x0078,
-	0x37d1, 0x127f, 0x0e7f, 0x0078, 0x37d1, 0xa18c, 0x00ff, 0xa18e,
-	0x0017, 0x0040, 0x3797, 0xa18e, 0x001f, 0x00c0, 0x37b3, 0x684c,
-	0xd0cc, 0x0040, 0x37b3, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001,
-	0x00c0, 0x37b3, 0x2009, 0x8021, 0x0078, 0x376f, 0x6844, 0xa086,
-	0x0100, 0x00c0, 0x37b3, 0x6868, 0xa005, 0x00c0, 0x37b3, 0x2009,
-	0x8020, 0x0078, 0x376f, 0x0e7f, 0x1078, 0x3842, 0x0040, 0x37d1,
-	0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003, 0x00c0,
-	0x37c8, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x37c8, 0x710e,
-	0x7007, 0x0003, 0x1078, 0x3862, 0x7050, 0xa086, 0x0100, 0x0040,
-	0x37e5, 0x007c, 0x701c, 0xa06d, 0x0040, 0x37e3, 0x1078, 0x3842,
-	0x0040, 0x37e3, 0x7007, 0x0003, 0x1078, 0x3862, 0x7050, 0xa086,
-	0x0100, 0x0040, 0x37e5, 0x007c, 0x007c, 0x7050, 0xa09e, 0x0100,
-	0x00c0, 0x37ee, 0x7007, 0x0004, 0x0078, 0x37f5, 0xa086, 0x0200,
-	0x00c0, 0x37f4, 0x7007, 0x0005, 0x007c, 0x1078, 0x37fc, 0x7006,
-	0x1078, 0x382e, 0x007c, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102,
-	0x0048, 0x3809, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, 0x0078,
-	0x3813, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x3813, 0x7070,
-	0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001, 0x700e, 0x00c0,
-	0x3827, 0x127e, 0x2091, 0x8000, 0x0068, 0x382a, 0x2001, 0x000d,
-	0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x127f, 0x007c, 0x2001,
-	0x0007, 0x007c, 0x2001, 0x0006, 0x127f, 0x007c, 0x701c, 0xa06d,
-	0x0040, 0x3841, 0x127e, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012,
-	0x2d04, 0x701e, 0xa005, 0x00c0, 0x383e, 0x701a, 0x127f, 0x1078,
-	0x1328, 0x007c, 0x2019, 0x000d, 0x2304, 0x230c, 0xa10e, 0x0040,
-	0x3851, 0x2304, 0x230c, 0xa10e, 0x0040, 0x3851, 0xa006, 0x0078,
-	0x3861, 0x732c, 0x8319, 0x7130, 0xa102, 0x00c0, 0x385b, 0x2300,
-	0xa005, 0x0078, 0x3861, 0x0048, 0x3860, 0xa302, 0x0078, 0x3861,
-	0x8002, 0x007c, 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053,
-	0x0000, 0x127e, 0x2091, 0x8000, 0x2009, 0x6f31, 0x2104, 0xc08d,
-	0x200a, 0x127f, 0x1078, 0x1379, 0x007c, 0x2071, 0x6dad, 0x7003,
-	0x0000, 0x7007, 0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f,
-	0x0000, 0x7053, 0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083,
-	0x0000, 0x708b, 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x007c,
-	0x0e7e, 0x2071, 0x6dad, 0x6848, 0xa005, 0x00c0, 0x389e, 0x7028,
-	0xc085, 0x702a, 0xa085, 0x0001, 0x0078, 0x38c3, 0x6a50, 0x7236,
-	0x6b54, 0x733a, 0x6858, 0x703e, 0x707a, 0x685c, 0x7042, 0x707e,
-	0x6848, 0x702e, 0x6840, 0x7032, 0x2009, 0x000c, 0x200a, 0x8007,
-	0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100,
-	0xa319, 0x7272, 0x7376, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001,
-	0x700f, 0x0000, 0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071, 0x6dad,
-	0x7004, 0x1079, 0x3923, 0x700c, 0x0079, 0x38ce, 0x38d3, 0x38c8,
-	0x38c8, 0x38c8, 0x38c8, 0x007c, 0x700c, 0x0079, 0x38d7, 0x38dc,
-	0x3921, 0x3921, 0x3922, 0x3922, 0x7830, 0x7930, 0xa106, 0x0040,
-	0x38e6, 0x7830, 0x7930, 0xa106, 0x00c0, 0x390c, 0x7030, 0xa10a,
-	0x0040, 0x390c, 0x00c8, 0x38ee, 0x712c, 0xa10a, 0xa18a, 0x0002,
-	0x00c8, 0x390d, 0x1078, 0x12f4, 0x0040, 0x390c, 0x2d00, 0x705a,
-	0x7063, 0x0040, 0x2001, 0x0003, 0x7057, 0x0000, 0x127e, 0x007e,
-	0x2091, 0x8000, 0x2009, 0x6f31, 0x2104, 0xc085, 0x200a, 0x007f,
-	0x700e, 0x127f, 0x1078, 0x1379, 0x007c, 0x1078, 0x12f4, 0x0040,
-	0x390c, 0x2d00, 0x705a, 0x1078, 0x12f4, 0x00c0, 0x3919, 0x0078,
-	0x38f8, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004, 0x0078,
-	0x38fc, 0x007c, 0x007c, 0x3934, 0x3935, 0x396c, 0x396d, 0x3921,
-	0x39a3, 0x39a8, 0x39df, 0x39e0, 0x39fb, 0x39fc, 0x39fd, 0x39fe,
-	0x39ff, 0x3a00, 0x3a69, 0x3a93, 0x007c, 0x700c, 0x0079, 0x3938,
-	0x393d, 0x3940, 0x3950, 0x396b, 0x396b, 0x1078, 0x38d4, 0x007c,
-	0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x3d52, 0x0040,
-	0x394d, 0x2091, 0x8000, 0x1078, 0x38d4, 0x0d7f, 0x0078, 0x3959,
-	0x127e, 0x8001, 0x700e, 0x1078, 0x3d52, 0x7058, 0x2068, 0x7084,
-	0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff,
-	0xa08a, 0x0020, 0x00c8, 0x3968, 0x1079, 0x3983, 0x127f, 0x007c,
-	0x127f, 0x1078, 0x3a01, 0x007c, 0x007c, 0x007c, 0x0e7e, 0x2071,
-	0x6dad, 0x700c, 0x0079, 0x3974, 0x3979, 0x3979, 0x3979, 0x397b,
-	0x397f, 0x0e7f, 0x007c, 0x700f, 0x0001, 0x0078, 0x3981, 0x700f,
-	0x0002, 0x0e7f, 0x007c, 0x3a01, 0x3a01, 0x3a1d, 0x3a01, 0x3aff,
-	0x3a01, 0x3a01, 0x3a01, 0x3a01, 0x3a01, 0x3a1d, 0x3b44, 0x3b8d,
-	0x3be5, 0x3bf8, 0x3a01, 0x3a01, 0x3a39, 0x3a1d, 0x3a01, 0x3a01,
-	0x3a4f, 0x3c74, 0x3c91, 0x3a01, 0x3a39, 0x3a01, 0x3a01, 0x3a01,
-	0x3a01, 0x3a01, 0x3c91, 0x7020, 0x2068, 0x1078, 0x1328, 0x007c,
-	0x700c, 0x0079, 0x39ab, 0x39b0, 0x39b3, 0x39c3, 0x39de, 0x39de,
-	0x1078, 0x38d4, 0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e,
-	0x1078, 0x3d52, 0x0040, 0x39c0, 0x2091, 0x8000, 0x1078, 0x38d4,
-	0x0d7f, 0x0078, 0x39cc, 0x127e, 0x8001, 0x700e, 0x1078, 0x3d52,
-	0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000,
-	0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x00c8, 0x39db, 0x1079,
-	0x39e1, 0x127f, 0x007c, 0x127f, 0x1078, 0x3a01, 0x007c, 0x007c,
-	0x007c, 0x3a01, 0x3a1d, 0x3ae9, 0x3a01, 0x3a1d, 0x3a01, 0x3a1d,
-	0x3a1d, 0x3a01, 0x3a1d, 0x3ae9, 0x3a1d, 0x3a1d, 0x3a1d, 0x3a1d,
-	0x3a1d, 0x3a01, 0x3a1d, 0x3ae9, 0x3a01, 0x3a01, 0x3a1d, 0x3a01,
-	0x3a01, 0x3a01, 0x3a1d, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c,
-	0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a,
-	0x127e, 0x2091, 0x8000, 0x1078, 0x36a1, 0x127f, 0x007c, 0x7007,
-	0x0001, 0x6838, 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e, 0x2091,
-	0x8000, 0x1078, 0x36a1, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838,
-	0xa084, 0x00ff, 0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078,
-	0x36a1, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff,
-	0xc0dd, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x36a1, 0x127f,
-	0x007c, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0040, 0x3a0f, 0x8001,
-	0x00c0, 0x3a46, 0x7007, 0x0001, 0x0078, 0x3ac8, 0x7007, 0x0006,
-	0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x3ac8, 0x007c, 0x2d00,
-	0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1,
-	0x6dd8, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8, 0x3a2b,
-	0x6884, 0xa08a, 0x0003, 0x00c8, 0x3a2b, 0xa080, 0x3ab9, 0x2004,
-	0x70c6, 0x7010, 0xa015, 0x0040, 0x3ab3, 0x1078, 0x12f4, 0x00c0,
-	0x3a74, 0x7007, 0x000f, 0x007c, 0x2d00, 0x7022, 0x70c4, 0x2060,
-	0x6000, 0x6836, 0x6004, 0xad00, 0x7096, 0x6008, 0xa20a, 0x00c8,
-	0x3a83, 0xa00e, 0x2200, 0x7112, 0x620c, 0x8003, 0x800b, 0xa296,
-	0x0004, 0x0040, 0x3a8c, 0xa108, 0x719a, 0x810b, 0x719e, 0xae90,
-	0x0022, 0x1078, 0x135f, 0x7090, 0xa08e, 0x0100, 0x0040, 0x3aa7,
-	0xa086, 0x0200, 0x0040, 0x3a9f, 0x7007, 0x0010, 0x007c, 0x7020,
-	0x2068, 0x1078, 0x1328, 0x7014, 0x2068, 0x0078, 0x3a2b, 0x7020,
-	0x2068, 0x7018, 0x6802, 0x6807, 0x0000, 0x2d08, 0x2068, 0x6906,
-	0x711a, 0x0078, 0x3a69, 0x7014, 0x2068, 0x7007, 0x0001, 0x0078,
-	0x3ac8, 0x3abc, 0x3ac0, 0x3ac4, 0x0002, 0x0011, 0x0007, 0x0004,
+	0xa294, 0xff00, 0xa215, 0x6206, 0x0c7f, 0x127f, 0x007c, 0x127e,
+	0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0xa294, 0x00ff,
+	0x8007, 0xa215, 0x6206, 0x0c7f, 0x127f, 0x007c, 0x027e, 0xa182,
+	0x00ff, 0x0048, 0x37f7, 0xa085, 0x0001, 0x0078, 0x380b, 0xa190,
+	0x7720, 0x2204, 0xa065, 0x00c0, 0x380a, 0x017e, 0x0d7e, 0x1078,
+	0x1314, 0x2d60, 0x0d7f, 0x017f, 0x0040, 0x37f3, 0x2c00, 0x2012,
+	0x1078, 0x3621, 0xa006, 0x027f, 0x007c, 0x027e, 0xa182, 0x00ff,
+	0x0048, 0x3816, 0xa085, 0x0001, 0x0078, 0x3823, 0x0d7e, 0xa190,
+	0x7720, 0x2204, 0xa06d, 0x0040, 0x3821, 0x2013, 0x0000, 0x1078,
+	0x1348, 0x0d7f, 0xa006, 0x027f, 0x007c, 0x017e, 0xa182, 0x00ff,
+	0x0048, 0x382e, 0xa085, 0x0001, 0x0078, 0x3835, 0xa188, 0x7720,
+	0x2104, 0xa065, 0x0040, 0x382a, 0xa006, 0x017f, 0x007c, 0x0d7e,
+	0x157e, 0x137e, 0x147e, 0x600b, 0x0000, 0x600f, 0x0000, 0x6000,
+	0xc08c, 0x6002, 0x2069, 0x7b8e, 0x6808, 0x605e, 0x6810, 0x6062,
+	0x6138, 0xa10a, 0x0048, 0x384d, 0x603a, 0x6814, 0x6066, 0x2099,
+	0x7b96, 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099,
+	0x7b9a, 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069,
+	0x7bae, 0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818,
+	0x6076, 0xa182, 0x0211, 0x00c8, 0x3871, 0x2009, 0x0008, 0x0078,
+	0x389b, 0xa182, 0x0259, 0x00c8, 0x3879, 0x2009, 0x0007, 0x0078,
+	0x389b, 0xa182, 0x02c1, 0x00c8, 0x3881, 0x2009, 0x0006, 0x0078,
+	0x389b, 0xa182, 0x0349, 0x00c8, 0x3889, 0x2009, 0x0005, 0x0078,
+	0x389b, 0xa182, 0x0421, 0x00c8, 0x3891, 0x2009, 0x0004, 0x0078,
+	0x389b, 0xa182, 0x0581, 0x00c8, 0x3899, 0x2009, 0x0003, 0x0078,
+	0x389b, 0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f, 0x0d7f,
+	0x007c, 0x0e7e, 0x2071, 0x7b8d, 0x2e04, 0x6896, 0x2071, 0x7b8e,
+	0x7004, 0x689a, 0x701c, 0x689e, 0x0e7f, 0x007c, 0x2001, 0x75d5,
+	0xa600, 0x2004, 0x127e, 0x2091, 0x8000, 0x6178, 0xa10d, 0x617a,
+	0x127f, 0x007c, 0x2001, 0x75d5, 0xa600, 0x2004, 0x8002, 0x127e,
+	0x2091, 0x8000, 0x6178, 0xa10c, 0x617a, 0x127f, 0x007c, 0x2001,
+	0x75d5, 0xa600, 0x2004, 0x8002, 0x127e, 0x2091, 0x8000, 0x617c,
+	0xa10c, 0x617e, 0x127f, 0x0078, 0x38d7, 0x1078, 0x376a, 0x1078,
+	0x3938, 0x00c0, 0x38d5, 0x1078, 0x38f2, 0x007c, 0x2001, 0x75d5,
+	0xa600, 0x2004, 0x127e, 0x2091, 0x8000, 0x617c, 0xa10d, 0x617e,
+	0x127f, 0x0078, 0x38ed, 0x1078, 0x37ae, 0x1078, 0x38fc, 0x00c0,
+	0x38eb, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x4844, 0x127f,
+	0x007c, 0xa01e, 0x0078, 0x38fe, 0x2019, 0x0001, 0xa00e, 0x127e,
+	0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x00c0, 0x391e,
+	0x8dff, 0x0040, 0x3933, 0x83ff, 0x0040, 0x3916, 0x6844, 0xa084,
+	0x00ff, 0xa606, 0x0040, 0x3923, 0x0078, 0x391e, 0x683c, 0xa406,
+	0x00c0, 0x391e, 0x6840, 0xa506, 0x0040, 0x3923, 0x2d08, 0x6800,
+	0x2068, 0x0078, 0x3908, 0x6a00, 0x604c, 0xad06, 0x00c0, 0x392b,
+	0x624e, 0x0078, 0x392e, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0,
+	0x3933, 0x6152, 0x8dff, 0x127f, 0x007c, 0xa01e, 0x0078, 0x393a,
+	0x2019, 0x0001, 0xa00e, 0x6080, 0x2068, 0x8dff, 0x0040, 0x3968,
+	0x83ff, 0x0040, 0x394b, 0x6844, 0xa084, 0x00ff, 0xa606, 0x0040,
+	0x3958, 0x0078, 0x3953, 0x683c, 0xa406, 0x00c0, 0x3953, 0x6840,
+	0xa506, 0x0040, 0x3958, 0x2d08, 0x6800, 0x2068, 0x0078, 0x393d,
+	0x6a00, 0x6080, 0xad06, 0x00c0, 0x3960, 0x6282, 0x0078, 0x3963,
+	0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x3968, 0x6186, 0x8dff,
+	0x007c, 0x2001, 0x75d5, 0xa600, 0x2004, 0x6178, 0xa10c, 0x0040,
+	0x3973, 0x2011, 0x0001, 0x617c, 0xa10c, 0x0040, 0x3979, 0xa295,
+	0x0002, 0x007c, 0x1078, 0x39c5, 0x0040, 0x3982, 0x1078, 0x6a16,
+	0x0078, 0x3984, 0xa085, 0x0001, 0x007c, 0x1078, 0x39c5, 0x0040,
+	0x398d, 0x1078, 0x69a5, 0x0078, 0x398f, 0xa085, 0x0001, 0x007c,
+	0x1078, 0x39c5, 0x0040, 0x3998, 0x1078, 0x69eb, 0x0078, 0x399a,
+	0xa085, 0x0001, 0x007c, 0x1078, 0x39c5, 0x0040, 0x39a3, 0x1078,
+	0x69c1, 0x0078, 0x39a5, 0xa085, 0x0001, 0x007c, 0x127e, 0x007e,
+	0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d, 0x0040, 0x39bd, 0x6800,
+	0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x6b3f,
+	0x1078, 0x3a7a, 0x007f, 0x0078, 0x39ac, 0x6083, 0x0000, 0x6087,
+	0x0000, 0x0d7f, 0x007f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c,
+	0x0f7e, 0x2079, 0x7651, 0x7804, 0xd0a4, 0x0040, 0x39f1, 0x157e,
+	0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3825,
+	0x00c0, 0x39e5, 0x6004, 0xa084, 0xff00, 0x8007, 0xa086, 0x0006,
+	0x00c0, 0x39e5, 0x6000, 0xc0ed, 0x6002, 0x017f, 0x8108, 0x00f0,
+	0x39d5, 0x0c7f, 0x157f, 0x2009, 0x07d0, 0x2011, 0x39f3, 0x1078,
+	0x45fe, 0x0f7f, 0x007c, 0x2011, 0x39f3, 0x1078, 0x456e, 0x157e,
+	0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3825,
+	0x00c0, 0x3a1f, 0x6000, 0xd0ec, 0x0040, 0x3a1f, 0x047e, 0x62a0,
+	0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0x7541,
+	0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x2019, 0x0029, 0x1078, 0x4962,
+	0x1078, 0x48a5, 0x2009, 0x0000, 0x1078, 0x737b, 0x047f, 0x017f,
+	0x8108, 0x00f0, 0x39fd, 0x0c7f, 0x157f, 0x007c, 0x0c7e, 0x6018,
+	0x2060, 0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x2071, 0x76ff,
+	0x7003, 0x0001, 0x7007, 0x0000, 0x7013, 0x0000, 0x7017, 0x0000,
+	0x701b, 0x0000, 0x701f, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000,
+	0x705b, 0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x007c, 0x0e7e,
+	0x2071, 0x76ff, 0x684c, 0xa005, 0x00c0, 0x3a55, 0x7028, 0xc085,
+	0x702a, 0xa085, 0x0001, 0x0078, 0x3a78, 0x6a60, 0x7236, 0x6b64,
+	0x733a, 0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c,
+	0x702e, 0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x8007, 0x8006,
+	0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319,
+	0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006,
+	0x0e7f, 0x007c, 0x0e7e, 0x6838, 0xd0fc, 0x00c0, 0x3acb, 0x6804,
+	0xa00d, 0x0040, 0x3a99, 0x0d7e, 0x0e7e, 0x2071, 0x7600, 0x027e,
+	0xa016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff,
+	0x00c0, 0x3a8a, 0x702e, 0x70a0, 0xa200, 0x70a2, 0x027f, 0x0e7f,
+	0x0d7f, 0x2071, 0x76ff, 0x701c, 0xa005, 0x00c0, 0x3adc, 0x0068,
+	0x3ada, 0x2071, 0x7651, 0x7004, 0xd09c, 0x0040, 0x3ada, 0x6934,
+	0xa186, 0x0103, 0x00c0, 0x3aed, 0x6948, 0x6844, 0xa105, 0x00c0,
+	0x3acd, 0x2009, 0x8020, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0,
+	0x3ada, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001,
+	0x2091, 0x4080, 0x2071, 0x7600, 0x702c, 0x206a, 0x2d00, 0x702e,
+	0x70a0, 0x8000, 0x70a2, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100,
+	0x00c0, 0x3ada, 0x6868, 0xa005, 0x00c0, 0x3ada, 0x2009, 0x8020,
+	0x0078, 0x3ab3, 0x2071, 0x76ff, 0x2d08, 0x206b, 0x0000, 0x7010,
+	0x8000, 0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x3aea, 0x6902,
+	0x0078, 0x3aeb, 0x711e, 0x0078, 0x3acb, 0xa18c, 0x00ff, 0xa186,
+	0x0017, 0x0040, 0x3afb, 0xa186, 0x001e, 0x0040, 0x3afb, 0xa18e,
+	0x001f, 0x00c0, 0x3ada, 0x684c, 0xd0cc, 0x0040, 0x3ada, 0x6850,
+	0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x3ada, 0x2009, 0x8021,
+	0x0078, 0x3ab3, 0x007e, 0x6837, 0x0103, 0x20a9, 0x001c, 0xad80,
+	0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x007f, 0x684a, 0x6952,
+	0x007c, 0x2071, 0x76ff, 0x7004, 0x0079, 0x3b1e, 0x3b26, 0x3b35,
+	0x3bc5, 0x3bc6, 0x3bd6, 0x3bdc, 0x3b27, 0x3bb3, 0x007c, 0x127e,
+	0x2091, 0x8000, 0x0068, 0x3b34, 0x2009, 0x000d, 0x7030, 0x200a,
+	0x2091, 0x4080, 0x7007, 0x0001, 0x127f, 0x701c, 0xa06d, 0x0040,
+	0x3bb2, 0x0e7e, 0x2071, 0x7651, 0x7004, 0xd09c, 0x0040, 0x3b94,
+	0x6934, 0xa186, 0x0103, 0x00c0, 0x3b6a, 0x6948, 0x6844, 0xa105,
+	0x00c0, 0x3b87, 0x2009, 0x8020, 0x127e, 0x2091, 0x8000, 0x0068,
+	0x3b66, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x3b66, 0x7122,
+	0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080,
+	0x127f, 0x0e7f, 0x1078, 0x3c0f, 0x0078, 0x3bb2, 0x127f, 0x0e7f,
+	0x0078, 0x3bb2, 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0040, 0x3b78,
+	0xa186, 0x001e, 0x0040, 0x3b78, 0xa18e, 0x001f, 0x00c0, 0x3b94,
+	0x684c, 0xd0cc, 0x0040, 0x3b94, 0x6850, 0xa084, 0x00ff, 0xa086,
+	0x0001, 0x00c0, 0x3b94, 0x2009, 0x8021, 0x0078, 0x3b4c, 0x6844,
+	0xa086, 0x0100, 0x00c0, 0x3b94, 0x6868, 0xa005, 0x00c0, 0x3b94,
+	0x2009, 0x8020, 0x0078, 0x3b4c, 0x0e7f, 0x1078, 0x3c23, 0x0040,
+	0x3bb2, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003,
+	0x00c0, 0x3ba9, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x3ba9,
+	0x710e, 0x7007, 0x0003, 0x1078, 0x3c43, 0x7050, 0xa086, 0x0100,
+	0x0040, 0x3bc6, 0x007c, 0x701c, 0xa06d, 0x0040, 0x3bc4, 0x1078,
+	0x3c23, 0x0040, 0x3bc4, 0x7007, 0x0003, 0x1078, 0x3c43, 0x7050,
+	0xa086, 0x0100, 0x0040, 0x3bc6, 0x007c, 0x007c, 0x7050, 0xa09e,
+	0x0100, 0x00c0, 0x3bcf, 0x7007, 0x0004, 0x0078, 0x3bd6, 0xa086,
+	0x0200, 0x00c0, 0x3bd5, 0x7007, 0x0005, 0x007c, 0x1078, 0x3bdd,
+	0x7006, 0x1078, 0x3c0f, 0x007c, 0x007c, 0x702c, 0x7130, 0x8108,
+	0xa102, 0x0048, 0x3bea, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072,
+	0x0078, 0x3bf4, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x3bf4,
+	0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001, 0x700e,
+	0x00c0, 0x3c08, 0x127e, 0x2091, 0x8000, 0x0068, 0x3c0b, 0x2001,
+	0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x127f, 0x007c,
+	0x2001, 0x0007, 0x007c, 0x2001, 0x0006, 0x127f, 0x007c, 0x701c,
+	0xa06d, 0x0040, 0x3c22, 0x127e, 0x2091, 0x8000, 0x7010, 0x8001,
+	0x7012, 0x2d04, 0x701e, 0xa005, 0x00c0, 0x3c1f, 0x701a, 0x127f,
+	0x1078, 0x1348, 0x007c, 0x2019, 0x000d, 0x2304, 0x230c, 0xa10e,
+	0x0040, 0x3c32, 0x2304, 0x230c, 0xa10e, 0x0040, 0x3c32, 0xa006,
+	0x0078, 0x3c42, 0x732c, 0x8319, 0x7130, 0xa102, 0x00c0, 0x3c3c,
+	0x2300, 0xa005, 0x0078, 0x3c42, 0x0048, 0x3c41, 0xa302, 0x0078,
+	0x3c42, 0x8002, 0x007c, 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056,
+	0x7053, 0x0000, 0x127e, 0x2091, 0x8000, 0x2009, 0x7859, 0x2104,
+	0xc08d, 0x200a, 0x127f, 0x1078, 0x1399, 0x007c, 0x2071, 0x76cd,
+	0x7003, 0x0000, 0x7007, 0x0000, 0x700f, 0x0000, 0x702b, 0x0001,
+	0x704f, 0x0000, 0x7053, 0x0001, 0x705f, 0x0020, 0x7063, 0x0040,
+	0x7083, 0x0000, 0x708b, 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000,
+	0x007c, 0x0e7e, 0x2071, 0x76cd, 0x6848, 0xa005, 0x00c0, 0x3c7f,
+	0x7028, 0xc085, 0x702a, 0xa085, 0x0001, 0x0078, 0x3ca4, 0x6a50,
+	0x7236, 0x6b54, 0x733a, 0x6858, 0x703e, 0x707a, 0x685c, 0x7042,
+	0x707e, 0x6848, 0x702e, 0x6840, 0x7032, 0x2009, 0x000c, 0x200a,
+	0x8007, 0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210,
+	0x2100, 0xa319, 0x7272, 0x7376, 0x7028, 0xc084, 0x702a, 0x7007,
+	0x0001, 0x700f, 0x0000, 0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071,
+	0x76cd, 0x7004, 0x1079, 0x3d04, 0x700c, 0x0079, 0x3caf, 0x3cb4,
+	0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x007c, 0x700c, 0x0079, 0x3cb8,
+	0x3cbd, 0x3d02, 0x3d02, 0x3d03, 0x3d03, 0x7830, 0x7930, 0xa106,
+	0x0040, 0x3cc7, 0x7830, 0x7930, 0xa106, 0x00c0, 0x3ced, 0x7030,
+	0xa10a, 0x0040, 0x3ced, 0x00c8, 0x3ccf, 0x712c, 0xa10a, 0xa18a,
+	0x0002, 0x00c8, 0x3cee, 0x1078, 0x1314, 0x0040, 0x3ced, 0x2d00,
+	0x705a, 0x7063, 0x0040, 0x2001, 0x0003, 0x7057, 0x0000, 0x127e,
+	0x007e, 0x2091, 0x8000, 0x2009, 0x7859, 0x2104, 0xc085, 0x200a,
+	0x007f, 0x700e, 0x127f, 0x1078, 0x1399, 0x007c, 0x1078, 0x1314,
+	0x0040, 0x3ced, 0x2d00, 0x705a, 0x1078, 0x1314, 0x00c0, 0x3cfa,
+	0x0078, 0x3cd9, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004,
+	0x0078, 0x3cdd, 0x007c, 0x007c, 0x3d15, 0x3d16, 0x3d4d, 0x3d4e,
+	0x3d02, 0x3d84, 0x3d89, 0x3dc0, 0x3dc1, 0x3ddc, 0x3ddd, 0x3dde,
+	0x3ddf, 0x3de0, 0x3de1, 0x3e4a, 0x3e74, 0x007c, 0x700c, 0x0079,
+	0x3d19, 0x3d1e, 0x3d21, 0x3d31, 0x3d4c, 0x3d4c, 0x1078, 0x3cb5,
+	0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x4153,
+	0x0040, 0x3d2e, 0x2091, 0x8000, 0x1078, 0x3cb5, 0x0d7f, 0x0078,
+	0x3d3a, 0x127e, 0x8001, 0x700e, 0x1078, 0x4153, 0x7058, 0x2068,
+	0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084,
+	0x00ff, 0xa08a, 0x0020, 0x00c8, 0x3d49, 0x1079, 0x3d64, 0x127f,
+	0x007c, 0x127f, 0x1078, 0x3de2, 0x007c, 0x007c, 0x007c, 0x0e7e,
+	0x2071, 0x76cd, 0x700c, 0x0079, 0x3d55, 0x3d5a, 0x3d5a, 0x3d5a,
+	0x3d5c, 0x3d60, 0x0e7f, 0x007c, 0x700f, 0x0001, 0x0078, 0x3d62,
+	0x700f, 0x0002, 0x0e7f, 0x007c, 0x3de2, 0x3de2, 0x3dfe, 0x3de2,
+	0x3ee9, 0x3de2, 0x3de2, 0x3de2, 0x3de2, 0x3de2, 0x3dfe, 0x3f2e,
+	0x3f77, 0x3fcf, 0x3fe2, 0x3de2, 0x3de2, 0x3e1a, 0x3dfe, 0x3de2,
+	0x3de2, 0x3e30, 0x4069, 0x4086, 0x3de2, 0x3e1a, 0x3de2, 0x3de2,
+	0x3de2, 0x3de2, 0x3e30, 0x4086, 0x7020, 0x2068, 0x1078, 0x1348,
+	0x007c, 0x700c, 0x0079, 0x3d8c, 0x3d91, 0x3d94, 0x3da4, 0x3dbf,
+	0x3dbf, 0x1078, 0x3cb5, 0x007c, 0x127e, 0x8001, 0x700e, 0x7058,
+	0x007e, 0x1078, 0x4153, 0x0040, 0x3da1, 0x2091, 0x8000, 0x1078,
+	0x3cb5, 0x0d7f, 0x0078, 0x3dad, 0x127e, 0x8001, 0x700e, 0x1078,
+	0x4153, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807,
+	0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x00c8, 0x3dbc,
+	0x1079, 0x3dc2, 0x127f, 0x007c, 0x127f, 0x1078, 0x3de2, 0x007c,
+	0x007c, 0x007c, 0x3de2, 0x3dfe, 0x3ed3, 0x3de2, 0x3dfe, 0x3de2,
+	0x3dfe, 0x3dfe, 0x3de2, 0x3dfe, 0x3ed3, 0x3dfe, 0x3dfe, 0x3dfe,
+	0x3dfe, 0x3dfe, 0x3de2, 0x3dfe, 0x3ed3, 0x3de2, 0x3de2, 0x3dfe,
+	0x3de2, 0x3de2, 0x3de2, 0x3dfe, 0x007c, 0x007c, 0x007c, 0x007c,
+	0x007c, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5,
+	0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x3a7a, 0x127f, 0x007c,
+	0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e,
+	0x2091, 0x8000, 0x1078, 0x3a7a, 0x127f, 0x007c, 0x7007, 0x0001,
+	0x6838, 0xa084, 0x00ff, 0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000,
+	0x1078, 0x3a7a, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084,
+	0x00ff, 0xc0dd, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x3a7a,
+	0x127f, 0x007c, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0040, 0x3df0,
+	0x8001, 0x00c0, 0x3e27, 0x7007, 0x0001, 0x0078, 0x3eb0, 0x7007,
+	0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x3eb0, 0x007c,
+	0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098,
+	0x20a1, 0x76f8, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8,
+	0x3e0c, 0x6884, 0xa08a, 0x0003, 0x00c8, 0x3e0c, 0xa080, 0x3ea1,
+	0x2004, 0x70c6, 0x7010, 0xa015, 0x0040, 0x3e94, 0x1078, 0x1314,
+	0x00c0, 0x3e55, 0x7007, 0x000f, 0x007c, 0x2d00, 0x7022, 0x70c4,
+	0x2060, 0x6000, 0x6836, 0x6004, 0xad00, 0x7096, 0x6008, 0xa20a,
+	0x00c8, 0x3e64, 0xa00e, 0x2200, 0x7112, 0x620c, 0x8003, 0x800b,
+	0xa296, 0x0004, 0x0040, 0x3e6d, 0xa108, 0x719a, 0x810b, 0x719e,
+	0xae90, 0x0022, 0x1078, 0x137f, 0x7090, 0xa08e, 0x0100, 0x0040,
+	0x3e88, 0xa086, 0x0200, 0x0040, 0x3e80, 0x7007, 0x0010, 0x007c,
+	0x7020, 0x2068, 0x1078, 0x1348, 0x7014, 0x2068, 0x0078, 0x3e0c,
+	0x7020, 0x2068, 0x7018, 0x6802, 0x6807, 0x0000, 0x2d08, 0x2068,
+	0x6906, 0x711a, 0x0078, 0x3e4a, 0x7014, 0x2068, 0x7007, 0x0001,
+	0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x0040, 0x40a3, 0x0078,
+	0x3eb0, 0x3ea4, 0x3ea8, 0x3eac, 0x0002, 0x0011, 0x0007, 0x0004,
 	0x000a, 0x000f, 0x0005, 0x0006, 0x0012, 0x000f, 0x0005, 0x0006,
-	0x2009, 0x6d2c, 0x210c, 0x81ff, 0x00c0, 0x3ae3, 0x6838, 0xa084,
-	0x00ff, 0x683a, 0x6853, 0x0000, 0x1078, 0x3299, 0x00c0, 0x3ad9,
-	0x007c, 0x1078, 0x372d, 0x127e, 0x2091, 0x8000, 0x1078, 0x36a1,
-	0x127f, 0x0078, 0x3ad8, 0x2001, 0x0028, 0x2009, 0x0000, 0x0078,
-	0x3ad9, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, 0x711a, 0x7010,
-	0x8001, 0x7012, 0x0040, 0x3af8, 0x7007, 0x0006, 0x0078, 0x3afe,
-	0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a, 0x007c, 0x7007,
-	0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848, 0xa084, 0x00ff,
-	0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x3b2a, 0x2009, 0x0000,
-	0x20a9, 0x007e, 0xa096, 0x0002, 0x0040, 0x3b2a, 0xa005, 0x00c0,
-	0x3b41, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x3447, 0x00c0,
-	0x3b41, 0x067e, 0x6e44, 0xa6b4, 0x000f, 0x1078, 0x34e3, 0x067f,
-	0x0078, 0x3b41, 0x047e, 0x2011, 0x6d0c, 0x2224, 0xc484, 0xc48c,
-	0x2412, 0x047f, 0x0c7e, 0x1078, 0x3447, 0x00c0, 0x3b3d, 0x2091,
-	0x8000, 0x607b, 0x0000, 0x2091, 0x8001, 0x8108, 0x00f0, 0x3b33,
-	0x0c7f, 0x1078, 0x1328, 0x007c, 0x127e, 0x2091, 0x8000, 0x7007,
-	0x0001, 0x2001, 0x6d52, 0x2004, 0xd0a4, 0x0040, 0x3b84, 0x6944,
-	0x1078, 0x3d6e, 0x6100, 0xd184, 0x0040, 0x3b69, 0x6858, 0xa084,
-	0x00ff, 0x00c0, 0x3b87, 0x6000, 0xd084, 0x0040, 0x3b84, 0x6004,
-	0xa005, 0x00c0, 0x3b8a, 0x6003, 0x0000, 0x600b, 0x0000, 0x0078,
-	0x3b81, 0x2011, 0x0001, 0x6860, 0xa005, 0x00c0, 0x3b71, 0x2001,
-	0x001e, 0x8000, 0x6016, 0x6858, 0xa084, 0x00ff, 0x0040, 0x3b84,
-	0x6006, 0x6858, 0x8007, 0xa084, 0x00ff, 0x0040, 0x3b84, 0x600a,
-	0x6202, 0x127f, 0x0078, 0x3d41, 0x127f, 0x0078, 0x3d39, 0x127f,
-	0x0078, 0x3d31, 0x127f, 0x0078, 0x3d35, 0x127e, 0x2091, 0x8000,
-	0x7007, 0x0001, 0x2001, 0x6d52, 0x2004, 0xd0a4, 0x0040, 0x3be2,
-	0x6944, 0x1078, 0x3d6e, 0x6000, 0xa084, 0x0001, 0x0040, 0x3be2,
-	0x6204, 0x6308, 0x6c48, 0xa484, 0x0003, 0x0040, 0x3bba, 0x6958,
-	0xa18c, 0x00ff, 0x8001, 0x00c0, 0x3bb3, 0x2100, 0xa210, 0x0048,
-	0x3bdf, 0x0078, 0x3bba, 0x8001, 0x00c0, 0x3bdf, 0x2100, 0xa212,
-	0x0048, 0x3bdf, 0xa484, 0x000c, 0x0040, 0x3bd4, 0x6958, 0x810f,
-	0xa18c, 0x00ff, 0xa082, 0x0004, 0x00c0, 0x3bcc, 0x2100, 0xa318,
-	0x0048, 0x3bdf, 0x0078, 0x3bd4, 0xa082, 0x0004, 0x00c0, 0x3bdf,
-	0x2100, 0xa31a, 0x0048, 0x3bdf, 0x6860, 0xa005, 0x0040, 0x3bda,
-	0x8000, 0x6016, 0x6206, 0x630a, 0x127f, 0x0078, 0x3d41, 0x127f,
-	0x0078, 0x3d3d, 0x127f, 0x0078, 0x3d39, 0x127e, 0x2091, 0x8000,
-	0x7007, 0x0001, 0x6944, 0x1078, 0x3d6e, 0x6308, 0x8318, 0x0048,
-	0x3bf5, 0x630a, 0x127f, 0x0078, 0x3d4f, 0x127f, 0x0078, 0x3d3d,
-	0x127e, 0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac,
-	0x0040, 0x3c0c, 0x027e, 0x2009, 0x0000, 0x2011, 0xfcff, 0x1078,
-	0x41f4, 0x027f, 0x0078, 0x3c42, 0x6858, 0xa005, 0x0040, 0x3c56,
-	0x685c, 0xa065, 0x0040, 0x3c52, 0x2001, 0x6d2c, 0x2004, 0xa005,
-	0x0040, 0x3c1e, 0x1078, 0x6283, 0x0078, 0x3c24, 0x6013, 0x0400,
-	0x2009, 0x0041, 0x1078, 0x5591, 0x6958, 0xa18c, 0xe600, 0xa186,
-	0x2000, 0x0040, 0x3c3a, 0xa186, 0x0400, 0x0040, 0x3c3a, 0x6944,
-	0x0c7e, 0x1078, 0x416d, 0x6000, 0xa084, 0xfdff, 0x6002, 0x0c7f,
-	0x0078, 0x3c42, 0x027e, 0x2009, 0x0000, 0x2011, 0xfdff, 0x1078,
-	0x41f4, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x3c4e, 0x6944, 0x1078,
-	0x416d, 0x6008, 0x8000, 0x0048, 0x3c4e, 0x600a, 0x0c7f, 0x127f,
-	0x0078, 0x3d41, 0x0c7f, 0x127f, 0x0078, 0x3d39, 0x6954, 0xa186,
-	0x0020, 0x0040, 0x3c6c, 0xa186, 0x0029, 0x00c0, 0x3c52, 0x6944,
-	0xa18c, 0xff00, 0x810f, 0x1078, 0x3447, 0x00c0, 0x3c42, 0x6000,
-	0xc0e4, 0x6002, 0x0078, 0x3c42, 0x685c, 0xa065, 0x0040, 0x3c52,
-	0x6017, 0x0014, 0x0078, 0x3c42, 0x6944, 0x1078, 0x3d6e, 0x6000,
-	0xa084, 0x0001, 0x0040, 0x3c8d, 0x2091, 0x8000, 0x6204, 0x8210,
-	0x0048, 0x3c87, 0x6206, 0x2091, 0x8001, 0x0078, 0x3d4f, 0x2091,
-	0x8001, 0x6853, 0x0016, 0x0078, 0x3d48, 0x6853, 0x0007, 0x0078,
-	0x3d48, 0x6834, 0x8007, 0xa084, 0x00ff, 0x00c0, 0x3c9b, 0x1078,
-	0x3a0f, 0x0078, 0x3cad, 0x2030, 0x8001, 0x00c0, 0x3ca5, 0x7007,
-	0x0001, 0x1078, 0x3cae, 0x0078, 0x3cad, 0x7007, 0x0006, 0x7012,
-	0x2d00, 0x7016, 0x701a, 0x704b, 0x3cae, 0x007c, 0x0e7e, 0x2009,
-	0x6d2c, 0x210c, 0x81ff, 0x00c0, 0x3d28, 0x6848, 0x2070, 0xae82,
-	0x7400, 0x0048, 0x3d18, 0x2001, 0x6d15, 0x2004, 0xae02, 0x00c8,
-	0x3d18, 0x6944, 0x1078, 0x3d6e, 0x6100, 0xa184, 0x0001, 0x0040,
-	0x3cfe, 0xa184, 0x0100, 0x00c0, 0x3d1c, 0xa184, 0x0200, 0x00c0,
-	0x3d20, 0x601c, 0xa005, 0x00c0, 0x3d24, 0x711c, 0xa186, 0x0006,
-	0x00c0, 0x3d03, 0x6853, 0x0000, 0x6803, 0x0000, 0x2d08, 0x127e,
-	0x2091, 0x8000, 0x7010, 0xa005, 0x00c0, 0x3cf5, 0x7112, 0x7018,
-	0xa065, 0x0040, 0x3d28, 0x6000, 0xd0e4, 0x00c0, 0x3d2c, 0x2e60,
-	0x1078, 0x4176, 0x127f, 0x0e7f, 0x007c, 0x2068, 0x6800, 0xa005,
-	0x00c0, 0x3cf5, 0x6902, 0x127f, 0x0e7f, 0x007c, 0x0e7f, 0x6853,
-	0x0006, 0x0078, 0x3d48, 0x6944, 0xa18c, 0xff00, 0x810f, 0x1078,
-	0x3447, 0x00c0, 0x3d2c, 0x6000, 0xd0e4, 0x00c0, 0x3d2c, 0x711c,
-	0xa186, 0x0007, 0x00c0, 0x3d18, 0x6853, 0x0002, 0x0078, 0x3d2e,
-	0x6853, 0x0008, 0x0078, 0x3d2e, 0x6853, 0x000e, 0x0078, 0x3d2e,
-	0x6853, 0x0017, 0x0078, 0x3d2e, 0x6853, 0x0035, 0x0078, 0x3d2e,
-	0x6853, 0x0028, 0x0078, 0x3d2e, 0x6853, 0x0029, 0x0e7f, 0x0078,
-	0x3d48, 0x2009, 0x003e, 0x0078, 0x3d43, 0x2009, 0x0004, 0x0078,
-	0x3d43, 0x2009, 0x0006, 0x0078, 0x3d43, 0x2009, 0x0016, 0x0078,
-	0x3d43, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00, 0xa105, 0x6856,
-	0x2091, 0x8000, 0x1078, 0x36a1, 0x2091, 0x8001, 0x007c, 0x1078,
-	0x1328, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102, 0x0048, 0x3d5f,
-	0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0078, 0x3d6b, 0x7070,
-	0xa080, 0x0040, 0x7072, 0x00c8, 0x3d6b, 0x7074, 0xa081, 0x0000,
-	0x7076, 0xa085, 0x0001, 0x7932, 0x7132, 0x007c, 0x0d7e, 0x1078,
-	0x416d, 0x0d7f, 0x007c, 0x0d7e, 0x2011, 0x0004, 0x2204, 0xa085,
-	0x8002, 0x2012, 0x0d7f, 0x007c, 0x20e1, 0x0002, 0x3d08, 0x20e1,
-	0x2000, 0x3d00, 0xa084, 0x7000, 0x0040, 0x3d8a, 0xa086, 0x1000,
-	0x00c0, 0x3dab, 0x20e1, 0x0004, 0x3d60, 0xd1bc, 0x00c0, 0x3d91,
-	0x3e60, 0xac84, 0x0007, 0x00c0, 0x3dab, 0xac82, 0x7400, 0x0048,
-	0x3dab, 0x6854, 0xac02, 0x00c8, 0x3dab, 0x2009, 0x0047, 0x1078,
-	0x5591, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x7a28, 0x7a1c, 0xd284,
-	0x00c0, 0x3d7c, 0x007c, 0xa016, 0x1078, 0x1532, 0x0078, 0x3da1,
-	0x157e, 0x137e, 0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584,
-	0x0070, 0x00c0, 0x3dd9, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0,
-	0x3dd9, 0x1078, 0x3de6, 0x0040, 0x3dd9, 0x20e1, 0x3000, 0x7828,
-	0x7828, 0x1078, 0x3e04, 0x147f, 0x137f, 0x157f, 0x2009, 0x6f18,
-	0x2104, 0xa005, 0x00c0, 0x3dd5, 0x007c, 0x1078, 0x476a, 0x0078,
-	0x3dd4, 0x1078, 0x6c23, 0x1078, 0x3de6, 0x20e1, 0x3000, 0x7828,
-	0x7828, 0x147f, 0x137f, 0x157f, 0x0078, 0x3dd4, 0xa484, 0x01ff,
-	0x687a, 0xa005, 0x0040, 0x3df8, 0xa080, 0x001f, 0xa084, 0x03f8,
-	0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x007c,
-	0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5,
-	0xa085, 0x0001, 0x0078, 0x3df7, 0x7000, 0xa084, 0xff00, 0xa08c,
-	0xf000, 0x8007, 0xa196, 0x0000, 0x00c0, 0x3e11, 0x0078, 0x3f51,
-	0x007c, 0xa196, 0x2000, 0x00c0, 0x3e22, 0x6900, 0xa18e, 0x0001,
-	0x00c0, 0x3e1e, 0x1078, 0x2aec, 0x0078, 0x3e10, 0x1078, 0x3e2a,
-	0x0078, 0x3e10, 0xa196, 0x8000, 0x00c0, 0x3e10, 0x1078, 0x3fd7,
-	0x0078, 0x3e10, 0x0c7e, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196,
-	0x0001, 0x0040, 0x3e37, 0xa196, 0x0023, 0x00c0, 0x3ef8, 0xa08e,
-	0x0023, 0x00c0, 0x3e68, 0x1078, 0x404e, 0x0040, 0x3ef8, 0x7124,
-	0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x3e50, 0x7034, 0xa005,
-	0x00c0, 0x3ef8, 0x2009, 0x0015, 0x1078, 0x5591, 0x0078, 0x3ef8,
-	0xa08e, 0x0210, 0x00c0, 0x3e5a, 0x2009, 0x0015, 0x1078, 0x5591,
-	0x0078, 0x3ef8, 0xa08e, 0x0100, 0x00c0, 0x3ef8, 0x7034, 0xa005,
-	0x00c0, 0x3ef8, 0x2009, 0x0016, 0x1078, 0x5591, 0x0078, 0x3ef8,
-	0xa08e, 0x0022, 0x00c0, 0x3ef8, 0x7030, 0xa08e, 0x0300, 0x00c0,
-	0x3e79, 0x7034, 0xa005, 0x00c0, 0x3ef8, 0x2009, 0x0017, 0x0078,
-	0x3eda, 0xa08e, 0x0500, 0x00c0, 0x3e85, 0x7034, 0xa005, 0x00c0,
-	0x3ef8, 0x2009, 0x0018, 0x0078, 0x3eda, 0xa08e, 0x2010, 0x00c0,
-	0x3e8d, 0x2009, 0x0019, 0x0078, 0x3eda, 0xa08e, 0x2110, 0x00c0,
-	0x3e95, 0x2009, 0x001a, 0x0078, 0x3eda, 0xa08e, 0x5200, 0x00c0,
-	0x3ea1, 0x7034, 0xa005, 0x00c0, 0x3ef8, 0x2009, 0x001b, 0x0078,
-	0x3eda, 0xa08e, 0x5000, 0x00c0, 0x3ead, 0x7034, 0xa005, 0x00c0,
-	0x3ef8, 0x2009, 0x001c, 0x0078, 0x3eda, 0xa08e, 0x2400, 0x00c0,
-	0x3eb3, 0x0078, 0x3ed8, 0xa08e, 0x5300, 0x00c0, 0x3eb9, 0x0078,
-	0x3ed8, 0xa08e, 0x0f00, 0x00c0, 0x3ec1, 0x2009, 0x0020, 0x0078,
-	0x3eda, 0xa08e, 0x5300, 0x00c0, 0x3ec7, 0x0078, 0x3ed8, 0xa08e,
-	0x6104, 0x00c0, 0x3ed8, 0x2009, 0x728e, 0x2011, 0x8015, 0x211c,
-	0x8108, 0x2124, 0x1078, 0x2a53, 0x2009, 0x0023, 0x0078, 0x3eda,
-	0x2009, 0x001d, 0x017e, 0x2011, 0x7283, 0x2204, 0x8211, 0x220c,
-	0x1078, 0x1e1b, 0x00c0, 0x3efa, 0x1078, 0x3410, 0x00c0, 0x3efa,
-	0x6612, 0x6516, 0x0c7e, 0x1078, 0x5504, 0x0040, 0x3efd, 0x017f,
-	0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x5591,
-	0x0c7f, 0x007c, 0x017f, 0x0078, 0x3ef8, 0x0c7f, 0x0078, 0x3efa,
-	0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696, 0x00ff, 0x00c0, 0x3f20,
-	0xa596, 0xfffd, 0x00c0, 0x3f10, 0x2009, 0x007f, 0x0078, 0x3f4d,
-	0xa596, 0xfffe, 0x00c0, 0x3f18, 0x2009, 0x007e, 0x0078, 0x3f4d,
-	0xa596, 0xfffc, 0x00c0, 0x3f20, 0x2009, 0x0080, 0x0078, 0x3f4d,
-	0x2011, 0x0000, 0x2021, 0x007e, 0x20a9, 0x0082, 0x2071, 0x6e7e,
-	0x2e1c, 0x83ff, 0x00c0, 0x3f32, 0x82ff, 0x00c0, 0x3f41, 0x2410,
-	0x0078, 0x3f41, 0x2368, 0x6b10, 0x007e, 0x2100, 0xa31e, 0x007f,
-	0x00c0, 0x3f41, 0x6b14, 0xa31e, 0x00c0, 0x3f41, 0x2408, 0x0078,
-	0x3f4d, 0x8420, 0x8e70, 0x00f0, 0x3f28, 0x82ff, 0x00c0, 0x3f4c,
-	0xa085, 0x0001, 0x0078, 0x3f4e, 0x2208, 0xa006, 0x0d7f, 0x0e7f,
-	0x007c, 0xa084, 0x0007, 0x0079, 0x3f56, 0x007c, 0x3f5e, 0x3f5e,
-	0x3f5e, 0x3f5e, 0x3f5e, 0x3f5f, 0x3f78, 0x3fc0, 0x007c, 0x7110,
-	0xd1bc, 0x0040, 0x3f77, 0x7120, 0x2160, 0xac8c, 0x0007, 0x00c0,
-	0x3f77, 0xac8a, 0x7400, 0x0048, 0x3f77, 0x6854, 0xac02, 0x00c8,
-	0x3f77, 0x7124, 0x610a, 0x2009, 0x0046, 0x1078, 0x5591, 0x007c,
-	0x0c7e, 0x7110, 0xd1bc, 0x00c0, 0x3fbe, 0x2011, 0x7283, 0x2204,
-	0x8211, 0x220c, 0x1078, 0x1e1b, 0x00c0, 0x3fbe, 0x1078, 0x3447,
-	0x00c0, 0x3fbe, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006,
-	0x00c0, 0x3fa3, 0x0c7e, 0x1078, 0x5504, 0x017f, 0x0040, 0x3fbe,
+	0x2009, 0x762c, 0x210c, 0x81ff, 0x00c0, 0x3ecd, 0x6838, 0xa084,
+	0x00ff, 0x683a, 0x6853, 0x0000, 0x1078, 0x3668, 0x00c0, 0x3ec1,
+	0x007c, 0x1078, 0x3b0a, 0x127e, 0x2091, 0x8000, 0x1078, 0x6b3f,
+	0x1078, 0x3a7a, 0x127f, 0x0078, 0x3ec0, 0x2001, 0x0028, 0x2009,
+	0x0000, 0x0078, 0x3ec1, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906,
+	0x711a, 0x7010, 0x8001, 0x7012, 0x0040, 0x3ee2, 0x7007, 0x0006,
+	0x0078, 0x3ee8, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a,
+	0x007c, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848,
+	0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x3f14,
+	0x2009, 0x0000, 0x20a9, 0x007e, 0xa096, 0x0002, 0x0040, 0x3f14,
+	0xa005, 0x00c0, 0x3f2b, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078,
+	0x3825, 0x00c0, 0x3f2b, 0x067e, 0x6e44, 0xa6b4, 0x000f, 0x1078,
+	0x38ba, 0x067f, 0x0078, 0x3f2b, 0x047e, 0x2011, 0x760c, 0x2224,
+	0xc484, 0xc48c, 0x2412, 0x047f, 0x0c7e, 0x1078, 0x3825, 0x00c0,
+	0x3f27, 0x2091, 0x8000, 0x607b, 0x0000, 0x2091, 0x8001, 0x8108,
+	0x00f0, 0x3f1d, 0x0c7f, 0x1078, 0x1348, 0x007c, 0x127e, 0x2091,
+	0x8000, 0x7007, 0x0001, 0x2001, 0x7652, 0x2004, 0xd0a4, 0x0040,
+	0x3f6e, 0x6944, 0x1078, 0x416f, 0x6100, 0xd184, 0x0040, 0x3f53,
+	0x6858, 0xa084, 0x00ff, 0x00c0, 0x3f71, 0x6000, 0xd084, 0x0040,
+	0x3f6e, 0x6004, 0xa005, 0x00c0, 0x3f74, 0x6003, 0x0000, 0x600b,
+	0x0000, 0x0078, 0x3f6b, 0x2011, 0x0001, 0x6860, 0xa005, 0x00c0,
+	0x3f5b, 0x2001, 0x001e, 0x8000, 0x6016, 0x6858, 0xa084, 0x00ff,
+	0x0040, 0x3f6e, 0x6006, 0x6858, 0x8007, 0xa084, 0x00ff, 0x0040,
+	0x3f6e, 0x600a, 0x6202, 0x127f, 0x0078, 0x4142, 0x127f, 0x0078,
+	0x413a, 0x127f, 0x0078, 0x4132, 0x127f, 0x0078, 0x4136, 0x127e,
+	0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0x7652, 0x2004, 0xd0a4,
+	0x0040, 0x3fcc, 0x6944, 0x1078, 0x416f, 0x6000, 0xa084, 0x0001,
+	0x0040, 0x3fcc, 0x6204, 0x6308, 0x6c48, 0xa484, 0x0003, 0x0040,
+	0x3fa4, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x00c0, 0x3f9d, 0x2100,
+	0xa210, 0x0048, 0x3fc9, 0x0078, 0x3fa4, 0x8001, 0x00c0, 0x3fc9,
+	0x2100, 0xa212, 0x0048, 0x3fc9, 0xa484, 0x000c, 0x0040, 0x3fbe,
+	0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x00c0, 0x3fb6,
+	0x2100, 0xa318, 0x0048, 0x3fc9, 0x0078, 0x3fbe, 0xa082, 0x0004,
+	0x00c0, 0x3fc9, 0x2100, 0xa31a, 0x0048, 0x3fc9, 0x6860, 0xa005,
+	0x0040, 0x3fc4, 0x8000, 0x6016, 0x6206, 0x630a, 0x127f, 0x0078,
+	0x4142, 0x127f, 0x0078, 0x413e, 0x127f, 0x0078, 0x413a, 0x127e,
+	0x2091, 0x8000, 0x7007, 0x0001, 0x6944, 0x1078, 0x416f, 0x6308,
+	0x8318, 0x0048, 0x3fdf, 0x630a, 0x127f, 0x0078, 0x4150, 0x127f,
+	0x0078, 0x413e, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001,
+	0x684c, 0xd0ac, 0x0040, 0x3ff6, 0x027e, 0x2009, 0x0000, 0x2011,
+	0xfcff, 0x1078, 0x46b4, 0x027f, 0x0078, 0x402c, 0x6858, 0xa005,
+	0x0040, 0x4040, 0x685c, 0xa065, 0x0040, 0x403c, 0x2001, 0x762c,
+	0x2004, 0xa005, 0x0040, 0x4008, 0x1078, 0x6aa1, 0x0078, 0x400e,
+	0x6013, 0x0400, 0x2009, 0x0041, 0x1078, 0x5c29, 0x6958, 0xa18c,
+	0xe600, 0xa186, 0x2000, 0x0040, 0x4024, 0xa186, 0x0400, 0x0040,
+	0x4024, 0x6944, 0x0c7e, 0x1078, 0x460c, 0x6000, 0xa084, 0xfdff,
+	0x6002, 0x0c7f, 0x0078, 0x402c, 0x027e, 0x2009, 0x0000, 0x2011,
+	0xfdff, 0x1078, 0x46b4, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x4038,
+	0x6944, 0x1078, 0x460c, 0x6008, 0x8000, 0x0048, 0x4038, 0x600a,
+	0x0c7f, 0x127f, 0x0078, 0x4142, 0x0c7f, 0x127f, 0x0078, 0x413a,
+	0x6954, 0xa186, 0x002a, 0x00c0, 0x404c, 0x2001, 0x760c, 0x200c,
+	0xc194, 0x2102, 0x0078, 0x402c, 0xa186, 0x0020, 0x0040, 0x4061,
+	0xa186, 0x0029, 0x00c0, 0x403c, 0x6944, 0xa18c, 0xff00, 0x810f,
+	0x1078, 0x3825, 0x00c0, 0x402c, 0x6000, 0xc0e4, 0x6002, 0x0078,
+	0x402c, 0x685c, 0xa065, 0x0040, 0x403c, 0x6017, 0x0014, 0x0078,
+	0x402c, 0x6944, 0x1078, 0x416f, 0x6000, 0xa084, 0x0001, 0x0040,
+	0x4082, 0x2091, 0x8000, 0x6204, 0x8210, 0x0048, 0x407c, 0x6206,
+	0x2091, 0x8001, 0x0078, 0x4150, 0x2091, 0x8001, 0x6853, 0x0016,
+	0x0078, 0x4149, 0x6853, 0x0007, 0x0078, 0x4149, 0x6834, 0x8007,
+	0xa084, 0x00ff, 0x00c0, 0x4090, 0x1078, 0x3df0, 0x0078, 0x40a2,
+	0x2030, 0x8001, 0x00c0, 0x409a, 0x7007, 0x0001, 0x1078, 0x40a3,
+	0x0078, 0x40a2, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a,
+	0x704b, 0x40a3, 0x007c, 0x0e7e, 0x2009, 0x762c, 0x210c, 0x81ff,
+	0x00c0, 0x4124, 0x2009, 0x760c, 0x210c, 0xd194, 0x00c0, 0x412e,
+	0x6848, 0x2070, 0xae82, 0x7d00, 0x0048, 0x4113, 0x2001, 0x7615,
+	0x2004, 0xae02, 0x00c8, 0x4113, 0x6944, 0x1078, 0x416f, 0x6100,
+	0xa184, 0x0001, 0x0040, 0x40f9, 0xa184, 0x0100, 0x00c0, 0x4117,
+	0xa184, 0x0200, 0x00c0, 0x411b, 0x601c, 0xa005, 0x00c0, 0x411f,
+	0x711c, 0xa186, 0x0006, 0x00c0, 0x40fe, 0x6853, 0x0000, 0x6803,
+	0x0000, 0x2d08, 0x127e, 0x2091, 0x8000, 0x7010, 0xa005, 0x00c0,
+	0x40f0, 0x7112, 0x7018, 0xa065, 0x0040, 0x4123, 0x6000, 0xd0e4,
+	0x00c0, 0x4128, 0x2e60, 0x1078, 0x4615, 0x127f, 0x0e7f, 0x007c,
+	0x2068, 0x6800, 0xa005, 0x00c0, 0x40f0, 0x6902, 0x127f, 0x0e7f,
+	0x007c, 0x0e7f, 0x6853, 0x0006, 0x0078, 0x4149, 0x6944, 0xa18c,
+	0xff00, 0x810f, 0x1078, 0x3825, 0x00c0, 0x4129, 0x6000, 0xd0e4,
+	0x00c0, 0x4129, 0x711c, 0xa186, 0x0007, 0x00c0, 0x4113, 0x6853,
+	0x0002, 0x0078, 0x412b, 0x6853, 0x0008, 0x0078, 0x412b, 0x6853,
+	0x000e, 0x0078, 0x412b, 0x6853, 0x0017, 0x0078, 0x412b, 0x6853,
+	0x0035, 0x0078, 0x412b, 0x127f, 0x6853, 0x0028, 0x0078, 0x412b,
+	0x127f, 0x6853, 0x0029, 0x0e7f, 0x0078, 0x4149, 0x6853, 0x002a,
+	0x0078, 0x412b, 0x2009, 0x003e, 0x0078, 0x4144, 0x2009, 0x0004,
+	0x0078, 0x4144, 0x2009, 0x0006, 0x0078, 0x4144, 0x2009, 0x0016,
+	0x0078, 0x4144, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00, 0xa105,
+	0x6856, 0x2091, 0x8000, 0x1078, 0x3a7a, 0x2091, 0x8001, 0x007c,
+	0x1078, 0x1348, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102, 0x0048,
+	0x4160, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0078, 0x416c,
+	0x7070, 0xa080, 0x0040, 0x7072, 0x00c8, 0x416c, 0x7074, 0xa081,
+	0x0000, 0x7076, 0xa085, 0x0001, 0x7932, 0x7132, 0x007c, 0x0d7e,
+	0x1078, 0x460c, 0x0d7f, 0x007c, 0x0d7e, 0x2011, 0x0004, 0x2204,
+	0xa085, 0x8002, 0x2012, 0x0d7f, 0x007c, 0x20e1, 0x0002, 0x3d08,
+	0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0040, 0x418b, 0xa086,
+	0x1000, 0x00c0, 0x41a7, 0x20e1, 0x0004, 0x3d60, 0xd1bc, 0x00c0,
+	0x4192, 0x3e60, 0xac84, 0x0007, 0x00c0, 0x41a7, 0xac82, 0x7d00,
+	0x0048, 0x41a7, 0x6854, 0xac02, 0x00c8, 0x41a7, 0x2009, 0x0047,
+	0x1078, 0x5c29, 0x7a1c, 0xd284, 0x00c0, 0x417d, 0x007c, 0xa016,
+	0x1078, 0x1572, 0x0078, 0x41a2, 0x157e, 0x137e, 0x147e, 0x20e1,
+	0x3000, 0x3d20, 0x3e28, 0xa584, 0x0070, 0x00c0, 0x41d5, 0xa484,
+	0x7000, 0xa086, 0x1000, 0x00c0, 0x41d5, 0x1078, 0x41e2, 0x0040,
+	0x41d5, 0x20e1, 0x3000, 0x7828, 0x7828, 0x1078, 0x4200, 0x147f,
+	0x137f, 0x157f, 0x2009, 0x783e, 0x2104, 0xa005, 0x00c0, 0x41d1,
+	0x007c, 0x1078, 0x4c7a, 0x0078, 0x41d0, 0x1078, 0x7574, 0x1078,
+	0x41e2, 0x20e1, 0x3000, 0x7828, 0x7828, 0x147f, 0x137f, 0x157f,
+	0x0078, 0x41d0, 0xa484, 0x01ff, 0x687a, 0xa005, 0x0040, 0x41f4,
+	0xa080, 0x001f, 0xa084, 0x03f8, 0x80ac, 0x20e1, 0x1000, 0x2ea0,
+	0x2099, 0x020a, 0x53a5, 0x007c, 0x20a9, 0x000c, 0x20e1, 0x1000,
+	0x2ea0, 0x2099, 0x020a, 0x53a5, 0xa085, 0x0001, 0x0078, 0x41f3,
+	0x7000, 0xa084, 0xff00, 0xa08c, 0xf000, 0x8007, 0xa196, 0x0000,
+	0x00c0, 0x420d, 0x0078, 0x4381, 0x007c, 0xa196, 0x2000, 0x00c0,
+	0x421e, 0x6900, 0xa18e, 0x0001, 0x00c0, 0x421a, 0x1078, 0x2eb2,
+	0x0078, 0x420c, 0x1078, 0x4226, 0x0078, 0x420c, 0xa196, 0x8000,
+	0x00c0, 0x420c, 0x1078, 0x4407, 0x0078, 0x420c, 0x0c7e, 0x7110,
+	0xa18c, 0xff00, 0x810f, 0xa196, 0x0001, 0x0040, 0x4233, 0xa196,
+	0x0023, 0x00c0, 0x4328, 0xa08e, 0x0023, 0x00c0, 0x4264, 0x1078,
+	0x447e, 0x0040, 0x4328, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200,
+	0x00c0, 0x424c, 0x7034, 0xa005, 0x00c0, 0x4328, 0x2009, 0x0015,
+	0x1078, 0x5c29, 0x0078, 0x4328, 0xa08e, 0x0210, 0x00c0, 0x4256,
+	0x2009, 0x0015, 0x1078, 0x5c29, 0x0078, 0x4328, 0xa08e, 0x0100,
+	0x00c0, 0x4328, 0x7034, 0xa005, 0x00c0, 0x4328, 0x2009, 0x0016,
+	0x1078, 0x5c29, 0x0078, 0x4328, 0xa08e, 0x0022, 0x00c0, 0x4328,
+	0x7030, 0xa08e, 0x0300, 0x00c0, 0x4275, 0x7034, 0xa005, 0x00c0,
+	0x4328, 0x2009, 0x0017, 0x0078, 0x42f4, 0xa08e, 0x0500, 0x00c0,
+	0x4281, 0x7034, 0xa005, 0x00c0, 0x4328, 0x2009, 0x0018, 0x0078,
+	0x42f4, 0xa08e, 0x2010, 0x00c0, 0x4289, 0x2009, 0x0019, 0x0078,
+	0x42f4, 0xa08e, 0x2110, 0x00c0, 0x4291, 0x2009, 0x001a, 0x0078,
+	0x42f4, 0xa08e, 0x5200, 0x00c0, 0x429d, 0x7034, 0xa005, 0x00c0,
+	0x4328, 0x2009, 0x001b, 0x0078, 0x42f4, 0xa08e, 0x5000, 0x00c0,
+	0x42a9, 0x7034, 0xa005, 0x00c0, 0x4328, 0x2009, 0x001c, 0x0078,
+	0x42f4, 0xa08e, 0x1200, 0x00c0, 0x42b5, 0x7034, 0xa005, 0x00c0,
+	0x4328, 0x2009, 0x0024, 0x0078, 0x42f4, 0xa08c, 0xff00, 0xa18e,
+	0x2400, 0x00c0, 0x42bf, 0x2009, 0x002d, 0x0078, 0x42f4, 0xa08c,
+	0xff00, 0xa18e, 0x5300, 0x00c0, 0x42c9, 0x2009, 0x002a, 0x0078,
+	0x42f4, 0xa08e, 0x0f00, 0x00c0, 0x42d1, 0x2009, 0x0020, 0x0078,
+	0x42f4, 0xa08e, 0x5300, 0x00c0, 0x42d7, 0x0078, 0x42f2, 0xa08e,
+	0x6104, 0x00c0, 0x42f2, 0x2011, 0x7b8d, 0x8208, 0x2204, 0xa082,
+	0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108,
+	0x2124, 0x1078, 0x2d4a, 0x8108, 0x00f0, 0x42e4, 0x2009, 0x0023,
+	0x0078, 0x42f4, 0x2009, 0x001d, 0x017e, 0x2011, 0x7b83, 0x2204,
+	0x8211, 0x220c, 0x1078, 0x2085, 0x00c0, 0x432a, 0x1078, 0x37ee,
+	0x00c0, 0x432a, 0x6612, 0x6516, 0x86ff, 0x0040, 0x431a, 0x017f,
+	0x017e, 0xa186, 0x0017, 0x00c0, 0x431a, 0x6864, 0xa606, 0x00c0,
+	0x431a, 0x6868, 0xa506, 0xa084, 0xff00, 0x00c0, 0x431a, 0x6000,
+	0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x5b9c, 0x0040, 0x432d, 0x017f,
+	0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x5c29,
+	0x0c7f, 0x007c, 0x017f, 0x0078, 0x4328, 0x0c7f, 0x0078, 0x432a,
+	0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696, 0x00ff, 0x00c0, 0x4350,
+	0xa596, 0xfffd, 0x00c0, 0x4340, 0x2009, 0x007f, 0x0078, 0x437d,
+	0xa596, 0xfffe, 0x00c0, 0x4348, 0x2009, 0x007e, 0x0078, 0x437d,
+	0xa596, 0xfffc, 0x00c0, 0x4350, 0x2009, 0x0080, 0x0078, 0x437d,
+	0x2011, 0x0000, 0x2021, 0x007e, 0x20a9, 0x0082, 0x2071, 0x779e,
+	0x2e1c, 0x83ff, 0x00c0, 0x4362, 0x82ff, 0x00c0, 0x4371, 0x2410,
+	0x0078, 0x4371, 0x2368, 0x6b10, 0x007e, 0x2100, 0xa31e, 0x007f,
+	0x00c0, 0x4371, 0x6b14, 0xa31e, 0x00c0, 0x4371, 0x2408, 0x0078,
+	0x437d, 0x8420, 0x8e70, 0x00f0, 0x4358, 0x82ff, 0x00c0, 0x437c,
+	0xa085, 0x0001, 0x0078, 0x437e, 0x2208, 0xa006, 0x0d7f, 0x0e7f,
+	0x007c, 0xa084, 0x0007, 0x0079, 0x4386, 0x007c, 0x438e, 0x438e,
+	0x438e, 0x438e, 0x438e, 0x438f, 0x43a8, 0x43f0, 0x007c, 0x7110,
+	0xd1bc, 0x0040, 0x43a7, 0x7120, 0x2160, 0xac8c, 0x0007, 0x00c0,
+	0x43a7, 0xac8a, 0x7d00, 0x0048, 0x43a7, 0x6854, 0xac02, 0x00c8,
+	0x43a7, 0x7124, 0x610a, 0x2009, 0x0046, 0x1078, 0x5c29, 0x007c,
+	0x0c7e, 0x7110, 0xd1bc, 0x00c0, 0x43ee, 0x2011, 0x7b83, 0x2204,
+	0x8211, 0x220c, 0x1078, 0x2085, 0x00c0, 0x43ee, 0x1078, 0x3825,
+	0x00c0, 0x43ee, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006,
+	0x00c0, 0x43d3, 0x0c7e, 0x1078, 0x5b9c, 0x017f, 0x0040, 0x43ee,
 	0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x2009, 0x0044, 0x1078,
-	0x5591, 0x0078, 0x3fbe, 0x0c7e, 0x1078, 0x5504, 0x017f, 0x0040,
-	0x3fbe, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004,
-	0x00c0, 0x3fb6, 0x6007, 0x0005, 0x0078, 0x3fb8, 0x6007, 0x0001,
-	0x6003, 0x0001, 0x1078, 0x4376, 0x1078, 0x476a, 0x0c7f, 0x007c,
-	0x7110, 0xd1bc, 0x0040, 0x3fd6, 0x7020, 0x2060, 0xac84, 0x0007,
-	0x00c0, 0x3fd6, 0xac82, 0x7400, 0x0048, 0x3fd6, 0x6854, 0xac02,
-	0x00c8, 0x3fd6, 0x2009, 0x0045, 0x1078, 0x5591, 0x007c, 0x7110,
-	0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x00c0, 0x3fe7, 0xa084,
-	0x000f, 0xa08a, 0x0006, 0x10c8, 0x12b7, 0x1079, 0x3fe8, 0x007c,
-	0x3fee, 0x3fef, 0x3fee, 0x3fee, 0x4030, 0x403f, 0x007c, 0x7110,
-	0xd1bc, 0x00c0, 0x402f, 0x700c, 0x7108, 0x1078, 0x1e1b, 0x00c0,
-	0x402f, 0x1078, 0x3410, 0x00c0, 0x402f, 0x6612, 0x6516, 0x6204,
-	0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x00c0, 0x4018, 0x0c7e,
-	0x1078, 0x5504, 0x017f, 0x0040, 0x402f, 0x611a, 0x601f, 0x0005,
-	0x7120, 0x610a, 0x2009, 0x0028, 0x1078, 0x5591, 0x0078, 0x402f,
-	0x0c7e, 0x1078, 0x5504, 0x017f, 0x0040, 0x402f, 0x611a, 0x601f,
-	0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x00c0, 0x402b, 0x2009,
-	0x0005, 0x0078, 0x402d, 0x2009, 0x0001, 0x1078, 0x5591, 0x007c,
-	0x7110, 0xd1bc, 0x0040, 0x403e, 0x1078, 0x404e, 0x0040, 0x403e,
-	0x7124, 0x610a, 0x2009, 0x0029, 0x1078, 0x5591, 0x007c, 0x7110,
-	0xd1bc, 0x0040, 0x404d, 0x1078, 0x404e, 0x0040, 0x404d, 0x7124,
-	0x610a, 0x2009, 0x002a, 0x1078, 0x5591, 0x007c, 0x7020, 0x2060,
-	0xac84, 0x0007, 0x00c0, 0x4061, 0xac82, 0x7400, 0x0048, 0x4061,
-	0x2001, 0x6d15, 0x2004, 0xac02, 0x00c8, 0x4061, 0xa085, 0x0001,
-	0x007c, 0xa006, 0x0078, 0x4060, 0x2071, 0x6f23, 0x7003, 0x0003,
-	0x700f, 0x0361, 0xa006, 0x701a, 0x7012, 0x7017, 0x7400, 0x7007,
-	0x0000, 0x7026, 0x702b, 0x4ff2, 0x7032, 0x7037, 0x503e, 0x007c,
-	0x2071, 0x6f23, 0x00e0, 0x40be, 0x2091, 0x6000, 0x700c, 0x8001,
-	0x700e, 0x00c0, 0x4087, 0x700f, 0x0361, 0x7007, 0x0001, 0x127e,
-	0x2091, 0x8000, 0x7024, 0xa00d, 0x0040, 0x409b, 0x7020, 0x8001,
-	0x7022, 0x00c0, 0x409b, 0x7023, 0x0009, 0x8109, 0x7126, 0x00c0,
-	0x409b, 0x7028, 0x107a, 0x7030, 0xa00d, 0x0040, 0x40ac, 0x702c,
-	0x8001, 0x702e, 0x00c0, 0x40ac, 0x702f, 0x0009, 0x8109, 0x7132,
-	0x00c0, 0x40ac, 0x7034, 0x107a, 0x7018, 0xa00d, 0x0040, 0x40bd,
-	0x7008, 0x8001, 0x700a, 0x00c0, 0x40bd, 0x700b, 0x0009, 0x8109,
-	0x711a, 0x00c0, 0x40bd, 0x701c, 0x107a, 0x127f, 0x7004, 0x0079,
-	0x40c1, 0x40e8, 0x40e9, 0x4105, 0x0e7e, 0x2071, 0x6f23, 0x7018,
-	0xa005, 0x00c0, 0x40cf, 0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f,
-	0x007c, 0x0e7e, 0x007e, 0x2071, 0x6f23, 0x701c, 0xa206, 0x00c0,
-	0x40db, 0x701a, 0x701e, 0x007f, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
-	0x6f23, 0x6088, 0xa102, 0x0048, 0x40e6, 0x618a, 0x0e7f, 0x007c,
-	0x007c, 0x7110, 0x1078, 0x3447, 0x00c0, 0x40fb, 0x6088, 0x8001,
-	0x0048, 0x40fb, 0x608a, 0x00c0, 0x40fb, 0x127e, 0x2091, 0x8000,
-	0x1078, 0x476a, 0x127f, 0x8108, 0xa182, 0x00ff, 0x0048, 0x4103,
-	0xa00e, 0x7007, 0x0002, 0x7112, 0x007c, 0x7014, 0x2060, 0x127e,
-	0x2091, 0x8000, 0x6014, 0xa005, 0x0040, 0x4134, 0x8001, 0x6016,
-	0x00c0, 0x4134, 0x611c, 0xa186, 0x0003, 0x0040, 0x411b, 0xa186,
-	0x0006, 0x00c0, 0x4132, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a,
-	0x0048, 0x4132, 0xa082, 0x1999, 0x6856, 0xa08a, 0x199a, 0x0048,
-	0x412b, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116,
-	0x0078, 0x4134, 0x1078, 0x5fea, 0x127f, 0xac88, 0x0008, 0x7116,
-	0x2001, 0x6d16, 0x2004, 0xa102, 0x0048, 0x4142, 0x7017, 0x7400,
-	0x7007, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x6f23, 0x7027, 0x07d0,
-	0x7023, 0x0009, 0x0e7f, 0x007c, 0x2001, 0x6f2c, 0x2003, 0x0000,
-	0x007c, 0x0e7e, 0x2071, 0x6f23, 0x7033, 0x07d0, 0x702f, 0x0009,
-	0x0e7f, 0x007c, 0x2011, 0x6f2f, 0x2013, 0x0000, 0x007c, 0x0e7e,
-	0x2071, 0x6f23, 0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c,
-	0x0c7e, 0x2061, 0x6fb2, 0x0c7f, 0x007c, 0xa184, 0x000f, 0x8003,
-	0x8003, 0x8003, 0xa080, 0x6fb2, 0x2060, 0x007c, 0x684c, 0xa08c,
-	0x00c0, 0xa18e, 0x00c0, 0x0040, 0x41ac, 0xd0b4, 0x00c0, 0x4188,
-	0xd0bc, 0x00c0, 0x419a, 0x2009, 0x0006, 0x1078, 0x41cf, 0x007c,
-	0xd0fc, 0x0040, 0x4195, 0xa084, 0x0003, 0xa08e, 0x0003, 0x0040,
-	0x41c8, 0xa08e, 0x0000, 0x00c0, 0x41c8, 0x2009, 0x0043, 0x1078,
-	0x5591, 0x007c, 0xd0fc, 0x0040, 0x41a7, 0xa084, 0x0003, 0xa08e,
-	0x0003, 0x0040, 0x41c8, 0xa08e, 0x0000, 0x00c0, 0x41c8, 0x2009,
-	0x0042, 0x1078, 0x5591, 0x007c, 0xd0fc, 0x0040, 0x41be, 0xa084,
-	0x0003, 0xa08e, 0x0003, 0x0040, 0x41c8, 0xa08e, 0x0002, 0x0040,
-	0x41c2, 0x2009, 0x0041, 0x1078, 0x5591, 0x007c, 0x1078, 0x41cd,
-	0x0078, 0x41bd, 0x2009, 0x0043, 0x1078, 0x5591, 0x0078, 0x41bd,
-	0x2009, 0x0004, 0x1078, 0x41cf, 0x007c, 0x2009, 0x0001, 0x6010,
-	0xa0ec, 0xf000, 0x0040, 0x41f3, 0x2068, 0x6952, 0x6800, 0x6012,
-	0xa186, 0x0001, 0x00c0, 0x41ed, 0x694c, 0xa18c, 0x8100, 0xa18e,
-	0x8100, 0x00c0, 0x41ed, 0x0c7e, 0x6944, 0x1078, 0x416d, 0x6204,
-	0x8210, 0x0048, 0x41ec, 0x6206, 0x0c7f, 0x1078, 0x36a1, 0x6010,
-	0xa06d, 0x10c0, 0x4176, 0x007c, 0x157e, 0x0c7e, 0x20a9, 0x0010,
-	0x2061, 0x6fb2, 0x6000, 0x81ff, 0x0040, 0x4201, 0xa205, 0x0078,
-	0x4202, 0xa204, 0x6002, 0xace0, 0x0008, 0x00f0, 0x41fa, 0x0c7f,
-	0x157f, 0x007c, 0x6808, 0xa005, 0x0040, 0x4212, 0x8001, 0x680a,
-	0xa085, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x2079, 0x6f10,
-	0x127f, 0x0d7e, 0x2069, 0x6f10, 0x6803, 0x0005, 0x2069, 0x0004,
+	0x5c29, 0x0078, 0x43ee, 0x0c7e, 0x1078, 0x5b9c, 0x017f, 0x0040,
+	0x43ee, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004,
+	0x00c0, 0x43e6, 0x6007, 0x0005, 0x0078, 0x43e8, 0x6007, 0x0001,
+	0x6003, 0x0001, 0x1078, 0x4872, 0x1078, 0x4c7a, 0x0c7f, 0x007c,
+	0x7110, 0xd1bc, 0x0040, 0x4406, 0x7020, 0x2060, 0xac84, 0x0007,
+	0x00c0, 0x4406, 0xac82, 0x7d00, 0x0048, 0x4406, 0x6854, 0xac02,
+	0x00c8, 0x4406, 0x2009, 0x0045, 0x1078, 0x5c29, 0x007c, 0x7110,
+	0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x00c0, 0x4417, 0xa084,
+	0x000f, 0xa08a, 0x0006, 0x10c8, 0x12d5, 0x1079, 0x4418, 0x007c,
+	0x441e, 0x441f, 0x441e, 0x441e, 0x4460, 0x446f, 0x007c, 0x7110,
+	0xd1bc, 0x00c0, 0x445f, 0x700c, 0x7108, 0x1078, 0x2085, 0x00c0,
+	0x445f, 0x1078, 0x37ee, 0x00c0, 0x445f, 0x6612, 0x6516, 0x6204,
+	0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x00c0, 0x4448, 0x0c7e,
+	0x1078, 0x5b9c, 0x017f, 0x0040, 0x445f, 0x611a, 0x601f, 0x0005,
+	0x7120, 0x610a, 0x2009, 0x0088, 0x1078, 0x5c29, 0x0078, 0x445f,
+	0x0c7e, 0x1078, 0x5b9c, 0x017f, 0x0040, 0x445f, 0x611a, 0x601f,
+	0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x00c0, 0x445b, 0x2009,
+	0x0005, 0x0078, 0x445d, 0x2009, 0x0001, 0x1078, 0x5c29, 0x007c,
+	0x7110, 0xd1bc, 0x0040, 0x446e, 0x1078, 0x447e, 0x0040, 0x446e,
+	0x7124, 0x610a, 0x2009, 0x0089, 0x1078, 0x5c29, 0x007c, 0x7110,
+	0xd1bc, 0x0040, 0x447d, 0x1078, 0x447e, 0x0040, 0x447d, 0x7124,
+	0x610a, 0x2009, 0x008a, 0x1078, 0x5c29, 0x007c, 0x7020, 0x2060,
+	0xac84, 0x0007, 0x00c0, 0x4491, 0xac82, 0x7d00, 0x0048, 0x4491,
+	0x2001, 0x7615, 0x2004, 0xac02, 0x00c8, 0x4491, 0xa085, 0x0001,
+	0x007c, 0xa006, 0x0078, 0x4490, 0x2071, 0x7849, 0x7003, 0x0003,
+	0x700f, 0x0361, 0xa006, 0x701a, 0x7012, 0x7017, 0x7d00, 0x7007,
+	0x0000, 0x7026, 0x702b, 0x558f, 0x7032, 0x7037, 0x55d0, 0x703b,
+	0x0002, 0x703f, 0x0000, 0x007c, 0x2071, 0x7849, 0x00e0, 0x455b,
+	0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x00c0, 0x4524, 0x700f,
+	0x0361, 0x7007, 0x0001, 0x127e, 0x2091, 0x8000, 0x7138, 0x8109,
+	0x713a, 0x00c0, 0x4522, 0x703b, 0x0002, 0x2009, 0x0100, 0x2104,
+	0xa082, 0x0003, 0x00c8, 0x4522, 0x703c, 0xa086, 0x0001, 0x00c0,
+	0x44ff, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040,
+	0x44dd, 0x6803, 0x1000, 0x0078, 0x44e4, 0x6804, 0xa084, 0x1000,
+	0x0040, 0x44e4, 0x6803, 0x0100, 0x6803, 0x0000, 0x703f, 0x0000,
+	0x2069, 0x7836, 0x6804, 0xa082, 0x0006, 0x00c0, 0x44f1, 0x6807,
+	0x0000, 0x6830, 0xa082, 0x0003, 0x00c0, 0x44f8, 0x6833, 0x0000,
+	0x1078, 0x4c7a, 0x1078, 0x4d3a, 0x0d7f, 0x0078, 0x4522, 0x0d7e,
+	0x2069, 0x7600, 0x6944, 0x6860, 0xa102, 0x00c8, 0x4521, 0x2069,
+	0x7836, 0x6804, 0xa086, 0x0000, 0x00c0, 0x4521, 0x6830, 0xa086,
+	0x0000, 0x00c0, 0x4521, 0x703f, 0x0001, 0x6807, 0x0006, 0x6833,
+	0x0003, 0x2069, 0x0100, 0x6830, 0x689e, 0x2069, 0x0140, 0x6803,
+	0x0600, 0x0d7f, 0x0078, 0x4527, 0x127e, 0x2091, 0x8000, 0x7024,
+	0xa00d, 0x0040, 0x4538, 0x7020, 0x8001, 0x7022, 0x00c0, 0x4538,
+	0x7023, 0x0009, 0x8109, 0x7126, 0x00c0, 0x4538, 0x7028, 0x107a,
+	0x7030, 0xa00d, 0x0040, 0x4549, 0x702c, 0x8001, 0x702e, 0x00c0,
+	0x4549, 0x702f, 0x0009, 0x8109, 0x7132, 0x00c0, 0x4549, 0x7034,
+	0x107a, 0x7018, 0xa00d, 0x0040, 0x455a, 0x7008, 0x8001, 0x700a,
+	0x00c0, 0x455a, 0x700b, 0x0009, 0x8109, 0x711a, 0x00c0, 0x455a,
+	0x701c, 0x107a, 0x127f, 0x7004, 0x0079, 0x455e, 0x4585, 0x4586,
+	0x45a2, 0x0e7e, 0x2071, 0x7849, 0x7018, 0xa005, 0x00c0, 0x456c,
+	0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x0e7e, 0x007e,
+	0x2071, 0x7849, 0x701c, 0xa206, 0x00c0, 0x4578, 0x701a, 0x701e,
+	0x007f, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x7849, 0x6088, 0xa102,
+	0x0048, 0x4583, 0x618a, 0x0e7f, 0x007c, 0x007c, 0x7110, 0x1078,
+	0x3825, 0x00c0, 0x4598, 0x6088, 0x8001, 0x0048, 0x4598, 0x608a,
+	0x00c0, 0x4598, 0x127e, 0x2091, 0x8000, 0x1078, 0x4c7a, 0x127f,
+	0x8108, 0xa182, 0x00ff, 0x0048, 0x45a0, 0xa00e, 0x7007, 0x0002,
+	0x7112, 0x007c, 0x7014, 0x2060, 0x127e, 0x2091, 0x8000, 0x6014,
+	0xa005, 0x0040, 0x45d1, 0x8001, 0x6016, 0x00c0, 0x45d1, 0x611c,
+	0xa186, 0x0003, 0x0040, 0x45b8, 0xa186, 0x0006, 0x00c0, 0x45cf,
+	0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0048, 0x45cf, 0xa082,
+	0x1999, 0x6856, 0xa08a, 0x199a, 0x0048, 0x45c8, 0x2001, 0x1999,
+	0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x0078, 0x45d1, 0x1078,
+	0x67c9, 0x127f, 0xac88, 0x0008, 0x7116, 0x2001, 0x7616, 0x2004,
+	0xa102, 0x0048, 0x45df, 0x7017, 0x7d00, 0x7007, 0x0000, 0x007c,
+	0x0e7e, 0x2071, 0x7849, 0x7027, 0x07d0, 0x7023, 0x0009, 0x703b,
+	0x0002, 0x0e7f, 0x007c, 0x2001, 0x7852, 0x2003, 0x0000, 0x007c,
+	0x0e7e, 0x2071, 0x7849, 0x7033, 0x07d0, 0x702f, 0x0009, 0x0e7f,
+	0x007c, 0x2011, 0x7855, 0x2013, 0x0000, 0x007c, 0x0e7e, 0x2071,
+	0x7849, 0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x0c7e,
+	0x2061, 0x78da, 0x0c7f, 0x007c, 0xa184, 0x000f, 0x8003, 0x8003,
+	0x8003, 0xa080, 0x78da, 0x2060, 0x007c, 0x6854, 0xa08a, 0x199a,
+	0x0048, 0x461c, 0x2001, 0x1999, 0xa005, 0x00c0, 0x462c, 0x6944,
+	0x0c7e, 0x1078, 0x460c, 0x6014, 0x0c7f, 0xa005, 0x00c0, 0x4631,
+	0x2001, 0x001e, 0x0078, 0x4631, 0xa08e, 0xffff, 0x00c0, 0x4631,
+	0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, 0xa08c,
+	0x00c0, 0xa18e, 0x00c0, 0x0040, 0x466c, 0xd0b4, 0x00c0, 0x4648,
+	0xd0bc, 0x00c0, 0x465a, 0x2009, 0x0006, 0x1078, 0x468f, 0x007c,
+	0xd0fc, 0x0040, 0x4655, 0xa084, 0x0003, 0xa08e, 0x0003, 0x0040,
+	0x4688, 0xa08e, 0x0000, 0x00c0, 0x4688, 0x2009, 0x0043, 0x1078,
+	0x5c29, 0x007c, 0xd0fc, 0x0040, 0x4667, 0xa084, 0x0003, 0xa08e,
+	0x0003, 0x0040, 0x4688, 0xa08e, 0x0000, 0x00c0, 0x4688, 0x2009,
+	0x0042, 0x1078, 0x5c29, 0x007c, 0xd0fc, 0x0040, 0x467e, 0xa084,
+	0x0003, 0xa08e, 0x0003, 0x0040, 0x4688, 0xa08e, 0x0002, 0x0040,
+	0x4682, 0x2009, 0x0041, 0x1078, 0x5c29, 0x007c, 0x1078, 0x468d,
+	0x0078, 0x467d, 0x2009, 0x0043, 0x1078, 0x5c29, 0x0078, 0x467d,
+	0x2009, 0x0004, 0x1078, 0x468f, 0x007c, 0x2009, 0x0001, 0x6010,
+	0xa0ec, 0xf000, 0x0040, 0x46b3, 0x2068, 0x6952, 0x6800, 0x6012,
+	0xa186, 0x0001, 0x00c0, 0x46ad, 0x694c, 0xa18c, 0x8100, 0xa18e,
+	0x8100, 0x00c0, 0x46ad, 0x0c7e, 0x6944, 0x1078, 0x460c, 0x6204,
+	0x8210, 0x0048, 0x46ac, 0x6206, 0x0c7f, 0x1078, 0x3a7a, 0x6010,
+	0xa06d, 0x10c0, 0x4615, 0x007c, 0x157e, 0x0c7e, 0x20a9, 0x0010,
+	0x2061, 0x78da, 0x6000, 0x81ff, 0x0040, 0x46c1, 0xa205, 0x0078,
+	0x46c2, 0xa204, 0x6002, 0xace0, 0x0008, 0x00f0, 0x46ba, 0x0c7f,
+	0x157f, 0x007c, 0x6808, 0xa005, 0x0040, 0x46d2, 0x8001, 0x680a,
+	0xa085, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x2079, 0x7836,
+	0x127f, 0x0d7e, 0x2069, 0x7836, 0x6803, 0x0005, 0x2069, 0x0004,
 	0x2d04, 0xa085, 0x8001, 0x206a, 0x0d7f, 0x007c, 0x0c7e, 0x6027,
-	0x0001, 0x7804, 0xa084, 0x0007, 0x0079, 0x422e, 0x4238, 0x425d,
-	0x428e, 0x423e, 0x425d, 0x4236, 0x4236, 0x4236, 0x1078, 0x12b7,
-	0x1078, 0x414c, 0x1078, 0x476a, 0x0c7f, 0x007c, 0x62c0, 0x82ff,
-	0x00c0, 0x4244, 0x0c7f, 0x007c, 0x2011, 0x318e, 0x1078, 0x40d1,
-	0x7828, 0xa092, 0x0002, 0x00c8, 0x4253, 0x8000, 0x782a, 0x1078,
-	0x31c2, 0x0078, 0x4242, 0x1078, 0x318e, 0x7807, 0x0003, 0x7827,
-	0x0000, 0x782b, 0x0000, 0x0078, 0x4242, 0x1078, 0x414c, 0x62c0,
-	0x82ff, 0x00c0, 0x426f, 0x782b, 0x0000, 0x7824, 0xa065, 0x1040,
-	0x12b7, 0x2009, 0x0013, 0x1078, 0x5591, 0x0c7f, 0x007c, 0x0c7e,
-	0x7824, 0xa065, 0x1040, 0x12b7, 0x7804, 0xa086, 0x0004, 0x0040,
-	0x42cc, 0x7828, 0xa092, 0x2710, 0x00c8, 0x4285, 0x8000, 0x782a,
-	0x0c7f, 0x1078, 0x4fd7, 0x0078, 0x426d, 0x1078, 0x6c76, 0x2009,
-	0x0014, 0x1078, 0x5591, 0x0c7f, 0x0078, 0x426d, 0x2001, 0x6f2c,
-	0x2003, 0x0000, 0x62c0, 0x82ff, 0x00c0, 0x42a2, 0x782b, 0x0000,
-	0x7824, 0xa065, 0x1040, 0x12b7, 0x2009, 0x0013, 0x1078, 0x55df,
-	0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x7824, 0xa005, 0x1040, 0x12b7,
-	0x781c, 0xa06d, 0x1040, 0x12b7, 0x6800, 0xc0dc, 0x6802, 0x7924,
-	0x2160, 0x1078, 0x556a, 0x693c, 0x81ff, 0x1040, 0x12b7, 0x8109,
-	0x693e, 0x6854, 0xa015, 0x0040, 0x42c0, 0x7a1e, 0x0078, 0x42c2,
-	0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x0d7f, 0x0c7f,
-	0x1078, 0x476a, 0x0078, 0x42a0, 0x6104, 0xa186, 0x0002, 0x0040,
-	0x42d7, 0xa186, 0x0004, 0x0040, 0x42d7, 0x0078, 0x4279, 0x7808,
-	0xac06, 0x0040, 0x4279, 0x1078, 0x4671, 0x1078, 0x4376, 0x0c7f,
-	0x1078, 0x476a, 0x0078, 0x426d, 0x0c7e, 0x6027, 0x0002, 0x2011,
-	0x6f2f, 0x2013, 0x0000, 0x62c8, 0x82ff, 0x00c0, 0x42fe, 0x62c4,
-	0x82ff, 0x00c0, 0x42fe, 0x793c, 0xa1e5, 0x0000, 0x0040, 0x42fc,
-	0x2009, 0x0049, 0x1078, 0x5591, 0x0c7f, 0x007c, 0x6017, 0x0010,
-	0x793c, 0x81ff, 0x0040, 0x42fc, 0x7944, 0xa192, 0x2710, 0x00c8,
-	0x431d, 0x8108, 0x7946, 0x1078, 0x4151, 0x793c, 0xa188, 0x0007,
-	0x210c, 0xa18e, 0x0006, 0x00c0, 0x4319, 0x6017, 0x0012, 0x0078,
-	0x42fc, 0x6017, 0x0016, 0x0078, 0x42fc, 0x1078, 0x6c76, 0x793c,
-	0x2160, 0x2009, 0x004a, 0x1078, 0x5591, 0x0078, 0x42fc, 0x007e,
-	0x017e, 0x0c7e, 0x127e, 0x600f, 0x0000, 0x2c08, 0x2061, 0x6f10,
-	0x2091, 0x8000, 0x6020, 0x8000, 0x6022, 0x6010, 0xa005, 0x0040,
-	0x4342, 0xa080, 0x0003, 0x2102, 0x6112, 0x127f, 0x0c7f, 0x017f,
-	0x007f, 0x007c, 0x6116, 0x6112, 0x0078, 0x433d, 0x0d7e, 0x2069,
-	0x6f10, 0x6000, 0xd0d4, 0x0040, 0x435d, 0x6820, 0x8000, 0x6822,
-	0xa086, 0x0001, 0x00c0, 0x4356, 0x2c00, 0x681e, 0x6804, 0xa084,
-	0x0007, 0x0079, 0x4772, 0x0d7f, 0x007c, 0xc0d5, 0x6002, 0x6818,
-	0xa005, 0x0040, 0x436f, 0x6056, 0x605b, 0x0000, 0x007e, 0x2c00,
-	0x681a, 0x0d7f, 0x685a, 0x2069, 0x6f10, 0x0078, 0x434d, 0x6056,
-	0x605a, 0x2c00, 0x681a, 0x681e, 0x0078, 0x434d, 0x007e, 0x017e,
-	0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061,
-	0x6f10, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040, 0x4391,
-	0xa080, 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f, 0x007f,
-	0x007c, 0x610e, 0x610a, 0x0078, 0x438c, 0x0c7e, 0x600f, 0x0000,
-	0x2c08, 0x2061, 0x6f10, 0x6034, 0xa005, 0x0040, 0x43a5, 0xa080,
-	0x0003, 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136, 0x0078,
-	0x43a3, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e,
-	0x127e, 0x2071, 0x6f10, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000,
-	0x8cff, 0x0040, 0x4405, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
-	0x00c0, 0x4400, 0x703c, 0xac06, 0x00c0, 0x43cb, 0x6003, 0x000a,
-	0x630a, 0x0078, 0x4400, 0x7038, 0xac36, 0x00c0, 0x43d1, 0x660c,
-	0x763a, 0x7034, 0xac36, 0x00c0, 0x43df, 0x2c00, 0xaf36, 0x0040,
-	0x43dd, 0x2f00, 0x7036, 0x0078, 0x43df, 0x7037, 0x0000, 0x660c,
-	0x067e, 0x2c00, 0xaf06, 0x0040, 0x43e8, 0x7e0e, 0x0078, 0x43e9,
-	0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003,
-	0x00c0, 0x440e, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
-	0x36a1, 0x1078, 0x6276, 0x1078, 0x6283, 0x0c7f, 0x0078, 0x43b8,
-	0x2c78, 0x600c, 0x2060, 0x0078, 0x43b8, 0x127f, 0x007f, 0x027f,
-	0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086,
-	0x0006, 0x00c0, 0x43f2, 0x1078, 0x6bb3, 0x0078, 0x43fb, 0x007e,
-	0x067e, 0x0c7e, 0x0d7e, 0x0f7e, 0x2031, 0x0000, 0x127e, 0x2091,
-	0x8000, 0x2079, 0x6f10, 0x7838, 0xa065, 0x0040, 0x444a, 0x600c,
-	0x007e, 0x600f, 0x0000, 0x783c, 0xac06, 0x00c0, 0x4435, 0x6003,
-	0x000a, 0x630a, 0x2c30, 0x0078, 0x4447, 0x6010, 0x2068, 0x601c,
-	0xa086, 0x0003, 0x00c0, 0x4453, 0x6837, 0x0103, 0x6b4a, 0x6847,
-	0x0000, 0x1078, 0x36a1, 0x1078, 0x6276, 0x1078, 0x6283, 0x007f,
-	0x0078, 0x4424, 0x7e3a, 0x7e36, 0x127f, 0x0f7f, 0x0d7f, 0x0c7f,
-	0x067f, 0x007f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x443c,
-	0x1078, 0x6bb3, 0x0078, 0x4445, 0x027e, 0x1078, 0x4470, 0x1078,
-	0x4507, 0x027f, 0x007c, 0x0f7e, 0x127e, 0x2079, 0x6f10, 0x2091,
-	0x8000, 0x1078, 0x4599, 0x1078, 0x4601, 0x127f, 0x0f7f, 0x007c,
-	0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2091,
-	0x8000, 0x2071, 0x6f10, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0040,
-	0x44f6, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x44f1,
-	0x7024, 0xac06, 0x00c0, 0x44b6, 0x2069, 0x0100, 0x68c0, 0xa005,
-	0x0040, 0x44b1, 0x1078, 0x4fe5, 0x68c3, 0x0000, 0x1078, 0x54a4,
-	0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
-	0x0040, 0x44a6, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
-	0x6824, 0xd084, 0x0040, 0x44ae, 0x6827, 0x0001, 0x037f, 0x0078,
-	0x44b6, 0x6003, 0x0009, 0x630a, 0x0078, 0x44f1, 0x7014, 0xac36,
-	0x00c0, 0x44bc, 0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x44ca,
-	0x2c00, 0xaf36, 0x0040, 0x44c8, 0x2f00, 0x7012, 0x0078, 0x44ca,
-	0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x44d3,
-	0x7e0e, 0x0078, 0x44d4, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
-	0x1078, 0x6120, 0x0040, 0x44ea, 0x601c, 0xa086, 0x0003, 0x00c0,
-	0x44fe, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x36a1,
-	0x1078, 0x6276, 0x1078, 0x6283, 0x1078, 0x5374, 0x0c7f, 0x0078,
-	0x447e, 0x2c78, 0x600c, 0x2060, 0x0078, 0x447e, 0x127f, 0x007f,
+	0x0001, 0x7804, 0xa084, 0x0007, 0x0079, 0x46ee, 0x46f8, 0x471d,
+	0x4778, 0x46fe, 0x471d, 0x46f6, 0x46f6, 0x46f6, 0x1078, 0x12d5,
+	0x1078, 0x45eb, 0x1078, 0x4c7a, 0x0c7f, 0x007c, 0x62c0, 0x82ff,
+	0x00c0, 0x4704, 0x0c7f, 0x007c, 0x2011, 0x3542, 0x1078, 0x456e,
+	0x7828, 0xa092, 0x0002, 0x00c8, 0x4713, 0x8000, 0x782a, 0x1078,
+	0x3572, 0x0078, 0x4702, 0x1078, 0x3542, 0x7807, 0x0003, 0x7827,
+	0x0000, 0x782b, 0x0000, 0x0078, 0x4702, 0x1078, 0x45eb, 0x3c00,
+	0x007e, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x007f, 0x20e0,
+	0x82ff, 0x0040, 0x473b, 0x62c0, 0x82ff, 0x00c0, 0x473b, 0x782b,
+	0x0000, 0x7824, 0xa065, 0x1040, 0x12d5, 0x2009, 0x0013, 0x1078,
+	0x5c29, 0x0c7f, 0x007c, 0x3900, 0xa082, 0x797a, 0x00c8, 0x4742,
+	0x1078, 0x5b2c, 0x0c7e, 0x7824, 0xa065, 0x1040, 0x12d5, 0x7804,
+	0xa086, 0x0004, 0x0040, 0x47bd, 0x7828, 0xa092, 0x2710, 0x00c8,
+	0x4758, 0x8000, 0x782a, 0x0c7f, 0x1078, 0x5574, 0x0078, 0x4739,
+	0x6104, 0xa186, 0x0003, 0x00c0, 0x476f, 0x0e7e, 0x2071, 0x7600,
+	0x70c8, 0x0e7f, 0xd08c, 0x0040, 0x476f, 0x0c7e, 0x0e7e, 0x2061,
+	0x0100, 0x2071, 0x7600, 0x1078, 0x357b, 0x0e7f, 0x0c7f, 0x1078,
+	0x75c7, 0x2009, 0x0014, 0x1078, 0x5c29, 0x0c7f, 0x0078, 0x4739,
+	0x2001, 0x7852, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x00c0, 0x478c,
+	0x782b, 0x0000, 0x7824, 0xa065, 0x1040, 0x12d5, 0x2009, 0x0013,
+	0x1078, 0x5c77, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x3900, 0xa082,
+	0x797a, 0x00c8, 0x4795, 0x1078, 0x5b2c, 0x7824, 0xa005, 0x1040,
+	0x12d5, 0x781c, 0xa06d, 0x1040, 0x12d5, 0x6800, 0xc0dc, 0x6802,
+	0x7924, 0x2160, 0x1078, 0x5c02, 0x693c, 0x81ff, 0x1040, 0x12d5,
+	0x8109, 0x693e, 0x6854, 0xa015, 0x0040, 0x47b1, 0x7a1e, 0x0078,
+	0x47b3, 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x0d7f,
+	0x0c7f, 0x1078, 0x4c7a, 0x0078, 0x478a, 0x6104, 0xa186, 0x0002,
+	0x0040, 0x47c8, 0xa186, 0x0004, 0x0040, 0x47c8, 0x0078, 0x474c,
+	0x7808, 0xac06, 0x0040, 0x474c, 0x1078, 0x4b81, 0x1078, 0x4872,
+	0x0c7f, 0x1078, 0x4c7a, 0x0078, 0x4739, 0x0c7e, 0x6027, 0x0002,
+	0x2011, 0x7855, 0x2013, 0x0000, 0x62c8, 0x82ff, 0x00c0, 0x47ef,
+	0x62c4, 0x82ff, 0x00c0, 0x47ef, 0x793c, 0xa1e5, 0x0000, 0x0040,
+	0x47ed, 0x2009, 0x0049, 0x1078, 0x5c29, 0x0c7f, 0x007c, 0x3908,
+	0xa192, 0x797a, 0x00c8, 0x47f6, 0x1078, 0x5b2c, 0x6017, 0x0010,
+	0x793c, 0x81ff, 0x0040, 0x47ed, 0x7944, 0xa192, 0x7530, 0x00c8,
+	0x4815, 0x8108, 0x7946, 0x1078, 0x45f0, 0x793c, 0xa188, 0x0007,
+	0x210c, 0xa18e, 0x0006, 0x00c0, 0x4811, 0x6017, 0x0012, 0x0078,
+	0x47ed, 0x6017, 0x0016, 0x0078, 0x47ed, 0x037e, 0x2019, 0x0001,
+	0x1078, 0x5768, 0x037f, 0x1078, 0x75c7, 0x793c, 0x2160, 0x2009,
+	0x004a, 0x1078, 0x5c29, 0x0078, 0x47ed, 0x007e, 0x017e, 0x0c7e,
+	0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x7836,
+	0x6020, 0x8000, 0x6022, 0x6010, 0xa005, 0x0040, 0x4840, 0xa080,
+	0x0003, 0x2102, 0x6112, 0x127f, 0x0c7f, 0x017f, 0x007f, 0x007c,
+	0x6116, 0x6112, 0x0078, 0x483b, 0x0d7e, 0x2069, 0x7836, 0x6000,
+	0xd0d4, 0x0040, 0x4859, 0x6820, 0x8000, 0x6822, 0xa086, 0x0001,
+	0x00c0, 0x4854, 0x2c00, 0x681e, 0x6804, 0xa084, 0x0007, 0x0079,
+	0x4c82, 0xc0d5, 0x6002, 0x6818, 0xa005, 0x0040, 0x486b, 0x6056,
+	0x605b, 0x0000, 0x007e, 0x2c00, 0x681a, 0x0d7f, 0x685a, 0x2069,
+	0x7836, 0x0078, 0x484b, 0x6056, 0x605a, 0x2c00, 0x681a, 0x681e,
+	0x0078, 0x484b, 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000,
+	0x600f, 0x0000, 0x2c08, 0x2061, 0x7836, 0x6020, 0x8000, 0x6022,
+	0x6008, 0xa005, 0x0040, 0x488d, 0xa080, 0x0003, 0x2102, 0x610a,
+	0x127f, 0x0c7f, 0x017f, 0x007f, 0x007c, 0x610e, 0x610a, 0x0078,
+	0x4888, 0x0c7e, 0x600f, 0x0000, 0x2c08, 0x2061, 0x7836, 0x6034,
+	0xa005, 0x0040, 0x48a1, 0xa080, 0x0003, 0x2102, 0x6136, 0x0c7f,
+	0x007c, 0x613a, 0x6136, 0x0078, 0x489f, 0x0f7e, 0x0e7e, 0x0d7e,
+	0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e, 0x2071, 0x7836, 0x7638,
+	0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0040, 0x4907, 0x6018,
+	0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x4902, 0x703c, 0xac06,
+	0x00c0, 0x48c7, 0x6003, 0x000a, 0x630a, 0x0078, 0x4902, 0x7038,
+	0xac36, 0x00c0, 0x48cd, 0x660c, 0x763a, 0x7034, 0xac36, 0x00c0,
+	0x48db, 0x2c00, 0xaf36, 0x0040, 0x48d9, 0x2f00, 0x7036, 0x0078,
+	0x48db, 0x7037, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040,
+	0x48e4, 0x7e0e, 0x0078, 0x48e5, 0x2678, 0x600f, 0x0000, 0x1078,
+	0x693e, 0x0040, 0x48fd, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003,
+	0x00c0, 0x4910, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
+	0x6b3f, 0x1078, 0x3a7a, 0x1078, 0x6a94, 0x1078, 0x6aa1, 0x0c7f,
+	0x0078, 0x48b4, 0x2c78, 0x600c, 0x2060, 0x0078, 0x48b4, 0x127f,
+	0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c,
+	0x601c, 0xa086, 0x0006, 0x00c0, 0x48f2, 0x1078, 0x74fd, 0x0078,
+	0x48fd, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x0f7e, 0x2031, 0x0000,
+	0x127e, 0x2091, 0x8000, 0x2079, 0x7836, 0x7838, 0xa065, 0x0040,
+	0x4950, 0x600c, 0x007e, 0x600f, 0x0000, 0x783c, 0xac06, 0x00c0,
+	0x4937, 0x6003, 0x000a, 0x630a, 0x2c30, 0x0078, 0x494d, 0x1078,
+	0x693e, 0x0040, 0x494b, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003,
+	0x00c0, 0x4959, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
+	0x3a7a, 0x1078, 0x6a94, 0x1078, 0x6aa1, 0x007f, 0x0078, 0x4926,
+	0x7e3a, 0x7e36, 0x127f, 0x0f7f, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
+	0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x4942, 0x1078, 0x74fd,
+	0x0078, 0x494b, 0x027e, 0x1078, 0x4976, 0x1078, 0x4a0f, 0x027f,
+	0x007c, 0x0f7e, 0x127e, 0x2079, 0x7836, 0x2091, 0x8000, 0x1078,
+	0x4aa6, 0x1078, 0x4b0e, 0x127f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e,
+	0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
+	0x7836, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0040, 0x49fe, 0x6018,
+	0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x49f9, 0x7024, 0xac06,
+	0x00c0, 0x49bc, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x49b7,
+	0x1078, 0x5582, 0x68c3, 0x0000, 0x1078, 0x5a32, 0x7027, 0x0000,
+	0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x49ac,
+	0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
+	0x0040, 0x49b4, 0x6827, 0x0001, 0x037f, 0x0078, 0x49bc, 0x6003,
+	0x0009, 0x630a, 0x0078, 0x49f9, 0x7014, 0xac36, 0x00c0, 0x49c2,
+	0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x49d0, 0x2c00, 0xaf36,
+	0x0040, 0x49ce, 0x2f00, 0x7012, 0x0078, 0x49d0, 0x7013, 0x0000,
+	0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x49d9, 0x7e0e, 0x0078,
+	0x49da, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x693e,
+	0x0040, 0x49f2, 0x601c, 0xa086, 0x0003, 0x00c0, 0x4a06, 0x6837,
+	0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x6b3f, 0x1078, 0x3a7a,
+	0x1078, 0x6a94, 0x1078, 0x6aa1, 0x1078, 0x5902, 0x0c7f, 0x0078,
+	0x4984, 0x2c78, 0x600c, 0x2060, 0x0078, 0x4984, 0x127f, 0x007f,
 	0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086,
-	0x0006, 0x00c0, 0x44e1, 0x1078, 0x6bb3, 0x0078, 0x44ea, 0x0c7e,
-	0x007e, 0x127e, 0x2091, 0x8000, 0xa280, 0x6e00, 0x2004, 0xa065,
-	0x0040, 0x4595, 0x0f7e, 0x0e7e, 0x0d7e, 0x067e, 0x2071, 0x6f10,
-	0x6654, 0x7018, 0xac06, 0x00c0, 0x451e, 0x761a, 0x701c, 0xac06,
-	0x00c0, 0x452a, 0x86ff, 0x00c0, 0x4529, 0x7018, 0x701e, 0x0078,
-	0x452a, 0x761e, 0x6058, 0xa07d, 0x0040, 0x452f, 0x7e56, 0xa6ed,
-	0x0000, 0x0040, 0x4535, 0x2f00, 0x685a, 0x6057, 0x0000, 0x605b,
-	0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x33c4, 0x0040,
-	0x4591, 0x7624, 0x86ff, 0x0040, 0x4586, 0xa680, 0x0004, 0x2004,
-	0xad06, 0x00c0, 0x4586, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005,
-	0x0040, 0x457d, 0x1078, 0x4fe5, 0x68c3, 0x0000, 0x1078, 0x54a4,
+	0x0006, 0x00c0, 0x49e7, 0x1078, 0x74fd, 0x0078, 0x49f2, 0x0c7e,
+	0x007e, 0x127e, 0x2091, 0x8000, 0xa280, 0x7720, 0x2004, 0xa065,
+	0x0040, 0x4aa2, 0x0f7e, 0x0e7e, 0x0d7e, 0x067e, 0x2071, 0x7836,
+	0x6654, 0x7018, 0xac06, 0x00c0, 0x4a26, 0x761a, 0x701c, 0xac06,
+	0x00c0, 0x4a32, 0x86ff, 0x00c0, 0x4a31, 0x7018, 0x701e, 0x0078,
+	0x4a32, 0x761e, 0x6058, 0xa07d, 0x0040, 0x4a37, 0x7e56, 0xa6ed,
+	0x0000, 0x0040, 0x4a3d, 0x2f00, 0x685a, 0x6057, 0x0000, 0x605b,
+	0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x37a2, 0x0040,
+	0x4a9e, 0x7624, 0x86ff, 0x0040, 0x4a8e, 0xa680, 0x0004, 0x2004,
+	0xad06, 0x00c0, 0x4a8e, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005,
+	0x0040, 0x4a85, 0x1078, 0x5582, 0x68c3, 0x0000, 0x1078, 0x5a32,
 	0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
-	0x0040, 0x4566, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
-	0x6824, 0xd084, 0x0040, 0x456e, 0x6827, 0x0001, 0x037f, 0x0d7f,
-	0x0c7e, 0x603c, 0xa005, 0x0040, 0x4577, 0x8001, 0x603e, 0x2660,
-	0x1078, 0x6283, 0x0c7f, 0x0078, 0x4586, 0x0d7f, 0x0c7e, 0x2660,
-	0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, 0x453d, 0x6837, 0x0103,
-	0x6b4a, 0x6847, 0x0000, 0x1078, 0x36a1, 0x1078, 0x5374, 0x0078,
-	0x453d, 0x067f, 0x0d7f, 0x0e7f, 0x0f7f, 0x127f, 0x007f, 0x0c7f,
-	0x007c, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x2031, 0x0000, 0x7814,
-	0xa065, 0x0040, 0x45f1, 0x600c, 0x007e, 0x600f, 0x0000, 0x7824,
-	0xac06, 0x00c0, 0x45d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040,
-	0x45d0, 0x1078, 0x4fe5, 0x68c3, 0x0000, 0x1078, 0x54a4, 0x7827,
-	0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040,
-	0x45c5, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824,
-	0xd084, 0x0040, 0x45cd, 0x6827, 0x0001, 0x037f, 0x0078, 0x45d6,
-	0x6003, 0x0009, 0x630a, 0x2c30, 0x0078, 0x45ee, 0x6010, 0x2068,
-	0x1078, 0x6120, 0x0040, 0x45ea, 0x601c, 0xa086, 0x0003, 0x00c0,
-	0x45f8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x36a1,
-	0x1078, 0x6276, 0x1078, 0x6283, 0x1078, 0x5374, 0x007f, 0x0078,
-	0x45a0, 0x7e16, 0x7e12, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c,
-	0x601c, 0xa086, 0x0006, 0x00c0, 0x45e1, 0x1078, 0x6bb3, 0x0078,
-	0x45ea, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x7818, 0xa065, 0x0040,
-	0x466a, 0x6054, 0x007e, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000,
-	0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x33c4, 0x0040, 0x4667, 0x7e24,
-	0x86ff, 0x0040, 0x465c, 0xa680, 0x0004, 0x2004, 0xad06, 0x00c0,
-	0x465c, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x4653,
-	0x1078, 0x4fe5, 0x68c3, 0x0000, 0x1078, 0x54a4, 0x7827, 0x0000,
-	0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x463c,
-	0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
-	0x0040, 0x4644, 0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c,
-	0xa005, 0x0040, 0x464d, 0x8001, 0x603e, 0x2660, 0x1078, 0x6283,
-	0x0c7f, 0x0078, 0x465c, 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009,
-	0x630a, 0x0c7f, 0x0078, 0x4613, 0x6837, 0x0103, 0x6b4a, 0x6847,
-	0x0000, 0x1078, 0x36a1, 0x1078, 0x5374, 0x0078, 0x4613, 0x007f,
-	0x0078, 0x4606, 0x781e, 0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
-	0x007c, 0x0e7e, 0x0c7e, 0x2071, 0x6f10, 0x7004, 0xa084, 0x0007,
-	0x0079, 0x467a, 0x4684, 0x4687, 0x46a0, 0x46bc, 0x4701, 0x4684,
-	0x4682, 0x4682, 0x1078, 0x12b7, 0x0c7f, 0x0e7f, 0x007c, 0x7024,
-	0xa065, 0x0040, 0x4695, 0x7020, 0x8001, 0x7022, 0x600c, 0xa015,
-	0x0040, 0x469c, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027,
-	0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7216, 0x7212, 0x0078, 0x4695,
-	0x6018, 0x2060, 0x1078, 0x33c4, 0x6000, 0xc0dc, 0x6002, 0x7020,
-	0x8001, 0x7022, 0x0040, 0x46b1, 0x6054, 0xa015, 0x0040, 0x46b8,
+	0x0040, 0x4a6e, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
+	0x6824, 0xd084, 0x0040, 0x4a76, 0x6827, 0x0001, 0x037f, 0x0d7f,
+	0x0c7e, 0x603c, 0xa005, 0x0040, 0x4a7f, 0x8001, 0x603e, 0x2660,
+	0x1078, 0x6aa1, 0x0c7f, 0x0078, 0x4a8e, 0x0d7f, 0x0c7e, 0x2660,
+	0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, 0x4a45, 0x8dff, 0x0040,
+	0x4a9a, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x6b3f,
+	0x1078, 0x3a7a, 0x1078, 0x5902, 0x0078, 0x4a45, 0x067f, 0x0d7f,
+	0x0e7f, 0x0f7f, 0x127f, 0x007f, 0x0c7f, 0x007c, 0x007e, 0x067e,
+	0x0c7e, 0x0d7e, 0x2031, 0x0000, 0x7814, 0xa065, 0x0040, 0x4afe,
+	0x600c, 0x007e, 0x600f, 0x0000, 0x7824, 0xac06, 0x00c0, 0x4ae3,
+	0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x4add, 0x1078, 0x5582,
+	0x68c3, 0x0000, 0x1078, 0x5a32, 0x7827, 0x0000, 0x037e, 0x2069,
+	0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x4ad2, 0x6803, 0x0100,
+	0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x4ada,
+	0x6827, 0x0001, 0x037f, 0x0078, 0x4ae3, 0x6003, 0x0009, 0x630a,
+	0x2c30, 0x0078, 0x4afb, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040,
+	0x4af7, 0x601c, 0xa086, 0x0003, 0x00c0, 0x4b05, 0x6837, 0x0103,
+	0x6b4a, 0x6847, 0x0000, 0x1078, 0x3a7a, 0x1078, 0x6a94, 0x1078,
+	0x6aa1, 0x1078, 0x5902, 0x007f, 0x0078, 0x4aad, 0x7e16, 0x7e12,
+	0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c, 0xa086, 0x0006,
+	0x00c0, 0x4aee, 0x1078, 0x74fd, 0x0078, 0x4af7, 0x007e, 0x067e,
+	0x0c7e, 0x0d7e, 0x7818, 0xa065, 0x0040, 0x4b7a, 0x6054, 0x007e,
+	0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002,
+	0x1078, 0x37a2, 0x0040, 0x4b77, 0x7e24, 0x86ff, 0x0040, 0x4b69,
+	0xa680, 0x0004, 0x2004, 0xad06, 0x00c0, 0x4b69, 0x0d7e, 0x2069,
+	0x0100, 0x68c0, 0xa005, 0x0040, 0x4b60, 0x1078, 0x5582, 0x68c3,
+	0x0000, 0x1078, 0x5a32, 0x7827, 0x0000, 0x037e, 0x2069, 0x0140,
+	0x6b04, 0xa384, 0x1000, 0x0040, 0x4b49, 0x6803, 0x0100, 0x6803,
+	0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x4b51, 0x6827,
+	0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040, 0x4b5a,
+	0x8001, 0x603e, 0x2660, 0x1078, 0x6aa1, 0x0c7f, 0x0078, 0x4b69,
+	0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078,
+	0x4b20, 0x8dff, 0x0040, 0x4b73, 0x6837, 0x0103, 0x6b4a, 0x6847,
+	0x0000, 0x1078, 0x3a7a, 0x1078, 0x5902, 0x0078, 0x4b20, 0x007f,
+	0x0078, 0x4b13, 0x781e, 0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
+	0x007c, 0x0e7e, 0x0c7e, 0x2071, 0x7836, 0x7004, 0xa084, 0x0007,
+	0x0079, 0x4b8a, 0x4b94, 0x4b97, 0x4bb0, 0x4bcc, 0x4c11, 0x4b94,
+	0x4b94, 0x4b92, 0x1078, 0x12d5, 0x0c7f, 0x0e7f, 0x007c, 0x7024,
+	0xa065, 0x0040, 0x4ba5, 0x7020, 0x8001, 0x7022, 0x600c, 0xa015,
+	0x0040, 0x4bac, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027,
+	0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7216, 0x7212, 0x0078, 0x4ba5,
+	0x6018, 0x2060, 0x1078, 0x37a2, 0x6000, 0xc0dc, 0x6002, 0x7020,
+	0x8001, 0x7022, 0x0040, 0x4bc1, 0x6054, 0xa015, 0x0040, 0x4bc8,
 	0x721e, 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c,
-	0x7218, 0x721e, 0x0078, 0x46b1, 0x7024, 0xa065, 0x0040, 0x46fe,
-	0x700c, 0xac06, 0x00c0, 0x46d3, 0x1078, 0x5374, 0x600c, 0xa015,
-	0x0040, 0x46cf, 0x720e, 0x600f, 0x0000, 0x0078, 0x46fc, 0x720e,
-	0x720a, 0x0078, 0x46fc, 0x7014, 0xac06, 0x00c0, 0x46e6, 0x1078,
-	0x5374, 0x600c, 0xa015, 0x0040, 0x46e2, 0x7216, 0x600f, 0x0000,
-	0x0078, 0x46fc, 0x7216, 0x7212, 0x0078, 0x46fc, 0x6018, 0x2060,
-	0x1078, 0x33c4, 0x6000, 0xc0dc, 0x6002, 0x1078, 0x5374, 0x701c,
-	0xa065, 0x0040, 0x46fc, 0x6054, 0xa015, 0x0040, 0x46fa, 0x721e,
-	0x0078, 0x46fc, 0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f, 0x0e7f,
-	0x007c, 0x7024, 0xa065, 0x0040, 0x470e, 0x1078, 0x5374, 0x600c,
-	0xa015, 0x0040, 0x4715, 0x720e, 0x600f, 0x0000, 0x1078, 0x54a4,
+	0x7218, 0x721e, 0x0078, 0x4bc1, 0x7024, 0xa065, 0x0040, 0x4c0e,
+	0x700c, 0xac06, 0x00c0, 0x4be3, 0x1078, 0x5902, 0x600c, 0xa015,
+	0x0040, 0x4bdf, 0x720e, 0x600f, 0x0000, 0x0078, 0x4c0c, 0x720e,
+	0x720a, 0x0078, 0x4c0c, 0x7014, 0xac06, 0x00c0, 0x4bf6, 0x1078,
+	0x5902, 0x600c, 0xa015, 0x0040, 0x4bf2, 0x7216, 0x600f, 0x0000,
+	0x0078, 0x4c0c, 0x7216, 0x7212, 0x0078, 0x4c0c, 0x6018, 0x2060,
+	0x1078, 0x37a2, 0x6000, 0xc0dc, 0x6002, 0x1078, 0x5902, 0x701c,
+	0xa065, 0x0040, 0x4c0c, 0x6054, 0xa015, 0x0040, 0x4c0a, 0x721e,
+	0x0078, 0x4c0c, 0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f, 0x0e7f,
+	0x007c, 0x7024, 0xa065, 0x0040, 0x4c1e, 0x1078, 0x5902, 0x600c,
+	0xa015, 0x0040, 0x4c25, 0x720e, 0x600f, 0x0000, 0x1078, 0x5a32,
 	0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x720e, 0x720a, 0x0078,
-	0x470e, 0x0d7e, 0x2069, 0x6f10, 0x6830, 0xa084, 0x0003, 0x0079,
-	0x4721, 0x4727, 0x4729, 0x474f, 0x4725, 0x1078, 0x12b7, 0x0d7f,
-	0x007c, 0x0c7e, 0x6840, 0xa086, 0x0001, 0x0040, 0x4745, 0x683c,
-	0xa065, 0x0040, 0x473a, 0x600c, 0xa015, 0x0040, 0x4741, 0x6a3a,
+	0x4c1e, 0x0d7e, 0x2069, 0x7836, 0x6830, 0xa084, 0x0003, 0x0079,
+	0x4c31, 0x4c37, 0x4c39, 0x4c5f, 0x4c37, 0x1078, 0x12d5, 0x0d7f,
+	0x007c, 0x0c7e, 0x6840, 0xa086, 0x0001, 0x0040, 0x4c55, 0x683c,
+	0xa065, 0x0040, 0x4c4a, 0x600c, 0xa015, 0x0040, 0x4c51, 0x6a3a,
 	0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0c7f, 0x0d7f,
-	0x007c, 0x683a, 0x6836, 0x0078, 0x473a, 0x6843, 0x0000, 0x6838,
-	0xa065, 0x0040, 0x473a, 0x6003, 0x0003, 0x0078, 0x473a, 0x0c7e,
-	0x6843, 0x0000, 0x6847, 0x0000, 0x683c, 0xa065, 0x0040, 0x4767,
-	0x600c, 0xa015, 0x0040, 0x4763, 0x6a3a, 0x600f, 0x0000, 0x683f,
-	0x0000, 0x0078, 0x4767, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f,
-	0x0d7f, 0x007c, 0x0d7e, 0x2069, 0x6f10, 0x6804, 0xa084, 0x0007,
-	0x0079, 0x4772, 0x477c, 0x4810, 0x4810, 0x4810, 0x4810, 0x4812,
-	0x477a, 0x477a, 0x1078, 0x12b7, 0x6820, 0xa005, 0x00c0, 0x4782,
-	0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x4791, 0x6807,
-	0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x4858, 0x0c7f, 0x0d7f,
-	0x007c, 0x6814, 0xa065, 0x0040, 0x479f, 0x6807, 0x0001, 0x6826,
-	0x682b, 0x0000, 0x1078, 0x4858, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e,
-	0x037e, 0x6a1c, 0xa2f5, 0x0000, 0x0040, 0x480b, 0x704c, 0xa00d,
-	0x0040, 0x47ae, 0x7088, 0xa005, 0x0040, 0x47c6, 0x7054, 0xa075,
-	0x0040, 0x47b7, 0xa20e, 0x0040, 0x480b, 0x0078, 0x47bc, 0x6818,
-	0xa20e, 0x0040, 0x480b, 0x2070, 0x704c, 0xa00d, 0x0040, 0x47ae,
-	0x7088, 0xa005, 0x00c0, 0x47ae, 0x2e00, 0x681e, 0x733c, 0x7038,
-	0xa302, 0x00c8, 0x47ae, 0x1078, 0x5539, 0x0040, 0x480b, 0x8318,
+	0x007c, 0x683a, 0x6836, 0x0078, 0x4c4a, 0x6843, 0x0000, 0x6838,
+	0xa065, 0x0040, 0x4c4a, 0x6003, 0x0003, 0x0078, 0x4c4a, 0x0c7e,
+	0x6843, 0x0000, 0x6847, 0x0000, 0x683c, 0xa065, 0x0040, 0x4c77,
+	0x600c, 0xa015, 0x0040, 0x4c73, 0x6a3a, 0x600f, 0x0000, 0x683f,
+	0x0000, 0x0078, 0x4c77, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f,
+	0x0d7f, 0x007c, 0x0d7e, 0x2069, 0x7836, 0x6804, 0xa084, 0x0007,
+	0x0079, 0x4c82, 0x4c8c, 0x4d29, 0x4d29, 0x4d29, 0x4d29, 0x4d2b,
+	0x4d29, 0x4c8a, 0x1078, 0x12d5, 0x6820, 0xa005, 0x00c0, 0x4c92,
+	0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x4ca1, 0x6807,
+	0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x4d71, 0x0c7f, 0x0d7f,
+	0x007c, 0x6814, 0xa065, 0x0040, 0x4caf, 0x6807, 0x0001, 0x6826,
+	0x682b, 0x0000, 0x1078, 0x4d71, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e,
+	0x037e, 0x6a1c, 0xa2f5, 0x0000, 0x0040, 0x4d24, 0x704c, 0xa00d,
+	0x0040, 0x4cbe, 0x7088, 0xa005, 0x0040, 0x4cd6, 0x7054, 0xa075,
+	0x0040, 0x4cc7, 0xa20e, 0x0040, 0x4d24, 0x0078, 0x4ccc, 0x6818,
+	0xa20e, 0x0040, 0x4d24, 0x2070, 0x704c, 0xa00d, 0x0040, 0x4cbe,
+	0x7088, 0xa005, 0x00c0, 0x4cbe, 0x2e00, 0x681e, 0x733c, 0x7038,
+	0xa302, 0x00c8, 0x4cbe, 0x1078, 0x5bd1, 0x0040, 0x4d24, 0x8318,
 	0x733e, 0x6112, 0x2e10, 0x621a, 0xa180, 0x0015, 0x2004, 0xa08a,
-	0x199a, 0x0048, 0x47dd, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b,
+	0x199a, 0x0048, 0x4ced, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b,
 	0xa318, 0x6316, 0x037f, 0x0f7e, 0x2c78, 0x71a0, 0xd1bc, 0x0040,
-	0x47ed, 0x2009, 0x0000, 0x0078, 0x47f2, 0xa1e0, 0x2091, 0x2c0c,
-	0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x1078, 0x4c44, 0x7300,
-	0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000,
-	0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, 0x0f7f, 0x0e7f,
-	0x0c7f, 0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f, 0x0078, 0x4809,
-	0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x481e, 0x6807,
-	0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x4858, 0x0c7f, 0x0d7f,
-	0x007c, 0x0f7e, 0x0d7e, 0x2069, 0x6f10, 0x6830, 0xa086, 0x0000,
-	0x00c0, 0x483f, 0x6838, 0xa07d, 0x0040, 0x483f, 0x6833, 0x0001,
-	0x683e, 0x6847, 0x0000, 0x127e, 0x0f7e, 0x2091, 0x2200, 0x027f,
-	0x1078, 0x1838, 0x00c0, 0x4842, 0x127f, 0x1078, 0x4ed5, 0x0d7f,
-	0x0f7f, 0x007c, 0x127f, 0x6843, 0x0000, 0x7803, 0x0002, 0x780c,
-	0xa015, 0x0040, 0x4854, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000,
-	0x683f, 0x0000, 0x0078, 0x483f, 0x683a, 0x6836, 0x0078, 0x484e,
-	0x601c, 0xa084, 0x000f, 0x1079, 0x485e, 0x007c, 0x4867, 0x4869,
-	0x4b33, 0x4c15, 0x4869, 0x4b33, 0x4c15, 0x4867, 0x4869, 0x1078,
-	0x12b7, 0x157e, 0x137e, 0x147e, 0x0c7e, 0x0f7e, 0x6004, 0xa08a,
-	0x0024, 0x10c8, 0x12b7, 0x6118, 0x2178, 0x79a0, 0xa1f8, 0x2091,
-	0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0x1079,
-	0x4887, 0x0f7f, 0x0c7f, 0x147f, 0x137f, 0x157f, 0x007c, 0x48ad,
-	0x48ec, 0x4904, 0x494c, 0x4979, 0x4981, 0x49a2, 0x49b3, 0x49c4,
-	0x49cc, 0x49dd, 0x49cc, 0x4a25, 0x49b3, 0x4a55, 0x4a5d, 0x49c4,
-	0x4a5d, 0x4a6e, 0x48ab, 0x48ab, 0x48ab, 0x48ab, 0x48ab, 0x48ab,
-	0x48ab, 0x48ab, 0x48ab, 0x48ab, 0x48ab, 0x48ab, 0x50b8, 0x50cd,
-	0x50f0, 0x5114, 0x49a2, 0x1078, 0x12b7, 0x20a1, 0x020b, 0x1078,
-	0x4a83, 0x20a3, 0x5200, 0x20a3, 0x0000, 0x0d7e, 0x2069, 0x6d51,
-	0x6804, 0xd084, 0x0040, 0x48ce, 0x6828, 0x017e, 0x2069, 0x6d00,
-	0x694c, 0xa106, 0x017f, 0x00c0, 0x48ce, 0x20a3, 0x0000, 0x6030,
-	0xa084, 0x00ff, 0x20a2, 0x0d7f, 0x0078, 0x48d3, 0x0d7f, 0x20a3,
-	0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0x6d05, 0x53a6,
-	0x20a9, 0x0004, 0x2099, 0x6d01, 0x53a6, 0x20a3, 0x0000, 0x6030,
-	0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
-	0x001c, 0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4a83,
-	0x20a3, 0x0500, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x6030, 0xa084,
-	0x00ff, 0x20a2, 0x20a9, 0x0004, 0x2099, 0x6d05, 0x53a6, 0x60c3,
-	0x0010, 0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4a83,
-	0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x4917,
-	0x20a3, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0078, 0x4919, 0x20a3,
-	0x0300, 0x20a3, 0x0000, 0x2099, 0x6f00, 0x20a9, 0x0008, 0x53a6,
-	0x20a9, 0x0004, 0x2099, 0x6d05, 0x53a6, 0x20a9, 0x0004, 0x2099,
-	0x6d01, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x492c,
-	0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x4932, 0x2099, 0x6f08,
+	0x4d06, 0x7100, 0xd1f4, 0x0040, 0x4d02, 0x7114, 0xa18c, 0x00ff,
+	0x0078, 0x4d0b, 0x2009, 0x0000, 0x0078, 0x4d0b, 0xa1e0, 0x232f,
+	0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x1078, 0x51c2,
+	0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b,
+	0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, 0x0f7f,
+	0x0e7f, 0x0c7f, 0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f, 0x0078,
+	0x4d22, 0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x4d37,
+	0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x4d71, 0x0c7f,
+	0x0d7f, 0x007c, 0x0f7e, 0x0d7e, 0x2069, 0x7836, 0x6830, 0xa086,
+	0x0000, 0x00c0, 0x4d58, 0x6838, 0xa07d, 0x0040, 0x4d58, 0x6833,
+	0x0001, 0x683e, 0x6847, 0x0000, 0x127e, 0x0f7e, 0x2091, 0x2200,
+	0x027f, 0x1078, 0x1a4c, 0x00c0, 0x4d5b, 0x127f, 0x1078, 0x5457,
+	0x0d7f, 0x0f7f, 0x007c, 0x127f, 0x6843, 0x0000, 0x7803, 0x0002,
+	0x780c, 0xa015, 0x0040, 0x4d6d, 0x6a3a, 0x780f, 0x0000, 0x6833,
+	0x0000, 0x683f, 0x0000, 0x0078, 0x4d58, 0x683a, 0x6836, 0x0078,
+	0x4d67, 0x601c, 0xa084, 0x000f, 0x1079, 0x4d77, 0x007c, 0x4d80,
+	0x4d85, 0x508c, 0x5182, 0x4d85, 0x508c, 0x5182, 0x4d80, 0x4d85,
+	0x1078, 0x4b81, 0x1078, 0x4c7a, 0x007c, 0x157e, 0x137e, 0x147e,
+	0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0030, 0x10c8, 0x12d5, 0x6118,
+	0x2178, 0x79a0, 0xd1bc, 0x0040, 0x4da2, 0x7900, 0xd1f4, 0x0040,
+	0x4d9e, 0x7914, 0xa18c, 0x00ff, 0x0078, 0x4da7, 0x2009, 0x0000,
+	0x0078, 0x4da7, 0xa1f8, 0x232f, 0x2f0c, 0xa18c, 0x00ff, 0x2c78,
+	0x2061, 0x0100, 0x619a, 0x1079, 0x4db3, 0x0f7f, 0x0c7f, 0x147f,
+	0x137f, 0x157f, 0x007c, 0x4de5, 0x4e1d, 0x4e35, 0x4eb4, 0x4ee1,
+	0x4ee9, 0x4f0a, 0x4f1b, 0x4f2c, 0x4f34, 0x4f45, 0x4f34, 0x4f8d,
+	0x4f1b, 0x4fae, 0x4fb6, 0x4f2c, 0x4fb6, 0x4fc7, 0x4de3, 0x4de3,
+	0x4de3, 0x4de3, 0x4de3, 0x4de3, 0x4de3, 0x4de3, 0x4de3, 0x4de3,
+	0x4de3, 0x4de3, 0x5640, 0x5655, 0x5678, 0x569c, 0x4f0a, 0x4de3,
+	0x4f0a, 0x4f34, 0x4de3, 0x4e35, 0x4eb4, 0x4de3, 0x5b4c, 0x4f34,
+	0x4de3, 0x5b6f, 0x4f34, 0x1078, 0x12d5, 0x20a1, 0x020b, 0x1078,
+	0x4fdc, 0x20a3, 0x5200, 0x20a3, 0x0000, 0x0d7e, 0x2069, 0x7651,
+	0x6804, 0xd084, 0x0040, 0x4dff, 0x6828, 0x20a3, 0x0000, 0x017e,
+	0x1078, 0x209a, 0x21a2, 0x017f, 0x0d7f, 0x0078, 0x4e04, 0x0d7f,
+	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0x7605,
+	0x53a6, 0x20a9, 0x0004, 0x2099, 0x7601, 0x53a6, 0x20a3, 0x0000,
+	0x6030, 0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
+	0x60c3, 0x001c, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x1078,
+	0x4fdc, 0x20a3, 0x0500, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x6030,
+	0xa084, 0x00ff, 0x20a2, 0x20a9, 0x0004, 0x2099, 0x7605, 0x53a6,
+	0x60c3, 0x0010, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x1078,
+	0x4fdc, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0,
+	0x4e48, 0x20a3, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0078, 0x4e4a,
+	0x20a3, 0x0300, 0x20a3, 0x0000, 0x7818, 0xa080, 0x0028, 0x2004,
+	0xa086, 0x007e, 0x00c0, 0x4e83, 0x2099, 0x7820, 0x33a6, 0x9398,
+	0x33a6, 0x9398, 0x3304, 0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6,
+	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
+	0x20a9, 0x0004, 0x2099, 0x7605, 0x53a6, 0x20a9, 0x0004, 0x2099,
+	0x7601, 0x53a6, 0x20a9, 0x0010, 0x20a3, 0x0000, 0x00f0, 0x4e74,
+	0x2099, 0x7828, 0x33a6, 0x20a9, 0x0007, 0x20a3, 0x0000, 0x00f0,
+	0x4e7d, 0x0078, 0x4ea3, 0x2099, 0x7820, 0x20a9, 0x0008, 0x53a6,
+	0x20a9, 0x0004, 0x2099, 0x7605, 0x53a6, 0x20a9, 0x0004, 0x2099,
+	0x7601, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x4e94,
+	0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x4e9a, 0x2099, 0x7828,
 	0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0,
-	0x493d, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x4943, 0x60c3,
-	0x0074, 0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4a83,
+	0x4ea5, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x4eab, 0x60c3,
+	0x0074, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4fdc,
 	0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3, 0x2000,
 	0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079,
-	0x6d51, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x4968, 0xa085, 0x0020,
-	0xd1a4, 0x0040, 0x496d, 0xa085, 0x0010, 0xa085, 0x0002, 0x20a2,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x4fd1,
-	0x007c, 0x20a1, 0x020b, 0x1078, 0x4a83, 0x20a3, 0x5000, 0x0078,
-	0x4919, 0x20a1, 0x020b, 0x1078, 0x4a83, 0x20a3, 0x2110, 0x20a3,
-	0x0014, 0x20a3, 0x0800, 0x20a3, 0x2000, 0x20a3, 0x0000, 0x20a3,
+	0x7651, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x4ed0, 0xa085, 0x0020,
+	0xd1a4, 0x0040, 0x4ed5, 0xa085, 0x0010, 0xa085, 0x0002, 0x20a2,
+	0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x556e,
+	0x007c, 0x20a1, 0x020b, 0x1078, 0x4fdc, 0x20a3, 0x5000, 0x0078,
+	0x4e4a, 0x20a1, 0x020b, 0x1078, 0x4fdc, 0x20a3, 0x2110, 0x20a3,
+	0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
 	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
-	0x0022, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
-	0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4afa, 0x20a3, 0x0200,
+	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
+	0x556e, 0x007c, 0x20a1, 0x020b, 0x1078, 0x5053, 0x20a3, 0x0200,
 	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004,
-	0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4afa, 0x20a3,
+	0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x1078, 0x5053, 0x20a3,
 	0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3,
-	0x0008, 0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4afa,
-	0x20a3, 0x0200, 0x0078, 0x4919, 0x20a1, 0x020b, 0x1078, 0x4afa,
+	0x0008, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x1078, 0x5053,
+	0x20a3, 0x0200, 0x0078, 0x4e4a, 0x20a1, 0x020b, 0x1078, 0x5053,
 	0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x7810, 0x20a2,
-	0x60c3, 0x0008, 0x1078, 0x4fd1, 0x007c, 0x0d7e, 0x20a1, 0x020b,
-	0x1078, 0x4afa, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0800,
-	0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x00c0, 0x4a03, 0x6998,
-	0xa184, 0xc000, 0x00c0, 0x49ff, 0xd1ec, 0x0040, 0x49fb, 0x20a3,
-	0x2100, 0x0078, 0x4a05, 0x20a3, 0x0100, 0x0078, 0x4a05, 0x20a3,
-	0x0400, 0x0078, 0x4a05, 0x20a3, 0x0700, 0xa006, 0x20a2, 0x20a2,
-	0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0x6d51, 0x7904, 0x0f7f,
-	0xd1ac, 0x00c0, 0x4a15, 0xa085, 0x0020, 0xd1a4, 0x0040, 0x4a1a,
+	0x60c3, 0x0008, 0x1078, 0x556e, 0x007c, 0x0d7e, 0x20a1, 0x020b,
+	0x1078, 0x5053, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0800,
+	0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x00c0, 0x4f6b, 0x6998,
+	0xa184, 0xc000, 0x00c0, 0x4f67, 0xd1ec, 0x0040, 0x4f63, 0x20a3,
+	0x2100, 0x0078, 0x4f6d, 0x20a3, 0x0100, 0x0078, 0x4f6d, 0x20a3,
+	0x0400, 0x0078, 0x4f6d, 0x20a3, 0x0700, 0xa006, 0x20a2, 0x20a2,
+	0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0x7651, 0x7904, 0x0f7f,
+	0xd1ac, 0x00c0, 0x4f7d, 0xa085, 0x0020, 0xd1a4, 0x0040, 0x4f82,
 	0xa085, 0x0010, 0xa085, 0x0002, 0x20a2, 0x20a2, 0x20a2, 0x60c3,
-	0x0014, 0x1078, 0x4fd1, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078,
-	0x4afa, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x6018,
-	0x0d7e, 0x2068, 0x6804, 0x0d7f, 0xa084, 0x00ff, 0xa086, 0x0006,
-	0x0040, 0x4a3e, 0x20a3, 0x0400, 0x0078, 0x4a40, 0x20a3, 0x0100,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x60c3, 0x0014, 0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078,
-	0x4afa, 0x20a3, 0x0200, 0x0078, 0x48b3, 0x20a1, 0x020b, 0x1078,
-	0x4afa, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3,
-	0x2a00, 0x60c3, 0x0008, 0x1078, 0x4fd1, 0x007c, 0x20e1, 0x9080,
-	0x20e1, 0x4000, 0x20a1, 0x020b, 0x1078, 0x4afa, 0x20a3, 0x0100,
-	0x20a3, 0x0000, 0x20a3, 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008,
-	0x1078, 0x4fd1, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
-	0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x00c0, 0x4a96,
-	0x20a3, 0x22ff, 0x20a3, 0xfffe, 0x0078, 0x4ac4, 0xa286, 0x007f,
-	0x00c0, 0x4aa1, 0x0d7e, 0x20a3, 0x22ff, 0x20a3, 0xfffd, 0x0078,
-	0x4ab8, 0xd2bc, 0x0040, 0x4ac0, 0xa286, 0x0080, 0x0d7e, 0x00c0,
-	0x4aaf, 0x20a3, 0x22ff, 0x20a3, 0xfffc, 0x0078, 0x4ab8, 0xa2e8,
-	0x6e00, 0x2d6c, 0x6810, 0xa085, 0x2200, 0x20a2, 0x6814, 0x20a2,
-	0x2069, 0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x4ac8,
-	0x20a3, 0x2200, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2,
-	0x20a3, 0x0129, 0x20a3, 0x0000, 0x1078, 0x4fc0, 0x22a2, 0x20a3,
-	0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x027f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3,
-	0x02ff, 0x2011, 0xfffc, 0x22a2, 0x0d7e, 0x2069, 0x6d19, 0x2da6,
-	0x8d68, 0x2da6, 0x0d7f, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078,
-	0x4acc, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3,
-	0x0000, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818,
-	0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x4b19, 0x0d7e,
-	0xa0e8, 0x6e00, 0x2d6c, 0x6810, 0xa085, 0x2300, 0x20a2, 0x6814,
-	0x20a2, 0x2069, 0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
-	0x4b21, 0x20a3, 0x2300, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230,
-	0x22a2, 0x20a3, 0x0198, 0x20a3, 0x0000, 0x1078, 0x4fc0, 0x22a2,
-	0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x027f, 0x007c, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0025,
-	0x1048, 0x12b7, 0xa08a, 0x002c, 0x10c8, 0x12b7, 0x6118, 0x2178,
-	0x79a0, 0xa1f8, 0x2091, 0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061,
-	0x0100, 0x619a, 0xa082, 0x0025, 0x1079, 0x4b51, 0x0f7f, 0x0c7f,
-	0x007c, 0x4b5a, 0x4b65, 0x4b7f, 0x4b58, 0x4b58, 0x4b58, 0x4b5a,
-	0x1078, 0x12b7, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4b8e, 0x60c3,
-	0x0000, 0x1078, 0x4fd1, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b,
-	0x1078, 0x4bbb, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2,
-	0x2fa2, 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x60c3, 0x000c, 0x1078, 0x4fd1, 0x147f, 0x007c, 0x147e,
-	0x20a1, 0x020b, 0x1078, 0x4be8, 0x20a3, 0x0003, 0x20a3, 0x0300,
-	0x60c3, 0x0004, 0x1078, 0x4fd1, 0x147f, 0x007c, 0x027e, 0x20e1,
-	0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092,
-	0x007e, 0x0048, 0x4bad, 0x0d7e, 0xa0e8, 0x6e00, 0x2d6c, 0x6810,
-	0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x6d19, 0x2da6,
-	0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x4bb5, 0x20a3, 0x8100, 0x6298,
-	0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0009, 0x20a3,
-	0x0000, 0x0078, 0x4acc, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
-	0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x4bda,
-	0x0d7e, 0xa0e8, 0x6e00, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2,
-	0x6814, 0x20a2, 0x2069, 0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
-	0x0078, 0x4be2, 0x20a3, 0x8400, 0x6298, 0x22a2, 0x20a3, 0x0000,
-	0x6230, 0x22a2, 0x20a3, 0x00d1, 0x20a3, 0x0000, 0x0078, 0x4b25,
-	0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
-	0x2004, 0xa092, 0x007e, 0x0048, 0x4c07, 0x0d7e, 0xa0e8, 0x6e00,
-	0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069,
-	0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x4c0f, 0x20a3,
-	0x8500, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3,
-	0x00d1, 0x20a3, 0x0000, 0x0078, 0x4b25, 0x0c7e, 0x0f7e, 0x2c78,
-	0x7804, 0xa08a, 0x0040, 0x1048, 0x12b7, 0xa08a, 0x004f, 0x10c8,
-	0x12b7, 0x7918, 0x2160, 0x61a0, 0xa1e0, 0x2091, 0x2c0c, 0xa18c,
-	0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, 0x0040, 0x1079, 0x4c33,
-	0x0f7f, 0x0c7f, 0x007c, 0x4c44, 0x4d28, 0x4cd0, 0x4e50, 0x4c42,
-	0x4c42, 0x4c42, 0x4c42, 0x4c42, 0x4c42, 0x4c42, 0x528d, 0x529e,
-	0x52af, 0x52c0, 0x1078, 0x12b7, 0x0d7e, 0x157e, 0x147e, 0x20a1,
-	0x020b, 0x1078, 0x4c93, 0x7910, 0x2168, 0x6944, 0xa18c, 0x00ff,
-	0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184, 0x0006,
-	0x8004, 0x20a2, 0xd1ac, 0x0040, 0x4c61, 0x20a3, 0x0002, 0x0078,
-	0x4c6d, 0xd1b4, 0x0040, 0x4c68, 0x20a3, 0x0001, 0x0078, 0x4c6d,
-	0x20a3, 0x0000, 0x2230, 0x0078, 0x4c6f, 0x6a80, 0x6e7c, 0x20a9,
-	0x0008, 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000, 0x00f0,
-	0x4c73, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, 0x6014,
-	0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0x6f2c, 0x2003,
-	0x07d0, 0x2001, 0x6f2b, 0x2003, 0x0009, 0x1078, 0x14e4, 0x147f,
-	0x157f, 0x0d7f, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18,
-	0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217,
-	0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x4cb9, 0x0d7e,
-	0xa0e8, 0x6e00, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814,
-	0x20a2, 0x2069, 0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
-	0x4cc1, 0x20a3, 0x0600, 0x6198, 0x21a2, 0x20a3, 0x0000, 0x6130,
-	0x21a2, 0x20a3, 0x0829, 0x20a3, 0x0000, 0x22a2, 0x20a3, 0x0000,
-	0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x007c,
-	0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4cf0,
-	0x7810, 0x2068, 0x6860, 0x20a2, 0x685c, 0x20a2, 0x6880, 0x20a2,
-	0x687c, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x60c3,
-	0x000c, 0x1078, 0x4fd1, 0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c,
-	0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
-	0x2004, 0xd0bc, 0x0040, 0x4d0e, 0x0d7e, 0xa0e8, 0x6e00, 0x2d6c,
-	0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x6d19,
-	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x4d16, 0x20a3, 0x0500,
-	0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0889,
-	0x20a3, 0x0000, 0x1078, 0x4fc0, 0x22a2, 0x20a3, 0x0000, 0x7a08,
-	0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c,
-	0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4e18,
-	0x7810, 0x2068, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
-	0x7810, 0xa084, 0xf000, 0x00c0, 0x4d45, 0x7810, 0xa084, 0x0700,
-	0x8007, 0x1079, 0x4d4d, 0x0078, 0x4d48, 0xa006, 0x1079, 0x4d4d,
-	0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c, 0x4d57, 0x4db9, 0x4dbd,
-	0x4de0, 0x4ded, 0x4dff, 0x4e03, 0x4d55, 0x1078, 0x12b7, 0x017e,
-	0x037e, 0x694c, 0xa18c, 0x0003, 0xa186, 0x0000, 0x00c0, 0x4d6a,
-	0x6b78, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x037f, 0x017f,
-	0x0078, 0x4de4, 0xa186, 0x0001, 0x00c0, 0x4db4, 0x6b78, 0x23a2,
-	0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2, 0x22a2,
-	0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0040, 0x4db3,
-	0xd3c4, 0x0040, 0x4d85, 0x687c, 0xa108, 0xd3cc, 0x0040, 0x4d8a,
-	0x6874, 0xa108, 0x157e, 0x20a9, 0x000d, 0xad80, 0x0020, 0x201c,
-	0x831f, 0x23a2, 0x8000, 0x00f0, 0x4d8f, 0x157f, 0x22a2, 0x22a2,
-	0x22a2, 0xa184, 0x0003, 0x0040, 0x4db3, 0x20a1, 0x020b, 0x20e1,
-	0x9080, 0x20e1, 0x4000, 0x20a3, 0x0700, 0x6298, 0x22a2, 0x20a3,
-	0x0000, 0x6230, 0x22a2, 0x20a3, 0x0898, 0x20a2, 0x1078, 0x4fc0,
-	0x22a2, 0x20a3, 0x0000, 0x61c2, 0x037f, 0x017f, 0x1078, 0x4fd1,
-	0x007c, 0x20a3, 0x0008, 0x0078, 0x4de2, 0x20a3, 0x0302, 0x22a2,
-	0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008, 0x22a2,
-	0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500, 0x22a2,
-	0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2, 0x22a2,
-	0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x1078, 0x4fd1, 0x007c,
-	0x20a3, 0x0028, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
-	0x60c3, 0x0018, 0x1078, 0x4fd1, 0x007c, 0x20a3, 0x0100, 0x22a2,
-	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x22a2,
-	0x22a2, 0x22a2, 0x60c3, 0x0020, 0x1078, 0x4fd1, 0x007c, 0x20a3,
-	0x0008, 0x0078, 0x4de2, 0x037e, 0x7b10, 0xa384, 0xff00, 0x7812,
-	0xa384, 0x00ff, 0x8001, 0x00c0, 0x4e11, 0x22a2, 0x037f, 0x0078,
-	0x4de2, 0x20a3, 0x0800, 0x22a2, 0x20a2, 0x037f, 0x0078, 0x4de4,
+	0x0014, 0x1078, 0x556e, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078,
+	0x5053, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3,
+	0x0100, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
+	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
+	0x0000, 0x60c3, 0x0014, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b,
+	0x1078, 0x5053, 0x20a3, 0x0200, 0x0078, 0x4deb, 0x20a1, 0x020b,
+	0x1078, 0x5053, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003,
+	0x20a3, 0x2a00, 0x60c3, 0x0008, 0x1078, 0x556e, 0x007c, 0x20e1,
+	0x9080, 0x20e1, 0x4000, 0x20a1, 0x020b, 0x1078, 0x5053, 0x20a3,
+	0x0100, 0x20a3, 0x0000, 0x20a3, 0x000b, 0x20a3, 0x0000, 0x60c3,
+	0x0008, 0x1078, 0x556e, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1,
+	0x4000, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x00c0,
+	0x4fef, 0x20a3, 0x22ff, 0x20a3, 0xfffe, 0x0078, 0x501d, 0xa286,
+	0x007f, 0x00c0, 0x4ffa, 0x0d7e, 0x20a3, 0x22ff, 0x20a3, 0xfffd,
+	0x0078, 0x5011, 0xd2bc, 0x0040, 0x5019, 0xa286, 0x0080, 0x0d7e,
+	0x00c0, 0x5008, 0x20a3, 0x22ff, 0x20a3, 0xfffc, 0x0078, 0x5011,
+	0xa2e8, 0x7720, 0x2d6c, 0x6810, 0xa085, 0x2200, 0x20a2, 0x6814,
+	0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
+	0x5021, 0x20a3, 0x2200, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230,
+	0x22a2, 0x20a3, 0x0129, 0x20a3, 0x0000, 0x1078, 0x555d, 0x22a2,
+	0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3,
+	0x0000, 0x027f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
+	0x20a3, 0x02ff, 0x2011, 0xfffc, 0x22a2, 0x0d7e, 0x2069, 0x7619,
+	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x20a3, 0x2029, 0x20a3, 0x0000,
+	0x0078, 0x5025, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02,
+	0x20a3, 0x0000, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
+	0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x5072,
+	0x0d7e, 0xa0e8, 0x7720, 0x2d6c, 0x6810, 0xa085, 0x2300, 0x20a2,
+	0x6814, 0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
+	0x0078, 0x507a, 0x20a3, 0x2300, 0x6298, 0x22a2, 0x20a3, 0x0000,
+	0x6230, 0x22a2, 0x20a3, 0x0198, 0x20a3, 0x0000, 0x1078, 0x555d,
+	0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000,
+	0x20a3, 0x0000, 0x027f, 0x007c, 0x0c7e, 0x0f7e, 0x6004, 0xa08a,
+	0x0085, 0x1048, 0x12d5, 0xa08a, 0x008c, 0x10c8, 0x12d5, 0x6118,
+	0x2178, 0x79a0, 0xd1bc, 0x0040, 0x50aa, 0x7900, 0xd1f4, 0x0040,
+	0x50a6, 0x7914, 0xa18c, 0x00ff, 0x0078, 0x50af, 0x2009, 0x0000,
+	0x0078, 0x50af, 0xa1f8, 0x232f, 0x2f0c, 0xa18c, 0x00ff, 0x2c78,
+	0x2061, 0x0100, 0x619a, 0xa082, 0x0085, 0x1079, 0x50ba, 0x0f7f,
+	0x0c7f, 0x007c, 0x50c3, 0x50ce, 0x50e8, 0x50c1, 0x50c1, 0x50c1,
+	0x50c3, 0x1078, 0x12d5, 0x147e, 0x20a1, 0x020b, 0x1078, 0x50fb,
+	0x60c3, 0x0000, 0x1078, 0x556e, 0x147f, 0x007c, 0x147e, 0x20a1,
+	0x020b, 0x1078, 0x5128, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808,
+	0x20a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000,
+	0x20a3, 0x0000, 0x60c3, 0x000c, 0x1078, 0x556e, 0x147f, 0x007c,
+	0x147e, 0x20a1, 0x020b, 0x1078, 0x5155, 0x20a3, 0x0003, 0x20a3,
+	0x0300, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x1078,
+	0x556e, 0x147f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
+	0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x511a,
+	0x0d7e, 0xa0e8, 0x7720, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2,
+	0x6814, 0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
+	0x0078, 0x5122, 0x20a3, 0x8100, 0x6298, 0x22a2, 0x20a3, 0x0000,
+	0x6230, 0x22a2, 0x20a3, 0x0009, 0x20a3, 0x0000, 0x0078, 0x5025,
 	0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
-	0x2004, 0xd0bc, 0x0040, 0x4e36, 0x0d7e, 0xa0e8, 0x6e00, 0x2d6c,
-	0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x6d19,
-	0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x4e3e, 0x20a3, 0x0700,
-	0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0898,
-	0x20a3, 0x0000, 0x1078, 0x4fc0, 0x22a2, 0x20a3, 0x0000, 0x7a08,
-	0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c,
-	0x0d7e, 0x157e, 0x137e, 0x147e, 0x017e, 0x037e, 0x7810, 0xa084,
-	0x0700, 0x8007, 0x1079, 0x4e63, 0x037f, 0x017f, 0x147f, 0x137f,
-	0x157f, 0x0d7f, 0x007c, 0x4e6b, 0x4e6b, 0x4e6d, 0x4e6b, 0x4e6b,
-	0x4e6b, 0x4e92, 0x4e6b, 0x1078, 0x12b7, 0x7910, 0xa18c, 0xf8ff,
-	0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078,
-	0x4e9c, 0x0d7e, 0x2069, 0x6d51, 0x6804, 0xd0bc, 0x0040, 0x4e87,
-	0x682c, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078, 0x4e89, 0x20a3,
-	0x3f00, 0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x1078,
-	0x4fd1, 0x007c, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x4e9c,
-	0x20a3, 0x7f00, 0x0078, 0x4e8a, 0x027e, 0x20e1, 0x9080, 0x20e1,
-	0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x4eba,
-	0x0d7e, 0xa0e8, 0x6e00, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2,
-	0x6814, 0x20a2, 0x2069, 0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
-	0x0078, 0x4ec2, 0x20a3, 0x0100, 0x6298, 0x22a2, 0x20a3, 0x0000,
-	0x6230, 0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x1078,
-	0x4fc0, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3,
-	0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e,
-	0x057e, 0x047e, 0x037e, 0x2061, 0x0100, 0x2071, 0x6d00, 0x6130,
-	0x7818, 0x2068, 0x68a0, 0x2028, 0xd0bc, 0x00c0, 0x4eee, 0xa080,
-	0x2091, 0x2014, 0xa294, 0x00ff, 0x0078, 0x4ef2, 0x6910, 0x6a14,
-	0x7364, 0x7468, 0x781c, 0xa086, 0x0006, 0x0040, 0x4f3d, 0xd5bc,
-	0x0040, 0x4f02, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e,
-	0x0078, 0x4f08, 0x6063, 0x0100, 0x6266, 0x606b, 0x0000, 0x616e,
-	0x6073, 0x0809, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff,
-	0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808,
-	0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c,
-	0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af,
-	0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048, 0x4f31, 0x2011,
-	0x0000, 0x629e, 0x6017, 0x0016, 0x1078, 0x4151, 0x037f, 0x047f,
-	0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x7810, 0x2070, 0x704c,
-	0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x4f83, 0xd5bc, 0x0040,
-	0x4f51, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078,
-	0x4f57, 0x6063, 0x0100, 0x6266, 0x606b, 0x0000, 0x616e, 0x6073,
-	0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e,
-	0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082,
-	0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6, 0x707c, 0x60ca,
-	0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000,
-	0xa582, 0x0080, 0x0048, 0x4f7e, 0x2011, 0x0000, 0x629e, 0x6017,
-	0x0012, 0x0078, 0x4f34, 0xd5bc, 0x0040, 0x4f8e, 0xa185, 0x0700,
-	0x20a2, 0x6266, 0x636a, 0x646e, 0x0078, 0x4f94, 0x6063, 0x0700,
-	0x6266, 0x606b, 0x0000, 0x616e, 0x6073, 0x0898, 0x6077, 0x0000,
-	0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f,
-	0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0x7014, 0x608a, 0x7010,
+	0x2004, 0xa092, 0x007e, 0x0048, 0x5147, 0x0d7e, 0xa0e8, 0x7720,
+	0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069,
+	0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x514f, 0x20a3,
+	0x8400, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3,
+	0x00d1, 0x20a3, 0x0000, 0x0078, 0x507e, 0x027e, 0x20e1, 0x9080,
+	0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e,
+	0x0048, 0x5174, 0x0d7e, 0xa0e8, 0x7720, 0x2d6c, 0x6810, 0xa085,
+	0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68,
+	0x2da6, 0x0d7f, 0x0078, 0x517c, 0x20a3, 0x8500, 0x6298, 0x22a2,
+	0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x00d1, 0x20a3, 0x0000,
+	0x0078, 0x507e, 0x0c7e, 0x0f7e, 0x2c78, 0x7804, 0xa08a, 0x0040,
+	0x1048, 0x12d5, 0xa08a, 0x0050, 0x10c8, 0x12d5, 0x7918, 0x2160,
+	0x61a0, 0xd1bc, 0x0040, 0x51a1, 0x6100, 0xd1f4, 0x0040, 0x519d,
+	0x6114, 0xa18c, 0x00ff, 0x0078, 0x51a6, 0x2009, 0x0000, 0x0078,
+	0x51a6, 0xa1e0, 0x232f, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100,
+	0x619a, 0xa082, 0x0040, 0x1079, 0x51b0, 0x0f7f, 0x0c7f, 0x007c,
+	0x51c2, 0x52aa, 0x5252, 0x53d2, 0x51c0, 0x51c0, 0x51c0, 0x51c0,
+	0x51c0, 0x51c0, 0x51c0, 0x581b, 0x582c, 0x583d, 0x584e, 0x51c0,
+	0x1078, 0x12d5, 0x0d7e, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078,
+	0x5215, 0x7910, 0x2168, 0x6944, 0xa18c, 0x00ff, 0x21a2, 0xa016,
+	0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184, 0x0006, 0x8004, 0x20a2,
+	0xd1ac, 0x0040, 0x51df, 0x20a3, 0x0002, 0x0078, 0x51eb, 0xd1b4,
+	0x0040, 0x51e6, 0x20a3, 0x0001, 0x0078, 0x51eb, 0x20a3, 0x0000,
+	0x2230, 0x0078, 0x51ed, 0x6a80, 0x6e7c, 0x20a9, 0x0008, 0xad80,
+	0x0017, 0x200c, 0x810f, 0x21a2, 0x8000, 0x00f0, 0x51f1, 0x22a2,
+	0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, 0x6014, 0xa084, 0x0004,
+	0xa085, 0x0009, 0x6016, 0x2001, 0x7852, 0x2003, 0x07d0, 0x2001,
+	0x7851, 0x2003, 0x0009, 0x2001, 0x7857, 0x2003, 0x0002, 0x1078,
+	0x1504, 0x147f, 0x157f, 0x0d7f, 0x007c, 0x20e1, 0x9080, 0x20e1,
+	0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff,
+	0x2202, 0x8217, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040,
+	0x523b, 0x0d7e, 0xa0e8, 0x7720, 0x2d6c, 0x6810, 0xa085, 0x0600,
+	0x20a2, 0x6814, 0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6,
+	0x0d7f, 0x0078, 0x5243, 0x20a3, 0x0600, 0x6198, 0x21a2, 0x20a3,
+	0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3, 0x0000, 0x22a2,
+	0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3,
+	0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1, 0x020b,
+	0x1078, 0x5272, 0x7810, 0x2068, 0x6860, 0x20a2, 0x685c, 0x20a2,
+	0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2,
+	0x20a2, 0x60c3, 0x000c, 0x1078, 0x556e, 0x147f, 0x137f, 0x157f,
+	0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818,
+	0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x5290, 0x0d7e, 0xa0e8,
+	0x7720, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2,
+	0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5298,
+	0x20a3, 0x0500, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2,
+	0x20a3, 0x0889, 0x20a3, 0x0000, 0x1078, 0x555d, 0x22a2, 0x20a3,
+	0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000,
+	0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1, 0x020b,
+	0x1078, 0x539a, 0x7810, 0x2068, 0xa016, 0x22a2, 0x22a2, 0x22a2,
+	0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, 0x00c0, 0x52c7, 0x7810,
+	0xa084, 0x0700, 0x8007, 0x1079, 0x52cf, 0x0078, 0x52ca, 0xa006,
+	0x1079, 0x52cf, 0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c, 0x52d9,
+	0x533b, 0x533f, 0x5362, 0x536f, 0x5381, 0x5385, 0x52d7, 0x1078,
+	0x12d5, 0x017e, 0x037e, 0x694c, 0xa18c, 0x0003, 0xa186, 0x0000,
+	0x00c0, 0x52ec, 0x6b78, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2,
+	0x037f, 0x017f, 0x0078, 0x5366, 0xa186, 0x0001, 0x00c0, 0x5336,
+	0x6b78, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874,
+	0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300,
+	0x0040, 0x5335, 0xd3c4, 0x0040, 0x5307, 0x687c, 0xa108, 0xd3cc,
+	0x0040, 0x530c, 0x6874, 0xa108, 0x157e, 0x20a9, 0x000d, 0xad80,
+	0x0020, 0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0, 0x5311, 0x157f,
+	0x22a2, 0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040, 0x5335, 0x20a1,
+	0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x0700, 0x6298,
+	0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0898, 0x20a2,
+	0x1078, 0x555d, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x037f, 0x017f,
+	0x1078, 0x556e, 0x007c, 0x20a3, 0x0008, 0x0078, 0x5364, 0x20a3,
+	0x0302, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3,
+	0x0008, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3,
+	0x0500, 0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500,
+	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x1078,
+	0x556e, 0x007c, 0x20a3, 0x0028, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
+	0x22a2, 0x22a2, 0x60c3, 0x0018, 0x1078, 0x556e, 0x007c, 0x20a3,
+	0x0100, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008,
+	0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0020, 0x1078, 0x556e,
+	0x007c, 0x20a3, 0x0008, 0x0078, 0x5364, 0x037e, 0x7b10, 0xa384,
+	0xff00, 0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0, 0x5393, 0x22a2,
+	0x037f, 0x0078, 0x5364, 0x20a3, 0x0800, 0x22a2, 0x20a2, 0x037f,
+	0x0078, 0x5366, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818,
+	0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x53b8, 0x0d7e, 0xa0e8,
+	0x7720, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2,
+	0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x53c0,
+	0x20a3, 0x0700, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2,
+	0x20a3, 0x0898, 0x20a3, 0x0000, 0x1078, 0x555d, 0x22a2, 0x20a3,
+	0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000,
+	0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x017e, 0x037e,
+	0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x53e5, 0x037f, 0x017f,
+	0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c, 0x53ed, 0x53ed, 0x53ef,
+	0x53ed, 0x53ed, 0x53ed, 0x5414, 0x53ed, 0x1078, 0x12d5, 0x7910,
+	0xa18c, 0xf8ff, 0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009,
+	0x0003, 0x1078, 0x541e, 0x0d7e, 0x2069, 0x7651, 0x6804, 0xd0bc,
+	0x0040, 0x5409, 0x682c, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078,
+	0x540b, 0x20a3, 0x3f00, 0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3,
+	0x0001, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x2009, 0x0003,
+	0x1078, 0x541e, 0x20a3, 0x7f00, 0x0078, 0x540c, 0x027e, 0x20e1,
+	0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc,
+	0x0040, 0x543c, 0x0d7e, 0xa0e8, 0x7720, 0x2d6c, 0x6810, 0xa085,
+	0x0100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68,
+	0x2da6, 0x0d7f, 0x0078, 0x5444, 0x20a3, 0x0100, 0x6298, 0x22a2,
+	0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008,
+	0x21a2, 0x1078, 0x555d, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2,
+	0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0e7e,
+	0x0d7e, 0x0c7e, 0x057e, 0x047e, 0x037e, 0x2061, 0x0100, 0x2071,
+	0x7600, 0x6130, 0x7818, 0x2068, 0x68a0, 0x2028, 0xd0bc, 0x00c0,
+	0x5470, 0xa080, 0x232f, 0x2014, 0xa294, 0x00ff, 0x0078, 0x5474,
+	0x6910, 0x6a14, 0x7364, 0x7468, 0x781c, 0xa086, 0x0006, 0x0040,
+	0x54c8, 0xd5bc, 0x0040, 0x5484, 0xa185, 0x0100, 0x6062, 0x6266,
+	0x636a, 0x646e, 0x0078, 0x548a, 0x6063, 0x0100, 0x6266, 0x606b,
+	0x0000, 0x616e, 0x6073, 0x0809, 0x6077, 0x0008, 0x688c, 0x8000,
+	0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00,
+	0x6082, 0x7808, 0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010,
 	0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60ab,
 	0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048,
-	0x4fbb, 0x2011, 0x0000, 0x629e, 0x6017, 0x0016, 0x0078, 0x4f34,
-	0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202,
-	0x8217, 0x007c, 0x0d7e, 0x2069, 0x6f10, 0x6843, 0x0001, 0x0d7f,
-	0x007c, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x1078,
-	0x4fdc, 0x1078, 0x4143, 0x007c, 0x007e, 0x6014, 0xa084, 0x0004,
-	0xa085, 0x0009, 0x6016, 0x007f, 0x007c, 0x007e, 0x0c7e, 0x2061,
-	0x0100, 0x6014, 0xa084, 0x0004, 0xa085, 0x0008, 0x6016, 0x0c7f,
-	0x007f, 0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x027e, 0x1078, 0x414c,
-	0x2061, 0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040,
-	0x503a, 0x1078, 0x4fe5, 0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e,
-	0x2061, 0x6f10, 0x6128, 0xa192, 0x0002, 0x00c8, 0x5027, 0x8108,
-	0x612a, 0x613c, 0x0c7f, 0x81ff, 0x0040, 0x5035, 0x1078, 0x4143,
-	0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0, 0x5023, 0x6017,
-	0x0012, 0x0078, 0x5035, 0x1078, 0x4fdc, 0x0078, 0x5035, 0x6124,
-	0xa1e5, 0x0000, 0x0040, 0x5032, 0x1078, 0x6c76, 0x2009, 0x0014,
-	0x1078, 0x5591, 0x0c7f, 0x0078, 0x5035, 0x027f, 0x017f, 0x0d7f,
-	0x0c7f, 0x007c, 0x1078, 0x31cb, 0x0078, 0x5035, 0x0c7e, 0x0d7e,
-	0x0e7e, 0x017e, 0x027e, 0x1078, 0x415a, 0x2071, 0x6f10, 0x713c,
-	0x81ff, 0x0040, 0x5079, 0x2061, 0x0100, 0x2069, 0x0140, 0x6904,
-	0x017e, 0x017f, 0xa194, 0x4000, 0x0040, 0x507f, 0x6017, 0x0010,
-	0x7144, 0xa192, 0x0002, 0x00c8, 0x5071, 0x8108, 0x7146, 0x1078,
-	0x4151, 0x713c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0,
-	0x506d, 0x6017, 0x0012, 0x0078, 0x5079, 0x6017, 0x0016, 0x0078,
-	0x5079, 0x1078, 0x6c76, 0x2009, 0x004a, 0x1078, 0x5591, 0x0078,
-	0x5079, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, 0x1078,
-	0x4151, 0x0078, 0x5079, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e,
+	0x54bc, 0x6a00, 0xd2f4, 0x0040, 0x54ba, 0x6a14, 0xa294, 0x00ff,
+	0x0078, 0x54bc, 0x2011, 0x0000, 0x629e, 0x6017, 0x0016, 0x1078,
+	0x45f0, 0x037f, 0x047f, 0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c,
+	0x7810, 0x2070, 0x704c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0040,
+	0x5517, 0xd5bc, 0x0040, 0x54dc, 0xa185, 0x0100, 0x6062, 0x6266,
+	0x636a, 0x646e, 0x0078, 0x54e2, 0x6063, 0x0100, 0x6266, 0x606b,
+	0x0000, 0x616e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000,
+	0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00,
+	0x6086, 0x7808, 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080,
+	0x60c6, 0x707c, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af,
+	0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048, 0x5512, 0x6a00,
+	0xd2f4, 0x0040, 0x5510, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x5512,
+	0x2011, 0x0000, 0x629e, 0x6017, 0x0012, 0x0078, 0x54bf, 0xd5bc,
+	0x0040, 0x5522, 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e,
+	0x0078, 0x5528, 0x6063, 0x0700, 0x6266, 0x606b, 0x0000, 0x616e,
+	0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff,
+	0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808,
+	0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008,
+	0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7,
+	0x0000, 0xa582, 0x0080, 0x0048, 0x5558, 0x6a00, 0xd2f4, 0x0040,
+	0x5556, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x5558, 0x2011, 0x0000,
+	0x629e, 0x6017, 0x0016, 0x0078, 0x54bf, 0x7a18, 0xa280, 0x0023,
+	0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x007c, 0x0d7e,
+	0x2069, 0x7836, 0x6843, 0x0001, 0x0d7f, 0x007c, 0x20e1, 0x9080,
+	0x60a3, 0x0056, 0x60a7, 0x9575, 0x1078, 0x5579, 0x1078, 0x45e0,
+	0x007c, 0x007e, 0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016,
+	0x007f, 0x007c, 0x007e, 0x0c7e, 0x2061, 0x0100, 0x6014, 0xa084,
+	0x0004, 0xa085, 0x0008, 0x6016, 0x0c7f, 0x007f, 0x007c, 0x0c7e,
+	0x0d7e, 0x017e, 0x027e, 0x1078, 0x45eb, 0x2061, 0x0100, 0x2069,
+	0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x55cc, 0x1078, 0x5582,
+	0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e, 0x2061, 0x7836, 0x6128,
+	0xa192, 0x0002, 0x00c8, 0x55b9, 0x8108, 0x612a, 0x6124, 0x0c7f,
+	0x81ff, 0x0040, 0x55c7, 0x1078, 0x45e0, 0x1078, 0x5579, 0x0078,
+	0x55c7, 0x6124, 0xa1e5, 0x0000, 0x0040, 0x55c4, 0x1078, 0x75c7,
+	0x2009, 0x0014, 0x1078, 0x5c29, 0x0c7f, 0x0078, 0x55c7, 0x027f,
+	0x017f, 0x0d7f, 0x0c7f, 0x007c, 0x1078, 0x357b, 0x0078, 0x55c7,
+	0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078, 0x45f9, 0x2071,
+	0x7836, 0x713c, 0x81ff, 0x0040, 0x55fa, 0x2061, 0x0100, 0x2069,
+	0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x5600, 0x6803, 0x1000,
+	0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078, 0x5768, 0x037f,
+	0x713c, 0x2160, 0x1078, 0x75c7, 0x2009, 0x004a, 0x1078, 0x5c29,
+	0x0078, 0x55fa, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c,
+	0x7144, 0xa192, 0x0002, 0x00c8, 0x55ea, 0x8108, 0x7146, 0x1078,
+	0x45f0, 0x0078, 0x55fa, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e,
 	0x047e, 0x007e, 0x127e, 0x2091, 0x8000, 0x6018, 0x2068, 0x6ca0,
-	0x2071, 0x6f10, 0x7018, 0x2068, 0x8dff, 0x0040, 0x50af, 0x68a0,
-	0xa406, 0x0040, 0x509f, 0x6854, 0x2068, 0x0078, 0x5094, 0x6010,
+	0x2071, 0x7836, 0x7018, 0x2068, 0x8dff, 0x0040, 0x5637, 0x68a0,
+	0xa406, 0x0040, 0x5627, 0x6854, 0x2068, 0x0078, 0x561c, 0x6010,
 	0x2060, 0x643c, 0x6540, 0x6644, 0xa6b4, 0x000f, 0x2d60, 0x1078,
-	0x3522, 0x0040, 0x50af, 0x1078, 0x5374, 0xa085, 0x0001, 0x127f,
+	0x38f9, 0x0040, 0x5637, 0x1078, 0x5902, 0xa085, 0x0001, 0x127f,
 	0x007f, 0x047f, 0x057f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c,
-	0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4a83, 0x20a3, 0x0f00,
+	0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4fdc, 0x20a3, 0x0f00,
 	0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008,
-	0x1078, 0x4fd1, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1,
-	0x020b, 0x1078, 0x4afa, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9,
-	0x0006, 0x2011, 0x6d40, 0x2019, 0x6d40, 0x23a6, 0x22a6, 0xa398,
-	0x0002, 0xa290, 0x0002, 0x00f0, 0x50dd, 0x20a3, 0x0000, 0x20a3,
-	0x0000, 0x60c3, 0x001c, 0x1078, 0x4fd1, 0x147f, 0x157f, 0x007c,
-	0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b, 0x1078, 0x4ada,
-	0x1078, 0x4af1, 0x7810, 0x007e, 0xa080, 0x0015, 0x2098, 0x7808,
+	0x1078, 0x556e, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1,
+	0x020b, 0x1078, 0x5053, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9,
+	0x0006, 0x2011, 0x7640, 0x2019, 0x7641, 0x23a6, 0x22a6, 0xa398,
+	0x0002, 0xa290, 0x0002, 0x00f0, 0x5665, 0x20a3, 0x0000, 0x20a3,
+	0x0000, 0x60c3, 0x001c, 0x1078, 0x556e, 0x147f, 0x157f, 0x007c,
+	0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b, 0x1078, 0x5033,
+	0x1078, 0x504a, 0x7810, 0x007e, 0xa080, 0x0015, 0x2098, 0x7808,
 	0xa088, 0x0002, 0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2,
-	0x007f, 0xa080, 0x0001, 0x2004, 0x7812, 0x1078, 0x4fd1, 0x027f,
+	0x007f, 0xa080, 0x0001, 0x2004, 0x7812, 0x1078, 0x556e, 0x027f,
 	0x017f, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b,
-	0x1078, 0x4a83, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000,
-	0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x4fd1, 0x147f, 0x157f,
+	0x1078, 0x4fdc, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000,
+	0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x556e, 0x147f, 0x157f,
 	0x007c, 0x0e7e, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
-	0x6f10, 0x700c, 0x2060, 0x8cff, 0x0040, 0x513f, 0x600c, 0x007e,
-	0x1078, 0x556a, 0x1078, 0x5374, 0x0c7f, 0x0078, 0x5133, 0x700f,
-	0x0000, 0x700b, 0x0000, 0x127f, 0x007f, 0x0c7f, 0x0e7f, 0x007c,
+	0x7836, 0x700c, 0x2060, 0x8cff, 0x0040, 0x56cd, 0x1078, 0x6ace,
+	0x00c0, 0x56c4, 0x1078, 0x5e57, 0x600c, 0x007e, 0x1078, 0x5c02,
+	0x1078, 0x5902, 0x0c7f, 0x0078, 0x56bb, 0x700f, 0x0000, 0x700b,
+	0x0000, 0x127f, 0x007f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x157e,
+	0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091,
+	0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x7836, 0x7024,
+	0x2060, 0x8cff, 0x0040, 0x5726, 0x1078, 0x5582, 0x68c3, 0x0000,
+	0x1078, 0x45eb, 0x2009, 0x0013, 0x1078, 0x5c29, 0x20a9, 0x01f4,
+	0x6824, 0xd094, 0x0040, 0x5709, 0x6827, 0x0004, 0x7804, 0xa084,
+	0x4000, 0x0040, 0x571b, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078,
+	0x571b, 0xd084, 0x0040, 0x5710, 0x6827, 0x0001, 0x0078, 0x5712,
+	0x00f0, 0x56f8, 0x7804, 0xa084, 0x1000, 0x0040, 0x571b, 0x7803,
+	0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f,
+	0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c, 0x2001, 0x7600,
+	0x2004, 0xa096, 0x0001, 0x0040, 0x575e, 0xa096, 0x0004, 0x0040,
+	0x575e, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x3542, 0x1078,
+	0x456e, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x574c, 0x6827,
+	0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x575e, 0x7803, 0x1000,
+	0x7803, 0x0000, 0x0078, 0x575e, 0xd084, 0x0040, 0x5753, 0x6827,
+	0x0001, 0x0078, 0x5755, 0x00f0, 0x573b, 0x7804, 0xa084, 0x1000,
+	0x0040, 0x575e, 0x7803, 0x0100, 0x7803, 0x0000, 0x007f, 0x017f,
+	0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
 	0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e,
 	0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071,
-	0x6f10, 0x7024, 0x2060, 0x8cff, 0x0040, 0x5198, 0x1078, 0x4fe5,
-	0x68c3, 0x0000, 0x1078, 0x414c, 0x2009, 0x0013, 0x1078, 0x5591,
-	0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x517b, 0x6827, 0x0004,
-	0x7804, 0xa084, 0x4000, 0x0040, 0x518d, 0x7803, 0x1000, 0x7803,
-	0x0000, 0x0078, 0x518d, 0xd084, 0x0040, 0x5182, 0x6827, 0x0001,
-	0x0078, 0x5184, 0x00f0, 0x516a, 0x7804, 0xa084, 0x1000, 0x0040,
-	0x518d, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f,
+	0x7836, 0x703c, 0x2060, 0x8cff, 0x0040, 0x57b6, 0x6817, 0x0010,
+	0x68cb, 0x0000, 0x68c7, 0x0000, 0x1078, 0x45f9, 0x1078, 0x1c19,
+	0xa39d, 0x0000, 0x00c0, 0x5790, 0x2009, 0x0049, 0x1078, 0x5c29,
+	0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x57a3, 0x6827, 0x0004,
+	0x7804, 0xa084, 0x4000, 0x0040, 0x57b5, 0x7803, 0x1000, 0x7803,
+	0x0000, 0x0078, 0x57b5, 0xd094, 0x0040, 0x57aa, 0x6827, 0x0002,
+	0x0078, 0x57ac, 0x00f0, 0x5792, 0x7804, 0xa084, 0x1000, 0x0040,
+	0x57b5, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f,
 	0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
-	0x2001, 0x6d00, 0x2004, 0xa096, 0x0001, 0x0040, 0x51d0, 0xa096,
-	0x0004, 0x0040, 0x51d0, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011,
-	0x318e, 0x1078, 0x40d1, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040,
-	0x51be, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x51d0,
-	0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0x51d0, 0xd084, 0x0040,
-	0x51c5, 0x6827, 0x0001, 0x0078, 0x51c7, 0x00f0, 0x51ad, 0x7804,
-	0xa084, 0x1000, 0x0040, 0x51d0, 0x7803, 0x0100, 0x7803, 0x0000,
-	0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f,
-	0x127f, 0x007c, 0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e,
-	0x027e, 0x017e, 0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079,
-	0x0140, 0x2071, 0x6f10, 0x703c, 0x2060, 0x8cff, 0x0040, 0x5228,
-	0x6817, 0x0010, 0x68cb, 0x0000, 0x68c7, 0x0000, 0x1078, 0x415a,
-	0x1078, 0x1a20, 0xa39d, 0x0000, 0x00c0, 0x5202, 0x2009, 0x0049,
-	0x1078, 0x5591, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x5215,
-	0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x5227, 0x7803,
-	0x1000, 0x7803, 0x0000, 0x0078, 0x5227, 0xd094, 0x0040, 0x521c,
-	0x6827, 0x0002, 0x0078, 0x521e, 0x00f0, 0x5204, 0x7804, 0xa084,
-	0x1000, 0x0040, 0x5227, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824,
-	0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f,
-	0x127f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x6f10,
-	0x6a06, 0x127f, 0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000,
-	0x2069, 0x6f10, 0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e,
-	0x0c7e, 0x067e, 0x007e, 0x127e, 0x2071, 0x6f10, 0x7614, 0x2660,
-	0x2678, 0x2091, 0x8000, 0x8cff, 0x0040, 0x5286, 0x601c, 0xa206,
-	0x00c0, 0x5281, 0x7014, 0xac36, 0x00c0, 0x5260, 0x660c, 0x7616,
-	0x7010, 0xac36, 0x00c0, 0x526e, 0x2c00, 0xaf36, 0x0040, 0x526c,
-	0x2f00, 0x7012, 0x0078, 0x526e, 0x7013, 0x0000, 0x660c, 0x067e,
-	0x2c00, 0xaf06, 0x0040, 0x5277, 0x7e0e, 0x0078, 0x5278, 0x2678,
-	0x600f, 0x0000, 0x1078, 0x6283, 0x1078, 0x5374, 0x0c7f, 0x0078,
-	0x5253, 0x2c78, 0x600c, 0x2060, 0x0078, 0x5253, 0x127f, 0x007f,
-	0x067f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1,
-	0x020b, 0x1078, 0x4c93, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
-	0x20a2, 0x20a2, 0x20a3, 0x4000, 0x0078, 0x52cf, 0x157e, 0x147e,
-	0x20a1, 0x020b, 0x1078, 0x4c93, 0x7810, 0x20a2, 0xa006, 0x20a2,
-	0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x0078, 0x52cf, 0x157e,
-	0x147e, 0x20a1, 0x020b, 0x1078, 0x4c93, 0x7810, 0x20a2, 0xa006,
-	0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x52cf,
-	0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4c93, 0x7810, 0x20a2,
-	0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078,
-	0x537f, 0x60c3, 0x0020, 0x1078, 0x4fd1, 0x147f, 0x157f, 0x007c,
-	0x127e, 0x0c7e, 0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4,
-	0x00c0, 0x52e7, 0xd1bc, 0x00c0, 0x5331, 0x0078, 0x5371, 0x2009,
+	0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x7836, 0x6a06, 0x127f,
+	0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x7836,
+	0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
+	0x007e, 0x127e, 0x2071, 0x7836, 0x7614, 0x2660, 0x2678, 0x2091,
+	0x8000, 0x8cff, 0x0040, 0x5814, 0x601c, 0xa206, 0x00c0, 0x580f,
+	0x7014, 0xac36, 0x00c0, 0x57ee, 0x660c, 0x7616, 0x7010, 0xac36,
+	0x00c0, 0x57fc, 0x2c00, 0xaf36, 0x0040, 0x57fa, 0x2f00, 0x7012,
+	0x0078, 0x57fc, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
+	0x0040, 0x5805, 0x7e0e, 0x0078, 0x5806, 0x2678, 0x600f, 0x0000,
+	0x1078, 0x6aa1, 0x1078, 0x5902, 0x0c7f, 0x0078, 0x57e1, 0x2c78,
+	0x600c, 0x2060, 0x0078, 0x57e1, 0x127f, 0x007f, 0x067f, 0x0c7f,
+	0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078,
+	0x5215, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
+	0x20a3, 0x4000, 0x0078, 0x585d, 0x157e, 0x147e, 0x20a1, 0x020b,
+	0x1078, 0x5215, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2,
+	0x20a2, 0x20a3, 0x2000, 0x0078, 0x585d, 0x157e, 0x147e, 0x20a1,
+	0x020b, 0x1078, 0x5215, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
+	0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x585d, 0x157e, 0x147e,
+	0x20a1, 0x020b, 0x1078, 0x5215, 0x7810, 0x20a2, 0xa006, 0x20a2,
+	0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078, 0x590d, 0x60c3,
+	0x0020, 0x1078, 0x556e, 0x147f, 0x157f, 0x007c, 0x127e, 0x0c7e,
+	0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4, 0x00c0, 0x5875,
+	0xd1bc, 0x00c0, 0x58bf, 0x0078, 0x58ff, 0x2009, 0x017f, 0x200b,
+	0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9, 0x001e,
+	0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x58b6, 0x6020,
+	0xd0b4, 0x0040, 0x58b6, 0x6024, 0xd094, 0x00c0, 0x58b6, 0x2104,
+	0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x58b6, 0x00f0, 0x5882,
+	0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff,
+	0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91, 0x6043, 0x0001,
+	0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094, 0x00c0, 0x58b5,
+	0x6a04, 0xa294, 0x4000, 0x00c0, 0x58ac, 0x027f, 0x0d7f, 0x007f,
+	0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078, 0x58ff, 0x2009,
 	0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140,
 	0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040,
-	0x5328, 0x6020, 0xd0b4, 0x0040, 0x5328, 0x6024, 0xd094, 0x00c0,
-	0x5328, 0x2104, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x5328,
-	0x00f0, 0x52f4, 0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130,
-	0xa18c, 0x00ff, 0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91,
-	0x6043, 0x0001, 0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094,
-	0x00c0, 0x5327, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x531e, 0x027f,
-	0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078,
-	0x5371, 0x2009, 0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e,
-	0x2069, 0x0140, 0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084,
-	0x4000, 0x0040, 0x536a, 0x6020, 0xd0bc, 0x0040, 0x536a, 0x2104,
-	0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x536a, 0x00f0, 0x533e,
-	0x027e, 0x6164, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff,
-	0xa10d, 0x6088, 0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001,
-	0x6043, 0x0000, 0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0,
-	0x5364, 0x027f, 0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b,
-	0x0000, 0x0c7f, 0x127f, 0x007c, 0x0e7e, 0x2071, 0x6f10, 0x7020,
-	0xa005, 0x0040, 0x537d, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9,
-	0x0008, 0x20a2, 0x00f0, 0x5381, 0x20a2, 0x20a2, 0x007c, 0x0f7e,
-	0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091,
-	0x8000, 0x2071, 0x6f10, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001,
-	0x87ff, 0x0040, 0x5417, 0x8cff, 0x0040, 0x5417, 0x601c, 0xa086,
-	0x0006, 0x00c0, 0x5412, 0x88ff, 0x0040, 0x53ae, 0x2800, 0xac06,
-	0x00c0, 0x5412, 0x2039, 0x0000, 0x0078, 0x53b2, 0x6018, 0xa206,
-	0x00c0, 0x5412, 0x7024, 0xac06, 0x00c0, 0x53e0, 0x2069, 0x0100,
-	0x68c0, 0xa005, 0x0040, 0x53db, 0x6817, 0x0008, 0x68c3, 0x0000,
-	0x1078, 0x54a4, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
-	0xa384, 0x1000, 0x0040, 0x53d0, 0x6803, 0x0100, 0x6803, 0x0000,
-	0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x53d8, 0x6827, 0x0001,
-	0x037f, 0x0078, 0x53e0, 0x6003, 0x0009, 0x630a, 0x0078, 0x5412,
-	0x7014, 0xac36, 0x00c0, 0x53e6, 0x660c, 0x7616, 0x7010, 0xac36,
-	0x00c0, 0x53f4, 0x2c00, 0xaf36, 0x0040, 0x53f2, 0x2f00, 0x7012,
-	0x0078, 0x53f4, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
-	0x0040, 0x53fd, 0x7e0e, 0x0078, 0x53fe, 0x2678, 0x600f, 0x0000,
-	0x6010, 0x2068, 0x1078, 0x6120, 0x0040, 0x5408, 0x1078, 0x6bb3,
-	0x1078, 0x6283, 0x1078, 0x5374, 0x88ff, 0x00c0, 0x5421, 0x0c7f,
-	0x0078, 0x5398, 0x2c78, 0x600c, 0x2060, 0x0078, 0x5398, 0xa006,
-	0x127f, 0x007f, 0x067f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f,
-	0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5, 0x0001, 0x0078, 0x5418,
-	0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e,
-	0x2091, 0x8000, 0x2071, 0x6f10, 0x7638, 0x2660, 0x2678, 0x8cff,
-	0x0040, 0x5493, 0x601c, 0xa086, 0x0006, 0x00c0, 0x548e, 0x88ff,
-	0x0040, 0x5448, 0x2800, 0xac06, 0x00c0, 0x548e, 0x0078, 0x544c,
-	0x6018, 0xa206, 0x00c0, 0x548e, 0x703c, 0xac06, 0x00c0, 0x545e,
-	0x037e, 0x2019, 0x0001, 0x1078, 0x51da, 0x7033, 0x0000, 0x703f,
-	0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x037f, 0x7038, 0xac36,
-	0x00c0, 0x5464, 0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5472,
-	0x2c00, 0xaf36, 0x0040, 0x5470, 0x2f00, 0x7036, 0x0078, 0x5472,
-	0x7037, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x547b,
-	0x7e0e, 0x0078, 0x547c, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
-	0x1078, 0x6120, 0x0040, 0x5486, 0x1078, 0x6bb3, 0x1078, 0x6283,
-	0x88ff, 0x00c0, 0x549d, 0x0c7f, 0x0078, 0x5437, 0x2c78, 0x600c,
-	0x2060, 0x0078, 0x5437, 0xa006, 0x127f, 0x007f, 0x027f, 0x067f,
-	0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f,
-	0xa8c5, 0x0001, 0x0078, 0x5494, 0x0e7e, 0x2071, 0x6f10, 0x2001,
-	0x6d00, 0x2004, 0xa086, 0x0002, 0x00c0, 0x54b2, 0x7007, 0x0005,
-	0x0078, 0x54b4, 0x7007, 0x0000, 0x0e7f, 0x007c, 0x0f7e, 0x0e7e,
-	0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
-	0x6f10, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x54f4,
-	0x2200, 0xac06, 0x00c0, 0x54ef, 0x7038, 0xac36, 0x00c0, 0x54d2,
-	0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x54e0, 0x2c00, 0xaf36,
-	0x0040, 0x54de, 0x2f00, 0x7036, 0x0078, 0x54e0, 0x7037, 0x0000,
-	0x660c, 0x2c00, 0xaf06, 0x0040, 0x54e8, 0x7e0e, 0x0078, 0x54e9,
-	0x2678, 0x600f, 0x0000, 0xa085, 0x0001, 0x0078, 0x54f4, 0x2c78,
-	0x600c, 0x2060, 0x0078, 0x54c5, 0x127f, 0x007f, 0x027f, 0x067f,
-	0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0x2061, 0x7400, 0x2a70, 0x7060,
-	0x7046, 0x704b, 0x7400, 0x007c, 0x0e7e, 0x127e, 0x2071, 0x6d00,
-	0x2091, 0x8000, 0x7544, 0xa582, 0x0001, 0x0048, 0x5536, 0x7048,
-	0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5522, 0xace0, 0x0008,
-	0x7054, 0xac02, 0x00c8, 0x551e, 0x0078, 0x5511, 0x2061, 0x7400,
-	0x0078, 0x5511, 0x6003, 0x0008, 0x8529, 0x7546, 0xaca8, 0x0008,
-	0x7054, 0xa502, 0x00c8, 0x5532, 0x754a, 0xa085, 0x0001, 0x127f,
-	0x0e7f, 0x007c, 0x704b, 0x7400, 0x0078, 0x552d, 0xa006, 0x0078,
-	0x552f, 0x0e7e, 0x2071, 0x6d00, 0x7544, 0xa582, 0x0001, 0x0048,
-	0x5567, 0x7048, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5554,
-	0xace0, 0x0008, 0x7054, 0xac02, 0x00c8, 0x5550, 0x0078, 0x5543,
-	0x2061, 0x7400, 0x0078, 0x5543, 0x6003, 0x0008, 0x8529, 0x7546,
-	0xaca8, 0x0008, 0x7054, 0xa502, 0x00c8, 0x5563, 0x754a, 0xa085,
-	0x0001, 0x0e7f, 0x007c, 0x704b, 0x7400, 0x0078, 0x555f, 0xa006,
-	0x0078, 0x5561, 0xac82, 0x7400, 0x1048, 0x12b7, 0x2001, 0x6d15,
-	0x2004, 0xac02, 0x10c8, 0x12b7, 0xa006, 0x6006, 0x600a, 0x600e,
+	0x58f8, 0x6020, 0xd0bc, 0x0040, 0x58f8, 0x2104, 0xa084, 0x000f,
+	0xa086, 0x0004, 0x00c0, 0x58f8, 0x00f0, 0x58cc, 0x027e, 0x6164,
+	0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d, 0x6088,
+	0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001, 0x6043, 0x0000,
+	0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x58f2, 0x027f,
+	0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0c7f,
+	0x127f, 0x007c, 0x0e7e, 0x2071, 0x7836, 0x7020, 0xa005, 0x0040,
+	0x590b, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9, 0x0008, 0x20a2,
+	0x00f0, 0x590f, 0x20a2, 0x20a2, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e,
+	0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
+	0x7836, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, 0x0040,
+	0x59a5, 0x8cff, 0x0040, 0x59a5, 0x601c, 0xa086, 0x0006, 0x00c0,
+	0x59a0, 0x88ff, 0x0040, 0x593c, 0x2800, 0xac06, 0x00c0, 0x59a0,
+	0x2039, 0x0000, 0x0078, 0x5940, 0x6018, 0xa206, 0x00c0, 0x59a0,
+	0x7024, 0xac06, 0x00c0, 0x596e, 0x2069, 0x0100, 0x68c0, 0xa005,
+	0x0040, 0x5969, 0x6817, 0x0008, 0x68c3, 0x0000, 0x1078, 0x5a32,
+	0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
+	0x0040, 0x595e, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
+	0x6824, 0xd084, 0x0040, 0x5966, 0x6827, 0x0001, 0x037f, 0x0078,
+	0x596e, 0x6003, 0x0009, 0x630a, 0x0078, 0x59a0, 0x7014, 0xac36,
+	0x00c0, 0x5974, 0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x5982,
+	0x2c00, 0xaf36, 0x0040, 0x5980, 0x2f00, 0x7012, 0x0078, 0x5982,
+	0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x598b,
+	0x7e0e, 0x0078, 0x598c, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
+	0x1078, 0x693e, 0x0040, 0x5996, 0x1078, 0x74fd, 0x1078, 0x6aa1,
+	0x1078, 0x5902, 0x88ff, 0x00c0, 0x59af, 0x0c7f, 0x0078, 0x5926,
+	0x2c78, 0x600c, 0x2060, 0x0078, 0x5926, 0xa006, 0x127f, 0x007f,
+	0x067f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017,
+	0x0000, 0x0c7f, 0xa8c5, 0x0001, 0x0078, 0x59a6, 0x0f7e, 0x0e7e,
+	0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000,
+	0x2071, 0x7836, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x5a21,
+	0x601c, 0xa086, 0x0006, 0x00c0, 0x5a1c, 0x88ff, 0x0040, 0x59d6,
+	0x2800, 0xac06, 0x00c0, 0x5a1c, 0x0078, 0x59da, 0x6018, 0xa206,
+	0x00c0, 0x5a1c, 0x703c, 0xac06, 0x00c0, 0x59ec, 0x037e, 0x2019,
+	0x0001, 0x1078, 0x5768, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043,
+	0x0000, 0x7047, 0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x59f2,
+	0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5a00, 0x2c00, 0xaf36,
+	0x0040, 0x59fe, 0x2f00, 0x7036, 0x0078, 0x5a00, 0x7037, 0x0000,
+	0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5a09, 0x7e0e, 0x0078,
+	0x5a0a, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x693e,
+	0x0040, 0x5a14, 0x1078, 0x74fd, 0x1078, 0x6aa1, 0x88ff, 0x00c0,
+	0x5a2b, 0x0c7f, 0x0078, 0x59c5, 0x2c78, 0x600c, 0x2060, 0x0078,
+	0x59c5, 0xa006, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f,
+	0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5, 0x0001,
+	0x0078, 0x5a22, 0x0e7e, 0x2071, 0x7836, 0x2001, 0x7600, 0x2004,
+	0xa086, 0x0002, 0x00c0, 0x5a40, 0x7007, 0x0005, 0x0078, 0x5a42,
+	0x7007, 0x0000, 0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
+	0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x7836, 0x2c10,
+	0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x5a82, 0x2200, 0xac06,
+	0x00c0, 0x5a7d, 0x7038, 0xac36, 0x00c0, 0x5a60, 0x660c, 0x763a,
+	0x7034, 0xac36, 0x00c0, 0x5a6e, 0x2c00, 0xaf36, 0x0040, 0x5a6c,
+	0x2f00, 0x7036, 0x0078, 0x5a6e, 0x7037, 0x0000, 0x660c, 0x2c00,
+	0xaf06, 0x0040, 0x5a76, 0x7e0e, 0x0078, 0x5a77, 0x2678, 0x600f,
+	0x0000, 0xa085, 0x0001, 0x0078, 0x5a82, 0x2c78, 0x600c, 0x2060,
+	0x0078, 0x5a53, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f,
+	0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e,
+	0x127e, 0x2091, 0x8000, 0x2071, 0x7836, 0x760c, 0x2660, 0x2678,
+	0x8cff, 0x0040, 0x5b1b, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
+	0x00c0, 0x5b16, 0x7024, 0xac06, 0x00c0, 0x5ac9, 0x2069, 0x0100,
+	0x68c0, 0xa005, 0x0040, 0x5ac9, 0x1078, 0x5582, 0x68c3, 0x0000,
+	0x1078, 0x5a32, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
+	0xa384, 0x1000, 0x0040, 0x5ac0, 0x6803, 0x0100, 0x6803, 0x0000,
+	0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x5ac8, 0x6827, 0x0001,
+	0x037f, 0x700c, 0xac36, 0x00c0, 0x5acf, 0x660c, 0x760e, 0x7008,
+	0xac36, 0x00c0, 0x5add, 0x2c00, 0xaf36, 0x0040, 0x5adb, 0x2f00,
+	0x700a, 0x0078, 0x5add, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00,
+	0xaf06, 0x0040, 0x5ae6, 0x7e0e, 0x0078, 0x5ae7, 0x2678, 0x600f,
+	0x0000, 0x1078, 0x6aba, 0x00c0, 0x5af1, 0x1078, 0x22dd, 0x0078,
+	0x5b0d, 0x1078, 0x6ace, 0x00c0, 0x5af9, 0x1078, 0x5e57, 0x0078,
+	0x5b0d, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040, 0x5b0d, 0x601c,
+	0xa086, 0x0003, 0x00c0, 0x5b23, 0x6837, 0x0103, 0x6b4a, 0x6847,
+	0x0000, 0x1078, 0x3a7a, 0x1078, 0x6a94, 0x6003, 0x0000, 0x1078,
+	0x6aa1, 0x1078, 0x5902, 0x0c7f, 0x0078, 0x5a98, 0x2c78, 0x600c,
+	0x2060, 0x0078, 0x5a98, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f,
+	0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x5b04,
+	0x1078, 0x74fd, 0x0078, 0x5b0d, 0x037e, 0x157e, 0x137e, 0x147e,
+	0x3908, 0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x214f, 0x00c0,
+	0x5b3d, 0x8210, 0x8000, 0x0078, 0x5b34, 0xa005, 0x0040, 0x5b47,
+	0x20a9, 0x0020, 0x2198, 0xa110, 0x22a0, 0x22c8, 0x53a3, 0x147f,
+	0x137f, 0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078,
+	0x5053, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3,
+	0x0000, 0x20a3, 0x0000, 0x20a3, 0x514c, 0x20a3, 0x4f47, 0x20a3,
+	0x4943, 0x20a3, 0x2020, 0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3,
+	0x0000, 0x20a3, 0x0000, 0x1078, 0x556e, 0x0d7f, 0x007c, 0x20a1,
+	0x020b, 0x1078, 0x5053, 0x20a3, 0x0210, 0x20a3, 0x0018, 0x20a3,
+	0x0800, 0x7810, 0xa084, 0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3,
+	0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7810,
+	0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
+	0x0018, 0x1078, 0x556e, 0x007c, 0x2061, 0x7d00, 0x2a70, 0x7060,
+	0x7046, 0x704b, 0x7d00, 0x007c, 0x0e7e, 0x127e, 0x2071, 0x7600,
+	0x2091, 0x8000, 0x7544, 0xa582, 0x0001, 0x0048, 0x5bce, 0x7048,
+	0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5bba, 0xace0, 0x0008,
+	0x7054, 0xac02, 0x00c8, 0x5bb6, 0x0078, 0x5ba9, 0x2061, 0x7d00,
+	0x0078, 0x5ba9, 0x6003, 0x0008, 0x8529, 0x7546, 0xaca8, 0x0008,
+	0x7054, 0xa502, 0x00c8, 0x5bca, 0x754a, 0xa085, 0x0001, 0x127f,
+	0x0e7f, 0x007c, 0x704b, 0x7d00, 0x0078, 0x5bc5, 0xa006, 0x0078,
+	0x5bc7, 0x0e7e, 0x2071, 0x7600, 0x7544, 0xa582, 0x0001, 0x0048,
+	0x5bff, 0x7048, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5bec,
+	0xace0, 0x0008, 0x7054, 0xac02, 0x00c8, 0x5be8, 0x0078, 0x5bdb,
+	0x2061, 0x7d00, 0x0078, 0x5bdb, 0x6003, 0x0008, 0x8529, 0x7546,
+	0xaca8, 0x0008, 0x7054, 0xa502, 0x00c8, 0x5bfb, 0x754a, 0xa085,
+	0x0001, 0x0e7f, 0x007c, 0x704b, 0x7d00, 0x0078, 0x5bf7, 0xa006,
+	0x0078, 0x5bf9, 0xac82, 0x7d00, 0x1048, 0x12d5, 0x2001, 0x7615,
+	0x2004, 0xac02, 0x10c8, 0x12d5, 0xa006, 0x6006, 0x600a, 0x600e,
 	0x6012, 0x6016, 0x601a, 0x601f, 0x0000, 0x6003, 0x0000, 0x2061,
-	0x6d00, 0x6044, 0x8000, 0x6046, 0xa086, 0x0001, 0x0040, 0x5589,
-	0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x476a, 0x127f, 0x0078,
-	0x5588, 0x601c, 0xa084, 0x000f, 0x0079, 0x5596, 0x559f, 0x55a7,
-	0x55c3, 0x55df, 0x629a, 0x62b6, 0x62d2, 0x559f, 0x55a7, 0xa18e,
-	0x0047, 0x00c0, 0x55a6, 0xa016, 0x1078, 0x1532, 0x007c, 0x067e,
-	0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12b7, 0x1079, 0x55b1, 0x067f,
-	0x007c, 0x55c1, 0x5698, 0x5792, 0x55c1, 0x57d7, 0x55c1, 0x55c1,
-	0x55c1, 0x5653, 0x5a4d, 0x55c1, 0x55c1, 0x55c1, 0x55c1, 0x55c1,
-	0x55c1, 0x1078, 0x12b7, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
-	0x12b7, 0x1079, 0x55cd, 0x067f, 0x007c, 0x55dd, 0x55dd, 0x55dd,
-	0x55dd, 0x55dd, 0x55dd, 0x55dd, 0x55dd, 0x5e10, 0x5edd, 0x55dd,
-	0x5e29, 0x5e8f, 0x5e29, 0x5e8f, 0x55dd, 0x1078, 0x12b7, 0x067e,
-	0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12b7, 0x1079, 0x55e9, 0x067f,
-	0x007c, 0x55f9, 0x5a96, 0x5b05, 0x5bbb, 0x5cd2, 0x55f9, 0x55f9,
-	0x55f9, 0x5a75, 0x5dc6, 0x5dca, 0x55f9, 0x55f9, 0x55f9, 0x55f9,
-	0x5df0, 0x1078, 0x12b7, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0,
+	0x7600, 0x6044, 0x8000, 0x6046, 0xa086, 0x0001, 0x0040, 0x5c21,
+	0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x4c7a, 0x127f, 0x0078,
+	0x5c20, 0x601c, 0xa084, 0x000f, 0x0079, 0x5c2e, 0x5c37, 0x5c3f,
+	0x5c5b, 0x5c77, 0x6b4b, 0x6b67, 0x6b83, 0x5c37, 0x5c3f, 0xa18e,
+	0x0047, 0x00c0, 0x5c3e, 0xa016, 0x1078, 0x1572, 0x007c, 0x067e,
+	0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12d5, 0x1079, 0x5c49, 0x067f,
+	0x007c, 0x5c59, 0x5d40, 0x5e72, 0x5c59, 0x5ec9, 0x5c59, 0x5c59,
+	0x5c59, 0x5cef, 0x6182, 0x5c59, 0x5c59, 0x5c59, 0x5c59, 0x5c59,
+	0x5c59, 0x1078, 0x12d5, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
+	0x12d5, 0x1079, 0x5c65, 0x067f, 0x007c, 0x5c75, 0x5c75, 0x5c75,
+	0x5c75, 0x5c75, 0x5c75, 0x5c75, 0x5c75, 0x65f2, 0x66b8, 0x5c75,
+	0x660b, 0x6664, 0x660b, 0x6664, 0x5c75, 0x1078, 0x12d5, 0x067e,
+	0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12d5, 0x1079, 0x5c81, 0x067f,
+	0x007c, 0x5c91, 0x61c0, 0x6266, 0x6328, 0x647c, 0x5c91, 0x5c91,
+	0x5c91, 0x619e, 0x65a7, 0x65ab, 0x5c91, 0x5c91, 0x5c91, 0x5c91,
+	0x65d1, 0x1078, 0x12d5, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0,
 	0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, 0x9398, 0x94a0, 0x3318,
 	0x3428, 0x222e, 0x2326, 0xa290, 0x0002, 0xa5a8, 0x0002, 0xa398,
-	0x0002, 0xa4a0, 0x0002, 0x00f0, 0x5609, 0x0e7e, 0x6010, 0x2070,
-	0x7007, 0x0000, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x556a, 0x007c,
-	0x0d7e, 0x037e, 0x7330, 0xa386, 0x0200, 0x00c0, 0x562d, 0x6018,
-	0x2068, 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0040,
-	0x5637, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x1078,
-	0x556a, 0x037f, 0x0d7f, 0x007c, 0x0d7e, 0x20a9, 0x000e, 0x2e98,
-	0x6010, 0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x00c0, 0x5650, 0x6018,
-	0x2068, 0x7038, 0x680a, 0x703c, 0x680e, 0x6800, 0xc08d, 0x6802,
-	0x0d7f, 0x0078, 0x5615, 0x2100, 0xa1b2, 0x0024, 0x10c8, 0x12b7,
-	0x0079, 0x565a, 0x5680, 0x568c, 0x5680, 0x5680, 0x5680, 0x5680,
-	0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e,
-	0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e,
-	0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e,
-	0x567e, 0x5680, 0x567e, 0x5680, 0x5680, 0x567e, 0x1078, 0x12b7,
-	0x6003, 0x0001, 0x6106, 0x1078, 0x4376, 0x127e, 0x2091, 0x8000,
-	0x1078, 0x476a, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078,
-	0x4376, 0x127e, 0x2091, 0x8000, 0x1078, 0x476a, 0x127f, 0x007c,
-	0x6004, 0xa0b2, 0x0024, 0x10c8, 0x12b7, 0xa1b6, 0x0013, 0x00c0,
-	0x56a4, 0x2008, 0x0079, 0x5706, 0xa1b6, 0x0014, 0x00c0, 0x56fd,
-	0x1078, 0x4671, 0x6004, 0xa08e, 0x0000, 0x0040, 0x56fe, 0xa08e,
-	0x0002, 0x0040, 0x56c9, 0xa08e, 0x0003, 0x0040, 0x56c9, 0xa08e,
-	0x0004, 0x0040, 0x56c9, 0xa08e, 0x001f, 0x0040, 0x56fe, 0xa08e,
-	0x0021, 0x0040, 0x5702, 0xa08e, 0x0022, 0x0040, 0x56fe, 0x0078,
-	0x56f9, 0x1078, 0x206f, 0x2001, 0x0007, 0x1078, 0x33f3, 0x6018,
-	0xa080, 0x0028, 0x200c, 0x1078, 0x5778, 0xa186, 0x007e, 0x00c0,
-	0x56df, 0x2001, 0x6d2f, 0x2014, 0xa295, 0x0001, 0x2202, 0x017e,
-	0x027e, 0x037e, 0x2110, 0x2019, 0x0028, 0x1078, 0x445c, 0x1078,
-	0x43a9, 0x0c7e, 0x6018, 0xa065, 0x0040, 0x56f0, 0x1078, 0x35cf,
-	0x0c7f, 0x2c08, 0x1078, 0x6a57, 0x037f, 0x027f, 0x017f, 0x1078,
-	0x342f, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c, 0x1078, 0x5778,
-	0x0078, 0x56f9, 0x1078, 0x5786, 0x0078, 0x56f9, 0x572c, 0x572e,
-	0x5732, 0x5736, 0x573a, 0x573e, 0x572a, 0x572a, 0x572a, 0x572a,
-	0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a,
-	0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a,
-	0x572a, 0x572a, 0x572a, 0x572a, 0x5742, 0x5748, 0x572a, 0x5752,
-	0x5748, 0x572a, 0x1078, 0x12b7, 0x0078, 0x5748, 0x2001, 0x000b,
-	0x0078, 0x575b, 0x2001, 0x0003, 0x0078, 0x575b, 0x2001, 0x0005,
-	0x0078, 0x575b, 0x2001, 0x0001, 0x0078, 0x575b, 0x2001, 0x0009,
-	0x0078, 0x575b, 0x1078, 0x12b7, 0x0078, 0x575a, 0x1078, 0x33f3,
-	0x1078, 0x4671, 0x6003, 0x0002, 0x6017, 0x0028, 0x1078, 0x476a,
-	0x0078, 0x575a, 0x1078, 0x4671, 0x6003, 0x0004, 0x6017, 0x0028,
-	0x1078, 0x476a, 0x007c, 0x1078, 0x33f3, 0x1078, 0x4671, 0x6003,
-	0x0002, 0x037e, 0x2019, 0x6d5c, 0x2304, 0xa084, 0xff00, 0x00c0,
-	0x576d, 0x2019, 0x0028, 0x0078, 0x5772, 0x8007, 0x8003, 0x801b,
-	0x831b, 0xa318, 0x6316, 0x037f, 0x1078, 0x476a, 0x0078, 0x575a,
-	0x0e7e, 0x6010, 0xa005, 0x0040, 0x5784, 0x2070, 0x7007, 0x0000,
+	0x0002, 0xa4a0, 0x0002, 0x00f0, 0x5ca1, 0x0e7e, 0x1078, 0x693e,
+	0x0040, 0x5cb8, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103,
+	0x0e7f, 0x1078, 0x5c02, 0x007c, 0x0d7e, 0x037e, 0x7330, 0xa386,
+	0x0200, 0x00c0, 0x5cc9, 0x6018, 0x2068, 0x6813, 0x00ff, 0x6817,
+	0xfffd, 0x6010, 0xa005, 0x0040, 0x5cd3, 0x2068, 0x6807, 0x0000,
+	0x6837, 0x0103, 0x6b32, 0x1078, 0x5c02, 0x037f, 0x0d7f, 0x007c,
+	0x0d7e, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, 0xa1b6,
+	0x0015, 0x00c0, 0x5cec, 0x6018, 0x2068, 0x7038, 0x680a, 0x703c,
+	0x680e, 0x6800, 0xc08d, 0x6802, 0x0d7f, 0x0078, 0x5cad, 0x2100,
+	0xa1b2, 0x0030, 0x10c8, 0x12d5, 0x0079, 0x5cf6, 0x5d28, 0x5d34,
+	0x5d28, 0x5d28, 0x5d28, 0x5d28, 0x5d26, 0x5d26, 0x5d26, 0x5d26,
+	0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26,
+	0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26,
+	0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d28, 0x5d26, 0x5d28,
+	0x5d28, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d28, 0x5d26,
+	0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x1078, 0x12d5,
+	0x6003, 0x0001, 0x6106, 0x1078, 0x4872, 0x127e, 0x2091, 0x8000,
+	0x1078, 0x4c7a, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078,
+	0x4872, 0x127e, 0x2091, 0x8000, 0x1078, 0x4c7a, 0x127f, 0x007c,
+	0x6004, 0xa0b2, 0x0030, 0x10c8, 0x12d5, 0xa1b6, 0x0013, 0x00c0,
+	0x5d4c, 0x2008, 0x0079, 0x5dd5, 0xa1b6, 0x0027, 0x00c0, 0x5da2,
+	0x1078, 0x4b81, 0x6004, 0x1078, 0x6aba, 0x0040, 0x5d65, 0x1078,
+	0x6ace, 0x0040, 0x5d9a, 0xa08e, 0x0021, 0x0040, 0x5d9e, 0xa08e,
+	0x0022, 0x0040, 0x5d9a, 0x0078, 0x5d95, 0x1078, 0x22dd, 0x2001,
+	0x0007, 0x1078, 0x37d1, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078,
+	0x5e57, 0xa186, 0x007e, 0x00c0, 0x5d7b, 0x2001, 0x762f, 0x2014,
+	0xa295, 0x0001, 0x2202, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019,
+	0x0028, 0x1078, 0x4962, 0x1078, 0x48a5, 0x0c7e, 0x6018, 0xa065,
+	0x0040, 0x5d8c, 0x1078, 0x39a6, 0x0c7f, 0x2c08, 0x1078, 0x737b,
+	0x037f, 0x027f, 0x017f, 0x1078, 0x380d, 0x1078, 0x5c02, 0x1078,
+	0x4c7a, 0x007c, 0x1078, 0x5e57, 0x0078, 0x5d95, 0x1078, 0x5e66,
+	0x0078, 0x5d95, 0xa186, 0x0014, 0x00c0, 0x5d99, 0x1078, 0x4b81,
+	0x1078, 0x22bb, 0x1078, 0x6aba, 0x00c0, 0x5dc2, 0x1078, 0x22dd,
+	0x6018, 0xa080, 0x0028, 0x200c, 0x1078, 0x5e57, 0xa186, 0x007e,
+	0x00c0, 0x5dc0, 0x2001, 0x762f, 0x200c, 0xa18d, 0x0001, 0x2102,
+	0x0078, 0x5d95, 0x1078, 0x6ace, 0x00c0, 0x5dca, 0x1078, 0x5e57,
+	0x0078, 0x5d95, 0x6004, 0xa08e, 0x0021, 0x0040, 0x5dc6, 0xa08e,
+	0x0022, 0x1040, 0x5e66, 0x0078, 0x5d95, 0x5e07, 0x5e09, 0x5e0d,
+	0x5e11, 0x5e15, 0x5e19, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05,
+	0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05,
+	0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05,
+	0x5e05, 0x5e05, 0x5e05, 0x5e1d, 0x5e23, 0x5e05, 0x5e2d, 0x5e23,
+	0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e23, 0x5e23, 0x5e05,
+	0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x1078, 0x12d5, 0x0078,
+	0x5e23, 0x2001, 0x000b, 0x0078, 0x5e36, 0x2001, 0x0003, 0x0078,
+	0x5e36, 0x2001, 0x0005, 0x0078, 0x5e36, 0x2001, 0x0001, 0x0078,
+	0x5e36, 0x2001, 0x0009, 0x0078, 0x5e36, 0x1078, 0x12d5, 0x0078,
+	0x5e35, 0x1078, 0x37d1, 0x1078, 0x4b81, 0x6003, 0x0002, 0x6017,
+	0x0028, 0x1078, 0x4c7a, 0x0078, 0x5e35, 0x1078, 0x4b81, 0x6003,
+	0x0004, 0x6017, 0x0028, 0x1078, 0x4c7a, 0x007c, 0x1078, 0x37d1,
+	0x1078, 0x4b81, 0x6003, 0x0002, 0x037e, 0x2019, 0x765c, 0x2304,
+	0xa084, 0xff00, 0x00c0, 0x5e48, 0x2019, 0x0028, 0x0078, 0x5e51,
+	0x8007, 0xa09a, 0x0004, 0x0048, 0x5e44, 0x8003, 0x801b, 0x831b,
+	0xa318, 0x6316, 0x037f, 0x1078, 0x4c7a, 0x0078, 0x5e35, 0x0e7e,
+	0x1078, 0x693e, 0x0040, 0x5e64, 0x6010, 0x2070, 0x7007, 0x0000,
 	0x7037, 0x0103, 0x7033, 0x0100, 0x0e7f, 0x007c, 0x0e7e, 0xacf0,
 	0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x7023, 0x8001,
 	0x0e7f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0x00ff,
-	0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x12b7, 0x6604, 0xa6b6, 0x001f,
-	0x00c0, 0x57a6, 0x1078, 0x55fb, 0x0078, 0x57c6, 0x6604, 0xa6b6,
-	0x0000, 0x00c0, 0x57af, 0x1078, 0x563c, 0x0078, 0x57c6, 0x6604,
-	0xa6b6, 0x0022, 0x00c0, 0x57b8, 0x1078, 0x5620, 0x0078, 0x57c6,
-	0xa1b6, 0x0015, 0x00c0, 0x57c0, 0x1079, 0x57cb, 0x0078, 0x57c6,
-	0xa1b6, 0x0016, 0x00c0, 0x57c7, 0x1079, 0x58f6, 0x007c, 0x1078,
-	0x559f, 0x0078, 0x57c6, 0x57ef, 0x57f2, 0x57ef, 0x5833, 0x57ef,
-	0x5892, 0x57ef, 0x57ef, 0x57ef, 0x58ce, 0x57ef, 0x58e4, 0xa1b6,
-	0x0048, 0x0040, 0x57e3, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
-	0x1078, 0x1532, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000,
-	0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x556a, 0x007c, 0x0005,
-	0x0005, 0x007c, 0x0e7e, 0x2071, 0x6d00, 0x7078, 0xa086, 0x0074,
-	0x00c0, 0x581c, 0x1078, 0x6a2b, 0x00c0, 0x580e, 0x0d7e, 0x6018,
-	0x2068, 0x1078, 0x5820, 0x0d7f, 0x2001, 0x0006, 0x1078, 0x33f3,
-	0x1078, 0x206f, 0x1078, 0x556a, 0x0078, 0x581e, 0x2001, 0x000a,
-	0x1078, 0x33f3, 0x1078, 0x206f, 0x6003, 0x0001, 0x6007, 0x0001,
-	0x1078, 0x4376, 0x0078, 0x581e, 0x1078, 0x5889, 0x0e7f, 0x007c,
-	0x6800, 0xd084, 0x0040, 0x5832, 0x2001, 0x0000, 0x1078, 0x33df,
-	0x2069, 0x6d51, 0x6804, 0xd0a4, 0x0040, 0x5832, 0x2001, 0x0006,
-	0x1078, 0x3401, 0x007c, 0x0d7e, 0x2011, 0x6d1e, 0x2204, 0xa086,
-	0x0074, 0x00c0, 0x5885, 0x1078, 0x599f, 0x6018, 0x2068, 0xa080,
-	0x0028, 0x2014, 0xa286, 0x007e, 0x0040, 0x5850, 0xa286, 0x0080,
-	0x00c0, 0x5879, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x0078, 0x586f,
-	0x0e7e, 0x0f7e, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0x6d2f,
-	0x2e04, 0xa085, 0x0003, 0x2072, 0x2071, 0x7280, 0x2079, 0x0100,
-	0x2e04, 0xa084, 0x00ff, 0x2069, 0x6d19, 0x206a, 0x78e6, 0x8e70,
-	0x2e04, 0x2069, 0x6d1a, 0x206a, 0x78ea, 0x0f7f, 0x0e7f, 0x2001,
-	0x0006, 0x1078, 0x33f3, 0x1078, 0x206f, 0x1078, 0x556a, 0x0078,
-	0x5887, 0x2001, 0x0004, 0x1078, 0x33f3, 0x6003, 0x0001, 0x6007,
-	0x0003, 0x1078, 0x4376, 0x0078, 0x5887, 0x1078, 0x5889, 0x0d7f,
-	0x007c, 0x2001, 0x0007, 0x1078, 0x33f3, 0x1078, 0x206f, 0x1078,
-	0x556a, 0x007c, 0x0e7e, 0x2071, 0x6d00, 0x7078, 0xa086, 0x0014,
-	0x00c0, 0x58c8, 0x7000, 0xa086, 0x0003, 0x00c0, 0x58a5, 0x6010,
-	0xa005, 0x00c0, 0x58a5, 0x1078, 0x2ad1, 0x0d7e, 0x6018, 0x2068,
-	0x1078, 0x34ca, 0x1078, 0x5820, 0x0d7f, 0x1078, 0x59a9, 0x00c0,
-	0x58c8, 0x2001, 0x0006, 0x1078, 0x33f3, 0x0e7e, 0x6010, 0xa005,
-	0x0040, 0x58c1, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103, 0x7033,
-	0x0200, 0x0e7f, 0x1078, 0x206f, 0x1078, 0x556a, 0x0078, 0x58cc,
-	0x1078, 0x5778, 0x1078, 0x5889, 0x0e7f, 0x007c, 0x2011, 0x6d1e,
-	0x2204, 0xa086, 0x0014, 0x00c0, 0x58e1, 0x2001, 0x0002, 0x1078,
-	0x33f3, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x4376, 0x0078,
-	0x58e3, 0x1078, 0x5889, 0x007c, 0x2011, 0x6d1e, 0x2204, 0xa086,
-	0x0004, 0x00c0, 0x58f3, 0x2001, 0x0007, 0x1078, 0x33f3, 0x1078,
-	0x556a, 0x0078, 0x58f5, 0x1078, 0x5889, 0x007c, 0x57ef, 0x5902,
-	0x57ef, 0x5928, 0x57ef, 0x5952, 0x57ef, 0x57ef, 0x57ef, 0x5967,
-	0x57ef, 0x597a, 0x0c7e, 0x1078, 0x598d, 0x00c0, 0x5917, 0x2001,
-	0x0000, 0x1078, 0x33df, 0x2001, 0x0002, 0x1078, 0x33f3, 0x6003,
-	0x0001, 0x6007, 0x0002, 0x1078, 0x4376, 0x0078, 0x5926, 0x2009,
-	0x728f, 0x2104, 0xa084, 0xff00, 0xa086, 0x1900, 0x00c0, 0x5924,
-	0x1078, 0x556a, 0x0078, 0x5926, 0x1078, 0x5889, 0x0c7f, 0x007c,
-	0x1078, 0x599c, 0x00c0, 0x593c, 0x2001, 0x0000, 0x1078, 0x33df,
-	0x2001, 0x0002, 0x1078, 0x33f3, 0x6003, 0x0001, 0x6007, 0x0002,
-	0x1078, 0x4376, 0x0078, 0x5951, 0x1078, 0x5778, 0x2009, 0x728f,
-	0x2104, 0xa084, 0xff00, 0xa086, 0x1900, 0x00c0, 0x594f, 0x2001,
-	0x0004, 0x1078, 0x33f3, 0x1078, 0x556a, 0x0078, 0x5951, 0x1078,
-	0x5889, 0x007c, 0x1078, 0x599c, 0x00c0, 0x5962, 0x2001, 0x0004,
-	0x1078, 0x33f3, 0x6003, 0x0001, 0x6007, 0x0003, 0x1078, 0x4376,
-	0x0078, 0x5966, 0x1078, 0x5778, 0x1078, 0x5889, 0x007c, 0x1078,
-	0x599c, 0x00c0, 0x5977, 0x2001, 0x0008, 0x1078, 0x33f3, 0x6003,
-	0x0001, 0x6007, 0x0005, 0x1078, 0x4376, 0x0078, 0x5979, 0x1078,
-	0x5889, 0x007c, 0x1078, 0x599c, 0x00c0, 0x598a, 0x2001, 0x000a,
-	0x1078, 0x33f3, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x4376,
-	0x0078, 0x598c, 0x1078, 0x5889, 0x007c, 0x2009, 0x728e, 0x2104,
-	0xa086, 0x0003, 0x00c0, 0x599b, 0x2009, 0x728f, 0x2104, 0xa084,
-	0xff00, 0xa086, 0x2a00, 0x007c, 0xa085, 0x0001, 0x007c, 0x0c7e,
-	0x017e, 0xac88, 0x0006, 0x2164, 0x1078, 0x3459, 0x017f, 0x0c7f,
-	0x007c, 0x0e7e, 0x2071, 0x728c, 0x7004, 0xa086, 0x0014, 0x00c0,
-	0x59cc, 0x7008, 0xa086, 0x0800, 0x00c0, 0x59cc, 0x700c, 0xd0ec,
-	0x0040, 0x59ca, 0xa084, 0x0f00, 0xa086, 0x0100, 0x00c0, 0x59ca,
-	0x7024, 0xd0a4, 0x0040, 0x59ca, 0xd08c, 0x0040, 0x59ca, 0xa006,
-	0x0078, 0x59cc, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x0e7e, 0x0d7e,
-	0x0c7e, 0x077e, 0x057e, 0x047e, 0x027e, 0x007e, 0x127e, 0x2091,
-	0x8000, 0x2029, 0x6f19, 0x252c, 0x2021, 0x6f1f, 0x2424, 0x2061,
-	0x7400, 0x2071, 0x6d00, 0x7244, 0x7060, 0xa202, 0x00c8, 0x5a23,
-	0x1078, 0x6c0f, 0x0040, 0x5a1b, 0x671c, 0xa786, 0x0001, 0x0040,
-	0x5a1b, 0xa786, 0x0007, 0x0040, 0x5a1b, 0x2500, 0xac06, 0x0040,
-	0x5a1b, 0x2400, 0xac06, 0x0040, 0x5a1b, 0x0c7e, 0x6010, 0x2068,
-	0x1078, 0x6120, 0x0040, 0x5a11, 0xa786, 0x0003, 0x00c0, 0x5a2d,
-	0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x36a1, 0x1078,
-	0x6276, 0x6000, 0xa086, 0x0004, 0x00c0, 0x5a18, 0x1078, 0x15f2,
-	0x1078, 0x6283, 0x0c7f, 0xace0, 0x0008, 0x7054, 0xac02, 0x00c8,
-	0x5a23, 0x0078, 0x59e3, 0x127f, 0x007f, 0x027f, 0x047f, 0x057f,
-	0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0xa786, 0x0006, 0x00c0,
-	0x5a08, 0x1078, 0x6bb3, 0x0078, 0x5a11, 0x220c, 0x2304, 0xa106,
-	0x00c0, 0x5a40, 0x8210, 0x8318, 0x00f0, 0x5a35, 0xa006, 0x007c,
-	0x2304, 0xa102, 0x0048, 0x5a48, 0x2001, 0x0001, 0x0078, 0x5a4a,
-	0x2001, 0x0000, 0xa18d, 0x0001, 0x007c, 0x6004, 0xa08a, 0x0024,
-	0x10c8, 0x12b7, 0xa08e, 0x0000, 0x0040, 0x5a71, 0xa08e, 0x0002,
-	0x0040, 0x5a68, 0xa08e, 0x0003, 0x0040, 0x5a68, 0xa08e, 0x0004,
-	0x0040, 0x5a68, 0xa08e, 0x001f, 0x0040, 0x5a71, 0x0078, 0x5a6a,
-	0x1078, 0x206f, 0x1078, 0x4671, 0x1078, 0x556a, 0x1078, 0x476a,
-	0x007c, 0x1078, 0x5778, 0x0078, 0x5a6a, 0xa182, 0x0040, 0x0079,
-	0x5a79, 0x5a88, 0x5a88, 0x5a88, 0x5a88, 0x5a88, 0x5a88, 0x5a88,
-	0x5a88, 0x5a88, 0x5a88, 0x5a88, 0x5a8a, 0x5a8a, 0x5a8a, 0x5a8a,
-	0x1078, 0x12b7, 0x6003, 0x0001, 0x6106, 0x1078, 0x4327, 0x127e,
-	0x2091, 0x8000, 0x1078, 0x476a, 0x127f, 0x007c, 0xa186, 0x0013,
-	0x00c0, 0x5a9f, 0x6004, 0xa082, 0x0040, 0x0079, 0x5adf, 0xa186,
-	0x0014, 0x10c0, 0x12b7, 0x6004, 0xa082, 0x0040, 0x0079, 0x5aa8,
-	0x5ab9, 0x5ab7, 0x5ab7, 0x5ab7, 0x5ab7, 0x5ab7, 0x5ab7, 0x5ab7,
-	0x5ab7, 0x5ab7, 0x5ab7, 0x5ad4, 0x5ad4, 0x5ad4, 0x5ad4, 0x1078,
-	0x12b7, 0x2001, 0x0007, 0x1078, 0x33f3, 0x1078, 0x4671, 0x0d7e,
-	0x6110, 0x2168, 0x1078, 0x6120, 0x0040, 0x5ace, 0x6837, 0x0103,
-	0x684b, 0x0028, 0x1078, 0x36a1, 0x1078, 0x6276, 0x0d7f, 0x1078,
-	0x556a, 0x1078, 0x476a, 0x007c, 0x2001, 0x0007, 0x1078, 0x33f3,
-	0x1078, 0x4671, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c, 0x5af0,
-	0x5aee, 0x5aee, 0x5aee, 0x5aee, 0x5aee, 0x5aee, 0x5aee, 0x5aee,
-	0x5aee, 0x5aee, 0x5afe, 0x5afe, 0x5afe, 0x5afe, 0x1078, 0x12b7,
-	0x1078, 0x4671, 0x6003, 0x0002, 0x1078, 0x476a, 0x6010, 0xa088,
-	0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x007c, 0x1078, 0x4671,
-	0x6003, 0x000f, 0x1078, 0x476a, 0x007c, 0xa182, 0x0040, 0x0079,
-	0x5b09, 0x5b18, 0x5b18, 0x5b18, 0x5b18, 0x5b18, 0x5b1a, 0x5b98,
-	0x5bb0, 0x5b18, 0x5b18, 0x5b18, 0x5b18, 0x5b18, 0x5b18, 0x5b18,
-	0x1078, 0x12b7, 0x0e7e, 0x0d7e, 0x2071, 0x728c, 0x6110, 0x2168,
-	0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040, 0x5b87, 0xa68c, 0x00ff,
-	0xa186, 0x0002, 0x0040, 0x5b4c, 0xa186, 0x0028, 0x00c0, 0x5b36,
-	0x1078, 0x628a, 0x684b, 0x001c, 0x0078, 0x5b4e, 0xd6dc, 0x0040,
-	0x5b41, 0x684b, 0x0015, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078,
-	0x5b4e, 0xd6d4, 0x0040, 0x5b4c, 0x684b, 0x0007, 0x7318, 0x6b62,
-	0x731c, 0x6b5e, 0x0078, 0x5b4e, 0x684b, 0x0000, 0x6837, 0x0103,
-	0x6e46, 0xa01e, 0xd6c4, 0x0040, 0x5b61, 0x7328, 0x732c, 0x6b56,
-	0x037e, 0x2308, 0x2019, 0x7298, 0xad90, 0x0019, 0x1078, 0x5f4c,
-	0x037f, 0xd6cc, 0x0040, 0x5b8c, 0x7124, 0x695a, 0xa192, 0x0021,
-	0x00c8, 0x5b75, 0x2071, 0x7298, 0x831c, 0x2300, 0xae18, 0xad90,
-	0x001d, 0x1078, 0x5f4c, 0x0078, 0x5b8c, 0x6838, 0xd0fc, 0x0040,
-	0x5b7e, 0x2009, 0x0020, 0x695a, 0x0078, 0x5b6a, 0x0f7e, 0x2d78,
-	0x1078, 0x5ee4, 0x0f7f, 0x1078, 0x5f39, 0x0078, 0x5b8e, 0x684b,
-	0x0000, 0x6837, 0x0103, 0x6e46, 0x1078, 0x36a1, 0x6218, 0x2268,
-	0x6a3c, 0x8211, 0x6a3e, 0x0d7f, 0x0e7f, 0x1078, 0x556a, 0x007c,
-	0x0f7e, 0x6003, 0x0003, 0x2079, 0x728c, 0x7c04, 0x7b00, 0x7e0c,
-	0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f,
-	0x2c10, 0x1078, 0x17de, 0x1078, 0x4395, 0x1078, 0x4821, 0x007c,
-	0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
-	0x1078, 0x1532, 0x007c, 0xa182, 0x0040, 0x0079, 0x5bbf, 0x5bce,
-	0x5bce, 0x5bce, 0x5bce, 0x5bce, 0x5bd0, 0x5c5e, 0x5bce, 0x5bce,
-	0x5c74, 0x5cb4, 0x5bce, 0x5bce, 0x5bce, 0x5bce, 0x1078, 0x12b7,
-	0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0x728c, 0x6110, 0x2178,
-	0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218,
-	0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x5c59, 0xa694,
-	0xff00, 0xa284, 0x0c00, 0x0040, 0x5bf1, 0x7018, 0x7862, 0x701c,
-	0x785e, 0xa284, 0x0300, 0x0040, 0x5c59, 0x1078, 0x130f, 0x1040,
-	0x12b7, 0x2d00, 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103,
-	0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c,
-	0x00ff, 0xa186, 0x0002, 0x0040, 0x5c2b, 0xa186, 0x0028, 0x00c0,
-	0x5c15, 0x684b, 0x001c, 0x0078, 0x5c2d, 0xd6dc, 0x0040, 0x5c20,
-	0x684b, 0x0015, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x5c2d,
-	0xd6d4, 0x0040, 0x5c2b, 0x684b, 0x0007, 0x7318, 0x6b62, 0x731c,
-	0x6b5e, 0x0078, 0x5c2d, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852,
-	0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x5c42, 0x7328, 0x732c,
-	0x6b56, 0x037e, 0x2308, 0x2019, 0x7298, 0xad90, 0x0019, 0x1078,
-	0x5f4c, 0x037f, 0xd6cc, 0x0040, 0x5c59, 0x7124, 0x695a, 0xa192,
-	0x0021, 0x00c8, 0x5c56, 0x2071, 0x7298, 0x831c, 0x2300, 0xae18,
-	0xad90, 0x001d, 0x1078, 0x5f4c, 0x0078, 0x5c59, 0x2d78, 0x1078,
-	0x5ee4, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x0f7e, 0x6003,
-	0x0003, 0x2079, 0x728c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010,
-	0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078,
-	0x17de, 0x1078, 0x4fca, 0x007c, 0x0d7e, 0x6003, 0x0002, 0x1078,
-	0x4719, 0x1078, 0x4821, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040,
-	0x5cb2, 0xd1cc, 0x0040, 0x5c8d, 0x6948, 0x017e, 0x1078, 0x1338,
-	0x0d7f, 0x1078, 0x5f39, 0x0078, 0x5cb0, 0x6837, 0x0103, 0x6944,
-	0xa184, 0x00ff, 0xa186, 0x0002, 0x0040, 0x5cac, 0xa086, 0x0028,
-	0x00c0, 0x5c9e, 0x684b, 0x001c, 0x0078, 0x5cae, 0xd1dc, 0x0040,
-	0x5ca5, 0x684b, 0x0015, 0x0078, 0x5cae, 0xd1d4, 0x0040, 0x5cac,
-	0x684b, 0x0007, 0x0078, 0x5cae, 0x684b, 0x0000, 0x1078, 0x36a1,
-	0x1078, 0x556a, 0x0d7f, 0x007c, 0x2001, 0x0007, 0x1078, 0x33f3,
-	0x1078, 0x4719, 0x0f7e, 0x0d7e, 0x6110, 0x2178, 0x1078, 0x6120,
-	0x0040, 0x5ccb, 0x7837, 0x0103, 0x784b, 0x0028, 0x2f68, 0x1078,
-	0x36a1, 0x1078, 0x6276, 0x0d7f, 0x0f7f, 0x1078, 0x556a, 0x1078,
-	0x4821, 0x007c, 0xa182, 0x0040, 0x0079, 0x5cd6, 0x5ce5, 0x5ce5,
-	0x5ce5, 0x5ce5, 0x5ce5, 0x5ce7, 0x5ce5, 0x5d82, 0x5d8a, 0x5ce5,
-	0x5ce5, 0x5ce5, 0x5ce5, 0x5ce5, 0x5ce5, 0x1078, 0x12b7, 0x077e,
-	0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0x728c, 0x6110, 0x2178, 0x7614,
-	0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268,
-	0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x5d74, 0xa694, 0xff00,
-	0xa284, 0x0c00, 0x0040, 0x5d08, 0x7018, 0x7862, 0x701c, 0x785e,
-	0xa284, 0x0300, 0x0040, 0x5d71, 0x1078, 0x130f, 0x1040, 0x12b7,
-	0x2d00, 0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103,
-	0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c,
-	0x00ff, 0xa186, 0x0002, 0x0040, 0x5d43, 0xa186, 0x0028, 0x00c0,
-	0x5d2d, 0x684b, 0x001c, 0x0078, 0x5d45, 0xd6dc, 0x0040, 0x5d38,
-	0x684b, 0x0015, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x5d45,
-	0xd6d4, 0x0040, 0x5d43, 0x684b, 0x0007, 0x7318, 0x6b62, 0x731c,
-	0x6b5e, 0x0078, 0x5d45, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852,
-	0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x5d5a, 0x7328, 0x732c,
-	0x6b56, 0x037e, 0x2308, 0x2019, 0x7298, 0xad90, 0x0019, 0x1078,
-	0x5f4c, 0x037f, 0xd6cc, 0x0040, 0x5d71, 0x7124, 0x695a, 0xa192,
-	0x0021, 0x00c8, 0x5d6e, 0x2071, 0x7298, 0x831c, 0x2300, 0xae18,
-	0xad90, 0x001d, 0x1078, 0x5f4c, 0x0078, 0x5d71, 0x2d78, 0x1078,
-	0x5ee4, 0xd6dc, 0x00c0, 0x5d77, 0xa006, 0x0078, 0x5d7b, 0x2001,
-	0x0001, 0x7218, 0x731c, 0x1078, 0x156f, 0x0d7f, 0x0e7f, 0x0f7f,
-	0x077f, 0x007c, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078,
-	0x1532, 0x007c, 0x0d7e, 0x6003, 0x0002, 0x6110, 0x2168, 0x694c,
-	0xd1e4, 0x0040, 0x5dc4, 0xd1cc, 0x0040, 0x5d9f, 0x6948, 0x017e,
-	0x1078, 0x1338, 0x0d7f, 0x1078, 0x5f39, 0x0078, 0x5dc2, 0x6837,
-	0x0103, 0x6944, 0xa184, 0x00ff, 0xa186, 0x0002, 0x0040, 0x5dbe,
-	0xa086, 0x0028, 0x00c0, 0x5db0, 0x684b, 0x001c, 0x0078, 0x5dc0,
-	0xd1dc, 0x0040, 0x5db7, 0x684b, 0x0015, 0x0078, 0x5dc0, 0xd1d4,
-	0x0040, 0x5dbe, 0x684b, 0x0007, 0x0078, 0x5dc0, 0x684b, 0x0000,
-	0x1078, 0x36a1, 0x1078, 0x556a, 0x0d7f, 0x007c, 0x1078, 0x4671,
-	0x0078, 0x5dcc, 0x1078, 0x4719, 0x1078, 0x6120, 0x0040, 0x5de3,
-	0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0x6d0c, 0x210c,
-	0xd18c, 0x00c0, 0x5dec, 0xd184, 0x00c0, 0x5de8, 0x6108, 0x694a,
-	0x1078, 0x36a1, 0x0d7f, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c,
-	0x684b, 0x0004, 0x0078, 0x5de0, 0x684b, 0x0004, 0x0078, 0x5de0,
-	0xa182, 0x0040, 0x0079, 0x5df4, 0x5e03, 0x5e03, 0x5e03, 0x5e03,
-	0x5e03, 0x5e05, 0x5e03, 0x5e08, 0x5e03, 0x5e03, 0x5e03, 0x5e03,
-	0x5e03, 0x5e03, 0x5e03, 0x1078, 0x12b7, 0x1078, 0x556a, 0x007c,
-	0x007e, 0x027e, 0xa016, 0x1078, 0x1532, 0x027f, 0x007f, 0x007c,
-	0xa182, 0x0025, 0x0079, 0x5e14, 0x5e1d, 0x5e1b, 0x5e1b, 0x5e1b,
-	0x5e1b, 0x5e1b, 0x5e1b, 0x1078, 0x12b7, 0x6003, 0x0001, 0x6106,
-	0x1078, 0x4327, 0x127e, 0x2091, 0x8000, 0x1078, 0x476a, 0x127f,
-	0x007c, 0xa186, 0x0013, 0x00c0, 0x5e33, 0x6004, 0xa082, 0x0025,
-	0x2008, 0x0079, 0x5e74, 0xa186, 0x0014, 0x00c0, 0x5e70, 0x1078,
-	0x4671, 0x2001, 0x0007, 0x1078, 0x33f3, 0x6018, 0xa080, 0x0028,
-	0x200c, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019, 0x0028, 0x1078,
-	0x445c, 0x1078, 0x43a9, 0x0c7e, 0x6018, 0xa065, 0x0040, 0x5e52,
-	0x1078, 0x35cf, 0x0c7f, 0x2c08, 0x1078, 0x6a57, 0x037f, 0x027f,
-	0x017f, 0x1078, 0x342f, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x6120,
-	0x0040, 0x5e6a, 0x6837, 0x0103, 0x684b, 0x0006, 0x1078, 0x36a1,
-	0x1078, 0x6276, 0x0d7f, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c,
-	0x1078, 0x559f, 0x0078, 0x5e6f, 0x5e7d, 0x5e7b, 0x5e7b, 0x5e7b,
-	0x5e7b, 0x5e7b, 0x5e86, 0x1078, 0x12b7, 0x1078, 0x4671, 0x6017,
-	0x0014, 0x6003, 0x000c, 0x1078, 0x476a, 0x007c, 0x1078, 0x4671,
-	0x6017, 0x0014, 0x6003, 0x000e, 0x1078, 0x476a, 0x007c, 0xa182,
-	0x002c, 0x00c8, 0x5e99, 0xa182, 0x0025, 0x0048, 0x5e99, 0x0079,
-	0x5e9c, 0x1078, 0x559f, 0x007c, 0x5ea3, 0x5ea3, 0x5ea3, 0x5ea3,
-	0x5ea5, 0x5ebf, 0x5ea3, 0x1078, 0x12b7, 0x0d7e, 0x1078, 0x6276,
-	0x6010, 0x2068, 0x6837, 0x0103, 0x6850, 0xa084, 0x0040, 0x0040,
-	0x5eb5, 0x684b, 0x0006, 0x0078, 0x5eb7, 0x684b, 0x0005, 0x6847,
-	0x0000, 0x1078, 0x36a1, 0x1078, 0x556a, 0x0d7f, 0x007c, 0x0d7e,
-	0x6010, 0x2068, 0x1078, 0x6120, 0x0040, 0x5ed9, 0x6837, 0x0103,
-	0x6850, 0xa084, 0x0040, 0x0040, 0x5ed1, 0x684b, 0x0006, 0x0078,
-	0x5ed3, 0x684b, 0x0005, 0x6847, 0x0000, 0x1078, 0x36a1, 0x1078,
-	0x6276, 0x0d7f, 0x1078, 0x556a, 0x007c, 0x1078, 0x4671, 0x1078,
-	0x556a, 0x1078, 0x476a, 0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e,
-	0x2029, 0x0001, 0xa182, 0x0101, 0x00c8, 0x5ef0, 0x0078, 0x5ef2,
-	0x2009, 0x0100, 0x2130, 0x2069, 0x7298, 0x831c, 0x2300, 0xad18,
-	0x2009, 0x0020, 0xaf90, 0x001d, 0x1078, 0x5f4c, 0xa6b2, 0x0020,
-	0x7804, 0xa06d, 0x0040, 0x5f06, 0x1078, 0x1338, 0x1078, 0x130f,
-	0x0040, 0x5f30, 0x8528, 0x6837, 0x0110, 0x683b, 0x0000, 0x2d20,
-	0x7c06, 0xa68a, 0x003d, 0x00c8, 0x5f1c, 0x2608, 0xad90, 0x000f,
-	0x1078, 0x5f4c, 0x0078, 0x5f30, 0xa6b2, 0x003c, 0x2009, 0x003c,
-	0x2d78, 0xad90, 0x000f, 0x1078, 0x5f4c, 0x0078, 0x5f06, 0x0f7f,
-	0x852f, 0xa5ad, 0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0078, 0x5f35,
-	0x0f7f, 0x852f, 0xa5ad, 0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f,
-	0x007c, 0x0f7e, 0x8dff, 0x0040, 0x5f4a, 0x6804, 0xa07d, 0x0040,
-	0x5f48, 0x6807, 0x0000, 0x1078, 0x36a1, 0x2f68, 0x0078, 0x5f3d,
-	0x1078, 0x36a1, 0x0f7f, 0x007c, 0x157e, 0xa184, 0x0001, 0x0040,
-	0x5f52, 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318,
-	0x8210, 0x00f0, 0x5f54, 0x157f, 0x007c, 0x127e, 0x2091, 0x8000,
-	0x601c, 0xa084, 0x000f, 0x1079, 0x5f67, 0x127f, 0x007c, 0x5f76,
-	0x5f6f, 0x5f71, 0x5f8d, 0x5f6f, 0x5f71, 0x5f71, 0x5f71, 0x1078,
-	0x12b7, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0x0d7e, 0x6010,
-	0x2068, 0x1078, 0x6120, 0x0040, 0x5f8a, 0xa00e, 0x2001, 0x0005,
-	0x1078, 0x372d, 0x1078, 0x36a1, 0x1078, 0x556a, 0xa085, 0x0001,
-	0x0d7f, 0x007c, 0xa006, 0x0078, 0x5f88, 0x6000, 0xa08a, 0x0010,
-	0x10c8, 0x12b7, 0x1079, 0x5f95, 0x007c, 0x5fa5, 0x5fc4, 0x5fa7,
-	0x5fd5, 0x5fc0, 0x5fa5, 0x5f71, 0x5f76, 0x5f76, 0x5f71, 0x5f71,
-	0x5f71, 0x5f71, 0x5f71, 0x5f71, 0x5f71, 0x1078, 0x12b7, 0x0d7e,
-	0x6010, 0x2068, 0x1078, 0x6120, 0x0040, 0x5fb2, 0x6850, 0xa085,
-	0x0005, 0x6852, 0x0d7f, 0x6007, 0x0025, 0x6003, 0x000b, 0x601f,
-	0x0002, 0x1078, 0x4327, 0x1078, 0x476a, 0xa085, 0x0001, 0x007c,
-	0x1078, 0x15f2, 0x0078, 0x5fa7, 0x0e7e, 0x2071, 0x6f10, 0x7024,
-	0xac06, 0x00c0, 0x5fcd, 0x1078, 0x5148, 0x1078, 0x5083, 0x0e7f,
-	0x00c0, 0x5fa7, 0x1078, 0x5f71, 0x007c, 0x037e, 0x0e7e, 0x2071,
-	0x6f10, 0x703c, 0xac06, 0x00c0, 0x5fe1, 0x2019, 0x0000, 0x1078,
-	0x51da, 0x1078, 0x54b6, 0x0e7f, 0x037f, 0x00c0, 0x5fa7, 0x1078,
-	0x5f71, 0x007c, 0x0c7e, 0x601c, 0xa084, 0x000f, 0x1079, 0x5ff2,
-	0x0c7f, 0x007c, 0x5ffb, 0x605b, 0x60c8, 0x5fff, 0x5ffb, 0x5ffb,
-	0x5ffb, 0x556a, 0x605b, 0x007c, 0x6017, 0x0001, 0x007c, 0x6000,
-	0xa08a, 0x0010, 0x10c8, 0x12b7, 0x1079, 0x6007, 0x007c, 0x6017,
-	0x6019, 0x603a, 0x604d, 0x604d, 0x6017, 0x5ffb, 0x5ffb, 0x5ffb,
-	0x604d, 0x604d, 0x6017, 0x6017, 0x6017, 0x6017, 0x6058, 0x1078,
-	0x12b7, 0x0e7e, 0x6010, 0x2070, 0x7050, 0xa085, 0x0040, 0x7052,
-	0x2071, 0x6f10, 0x7024, 0xac06, 0x0040, 0x6036, 0x1078, 0x5083,
-	0x6007, 0x0025, 0x6003, 0x000b, 0x601f, 0x0002, 0x6017, 0x0014,
-	0x1078, 0x4327, 0x1078, 0x476a, 0x0e7f, 0x007c, 0x6017, 0x0001,
-	0x0078, 0x6034, 0x0d7e, 0x6010, 0x2068, 0x6850, 0xa085, 0x0040,
-	0x6852, 0x0d7f, 0x6007, 0x0025, 0x6003, 0x000b, 0x601f, 0x0002,
-	0x1078, 0x4327, 0x1078, 0x476a, 0x007c, 0x0d7e, 0x6017, 0x0001,
-	0x6010, 0x2068, 0x6850, 0xa085, 0x0040, 0x6852, 0x0d7f, 0x007c,
-	0x1078, 0x556a, 0x007c, 0x6000, 0xa08a, 0x0010, 0x10c8, 0x12b7,
-	0x1079, 0x6063, 0x007c, 0x6073, 0x5ffc, 0x6075, 0x6073, 0x6075,
-	0x6073, 0x6073, 0x6073, 0x5ffb, 0x5ffb, 0x6073, 0x6073, 0x6073,
-	0x6073, 0x6073, 0x6073, 0x1078, 0x12b7, 0x0d7e, 0x6018, 0x2068,
-	0x6804, 0xa084, 0x00ff, 0x0d7f, 0xa08a, 0x000c, 0x10c8, 0x12b7,
-	0x1079, 0x6083, 0x007c, 0x608f, 0x60b1, 0x608f, 0x60b1, 0x608f,
-	0x60b1, 0x6091, 0x609a, 0x608f, 0x60b1, 0x608f, 0x60aa, 0x1078,
-	0x12b7, 0x6004, 0xa08e, 0x0004, 0x0040, 0x60ac, 0xa08e, 0x0002,
-	0x0040, 0x60ac, 0xa08e, 0x0000, 0x0040, 0x60c0, 0xa08e, 0x001f,
-	0x0040, 0x60c0, 0xa08e, 0x0021, 0x0040, 0x60c4, 0xa08e, 0x0022,
-	0x0040, 0x60c0, 0x1078, 0x2051, 0x1078, 0x5778, 0x1078, 0x556a,
-	0x007c, 0x1078, 0x5778, 0x1078, 0x2051, 0x0e7e, 0x127e, 0x2091,
-	0x8000, 0x1078, 0x206f, 0x127f, 0x0e7f, 0x1078, 0x556a, 0x007c,
-	0x1078, 0x5778, 0x0078, 0x60ac, 0x1078, 0x5786, 0x0078, 0x60ac,
-	0x6000, 0xa08a, 0x0010, 0x10c8, 0x12b7, 0x1079, 0x60d0, 0x007c,
-	0x60e0, 0x60e0, 0x60e0, 0x60e0, 0x60e0, 0x60e0, 0x60e0, 0x60e0,
-	0x60e0, 0x5ffb, 0x60e0, 0x5ffc, 0x60e2, 0x5ffc, 0x60eb, 0x60e0,
-	0x1078, 0x12b7, 0x6007, 0x002b, 0x6003, 0x000d, 0x1078, 0x4327,
-	0x1078, 0x476a, 0x007c, 0x1078, 0x6276, 0x1078, 0x6120, 0x0040,
-	0x6109, 0x1078, 0x2051, 0x0d7e, 0x6010, 0x2068, 0x6837, 0x0103,
-	0x684b, 0x0006, 0x1078, 0x36a1, 0x0d7f, 0x601f, 0x0001, 0x6007,
-	0x0001, 0x6003, 0x0001, 0x1078, 0x4376, 0x1078, 0x476a, 0x0078,
-	0x610b, 0x1078, 0x556a, 0x007c, 0xa284, 0x0007, 0x00c0, 0x611d,
-	0xa282, 0x7400, 0x0048, 0x611d, 0x2001, 0x6d15, 0x2004, 0xa202,
-	0x00c8, 0x611d, 0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x611c,
-	0x027e, 0x0e7e, 0x2071, 0x6d00, 0x6210, 0x7058, 0xa202, 0x0048,
-	0x6132, 0x705c, 0xa202, 0x00c8, 0x6132, 0xa085, 0x0001, 0x0e7f,
-	0x027f, 0x007c, 0xa006, 0x0078, 0x612f, 0x0e7e, 0x0c7e, 0x037e,
-	0x007e, 0x127e, 0x2091, 0x8000, 0x2061, 0x7400, 0x2071, 0x6d00,
-	0x7344, 0x7060, 0xa302, 0x00c8, 0x6155, 0x601c, 0xa206, 0x00c0,
-	0x614d, 0x0c7e, 0x1078, 0x556a, 0x0c7f, 0xace0, 0x0008, 0x7054,
-	0xac02, 0x00c8, 0x6155, 0x0078, 0x6140, 0x127f, 0x007f, 0x037f,
-	0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x017e, 0x127e, 0x2091,
-	0x8000, 0xa188, 0x6e00, 0x210c, 0x81ff, 0x0040, 0x6182, 0x2061,
-	0x7400, 0x2071, 0x6d00, 0x7344, 0x7060, 0xa302, 0x00c8, 0x6182,
-	0x6018, 0xa106, 0x00c0, 0x617c, 0x1078, 0x2051, 0x017e, 0x0c7e,
-	0x1078, 0x556a, 0x0c7f, 0x017f, 0xace0, 0x0008, 0x7054, 0xac02,
-	0x0048, 0x6170, 0x127f, 0x017f, 0x0c7f, 0x0e7f, 0x007c, 0x0c7e,
-	0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x5504, 0x057f,
-	0x0040, 0x61a0, 0x6612, 0x651a, 0x601f, 0x0003, 0x2009, 0x004b,
-	0x1078, 0x5591, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c,
-	0xa006, 0x0078, 0x619c, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000,
-	0x62a0, 0x0c7e, 0x1078, 0x5504, 0x057f, 0x0040, 0x61ca, 0x6013,
-	0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e, 0x2560, 0x1078, 0x35cf,
-	0x0c7f, 0x1078, 0x445c, 0x1078, 0x43a9, 0x2c08, 0x1078, 0x6a57,
-	0x2009, 0x004c, 0x1078, 0x5591, 0xa085, 0x0001, 0x127f, 0x057f,
-	0x0c7f, 0x007c, 0xa006, 0x0078, 0x61c6, 0x0c7e, 0x057e, 0x127e,
-	0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x5504, 0x057f, 0x0040,
-	0x61f5, 0x6612, 0x651a, 0x601f, 0x0003, 0x2019, 0x0005, 0x0c7e,
-	0x2560, 0x1078, 0x35cf, 0x0c7f, 0x1078, 0x445c, 0x1078, 0x43a9,
-	0x2c08, 0x1078, 0x6a57, 0x2009, 0x004d, 0x1078, 0x5591, 0xa085,
-	0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x61f1,
-	0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078,
-	0x5504, 0x057f, 0x0040, 0x6220, 0x6612, 0x651a, 0x601f, 0x0003,
-	0x2019, 0x0005, 0x0c7e, 0x2560, 0x1078, 0x35cf, 0x0c7f, 0x1078,
-	0x445c, 0x1078, 0x43a9, 0x2c08, 0x1078, 0x6a57, 0x2009, 0x004e,
-	0x1078, 0x5591, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c,
-	0xa006, 0x0078, 0x621c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e,
-	0x1078, 0x5504, 0x017f, 0x0040, 0x623c, 0x660a, 0x611a, 0x601f,
-	0x0001, 0x2d00, 0x6012, 0x2009, 0x001f, 0x1078, 0x5591, 0xa085,
-	0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6239, 0x0c7e,
-	0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x5504, 0x017f, 0x0040,
-	0x6258, 0x660a, 0x611a, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009,
-	0x0021, 0x1078, 0x5591, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c,
-	0xa006, 0x0078, 0x6255, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e,
-	0x1078, 0x5504, 0x017f, 0x0040, 0x6273, 0x611a, 0x601f, 0x0001,
-	0x2d00, 0x6012, 0x2009, 0x0000, 0x1078, 0x5591, 0xa085, 0x0001,
-	0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6270, 0x027e, 0x0d7e,
-	0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040, 0x6280, 0x8211, 0x6a3e,
-	0x0d7f, 0x027f, 0x007c, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017,
-	0x0014, 0x007c, 0x067e, 0x0c7e, 0x2031, 0x6d52, 0x2634, 0xd6e4,
-	0x0040, 0x6297, 0x6618, 0x2660, 0x6e44, 0x1078, 0x3507, 0x0c7f,
-	0x067f, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12b7,
-	0x1079, 0x62a4, 0x067f, 0x007c, 0x62b4, 0x640b, 0x64d4, 0x62b4,
-	0x62b4, 0x62b4, 0x62b4, 0x62b4, 0x62ee, 0x6542, 0x62b4, 0x62b4,
-	0x62b4, 0x62b4, 0x62b4, 0x62b4, 0x1078, 0x12b7, 0x067e, 0x6000,
-	0xa0b2, 0x0010, 0x10c8, 0x12b7, 0x1079, 0x62c0, 0x067f, 0x007c,
-	0x62d0, 0x6837, 0x62d0, 0x62d0, 0x62d0, 0x62d0, 0x62d0, 0x62d0,
-	0x6812, 0x687d, 0x62d0, 0x62d0, 0x62d0, 0x62d0, 0x62d0, 0x62d0,
-	0x1078, 0x12b7, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12b7,
-	0x1079, 0x62dc, 0x067f, 0x007c, 0x62ec, 0x668f, 0x66fb, 0x671c,
-	0x6769, 0x62ec, 0x62ec, 0x67be, 0x654e, 0x67fa, 0x67fe, 0x62ec,
-	0x62ec, 0x62ec, 0x62ec, 0x62ec, 0x1078, 0x12b7, 0xa1b2, 0x0024,
-	0x10c8, 0x12b7, 0x2100, 0x0079, 0x62f5, 0x6319, 0x63f5, 0x6319,
-	0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319,
-	0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319,
-	0x6319, 0x6319, 0x6319, 0x6319, 0x631b, 0x634a, 0x6354, 0x637c,
-	0x6382, 0x63b6, 0x63ee, 0x6319, 0x6319, 0x63fd, 0x6319, 0x6319,
-	0x6404, 0x1078, 0x12b7, 0x1078, 0x364d, 0x6618, 0x0c7e, 0x2660,
-	0x1078, 0x3459, 0x0c7f, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff,
-	0xa082, 0x0006, 0x0048, 0x633c, 0x1078, 0x6993, 0x00c0, 0x6376,
-	0x1078, 0x6931, 0x00c0, 0x6338, 0x6007, 0x0008, 0x0078, 0x63f0,
-	0x6007, 0x0009, 0x0078, 0x63f0, 0x1078, 0x6b02, 0x0040, 0x6346,
-	0x1078, 0x6993, 0x0040, 0x6330, 0x0078, 0x6376, 0x6013, 0x1900,
-	0x0078, 0x6338, 0x1078, 0x68b7, 0x6007, 0x0006, 0x0078, 0x63f0,
-	0x6007, 0x0007, 0x0078, 0x63f0, 0x0d7e, 0x6618, 0x2668, 0x6e04,
-	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x6366, 0xa686,
-	0x0004, 0x0040, 0x6366, 0x0d7f, 0x0078, 0x6376, 0x1078, 0x69f1,
-	0x00c0, 0x6371, 0x1078, 0x34ca, 0x6007, 0x000a, 0x0d7f, 0x0078,
-	0x63f0, 0x6007, 0x000b, 0x0d7f, 0x0078, 0x63f0, 0x1078, 0x2051,
-	0x6007, 0x0001, 0x0078, 0x63f0, 0x1078, 0x2051, 0x6007, 0x000c,
-	0x0078, 0x63f0, 0x1078, 0x364d, 0x6618, 0xa6b0, 0x0001, 0x2634,
-	0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x63a3, 0xa6b4, 0xff00,
-	0x8637, 0xa686, 0x0006, 0x00c0, 0x6376, 0x1078, 0x6a00, 0x00c0,
-	0x639d, 0x6007, 0x000e, 0x0078, 0x63f0, 0x1078, 0x2051, 0x6007,
-	0x000f, 0x0078, 0x63f0, 0x1078, 0x6b02, 0x0040, 0x63b0, 0xa6b4,
-	0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x6395, 0x0078, 0x6376,
-	0x6013, 0x1900, 0x6007, 0x0009, 0x0078, 0x63f0, 0x1078, 0x364d,
-	0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006,
-	0x0048, 0x63db, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x00c0,
-	0x6376, 0x1078, 0x6a2b, 0x00c0, 0x63d5, 0x1078, 0x6931, 0x00c0,
-	0x63d5, 0x6007, 0x0010, 0x0078, 0x63f0, 0x1078, 0x2051, 0x6007,
-	0x0011, 0x0078, 0x63f0, 0x1078, 0x6b02, 0x0040, 0x63e8, 0xa6b4,
-	0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x63c9, 0x0078, 0x6376,
-	0x6013, 0x1900, 0x6007, 0x0009, 0x0078, 0x63f0, 0x6007, 0x0012,
-	0x6003, 0x0001, 0x1078, 0x4376, 0x007c, 0x6007, 0x0001, 0x6003,
-	0x0001, 0x1078, 0x4376, 0x0078, 0x63f4, 0x6007, 0x0020, 0x6003,
-	0x0001, 0x1078, 0x4376, 0x007c, 0x6007, 0x0023, 0x6003, 0x0001,
-	0x1078, 0x4376, 0x007c, 0x6004, 0xa0b2, 0x0024, 0x10c8, 0x12b7,
-	0xa1b6, 0x0013, 0x00c0, 0x6417, 0x2008, 0x0079, 0x6426, 0xa1b6,
-	0x0014, 0x10c0, 0x12b7, 0x2001, 0x0007, 0x1078, 0x3401, 0x1078,
-	0x4671, 0x1078, 0x6283, 0x1078, 0x476a, 0x007c, 0x644a, 0x644c,
-	0x644a, 0x644a, 0x644a, 0x644c, 0x6454, 0x64af, 0x6472, 0x64af,
-	0x6486, 0x64af, 0x6454, 0x64af, 0x64a7, 0x64af, 0x64a7, 0x64af,
-	0x64af, 0x644a, 0x644a, 0x644a, 0x644a, 0x644a, 0x644a, 0x644a,
-	0x644a, 0x644a, 0x644a, 0x644a, 0x644a, 0x644a, 0x64af, 0x644a,
-	0x644a, 0x64af, 0x1078, 0x12b7, 0x1078, 0x4671, 0x6003, 0x0002,
-	0x1078, 0x476a, 0x0078, 0x64b5, 0x0f7e, 0x2079, 0x6d51, 0x7804,
-	0x0f7f, 0xd0ac, 0x00c0, 0x64af, 0x2001, 0x0000, 0x1078, 0x33df,
-	0x2001, 0x0002, 0x1078, 0x33f3, 0x1078, 0x4671, 0x601f, 0x0001,
-	0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x4376, 0x1078, 0x476a,
-	0x0078, 0x64b5, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4,
-	0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x64af, 0xa686, 0x0004,
-	0x0040, 0x64af, 0x2001, 0x0004, 0x0078, 0x64ad, 0x2001, 0x6d00,
-	0x2004, 0xa086, 0x0003, 0x00c0, 0x648f, 0x1078, 0x2ad1, 0x2001,
-	0x0006, 0x1078, 0x64b6, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f,
-	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x64af, 0x2001,
-	0x0006, 0x0078, 0x64ad, 0x2001, 0x0004, 0x0078, 0x64ad, 0x2001,
-	0x0006, 0x1078, 0x64b6, 0x0078, 0x64af, 0x1078, 0x3401, 0x1078,
-	0x4671, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c, 0x017e, 0x0d7e,
-	0x6118, 0x2168, 0x6900, 0xd184, 0x0040, 0x64d1, 0x6104, 0xa18e,
-	0x000a, 0x00c0, 0x64c9, 0x699c, 0xd1a4, 0x00c0, 0x64c9, 0x2001,
-	0x0007, 0x1078, 0x33f3, 0x2001, 0x0000, 0x1078, 0x33df, 0x1078,
-	0x206f, 0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804,
-	0xa084, 0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x12b7,
-	0xa1b6, 0x0015, 0x00c0, 0x64e8, 0x1079, 0x64ef, 0x0078, 0x64ee,
-	0xa1b6, 0x0016, 0x10c0, 0x12b7, 0x1079, 0x6527, 0x007c, 0x57ef,
-	0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x64fb, 0x57ef,
-	0x57ef, 0x57ef, 0x57ef, 0x0f7e, 0x2079, 0x6d51, 0x7804, 0x0f7f,
-	0xd0ac, 0x00c0, 0x6517, 0x2001, 0x0000, 0x1078, 0x33df, 0x2001,
-	0x0002, 0x1078, 0x33f3, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007,
-	0x0002, 0x1078, 0x4376, 0x1078, 0x476a, 0x0078, 0x6526, 0x2011,
-	0x7283, 0x220c, 0x017e, 0x0c7e, 0x1078, 0x3447, 0x00c0, 0x6526,
-	0x1078, 0x3256, 0x0c7f, 0x017f, 0x1078, 0x556a, 0x007c, 0x57ef,
-	0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x6533, 0x57ef,
-	0x57ef, 0x57ef, 0x57ef, 0x1078, 0x599c, 0x00c0, 0x653f, 0x6003,
-	0x0001, 0x6007, 0x0001, 0x1078, 0x4376, 0x0078, 0x6541, 0x1078,
-	0x556a, 0x007c, 0x6004, 0xa08a, 0x0024, 0x10c8, 0x12b7, 0x1078,
-	0x4671, 0x1078, 0x6283, 0x1078, 0x476a, 0x007c, 0xa182, 0x0040,
-	0x0079, 0x6552, 0x6561, 0x6561, 0x6561, 0x6561, 0x6563, 0x6561,
-	0x6561, 0x6561, 0x6561, 0x6561, 0x6561, 0x6561, 0x6561, 0x6561,
-	0x6561, 0x1078, 0x12b7, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e,
-	0x027e, 0x2071, 0x7280, 0x7444, 0xa4a4, 0xe600, 0x0040, 0x65d4,
-	0xa486, 0x2000, 0x0040, 0x6592, 0xa486, 0x0400, 0x0040, 0x6592,
-	0x7130, 0xa18c, 0x00ff, 0xa182, 0x0010, 0x00c8, 0x6663, 0x0c7e,
-	0x1078, 0x416d, 0x2c68, 0x0c7f, 0x6a00, 0xa284, 0x0001, 0x0040,
-	0x6644, 0x1078, 0x420a, 0x0040, 0x666f, 0xa295, 0x0200, 0x6a02,
-	0x0078, 0x6598, 0x2009, 0x0001, 0x2011, 0x0200, 0x1078, 0x41f4,
-	0x1078, 0x130f, 0x1040, 0x12b7, 0x6003, 0x0007, 0x6106, 0x2d00,
-	0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00,
-	0x685e, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0xa18c, 0x00ff,
-	0xa10d, 0x6946, 0x684f, 0x0000, 0x6857, 0x0036, 0x1078, 0x36a1,
-	0xa486, 0x2000, 0x00c0, 0x65c2, 0x2019, 0x0017, 0x1078, 0x6b8f,
-	0x0078, 0x6631, 0xa486, 0x0400, 0x00c0, 0x65cc, 0x2019, 0x0002,
-	0x1078, 0x6b8f, 0x0078, 0x6631, 0xa486, 0x0200, 0x00c0, 0x65d2,
-	0x1078, 0x6b80, 0x0078, 0x6631, 0x7130, 0xa18c, 0x00ff, 0xa182,
-	0x0010, 0x00c8, 0x6687, 0x0c7e, 0x1078, 0x416d, 0x2c68, 0x0c7f,
-	0x6a00, 0xa284, 0x0001, 0x0040, 0x668b, 0xa284, 0x0300, 0x00c0,
-	0x6683, 0x6804, 0xa005, 0x0040, 0x666f, 0x8001, 0x6806, 0x6003,
-	0x0007, 0x6106, 0x1078, 0x12f4, 0x0040, 0x6638, 0x6013, 0x0000,
-	0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000, 0x2c00, 0x684a,
-	0x6018, 0x2078, 0x78a0, 0x8007, 0xa10d, 0x6946, 0x6853, 0x003d,
-	0x7044, 0xa084, 0x0003, 0xa086, 0x0002, 0x00c0, 0x6613, 0x684f,
-	0x0040, 0x0078, 0x661d, 0xa086, 0x0001, 0x00c0, 0x661b, 0x684f,
-	0x0080, 0x0078, 0x661d, 0x684f, 0x0000, 0x20a9, 0x000a, 0x2001,
-	0x7290, 0xad90, 0x0015, 0x200c, 0x810f, 0x2112, 0x8000, 0x8210,
-	0x00f0, 0x6623, 0x200c, 0x6982, 0x8000, 0x200c, 0x697e, 0x1078,
-	0x36a1, 0x027f, 0x047f, 0x157f, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c,
-	0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4327,
-	0x1078, 0x476a, 0x0078, 0x6631, 0x2069, 0x7292, 0x2d04, 0xa084,
-	0xff00, 0xa086, 0x1200, 0x00c0, 0x6663, 0x2069, 0x7280, 0x686c,
-	0xa084, 0x00ff, 0x017e, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112,
-	0x017f, 0x6003, 0x0001, 0x6007, 0x0043, 0x1078, 0x4327, 0x1078,
-	0x476a, 0x0078, 0x6631, 0x6013, 0x0200, 0x6003, 0x0001, 0x6007,
-	0x0041, 0x1078, 0x4327, 0x1078, 0x476a, 0x0078, 0x6631, 0xa284,
-	0x0004, 0x00c0, 0x6677, 0x6013, 0x0300, 0x0078, 0x6679, 0x6013,
-	0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4327, 0x1078,
-	0x476a, 0x0078, 0x6631, 0x6013, 0x0500, 0x0078, 0x6679, 0x6013,
-	0x0600, 0x0078, 0x6644, 0x6013, 0x0200, 0x0078, 0x6644, 0xa186,
-	0x0013, 0x00c0, 0x66a1, 0x6004, 0xa08a, 0x0040, 0x1048, 0x12b7,
-	0xa08a, 0x004f, 0x10c8, 0x12b7, 0xa082, 0x0040, 0x2008, 0x0079,
-	0x66cd, 0xa186, 0x0047, 0x00c0, 0x66a7, 0x0078, 0x66fb, 0xa186,
-	0x0014, 0x10c0, 0x12b7, 0x6004, 0xa082, 0x0040, 0x2008, 0x0079,
-	0x66b1, 0x66c0, 0x66c2, 0x66c2, 0x66c0, 0x66c0, 0x66c0, 0x66c0,
-	0x66c0, 0x66c0, 0x66c0, 0x66c0, 0x66c0, 0x66c0, 0x66c0, 0x66c0,
-	0x1078, 0x12b7, 0x2001, 0x0007, 0x1078, 0x3401, 0x1078, 0x4671,
-	0x1078, 0x6283, 0x1078, 0x476a, 0x007c, 0x66dc, 0x66ec, 0x66e5,
-	0x66f5, 0x66dc, 0x66dc, 0x66dc, 0x66dc, 0x66dc, 0x66dc, 0x66dc,
-	0x66dc, 0x66dc, 0x66dc, 0x66dc, 0x1078, 0x12b7, 0x6010, 0xa088,
-	0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x4671, 0x6003,
-	0x0002, 0x1078, 0x476a, 0x007c, 0x1078, 0x4671, 0x1078, 0x41cd,
-	0x1078, 0x556a, 0x1078, 0x476a, 0x007c, 0x1078, 0x4671, 0x2009,
-	0x0041, 0x0078, 0x67be, 0xa182, 0x0040, 0x0079, 0x66ff, 0x670e,
-	0x6710, 0x670e, 0x670e, 0x670e, 0x670e, 0x670e, 0x6711, 0x670e,
-	0x670e, 0x670e, 0x670e, 0x670e, 0x670e, 0x670e, 0x1078, 0x12b7,
+	0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x12d5, 0x6604, 0xa6b6, 0x0028,
+	0x00c0, 0x5e86, 0x1078, 0x6b03, 0x0078, 0x5eb8, 0x6604, 0xa6b6,
+	0x0029, 0x00c0, 0x5e8f, 0x1078, 0x6b1d, 0x0078, 0x5eb8, 0x6604,
+	0xa6b6, 0x001f, 0x00c0, 0x5e98, 0x1078, 0x5c93, 0x0078, 0x5eb8,
+	0x6604, 0xa6b6, 0x0000, 0x00c0, 0x5ea1, 0x1078, 0x5cd8, 0x0078,
+	0x5eb8, 0x6604, 0xa6b6, 0x0022, 0x00c0, 0x5eaa, 0x1078, 0x5cbc,
+	0x0078, 0x5eb8, 0xa1b6, 0x0015, 0x00c0, 0x5eb2, 0x1079, 0x5ebd,
+	0x0078, 0x5eb8, 0xa1b6, 0x0016, 0x00c0, 0x5eb9, 0x1079, 0x5ffa,
+	0x007c, 0x1078, 0x5c37, 0x0078, 0x5eb8, 0x5ee1, 0x5ee4, 0x5ee1,
+	0x5f25, 0x5ee1, 0x5f96, 0x5ee1, 0x5ee1, 0x5ee1, 0x5fd2, 0x5ee1,
+	0x5fe8, 0xa1b6, 0x0048, 0x0040, 0x5ed5, 0x20e1, 0x0005, 0x3d18,
+	0x3e20, 0x2c10, 0x1078, 0x1572, 0x007c, 0x0e7e, 0xacf0, 0x0004,
+	0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x5c02,
+	0x007c, 0x0005, 0x0005, 0x007c, 0x0e7e, 0x2071, 0x7600, 0x7078,
+	0xa086, 0x0074, 0x00c0, 0x5f0e, 0x1078, 0x734f, 0x00c0, 0x5f00,
+	0x0d7e, 0x6018, 0x2068, 0x1078, 0x5f12, 0x0d7f, 0x2001, 0x0006,
+	0x1078, 0x37d1, 0x1078, 0x22dd, 0x1078, 0x5c02, 0x0078, 0x5f10,
+	0x2001, 0x000a, 0x1078, 0x37d1, 0x1078, 0x22dd, 0x6003, 0x0001,
+	0x6007, 0x0001, 0x1078, 0x4872, 0x0078, 0x5f10, 0x1078, 0x5f86,
+	0x0e7f, 0x007c, 0x6800, 0xd084, 0x0040, 0x5f24, 0x2001, 0x0000,
+	0x1078, 0x37bd, 0x2069, 0x7651, 0x6804, 0xd0a4, 0x0040, 0x5f24,
+	0x2001, 0x0006, 0x1078, 0x37df, 0x007c, 0x0d7e, 0x2011, 0x761e,
+	0x2204, 0xa086, 0x0074, 0x00c0, 0x5f82, 0x1078, 0x60d4, 0x6018,
+	0x2068, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x0040, 0x5f4d,
+	0xa286, 0x0080, 0x00c0, 0x5f76, 0x6813, 0x00ff, 0x6817, 0xfffc,
+	0x6010, 0xa005, 0x0040, 0x5f6c, 0x2068, 0x6807, 0x0000, 0x6837,
+	0x0103, 0x6833, 0x0200, 0x0078, 0x5f6c, 0x0e7e, 0x0f7e, 0x6813,
+	0x00ff, 0x6817, 0xfffe, 0x2071, 0x762f, 0x2e04, 0xa085, 0x0003,
+	0x2072, 0x2071, 0x7b80, 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff,
+	0x2069, 0x7619, 0x206a, 0x78e6, 0x8e70, 0x2e04, 0x2069, 0x761a,
+	0x206a, 0x78ea, 0x0f7f, 0x0e7f, 0x2001, 0x0006, 0x1078, 0x37d1,
+	0x1078, 0x22dd, 0x1078, 0x5c02, 0x0078, 0x5f84, 0x2001, 0x0004,
+	0x1078, 0x37d1, 0x6003, 0x0001, 0x6007, 0x0003, 0x1078, 0x4872,
+	0x0078, 0x5f84, 0x1078, 0x5f86, 0x0d7f, 0x007c, 0x2001, 0x7600,
+	0x2004, 0xa086, 0x0003, 0x0040, 0x5f91, 0x2001, 0x0007, 0x1078,
+	0x37d1, 0x1078, 0x22dd, 0x1078, 0x5c02, 0x007c, 0x0e7e, 0x2071,
+	0x7600, 0x7078, 0xa086, 0x0014, 0x00c0, 0x5fcc, 0x7000, 0xa086,
+	0x0003, 0x00c0, 0x5fa9, 0x6010, 0xa005, 0x00c0, 0x5fa9, 0x1078,
+	0x2dc8, 0x0d7e, 0x6018, 0x2068, 0x1078, 0x38a1, 0x1078, 0x5f12,
+	0x0d7f, 0x1078, 0x60de, 0x00c0, 0x5fcc, 0x2001, 0x0006, 0x1078,
+	0x37d1, 0x0e7e, 0x6010, 0xa005, 0x0040, 0x5fc5, 0x2070, 0x7007,
+	0x0000, 0x7037, 0x0103, 0x7033, 0x0200, 0x0e7f, 0x1078, 0x22dd,
+	0x1078, 0x5c02, 0x0078, 0x5fd0, 0x1078, 0x5e57, 0x1078, 0x5f86,
+	0x0e7f, 0x007c, 0x2011, 0x761e, 0x2204, 0xa086, 0x0014, 0x00c0,
+	0x5fe5, 0x2001, 0x0002, 0x1078, 0x37d1, 0x6003, 0x0001, 0x6007,
+	0x0001, 0x1078, 0x4872, 0x0078, 0x5fe7, 0x1078, 0x5f86, 0x007c,
+	0x2011, 0x761e, 0x2204, 0xa086, 0x0004, 0x00c0, 0x5ff7, 0x2001,
+	0x0007, 0x1078, 0x37d1, 0x1078, 0x5c02, 0x0078, 0x5ff9, 0x1078,
+	0x5f86, 0x007c, 0x5ee1, 0x6006, 0x5ee1, 0x602c, 0x5ee1, 0x6087,
+	0x5ee1, 0x5ee1, 0x5ee1, 0x609c, 0x5ee1, 0x60af, 0x0c7e, 0x1078,
+	0x60c2, 0x00c0, 0x601b, 0x2001, 0x0000, 0x1078, 0x37bd, 0x2001,
+	0x0002, 0x1078, 0x37d1, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078,
+	0x4872, 0x0078, 0x602a, 0x2009, 0x7b8f, 0x2104, 0xa084, 0xff00,
+	0xa086, 0x1900, 0x00c0, 0x6028, 0x1078, 0x5c02, 0x0078, 0x602a,
+	0x1078, 0x5f86, 0x0c7f, 0x007c, 0x1078, 0x60d1, 0x00c0, 0x6040,
+	0x2001, 0x0000, 0x1078, 0x37bd, 0x2001, 0x0002, 0x1078, 0x37d1,
+	0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x4872, 0x0078, 0x6062,
+	0x1078, 0x5e57, 0x2009, 0x7b8e, 0x2134, 0xa6b4, 0x00ff, 0xa686,
+	0x0005, 0x0040, 0x6063, 0x2009, 0x7b8f, 0x2104, 0xa084, 0xff00,
+	0xa086, 0x1900, 0x00c0, 0x6060, 0xa686, 0x0009, 0x0040, 0x6063,
+	0x2001, 0x0004, 0x1078, 0x37d1, 0x1078, 0x5c02, 0x0078, 0x6062,
+	0x1078, 0x5f86, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x693e,
+	0x0040, 0x6071, 0x6838, 0xd0fc, 0x0040, 0x6071, 0x0d7f, 0x0078,
+	0x6060, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040,
+	0x6082, 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x0d7f,
+	0x0078, 0x6062, 0x1078, 0x22bb, 0x0d7f, 0x0078, 0x6060, 0x1078,
+	0x60d1, 0x00c0, 0x6097, 0x2001, 0x0004, 0x1078, 0x37d1, 0x6003,
+	0x0001, 0x6007, 0x0003, 0x1078, 0x4872, 0x0078, 0x609b, 0x1078,
+	0x5e57, 0x1078, 0x5f86, 0x007c, 0x1078, 0x60d1, 0x00c0, 0x60ac,
+	0x2001, 0x0008, 0x1078, 0x37d1, 0x6003, 0x0001, 0x6007, 0x0005,
+	0x1078, 0x4872, 0x0078, 0x60ae, 0x1078, 0x5f86, 0x007c, 0x1078,
+	0x60d1, 0x00c0, 0x60bf, 0x2001, 0x000a, 0x1078, 0x37d1, 0x6003,
+	0x0001, 0x6007, 0x0001, 0x1078, 0x4872, 0x0078, 0x60c1, 0x1078,
+	0x5f86, 0x007c, 0x2009, 0x7b8e, 0x2104, 0xa086, 0x0003, 0x00c0,
+	0x60d0, 0x2009, 0x7b8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00,
+	0x007c, 0xa085, 0x0001, 0x007c, 0x0c7e, 0x017e, 0xac88, 0x0006,
+	0x2164, 0x1078, 0x3837, 0x017f, 0x0c7f, 0x007c, 0x0e7e, 0x2071,
+	0x7b8c, 0x7004, 0xa086, 0x0014, 0x00c0, 0x6101, 0x7008, 0xa086,
+	0x0800, 0x00c0, 0x6101, 0x700c, 0xd0ec, 0x0040, 0x60ff, 0xa084,
+	0x0f00, 0xa086, 0x0100, 0x00c0, 0x60ff, 0x7024, 0xd0a4, 0x0040,
+	0x60ff, 0xd08c, 0x0040, 0x60ff, 0xa006, 0x0078, 0x6101, 0xa085,
+	0x0001, 0x0e7f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x057e,
+	0x047e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2029, 0x783f,
+	0x252c, 0x2021, 0x7845, 0x2424, 0x2061, 0x7d00, 0x2071, 0x7600,
+	0x7244, 0x7060, 0xa202, 0x00c8, 0x6158, 0x1078, 0x7559, 0x0040,
+	0x6150, 0x671c, 0xa786, 0x0001, 0x0040, 0x6150, 0xa786, 0x0007,
+	0x0040, 0x6150, 0x2500, 0xac06, 0x0040, 0x6150, 0x2400, 0xac06,
+	0x0040, 0x6150, 0x0c7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x613a,
+	0x1078, 0x1676, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040, 0x614d,
+	0xa786, 0x0003, 0x00c0, 0x6162, 0x6837, 0x0103, 0x6b4a, 0x6847,
+	0x0000, 0x1078, 0x3a7a, 0x1078, 0x6a94, 0x1078, 0x6aa1, 0x0c7f,
+	0xace0, 0x0008, 0x7054, 0xac02, 0x00c8, 0x6158, 0x0078, 0x6118,
+	0x127f, 0x007f, 0x027f, 0x047f, 0x057f, 0x077f, 0x0c7f, 0x0d7f,
+	0x0e7f, 0x007c, 0xa786, 0x0006, 0x00c0, 0x6144, 0x1078, 0x74fd,
+	0x0078, 0x614d, 0x220c, 0x2304, 0xa106, 0x00c0, 0x6175, 0x8210,
+	0x8318, 0x00f0, 0x616a, 0xa006, 0x007c, 0x2304, 0xa102, 0x0048,
+	0x617d, 0x2001, 0x0001, 0x0078, 0x617f, 0x2001, 0x0000, 0xa18d,
+	0x0001, 0x007c, 0x6004, 0xa08a, 0x0030, 0x10c8, 0x12d5, 0x1078,
+	0x6aba, 0x0040, 0x6191, 0x1078, 0x6ace, 0x0040, 0x619a, 0x0078,
+	0x6193, 0x1078, 0x22dd, 0x1078, 0x4b81, 0x1078, 0x5c02, 0x1078,
+	0x4c7a, 0x007c, 0x1078, 0x5e57, 0x0078, 0x6193, 0xa182, 0x0040,
+	0x0079, 0x61a2, 0x61b2, 0x61b2, 0x61b2, 0x61b2, 0x61b2, 0x61b2,
+	0x61b2, 0x61b2, 0x61b2, 0x61b2, 0x61b2, 0x61b4, 0x61b4, 0x61b4,
+	0x61b4, 0x61b2, 0x1078, 0x12d5, 0x6003, 0x0001, 0x6106, 0x1078,
+	0x4825, 0x127e, 0x2091, 0x8000, 0x1078, 0x4c7a, 0x127f, 0x007c,
+	0xa186, 0x0013, 0x00c0, 0x61c9, 0x6004, 0xa082, 0x0040, 0x0079,
+	0x623f, 0xa186, 0x0027, 0x00c0, 0x61e6, 0x1078, 0x4b81, 0x1078,
+	0x22bb, 0x0d7e, 0x6110, 0x2168, 0x1078, 0x693e, 0x0040, 0x61e0,
+	0x6837, 0x0103, 0x684b, 0x0029, 0x1078, 0x3a7a, 0x1078, 0x6a94,
+	0x0d7f, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c, 0xa186, 0x0014,
+	0x00c0, 0x61ef, 0x6004, 0xa082, 0x0040, 0x0079, 0x620f, 0xa186,
+	0x0047, 0x10c0, 0x12d5, 0x2001, 0x0109, 0x2004, 0xd084, 0x0040,
+	0x620c, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x1078,
+	0x46e6, 0x027f, 0x017f, 0x007f, 0x127f, 0x6000, 0xa086, 0x0002,
+	0x00c0, 0x620c, 0x0078, 0x6266, 0x1078, 0x5c37, 0x007c, 0x6221,
+	0x621f, 0x621f, 0x621f, 0x621f, 0x621f, 0x621f, 0x621f, 0x621f,
+	0x621f, 0x621f, 0x6238, 0x6238, 0x6238, 0x6238, 0x621f, 0x1078,
+	0x12d5, 0x1078, 0x4b81, 0x0d7e, 0x6110, 0x2168, 0x1078, 0x693e,
+	0x0040, 0x6232, 0x6837, 0x0103, 0x684b, 0x0006, 0x1078, 0x3a7a,
+	0x1078, 0x6a94, 0x0d7f, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c,
+	0x1078, 0x4b81, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c, 0x6251,
+	0x624f, 0x624f, 0x624f, 0x624f, 0x624f, 0x624f, 0x624f, 0x624f,
+	0x624f, 0x624f, 0x625f, 0x625f, 0x625f, 0x625f, 0x624f, 0x1078,
+	0x12d5, 0x1078, 0x4b81, 0x6003, 0x0002, 0x1078, 0x4c7a, 0x6010,
+	0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x007c, 0x1078,
+	0x4b81, 0x6003, 0x000f, 0x1078, 0x4c7a, 0x007c, 0xa182, 0x0040,
+	0x0079, 0x626a, 0x627a, 0x627a, 0x627a, 0x627a, 0x627a, 0x627c,
+	0x6305, 0x631d, 0x627a, 0x627a, 0x627a, 0x627a, 0x627a, 0x627a,
+	0x627a, 0x627a, 0x1078, 0x12d5, 0x0e7e, 0x0d7e, 0x2071, 0x7b8c,
+	0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040, 0x62e9,
+	0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x62ae, 0xa186, 0x0028,
+	0x00c0, 0x6298, 0x1078, 0x6aa8, 0x684b, 0x001c, 0x0078, 0x62b0,
+	0xd6dc, 0x0040, 0x62a3, 0x684b, 0x0015, 0x7318, 0x6b62, 0x731c,
+	0x6b5e, 0x0078, 0x62b0, 0xd6d4, 0x0040, 0x62ae, 0x684b, 0x0007,
+	0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x62b0, 0x684b, 0x0000,
+	0x6837, 0x0103, 0x6e46, 0xa01e, 0xd6c4, 0x0040, 0x62c3, 0x7328,
+	0x732c, 0x6b56, 0x037e, 0x2308, 0x2019, 0x7b98, 0xad90, 0x0019,
+	0x1078, 0x6727, 0x037f, 0xd6cc, 0x0040, 0x62f9, 0x7124, 0x695a,
+	0xa192, 0x0021, 0x00c8, 0x62d7, 0x2071, 0x7b98, 0x831c, 0x2300,
+	0xae18, 0xad90, 0x001d, 0x1078, 0x6727, 0x0078, 0x62f9, 0x6838,
+	0xd0fc, 0x0040, 0x62e0, 0x2009, 0x0020, 0x695a, 0x0078, 0x62cc,
+	0x0f7e, 0x2d78, 0x1078, 0x66bf, 0x0f7f, 0x1078, 0x6714, 0x0078,
+	0x62fb, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac,
+	0x0040, 0x62f9, 0x6810, 0x6914, 0xa115, 0x0040, 0x62f9, 0x1078,
+	0x646d, 0x1078, 0x3a7a, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e,
+	0x0d7f, 0x0e7f, 0x1078, 0x5c02, 0x007c, 0x0f7e, 0x6003, 0x0003,
+	0x2079, 0x7b8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078,
+	0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x19cf,
+	0x1078, 0x4891, 0x1078, 0x4d3a, 0x007c, 0x6003, 0x0004, 0x6110,
+	0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x1572, 0x007c,
+	0xa182, 0x0040, 0x0079, 0x632c, 0x633c, 0x633c, 0x633c, 0x633c,
+	0x633c, 0x633e, 0x63d5, 0x633c, 0x633c, 0x63eb, 0x644d, 0x633c,
+	0x633c, 0x633c, 0x633c, 0x6454, 0x1078, 0x12d5, 0x077e, 0x0f7e,
+	0x0e7e, 0x0d7e, 0x2071, 0x7b8c, 0x6110, 0x2178, 0x7614, 0xa6b4,
+	0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c,
+	0x8211, 0x6a3e, 0x86ff, 0x0040, 0x63d0, 0xa694, 0xff00, 0xa284,
+	0x0c00, 0x0040, 0x635f, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284,
+	0x0300, 0x0040, 0x63d0, 0x1078, 0x132f, 0x1040, 0x12d5, 0x2d00,
+	0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a,
+	0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x00ff, 0xa186,
+	0x0002, 0x0040, 0x6399, 0xa186, 0x0028, 0x00c0, 0x6383, 0x684b,
+	0x001c, 0x0078, 0x639b, 0xd6dc, 0x0040, 0x638e, 0x684b, 0x0015,
+	0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x639b, 0xd6d4, 0x0040,
+	0x6399, 0x684b, 0x0007, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078,
+	0x639b, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856,
+	0xa01e, 0xd6c4, 0x0040, 0x63b0, 0x7328, 0x732c, 0x6b56, 0x037e,
+	0x2308, 0x2019, 0x7b98, 0xad90, 0x0019, 0x1078, 0x6727, 0x037f,
+	0xd6cc, 0x0040, 0x63d0, 0x7124, 0x695a, 0xa192, 0x0021, 0x00c8,
+	0x63c4, 0x2071, 0x7b98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d,
+	0x1078, 0x6727, 0x0078, 0x63d0, 0x7838, 0xd0fc, 0x0040, 0x63cd,
+	0x2009, 0x0020, 0x695a, 0x0078, 0x63b9, 0x2d78, 0x1078, 0x66bf,
+	0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x0f7e, 0x6003, 0x0003,
+	0x2079, 0x7b8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078,
+	0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x19cf,
+	0x1078, 0x5567, 0x007c, 0x0d7e, 0x6003, 0x0002, 0x1078, 0x4c29,
+	0x1078, 0x4d3a, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040, 0x644b,
+	0xd1cc, 0x0040, 0x6426, 0x6948, 0x6838, 0xd0fc, 0x0040, 0x641e,
+	0x017e, 0x684c, 0x007e, 0x6850, 0x007e, 0xad90, 0x000d, 0xa198,
+	0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318,
+	0x8210, 0x00f0, 0x640d, 0x157f, 0x007f, 0x6852, 0x007f, 0x684e,
+	0x017f, 0x2168, 0x1078, 0x1358, 0x0078, 0x6449, 0x017e, 0x1078,
+	0x1358, 0x0d7f, 0x1078, 0x6714, 0x0078, 0x6449, 0x6837, 0x0103,
+	0x6944, 0xa184, 0x00ff, 0xa186, 0x0002, 0x0040, 0x6445, 0xa086,
+	0x0028, 0x00c0, 0x6437, 0x684b, 0x001c, 0x0078, 0x6447, 0xd1dc,
+	0x0040, 0x643e, 0x684b, 0x0015, 0x0078, 0x6447, 0xd1d4, 0x0040,
+	0x6445, 0x684b, 0x0007, 0x0078, 0x6447, 0x684b, 0x0000, 0x1078,
+	0x3a7a, 0x1078, 0x5c02, 0x0d7f, 0x007c, 0x6003, 0x0002, 0x1078,
+	0x4c29, 0x1078, 0x4d3a, 0x007c, 0x1078, 0x4c29, 0x1078, 0x22bb,
+	0x0d7e, 0x6110, 0x2168, 0x1078, 0x693e, 0x0040, 0x6467, 0x6837,
+	0x0103, 0x684b, 0x0029, 0x1078, 0x3a7a, 0x1078, 0x6a94, 0x0d7f,
+	0x1078, 0x5c02, 0x1078, 0x4d3a, 0x007c, 0x684b, 0x0015, 0xd1fc,
+	0x0040, 0x6479, 0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189,
+	0x0000, 0x6962, 0x685e, 0x007c, 0xa182, 0x0040, 0x0079, 0x6480,
+	0x6490, 0x6490, 0x6490, 0x6490, 0x6490, 0x6492, 0x6490, 0x6536,
+	0x653e, 0x6490, 0x6490, 0x6490, 0x6490, 0x6490, 0x6490, 0x6490,
+	0x1078, 0x12d5, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0x7b8c,
+	0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5,
+	0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040,
+	0x6528, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0040, 0x64b3, 0x7018,
+	0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0040, 0x6525, 0x1078,
+	0x132f, 0x1040, 0x12d5, 0x2d00, 0x784a, 0x7f4c, 0xa7bd, 0x0200,
+	0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, 0x683e, 0x7840,
+	0x6842, 0x6e46, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x64ee,
+	0xa186, 0x0028, 0x00c0, 0x64d8, 0x684b, 0x001c, 0x0078, 0x64f0,
+	0xd6dc, 0x0040, 0x64e3, 0x684b, 0x0015, 0x7318, 0x6b62, 0x731c,
+	0x6b5e, 0x0078, 0x64f0, 0xd6d4, 0x0040, 0x64ee, 0x684b, 0x0007,
+	0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x64f0, 0x684b, 0x0000,
+	0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040,
+	0x6505, 0x7328, 0x732c, 0x6b56, 0x037e, 0x2308, 0x2019, 0x7b98,
+	0xad90, 0x0019, 0x1078, 0x6727, 0x037f, 0xd6cc, 0x0040, 0x6525,
+	0x7124, 0x695a, 0xa192, 0x0021, 0x00c8, 0x6519, 0x2071, 0x7b98,
+	0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x6727, 0x0078,
+	0x6525, 0x7838, 0xd0fc, 0x0040, 0x6522, 0x2009, 0x0020, 0x695a,
+	0x0078, 0x650e, 0x2d78, 0x1078, 0x66bf, 0xd6dc, 0x00c0, 0x652b,
+	0xa006, 0x0078, 0x652f, 0x2001, 0x0001, 0x7218, 0x731c, 0x1078,
+	0x15b6, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x20e1, 0x0005,
+	0x3d18, 0x3e20, 0x2c10, 0x1078, 0x1572, 0x007c, 0x0d7e, 0x6003,
+	0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040, 0x65a5, 0xd1cc,
+	0x0040, 0x6575, 0x6948, 0x6838, 0xd0fc, 0x0040, 0x656d, 0x017e,
+	0x684c, 0x007e, 0x6850, 0x007e, 0xad90, 0x000d, 0xa198, 0x000d,
+	0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210,
+	0x00f0, 0x655c, 0x157f, 0x007f, 0x6852, 0x007f, 0x684e, 0x017f,
+	0x2168, 0x1078, 0x1358, 0x0078, 0x65a3, 0x017e, 0x1078, 0x1358,
+	0x0d7f, 0x1078, 0x6714, 0x0078, 0x65a3, 0x6837, 0x0103, 0x6944,
+	0xa184, 0x00ff, 0xa186, 0x0002, 0x0040, 0x6594, 0xa086, 0x0028,
+	0x00c0, 0x6586, 0x684b, 0x001c, 0x0078, 0x65a1, 0xd1dc, 0x0040,
+	0x658d, 0x684b, 0x0015, 0x0078, 0x65a1, 0xd1d4, 0x0040, 0x6594,
+	0x684b, 0x0007, 0x0078, 0x65a1, 0x684b, 0x0000, 0x684c, 0xd0ac,
+	0x0040, 0x65a1, 0x6810, 0x6914, 0xa115, 0x0040, 0x65a1, 0x1078,
+	0x646d, 0x1078, 0x3a7a, 0x1078, 0x5c02, 0x0d7f, 0x007c, 0x1078,
+	0x4b81, 0x0078, 0x65ad, 0x1078, 0x4c29, 0x1078, 0x693e, 0x0040,
+	0x65c4, 0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0x760c,
+	0x210c, 0xd18c, 0x00c0, 0x65cd, 0xd184, 0x00c0, 0x65c9, 0x6108,
+	0x694a, 0x1078, 0x3a7a, 0x0d7f, 0x1078, 0x5c02, 0x1078, 0x4c7a,
+	0x007c, 0x684b, 0x0004, 0x0078, 0x65c1, 0x684b, 0x0004, 0x0078,
+	0x65c1, 0xa182, 0x0040, 0x0079, 0x65d5, 0x65e5, 0x65e5, 0x65e5,
+	0x65e5, 0x65e5, 0x65e7, 0x65e5, 0x65ea, 0x65e5, 0x65e5, 0x65e5,
+	0x65e5, 0x65e5, 0x65e5, 0x65e5, 0x65e5, 0x1078, 0x12d5, 0x1078,
+	0x5c02, 0x007c, 0x007e, 0x027e, 0xa016, 0x1078, 0x1572, 0x027f,
+	0x007f, 0x007c, 0xa182, 0x0085, 0x0079, 0x65f6, 0x65ff, 0x65fd,
+	0x65fd, 0x65fd, 0x65fd, 0x65fd, 0x65fd, 0x1078, 0x12d5, 0x6003,
+	0x0001, 0x6106, 0x1078, 0x4825, 0x127e, 0x2091, 0x8000, 0x1078,
+	0x4c7a, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x6615, 0x6004,
+	0xa082, 0x0085, 0x2008, 0x0079, 0x6649, 0xa186, 0x0027, 0x00c0,
+	0x6636, 0x1078, 0x4b81, 0x1078, 0x22bb, 0x0d7e, 0x6010, 0x2068,
+	0x1078, 0x693e, 0x0040, 0x662c, 0x6837, 0x0103, 0x684b, 0x0029,
+	0x1078, 0x3a7a, 0x1078, 0x6a94, 0x0d7f, 0x1078, 0x5c02, 0x1078,
+	0x4c7a, 0x007c, 0x1078, 0x5c37, 0x0078, 0x6631, 0xa186, 0x0014,
+	0x00c0, 0x6632, 0x1078, 0x4b81, 0x0d7e, 0x6010, 0x2068, 0x1078,
+	0x693e, 0x0040, 0x662c, 0x6837, 0x0103, 0x684b, 0x0006, 0x0078,
+	0x6628, 0x6652, 0x6650, 0x6650, 0x6650, 0x6650, 0x6650, 0x665b,
+	0x1078, 0x12d5, 0x1078, 0x4b81, 0x6017, 0x0014, 0x6003, 0x000c,
+	0x1078, 0x4c7a, 0x007c, 0x1078, 0x4b81, 0x6017, 0x0014, 0x6003,
+	0x000e, 0x1078, 0x4c7a, 0x007c, 0xa182, 0x008c, 0x00c8, 0x666e,
+	0xa182, 0x0085, 0x0048, 0x666e, 0x0079, 0x6671, 0x1078, 0x5c37,
+	0x007c, 0x6678, 0x6678, 0x6678, 0x6678, 0x667a, 0x6699, 0x6678,
+	0x1078, 0x12d5, 0x0d7e, 0x1078, 0x6a94, 0x1078, 0x693e, 0x0040,
+	0x6695, 0x6010, 0x2068, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040,
+	0x668d, 0x684b, 0x0006, 0x0078, 0x6691, 0x684b, 0x0005, 0x1078,
+	0x6b47, 0x6847, 0x0000, 0x1078, 0x3a7a, 0x1078, 0x5c02, 0x0d7f,
+	0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040, 0x66b4,
+	0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x66aa, 0x684b, 0x0006,
+	0x0078, 0x66ae, 0x684b, 0x0005, 0x1078, 0x6b47, 0x6847, 0x0000,
+	0x1078, 0x3a7a, 0x1078, 0x6a94, 0x0d7f, 0x1078, 0x5c02, 0x007c,
+	0x1078, 0x4b81, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c, 0x057e,
+	0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001, 0xa182, 0x0101, 0x00c8,
+	0x66cb, 0x0078, 0x66cd, 0x2009, 0x0100, 0x2130, 0x2069, 0x7b98,
+	0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90, 0x001d, 0x1078,
+	0x6727, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0040, 0x66e1, 0x1078,
+	0x1358, 0x1078, 0x132f, 0x0040, 0x670b, 0x8528, 0x6837, 0x0110,
+	0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, 0x003d, 0x00c8, 0x66f7,
+	0x2608, 0xad90, 0x000f, 0x1078, 0x6727, 0x0078, 0x670b, 0xa6b2,
+	0x003c, 0x2009, 0x003c, 0x2d78, 0xad90, 0x000f, 0x1078, 0x6727,
+	0x0078, 0x66e1, 0x0f7f, 0x852f, 0xa5ad, 0x0003, 0x7d36, 0xa5ac,
+	0x0000, 0x0078, 0x6710, 0x0f7f, 0x852f, 0xa5ad, 0x0003, 0x7d36,
+	0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e, 0x8dff, 0x0040, 0x6725,
+	0x6804, 0xa07d, 0x0040, 0x6723, 0x6807, 0x0000, 0x1078, 0x3a7a,
+	0x2f68, 0x0078, 0x6718, 0x1078, 0x3a7a, 0x0f7f, 0x007c, 0x157e,
+	0xa184, 0x0001, 0x0040, 0x672d, 0x8108, 0x810c, 0x21a8, 0x2304,
+	0x8007, 0x2012, 0x8318, 0x8210, 0x00f0, 0x672f, 0x157f, 0x007c,
+	0x127e, 0x2091, 0x8000, 0x601c, 0xa084, 0x000f, 0x1079, 0x6742,
+	0x127f, 0x007c, 0x6751, 0x674a, 0x674c, 0x676a, 0x674a, 0x674c,
+	0x674c, 0x674c, 0x1078, 0x12d5, 0xa006, 0x007c, 0xa085, 0x0001,
+	0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040, 0x6767,
+	0xa00e, 0x2001, 0x0005, 0x1078, 0x3b0a, 0x1078, 0x6b47, 0x1078,
+	0x3a7a, 0x1078, 0x5c02, 0xa085, 0x0001, 0x0d7f, 0x007c, 0xa006,
+	0x0078, 0x6765, 0x6000, 0xa08a, 0x0010, 0x10c8, 0x12d5, 0x1079,
+	0x6772, 0x007c, 0x6782, 0x679f, 0x6784, 0x67b0, 0x679b, 0x6782,
+	0x674c, 0x6751, 0x6751, 0x674c, 0x674c, 0x674c, 0x674c, 0x674c,
+	0x674c, 0x674c, 0x1078, 0x12d5, 0x0d7e, 0x6010, 0x2068, 0x1078,
+	0x693e, 0x0040, 0x678d, 0x1078, 0x6b47, 0x0d7f, 0x6007, 0x0085,
+	0x6003, 0x000b, 0x601f, 0x0002, 0x1078, 0x4825, 0x1078, 0x4c7a,
+	0xa085, 0x0001, 0x007c, 0x1078, 0x1676, 0x0078, 0x6784, 0x0e7e,
+	0x2071, 0x7836, 0x7024, 0xac06, 0x00c0, 0x67a8, 0x1078, 0x56d6,
+	0x1078, 0x560b, 0x0e7f, 0x00c0, 0x6784, 0x1078, 0x674c, 0x007c,
+	0x037e, 0x0e7e, 0x2071, 0x7836, 0x703c, 0xac06, 0x00c0, 0x67c0,
+	0x2019, 0x0000, 0x1078, 0x5768, 0x0e7f, 0x037f, 0x0078, 0x6784,
+	0x1078, 0x5a44, 0x0e7f, 0x037f, 0x00c0, 0x6784, 0x1078, 0x674c,
+	0x007c, 0x0c7e, 0x601c, 0xa084, 0x000f, 0x1079, 0x67d1, 0x0c7f,
+	0x007c, 0x67e0, 0x683d, 0x68e2, 0x67e4, 0x67e0, 0x67e0, 0x71dd,
+	0x5c02, 0x683d, 0x1078, 0x6ace, 0x00c0, 0x67e0, 0x1078, 0x5e57,
+	0x007c, 0x6017, 0x0001, 0x007c, 0x6000, 0xa08a, 0x0010, 0x10c8,
+	0x12d5, 0x1079, 0x67ec, 0x007c, 0x67fc, 0x67fe, 0x681e, 0x6830,
+	0x6830, 0x67fc, 0x67e0, 0x67e0, 0x67e0, 0x6830, 0x6830, 0x67fc,
+	0x67fc, 0x67fc, 0x67fc, 0x683a, 0x1078, 0x12d5, 0x0e7e, 0x6010,
+	0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, 0x7836, 0x7024, 0xac06,
+	0x0040, 0x681a, 0x1078, 0x560b, 0x6007, 0x0085, 0x6003, 0x000b,
+	0x601f, 0x0002, 0x6017, 0x0014, 0x1078, 0x4825, 0x1078, 0x4c7a,
+	0x0e7f, 0x007c, 0x6017, 0x0001, 0x0078, 0x6818, 0x0d7e, 0x6010,
+	0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x6007, 0x0085, 0x6003,
+	0x000b, 0x601f, 0x0002, 0x1078, 0x4825, 0x1078, 0x4c7a, 0x007c,
+	0x0d7e, 0x6017, 0x0001, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852,
+	0x0d7f, 0x007c, 0x1078, 0x5c02, 0x007c, 0x6000, 0xa08a, 0x0010,
+	0x10c8, 0x12d5, 0x1079, 0x6845, 0x007c, 0x6855, 0x67e1, 0x6857,
+	0x6855, 0x6857, 0x6855, 0x6855, 0x6855, 0x67da, 0x67da, 0x6855,
+	0x6855, 0x6855, 0x6855, 0x6855, 0x6855, 0x1078, 0x12d5, 0x0d7e,
+	0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f, 0xa08a, 0x000c,
+	0x10c8, 0x12d5, 0x1079, 0x6865, 0x007c, 0x6871, 0x6890, 0x6871,
+	0x6890, 0x6871, 0x6890, 0x6873, 0x687c, 0x6871, 0x6890, 0x6871,
+	0x6889, 0x1078, 0x12d5, 0x6004, 0xa08e, 0x0004, 0x0040, 0x688b,
+	0xa08e, 0x0002, 0x0040, 0x688b, 0x6004, 0x1078, 0x6ace, 0x0040,
+	0x68da, 0xa08e, 0x0021, 0x0040, 0x68de, 0xa08e, 0x0022, 0x0040,
+	0x68da, 0x1078, 0x22bb, 0x1078, 0x5e57, 0x1078, 0x5c02, 0x007c,
+	0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016, 0x0040, 0x68ca, 0xa186,
+	0x0002, 0x00c0, 0x68b9, 0x6018, 0x2068, 0x68a0, 0xd0bc, 0x00c0,
+	0x68b9, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040, 0x68b9, 0x8001,
+	0x6842, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x1078,
+	0x5b9c, 0x0040, 0x68b9, 0x2d00, 0x601a, 0x601f, 0x0001, 0x0078,
+	0x68ca, 0x0d7f, 0x0c7f, 0x1078, 0x5e57, 0x1078, 0x22bb, 0x0e7e,
+	0x127e, 0x2091, 0x8000, 0x1078, 0x22dd, 0x127f, 0x0e7f, 0x1078,
+	0x5c02, 0x007c, 0x2001, 0x0002, 0x1078, 0x37d1, 0x6003, 0x0001,
+	0x6007, 0x0002, 0x1078, 0x4872, 0x1078, 0x4c7a, 0x0d7f, 0x0c7f,
+	0x0078, 0x68c9, 0x1078, 0x5e57, 0x0078, 0x688d, 0x1078, 0x5e66,
+	0x0078, 0x688d, 0x6000, 0xa08a, 0x0010, 0x10c8, 0x12d5, 0x1079,
+	0x68ea, 0x007c, 0x68fa, 0x68fa, 0x68fa, 0x68fa, 0x68fa, 0x68fa,
+	0x68fa, 0x68fa, 0x68fa, 0x67e0, 0x68fa, 0x67e1, 0x68fc, 0x67e1,
+	0x6905, 0x68fa, 0x1078, 0x12d5, 0x6007, 0x008b, 0x6003, 0x000d,
+	0x1078, 0x4825, 0x1078, 0x4c7a, 0x007c, 0x1078, 0x6a94, 0x1078,
+	0x693e, 0x0040, 0x6927, 0x1078, 0x22bb, 0x0d7e, 0x1078, 0x693e,
+	0x0040, 0x691a, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b, 0x0006,
+	0x1078, 0x3a7a, 0x0d7f, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003,
+	0x0001, 0x1078, 0x4872, 0x1078, 0x4c7a, 0x0078, 0x6929, 0x1078,
+	0x5c02, 0x007c, 0xa284, 0x0007, 0x00c0, 0x693b, 0xa282, 0x7d00,
+	0x0048, 0x693b, 0x2001, 0x7615, 0x2004, 0xa202, 0x00c8, 0x693b,
+	0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x693a, 0x027e, 0x0e7e,
+	0x2071, 0x7600, 0x6210, 0x7058, 0xa202, 0x0048, 0x6950, 0x705c,
+	0xa202, 0x00c8, 0x6950, 0xa085, 0x0001, 0x0e7f, 0x027f, 0x007c,
+	0xa006, 0x0078, 0x694d, 0x0e7e, 0x0c7e, 0x037e, 0x007e, 0x127e,
+	0x2091, 0x8000, 0x2061, 0x7d00, 0x2071, 0x7600, 0x7344, 0x7060,
+	0xa302, 0x00c8, 0x6979, 0x601c, 0xa206, 0x00c0, 0x6971, 0x1078,
+	0x6ace, 0x00c0, 0x696d, 0x1078, 0x5e57, 0x0c7e, 0x1078, 0x5c02,
+	0x0c7f, 0xace0, 0x0008, 0x7054, 0xac02, 0x00c8, 0x6979, 0x0078,
+	0x695e, 0x127f, 0x007f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e,
+	0x0c7e, 0x017e, 0xa188, 0x7720, 0x210c, 0x81ff, 0x0040, 0x699c,
+	0x2061, 0x7d00, 0x2071, 0x7600, 0x7344, 0x7060, 0xa302, 0x00c8,
+	0x699c, 0x017e, 0x1078, 0x5b9c, 0x017f, 0x0040, 0x699f, 0x611a,
+	0x1078, 0x22bb, 0x1078, 0x5c02, 0xa006, 0x0078, 0x69a1, 0xa085,
+	0x0001, 0x017f, 0x0c7f, 0x0e7f, 0x007c, 0x0c7e, 0x057e, 0x127e,
+	0x2091, 0x8000, 0x0c7e, 0x1078, 0x5b9c, 0x057f, 0x0040, 0x69be,
+	0x6612, 0x651a, 0x601f, 0x0003, 0x2009, 0x004b, 0x1078, 0x5c29,
+	0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078,
+	0x69ba, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e,
+	0x1078, 0x5b9c, 0x057f, 0x0040, 0x69e8, 0x6013, 0x0000, 0x651a,
+	0x601f, 0x0003, 0x0c7e, 0x2560, 0x1078, 0x39a6, 0x0c7f, 0x1078,
+	0x4962, 0x1078, 0x48a5, 0x2c08, 0x1078, 0x737b, 0x2009, 0x004c,
+	0x1078, 0x5c29, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c,
+	0xa006, 0x0078, 0x69e4, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000,
+	0x62a0, 0x0c7e, 0x1078, 0x5b9c, 0x057f, 0x0040, 0x6a13, 0x6612,
+	0x651a, 0x601f, 0x0003, 0x2019, 0x0005, 0x0c7e, 0x2560, 0x1078,
+	0x39a6, 0x0c7f, 0x1078, 0x4962, 0x1078, 0x48a5, 0x2c08, 0x1078,
+	0x737b, 0x2009, 0x004d, 0x1078, 0x5c29, 0xa085, 0x0001, 0x127f,
+	0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6a0f, 0x0c7e, 0x057e,
+	0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x5b9c, 0x057f,
+	0x0040, 0x6a3e, 0x6612, 0x651a, 0x601f, 0x0003, 0x2019, 0x0005,
+	0x0c7e, 0x2560, 0x1078, 0x39a6, 0x0c7f, 0x1078, 0x4962, 0x1078,
+	0x48a5, 0x2c08, 0x1078, 0x737b, 0x2009, 0x004e, 0x1078, 0x5c29,
+	0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078,
+	0x6a3a, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x5b9c,
+	0x017f, 0x0040, 0x6a5a, 0x660a, 0x611a, 0x601f, 0x0001, 0x2d00,
+	0x6012, 0x2009, 0x001f, 0x1078, 0x5c29, 0xa085, 0x0001, 0x127f,
+	0x0c7f, 0x007c, 0xa006, 0x0078, 0x6a57, 0x0c7e, 0x127e, 0x2091,
+	0x8000, 0x0c7e, 0x1078, 0x5b9c, 0x017f, 0x0040, 0x6a76, 0x660a,
+	0x611a, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, 0x1078,
+	0x5c29, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078,
+	0x6a73, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x5b9c,
+	0x017f, 0x0040, 0x6a91, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012,
+	0x2009, 0x0000, 0x1078, 0x5c29, 0xa085, 0x0001, 0x127f, 0x0c7f,
+	0x007c, 0xa006, 0x0078, 0x6a8e, 0x027e, 0x0d7e, 0x6218, 0x2268,
+	0x6a3c, 0x82ff, 0x0040, 0x6a9e, 0x8211, 0x6a3e, 0x0d7f, 0x027f,
+	0x007c, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0014, 0x007c,
+	0x067e, 0x0c7e, 0x0d7e, 0x2031, 0x7652, 0x2634, 0xd6e4, 0x0040,
+	0x6ab6, 0x6618, 0x2660, 0x6e44, 0x1078, 0x38de, 0x0d7f, 0x0c7f,
+	0x067f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, 0x0002, 0x0040,
+	0x6acb, 0xa08e, 0x0003, 0x0040, 0x6acb, 0xa08e, 0x0004, 0x0040,
+	0x6acb, 0xa085, 0x0001, 0x017f, 0x007f, 0x007c, 0x007e, 0x017e,
+	0x6004, 0xa08e, 0x0000, 0x0040, 0x6ae3, 0xa08e, 0x001f, 0x0040,
+	0x6ae3, 0xa08e, 0x0028, 0x0040, 0x6ae3, 0xa08e, 0x0029, 0x0040,
+	0x6ae3, 0xa085, 0x0001, 0x017f, 0x007f, 0x007c, 0x0c7e, 0x127e,
+	0x2091, 0x8000, 0x0c7e, 0x1078, 0x5b9c, 0x017f, 0x0040, 0x6b00,
+	0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x1078, 0x22bb, 0x2009,
+	0x0028, 0x1078, 0x5c29, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c,
+	0xa006, 0x0078, 0x6afd, 0xa186, 0x0015, 0x00c0, 0x6b18, 0x2011,
+	0x761e, 0x2204, 0xa086, 0x0074, 0x00c0, 0x6b18, 0x1078, 0x60d4,
+	0x6003, 0x0001, 0x6007, 0x0029, 0x1078, 0x4872, 0x0078, 0x6b1c,
+	0x1078, 0x5e57, 0x1078, 0x5c02, 0x007c, 0xa186, 0x0015, 0x00c0,
+	0x6b3a, 0x2011, 0x761e, 0x2204, 0xa086, 0x0014, 0x00c0, 0x6b3a,
+	0x0d7e, 0x6018, 0x2068, 0x1078, 0x38a1, 0x0d7f, 0x1078, 0x60de,
+	0x00c0, 0x6b3a, 0x2001, 0x0006, 0x1078, 0x37d1, 0x1078, 0x5cad,
+	0x0078, 0x6b3e, 0x1078, 0x5e57, 0x1078, 0x5c02, 0x007c, 0x6848,
+	0xa086, 0x0005, 0x00c0, 0x6b46, 0x1078, 0x6b47, 0x007c, 0x6850,
+	0xc0ad, 0x6852, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
+	0x12d5, 0x1079, 0x6b55, 0x067f, 0x007c, 0x6b65, 0x6d3c, 0x6e1d,
+	0x6b65, 0x6b65, 0x6b65, 0x6b65, 0x6b65, 0x6b9f, 0x6e8b, 0x6b65,
+	0x6b65, 0x6b65, 0x6b65, 0x6b65, 0x6b65, 0x1078, 0x12d5, 0x067e,
+	0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12d5, 0x1079, 0x6b71, 0x067f,
+	0x007c, 0x6b81, 0x718c, 0x6b81, 0x6b81, 0x6b81, 0x6b81, 0x6b81,
+	0x6b81, 0x7167, 0x71d6, 0x6b81, 0x6b81, 0x6b81, 0x6b81, 0x6b81,
+	0x6b81, 0x1078, 0x12d5, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
+	0x12d5, 0x1079, 0x6b8d, 0x067f, 0x007c, 0x6b9d, 0x6fd8, 0x704a,
+	0x706c, 0x70b8, 0x6b9d, 0x6b9d, 0x7112, 0x6e97, 0x714f, 0x7153,
+	0x6b9d, 0x6b9d, 0x6b9d, 0x6b9d, 0x6b9d, 0x1078, 0x12d5, 0xa1b2,
+	0x0030, 0x10c8, 0x12d5, 0x2100, 0x0079, 0x6ba6, 0x6bd6, 0x6cb3,
+	0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6,
+	0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6,
+	0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd8, 0x6c07, 0x6c12,
+	0x6c3a, 0x6c40, 0x6c74, 0x6cac, 0x6bd6, 0x6bd6, 0x6cbb, 0x6bd6,
+	0x6bd6, 0x6cc2, 0x6cc9, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6,
+	0x6ce6, 0x6bd6, 0x6bd6, 0x6cf1, 0x6bd6, 0x6bd6, 0x1078, 0x12d5,
+	0x1078, 0x3a26, 0x6618, 0x0c7e, 0x2660, 0x1078, 0x3837, 0x0c7f,
+	0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048,
+	0x6bf9, 0x1078, 0x72b7, 0x00c0, 0x6c34, 0x1078, 0x7255, 0x00c0,
+	0x6bf5, 0x6007, 0x0008, 0x0078, 0x6cae, 0x6007, 0x0009, 0x0078,
+	0x6cae, 0x1078, 0x744c, 0x0040, 0x6c03, 0x1078, 0x72b7, 0x0040,
+	0x6bed, 0x0078, 0x6c34, 0x6013, 0x1900, 0x0078, 0x6bf5, 0x6106,
+	0x1078, 0x7217, 0x6007, 0x0006, 0x0078, 0x6cae, 0x6007, 0x0007,
+	0x0078, 0x6cae, 0x0d7e, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00,
+	0x8637, 0xa686, 0x0006, 0x0040, 0x6c24, 0xa686, 0x0004, 0x0040,
+	0x6c24, 0x0d7f, 0x0078, 0x6c34, 0x1078, 0x7315, 0x00c0, 0x6c2f,
+	0x1078, 0x38a1, 0x6007, 0x000a, 0x0d7f, 0x0078, 0x6cae, 0x6007,
+	0x000b, 0x0d7f, 0x0078, 0x6cae, 0x1078, 0x22bb, 0x6007, 0x0001,
+	0x0078, 0x6cae, 0x1078, 0x22bb, 0x6007, 0x000c, 0x0078, 0x6cae,
+	0x1078, 0x3a26, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff,
+	0xa082, 0x0006, 0x0048, 0x6c61, 0xa6b4, 0xff00, 0x8637, 0xa686,
+	0x0006, 0x00c0, 0x6c34, 0x1078, 0x7324, 0x00c0, 0x6c5b, 0x6007,
+	0x000e, 0x0078, 0x6cae, 0x1078, 0x22bb, 0x6007, 0x000f, 0x0078,
+	0x6cae, 0x1078, 0x744c, 0x0040, 0x6c6e, 0xa6b4, 0xff00, 0x8637,
+	0xa686, 0x0006, 0x0040, 0x6c53, 0x0078, 0x6c34, 0x6013, 0x1900,
+	0x6007, 0x0009, 0x0078, 0x6cae, 0x1078, 0x3a26, 0x6618, 0xa6b0,
+	0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x6c99,
+	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x00c0, 0x6c34, 0x1078,
+	0x734f, 0x00c0, 0x6c93, 0x1078, 0x7255, 0x00c0, 0x6c93, 0x6007,
+	0x0010, 0x0078, 0x6cae, 0x1078, 0x22bb, 0x6007, 0x0011, 0x0078,
+	0x6cae, 0x1078, 0x744c, 0x0040, 0x6ca6, 0xa6b4, 0xff00, 0x8637,
+	0xa686, 0x0006, 0x0040, 0x6c87, 0x0078, 0x6c34, 0x6013, 0x1900,
+	0x6007, 0x0009, 0x0078, 0x6cae, 0x6007, 0x0012, 0x6003, 0x0001,
+	0x1078, 0x4872, 0x007c, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078,
+	0x4872, 0x0078, 0x6cb2, 0x6007, 0x0020, 0x6003, 0x0001, 0x1078,
+	0x4872, 0x007c, 0x6007, 0x0023, 0x6003, 0x0001, 0x1078, 0x4872,
+	0x007c, 0x017e, 0x027e, 0x2011, 0x7b88, 0x2214, 0x2c08, 0x1078,
+	0x7514, 0x00c0, 0x6cda, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700,
+	0x0078, 0x6cdf, 0x1078, 0x5c02, 0x2160, 0x6007, 0x0025, 0x6003,
+	0x0001, 0x1078, 0x4872, 0x027f, 0x017f, 0x007c, 0x6106, 0x1078,
+	0x6cf8, 0x6007, 0x002b, 0x0078, 0x6cae, 0x6007, 0x002c, 0x0078,
+	0x6cae, 0x6106, 0x1078, 0x6cfd, 0x6007, 0x002e, 0x0078, 0x6cae,
+	0x0d7e, 0x1078, 0x6d23, 0x0d7f, 0x007c, 0x0d7e, 0x1078, 0x6d32,
+	0x00c0, 0x6d1c, 0x680c, 0xa08c, 0xff00, 0x6824, 0xa084, 0x00ff,
+	0xa115, 0x6212, 0xd1e4, 0x0040, 0x6d11, 0x2009, 0x0001, 0x0078,
+	0x6d18, 0xd1ec, 0x0040, 0x6d1c, 0x2009, 0x0000, 0xa294, 0x00ff,
+	0x1078, 0x22ff, 0x0078, 0x6d20, 0xa085, 0x0001, 0x0078, 0x6d21,
+	0xa006, 0x0d7f, 0x007c, 0x2069, 0x7b8d, 0x6800, 0xa082, 0x0010,
+	0x00c8, 0x6d30, 0x6013, 0x0000, 0xa085, 0x0001, 0x0078, 0x6d31,
+	0xa006, 0x007c, 0x6013, 0x0000, 0x2069, 0x7b8c, 0x6808, 0xa084,
+	0xff00, 0xa086, 0x0800, 0x007c, 0x6004, 0xa0b2, 0x0030, 0x10c8,
+	0x12d5, 0xa1b6, 0x0013, 0x00c0, 0x6d48, 0x2008, 0x0079, 0x6d5b,
+	0xa1b6, 0x0027, 0x0040, 0x6d50, 0xa1b6, 0x0014, 0x10c0, 0x12d5,
+	0x2001, 0x0007, 0x1078, 0x37df, 0x1078, 0x4b81, 0x1078, 0x6aa1,
+	0x1078, 0x4c7a, 0x007c, 0x6d8b, 0x6d8d, 0x6d8b, 0x6d8b, 0x6d8b,
+	0x6d8d, 0x6d95, 0x6df8, 0x6dbb, 0x6df8, 0x6dcf, 0x6df8, 0x6d95,
+	0x6df8, 0x6df0, 0x6df8, 0x6df0, 0x6df8, 0x6df8, 0x6d8b, 0x6d8b,
+	0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b,
+	0x6d8b, 0x6d8b, 0x6d8b, 0x6df8, 0x6d8b, 0x6d8b, 0x6df8, 0x6d8b,
+	0x6df8, 0x6df8, 0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b, 0x6df8, 0x6df8,
+	0x6d8b, 0x6df8, 0x6df8, 0x1078, 0x12d5, 0x1078, 0x4b81, 0x6003,
+	0x0002, 0x1078, 0x4c7a, 0x0078, 0x6dfe, 0x0f7e, 0x2079, 0x7651,
+	0x7804, 0x0f7f, 0xd0ac, 0x00c0, 0x6df8, 0x2001, 0x0000, 0x1078,
+	0x37bd, 0x2001, 0x0002, 0x1078, 0x37d1, 0x1078, 0x4b81, 0x601f,
+	0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x4872, 0x1078,
+	0x4c7a, 0x0c7e, 0x6118, 0x2160, 0x2009, 0x0001, 0x1078, 0x457b,
+	0x0c7f, 0x0078, 0x6dfe, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f,
+	0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x6df8, 0xa686,
+	0x0004, 0x0040, 0x6df8, 0x2001, 0x0004, 0x0078, 0x6df6, 0x2001,
+	0x7600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x6dd8, 0x1078, 0x2dc8,
+	0x2001, 0x0006, 0x1078, 0x6dff, 0x6618, 0x0d7e, 0x2668, 0x6e04,
+	0x0d7f, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x6df8,
+	0x2001, 0x0006, 0x0078, 0x6df6, 0x2001, 0x0004, 0x0078, 0x6df6,
+	0x2001, 0x0006, 0x1078, 0x6dff, 0x0078, 0x6df8, 0x1078, 0x37df,
+	0x1078, 0x4b81, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c, 0x017e,
+	0x0d7e, 0x6118, 0x2168, 0x6900, 0xd184, 0x0040, 0x6e1a, 0x6104,
+	0xa18e, 0x000a, 0x00c0, 0x6e12, 0x699c, 0xd1a4, 0x00c0, 0x6e12,
+	0x2001, 0x0007, 0x1078, 0x37d1, 0x2001, 0x0000, 0x1078, 0x37bd,
+	0x1078, 0x22dd, 0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668,
+	0x6804, 0xa084, 0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8,
+	0x12d5, 0xa1b6, 0x0015, 0x00c0, 0x6e31, 0x1079, 0x6e38, 0x0078,
+	0x6e37, 0xa1b6, 0x0016, 0x10c0, 0x12d5, 0x1079, 0x6e70, 0x007c,
+	0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x6e44,
+	0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x0f7e, 0x2079, 0x7651, 0x7804,
+	0x0f7f, 0xd0ac, 0x00c0, 0x6e60, 0x2001, 0x0000, 0x1078, 0x37bd,
+	0x2001, 0x0002, 0x1078, 0x37d1, 0x601f, 0x0001, 0x6003, 0x0001,
+	0x6007, 0x0002, 0x1078, 0x4872, 0x1078, 0x4c7a, 0x0078, 0x6e6f,
+	0x2011, 0x7b83, 0x220c, 0x017e, 0x0c7e, 0x1078, 0x3825, 0x00c0,
+	0x6e6f, 0x1078, 0x3621, 0x0c7f, 0x017f, 0x1078, 0x5c02, 0x007c,
+	0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x6e7c,
+	0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x1078, 0x60d1, 0x00c0, 0x6e88,
+	0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x4872, 0x0078, 0x6e8a,
+	0x1078, 0x5c02, 0x007c, 0x6004, 0xa08a, 0x0030, 0x10c8, 0x12d5,
+	0x1078, 0x4b81, 0x1078, 0x6aa1, 0x1078, 0x4c7a, 0x007c, 0xa182,
+	0x0040, 0x0079, 0x6e9b, 0x6eab, 0x6eab, 0x6eab, 0x6eab, 0x6ead,
+	0x6eab, 0x6eab, 0x6eab, 0x6eab, 0x6eab, 0x6eab, 0x6eab, 0x6eab,
+	0x6eab, 0x6eab, 0x6eab, 0x1078, 0x12d5, 0x0d7e, 0x0e7e, 0x0f7e,
+	0x157e, 0x047e, 0x027e, 0x6106, 0x2071, 0x7b80, 0x7444, 0xa4a4,
+	0xe600, 0x0040, 0x6f1e, 0xa486, 0x2000, 0x0040, 0x6edd, 0xa486,
+	0x0400, 0x0040, 0x6edd, 0x7130, 0xa18c, 0x00ff, 0xa182, 0x0010,
+	0x00c8, 0x6fb0, 0x0c7e, 0x1078, 0x460c, 0x2c68, 0x0c7f, 0x6a00,
+	0xa284, 0x0001, 0x0040, 0x6f91, 0x1078, 0x46ca, 0x0040, 0x6fbc,
+	0xa295, 0x0200, 0x6a02, 0x0078, 0x6ee3, 0x2009, 0x0001, 0x2011,
+	0x0200, 0x1078, 0x46b4, 0x1078, 0x132f, 0x1040, 0x12d5, 0x6003,
+	0x0007, 0x2d00, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000,
+	0x6c5a, 0x2c00, 0x685e, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130,
+	0xa18c, 0x00ff, 0xa10d, 0x6946, 0x684f, 0x0000, 0x6857, 0x0036,
+	0x1078, 0x3a7a, 0xa486, 0x2000, 0x00c0, 0x6f0c, 0x2019, 0x0017,
+	0x1078, 0x74d9, 0x0078, 0x6f7e, 0xa486, 0x0400, 0x00c0, 0x6f16,
+	0x2019, 0x0002, 0x1078, 0x74d9, 0x0078, 0x6f7e, 0xa486, 0x0200,
+	0x00c0, 0x6f1c, 0x1078, 0x74ca, 0x0078, 0x6f7e, 0x7130, 0xa184,
+	0xff00, 0x00c0, 0x6fd0, 0xa18c, 0x00ff, 0xa182, 0x0010, 0x00c8,
+	0x6fd0, 0x0c7e, 0x1078, 0x460c, 0x2c68, 0x0c7f, 0x6a00, 0xa284,
+	0x0001, 0x0040, 0x6fd4, 0xa284, 0x0300, 0x00c0, 0x6fcc, 0x6804,
+	0xa005, 0x0040, 0x6fbc, 0x8001, 0x6806, 0x6003, 0x0007, 0x1078,
+	0x1314, 0x0040, 0x6f85, 0x6013, 0x0000, 0x6803, 0x0000, 0x6837,
+	0x0116, 0x683b, 0x0000, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0,
+	0x8007, 0xa10d, 0x6946, 0x6853, 0x003d, 0x7044, 0xa084, 0x0003,
+	0xa086, 0x0002, 0x00c0, 0x6f60, 0x684f, 0x0040, 0x0078, 0x6f6a,
+	0xa086, 0x0001, 0x00c0, 0x6f68, 0x684f, 0x0080, 0x0078, 0x6f6a,
+	0x684f, 0x0000, 0x20a9, 0x000a, 0x2001, 0x7b90, 0xad90, 0x0015,
+	0x200c, 0x810f, 0x2112, 0x8000, 0x8210, 0x00f0, 0x6f70, 0x200c,
+	0x6982, 0x8000, 0x200c, 0x697e, 0x1078, 0x3a7a, 0x027f, 0x047f,
+	0x157f, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x6013, 0x0100, 0x6003,
+	0x0001, 0x6007, 0x0041, 0x1078, 0x4825, 0x1078, 0x4c7a, 0x0078,
+	0x6f7e, 0x2069, 0x7b92, 0x2d04, 0xa084, 0xff00, 0xa086, 0x1200,
+	0x00c0, 0x6fb0, 0x2069, 0x7b80, 0x686c, 0xa084, 0x00ff, 0x017e,
+	0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f, 0x6003, 0x0001,
+	0x6007, 0x0043, 0x1078, 0x4825, 0x1078, 0x4c7a, 0x0078, 0x6f7e,
+	0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4825,
+	0x1078, 0x4c7a, 0x0078, 0x6f7e, 0x6013, 0x0300, 0x0078, 0x6fc2,
+	0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4825,
+	0x1078, 0x4c7a, 0x0078, 0x6f7e, 0x6013, 0x0500, 0x0078, 0x6fc2,
+	0x6013, 0x0600, 0x0078, 0x6f91, 0x6013, 0x0200, 0x0078, 0x6f91,
+	0xa186, 0x0013, 0x00c0, 0x6fea, 0x6004, 0xa08a, 0x0040, 0x1048,
+	0x12d5, 0xa08a, 0x0050, 0x10c8, 0x12d5, 0xa082, 0x0040, 0x2008,
+	0x0079, 0x701b, 0xa186, 0x0047, 0x00c0, 0x6ff0, 0x0078, 0x704a,
+	0xa186, 0x0027, 0x0040, 0x6ff8, 0xa186, 0x0014, 0x10c0, 0x12d5,
+	0x6004, 0xa082, 0x0040, 0x2008, 0x0079, 0x6ffe, 0x700e, 0x7010,
+	0x7010, 0x700e, 0x700e, 0x700e, 0x700e, 0x700e, 0x700e, 0x700e,
+	0x700e, 0x700e, 0x700e, 0x700e, 0x700e, 0x700e, 0x1078, 0x12d5,
+	0x2001, 0x0007, 0x1078, 0x37df, 0x1078, 0x4b81, 0x1078, 0x6aa1,
+	0x1078, 0x4c7a, 0x007c, 0x702b, 0x703b, 0x7034, 0x7044, 0x702b,
+	0x702b, 0x702b, 0x702b, 0x702b, 0x702b, 0x702b, 0x702b, 0x702b,
+	0x702b, 0x702b, 0x702b, 0x1078, 0x12d5, 0x6010, 0xa088, 0x0013,
+	0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x4b81, 0x6003, 0x0002,
+	0x1078, 0x4c7a, 0x007c, 0x1078, 0x4b81, 0x1078, 0x468d, 0x1078,
+	0x5c02, 0x1078, 0x4c7a, 0x007c, 0x1078, 0x4b81, 0x2009, 0x0041,
+	0x0078, 0x7112, 0xa182, 0x0040, 0x0079, 0x704e, 0x705e, 0x7060,
+	0x705e, 0x705e, 0x705e, 0x705e, 0x705e, 0x7061, 0x705e, 0x705e,
+	0x705e, 0x705e, 0x705e, 0x705e, 0x705e, 0x705e, 0x1078, 0x12d5,
 	0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20,
-	0x2c10, 0x1078, 0x1532, 0x007c, 0xa182, 0x0040, 0x0079, 0x6720,
-	0x672f, 0x672f, 0x672f, 0x672f, 0x672f, 0x672f, 0x672f, 0x672f,
-	0x672f, 0x6731, 0x6754, 0x672f, 0x672f, 0x672f, 0x672f, 0x1078,
-	0x12b7, 0x1078, 0x4719, 0x1078, 0x4821, 0x6010, 0x0d7e, 0x2068,
-	0x684c, 0xd0fc, 0x0040, 0x6747, 0xa08c, 0x0003, 0xa18e, 0x0002,
-	0x0040, 0x674d, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x67be, 0x6003,
-	0x0007, 0x1078, 0x41cd, 0x0d7f, 0x007c, 0x1078, 0x41cd, 0x1078,
-	0x556a, 0x0d7f, 0x0078, 0x674c, 0x2001, 0x0007, 0x1078, 0x3401,
-	0x1078, 0x4719, 0x1078, 0x4821, 0x6010, 0x0d7e, 0x2068, 0x037e,
-	0x2019, 0x0004, 0x1078, 0x6bb3, 0x037f, 0x1078, 0x6283, 0x0d7f,
-	0x007c, 0xa186, 0x0013, 0x00c0, 0x6777, 0x6004, 0xa086, 0x0042,
-	0x10c0, 0x12b7, 0x1078, 0x4671, 0x1078, 0x476a, 0x007c, 0xa186,
-	0x0014, 0x00c0, 0x678b, 0x6004, 0xa086, 0x0042, 0x10c0, 0x12b7,
-	0x2001, 0x0007, 0x1078, 0x3401, 0x1078, 0x4671, 0x1078, 0x6283,
-	0x1078, 0x476a, 0x007c, 0xa182, 0x0040, 0x0079, 0x678f, 0x679e,
-	0x679e, 0x679e, 0x679e, 0x679e, 0x679e, 0x679e, 0x67a0, 0x67ac,
-	0x679e, 0x679e, 0x679e, 0x679e, 0x679e, 0x679e, 0x1078, 0x12b7,
-	0x037e, 0x047e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078,
-	0x1532, 0x047f, 0x037f, 0x007c, 0x6010, 0x0d7e, 0x2068, 0x684c,
-	0xd0fc, 0x0040, 0x67b8, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x67be,
-	0x6003, 0x0007, 0x1078, 0x41cd, 0x0d7f, 0x007c, 0xa182, 0x0040,
-	0x0079, 0x67c2, 0x67d1, 0x67d3, 0x67df, 0x67eb, 0x67d1, 0x67d1,
-	0x67d1, 0x67d1, 0x67d1, 0x67d1, 0x67d1, 0x67d1, 0x67d1, 0x67d1,
-	0x67d1, 0x1078, 0x12b7, 0x6003, 0x0001, 0x6106, 0x1078, 0x4327,
-	0x127e, 0x2091, 0x8000, 0x1078, 0x476a, 0x127f, 0x007c, 0x6003,
-	0x0001, 0x6106, 0x1078, 0x4327, 0x127e, 0x2091, 0x8000, 0x1078,
-	0x476a, 0x127f, 0x007c, 0x6003, 0x0003, 0x6106, 0x2c10, 0x1078,
-	0x17de, 0x127e, 0x2091, 0x8000, 0x1078, 0x4395, 0x1078, 0x4821,
-	0x127f, 0x007c, 0x1078, 0x4671, 0x0078, 0x6800, 0x1078, 0x4719,
-	0x6110, 0x81ff, 0x0040, 0x680d, 0x0d7e, 0x2168, 0x037e, 0x2019,
-	0x0029, 0x1078, 0x6bb3, 0x037f, 0x0d7f, 0x1078, 0x6283, 0x1078,
-	0x476a, 0x007c, 0xa182, 0x0025, 0x0079, 0x6816, 0x681d, 0x681d,
-	0x681d, 0x681f, 0x681d, 0x681d, 0x681d, 0x1078, 0x12b7, 0x027e,
-	0x0e7e, 0x2071, 0x7280, 0x7220, 0x1078, 0x6ad1, 0x0040, 0x682c,
-	0x6007, 0x0026, 0x0078, 0x682e, 0x6007, 0x0027, 0x6003, 0x0001,
-	0x1078, 0x4327, 0x1078, 0x476a, 0x0e7f, 0x027f, 0x007c, 0xa186,
-	0x0013, 0x00c0, 0x6848, 0x6004, 0xa08a, 0x0025, 0x1048, 0x12b7,
-	0xa08a, 0x002c, 0x10c8, 0x12b7, 0xa082, 0x0025, 0x0079, 0x6857,
-	0xa186, 0x0014, 0x10c0, 0x12b7, 0x2001, 0x0007, 0x1078, 0x3401,
-	0x1078, 0x4671, 0x1078, 0x6283, 0x1078, 0x476a, 0x007c, 0x685e,
-	0x6860, 0x6860, 0x685e, 0x685e, 0x685e, 0x685e, 0x1078, 0x12b7,
-	0x1078, 0x4671, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c, 0xa182,
-	0x0025, 0x1048, 0x12b7, 0xa182, 0x002c, 0x10c8, 0x12b7, 0xa182,
-	0x0025, 0x0079, 0x6873, 0x687a, 0x687a, 0x687a, 0x687c, 0x687a,
-	0x687a, 0x687a, 0x1078, 0x12b7, 0x007c, 0x1078, 0x4671, 0x1078,
-	0x6283, 0x1078, 0x476a, 0x007c, 0x127e, 0x037e, 0x087e, 0x2091,
-	0x8000, 0x2c40, 0x2019, 0x0002, 0x1078, 0x5387, 0x00c0, 0x68b3,
-	0x1078, 0x5428, 0x00c0, 0x68b3, 0x6000, 0xa086, 0x0000, 0x0040,
-	0x68b3, 0x601c, 0xa086, 0x0007, 0x0040, 0x68b3, 0x0d7e, 0x6010,
-	0x2068, 0x1078, 0x6120, 0x0040, 0x68a7, 0x1078, 0x6bb3, 0x0d7f,
-	0x6000, 0xa086, 0x0004, 0x00c0, 0x68af, 0x1078, 0x15f2, 0x6013,
+	0x2c10, 0x1078, 0x1572, 0x007c, 0xa182, 0x0040, 0x0079, 0x7070,
+	0x7080, 0x7080, 0x7080, 0x7080, 0x7080, 0x7080, 0x7080, 0x7080,
+	0x7080, 0x7082, 0x70a5, 0x7080, 0x7080, 0x7080, 0x7080, 0x70a5,
+	0x1078, 0x12d5, 0x1078, 0x4c29, 0x1078, 0x4d3a, 0x6010, 0x0d7e,
+	0x2068, 0x684c, 0xd0fc, 0x0040, 0x7098, 0xa08c, 0x0003, 0xa18e,
+	0x0002, 0x0040, 0x709e, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x7112,
+	0x6003, 0x0007, 0x1078, 0x468d, 0x0d7f, 0x007c, 0x1078, 0x468d,
+	0x1078, 0x5c02, 0x0d7f, 0x0078, 0x709d, 0x037e, 0x1078, 0x4c29,
+	0x1078, 0x4d3a, 0x6010, 0x0d7e, 0x2068, 0x2019, 0x0004, 0x1078,
+	0x74fd, 0x1078, 0x6aa1, 0x6017, 0x0028, 0x0d7f, 0x037f, 0x007c,
+	0xa186, 0x0013, 0x00c0, 0x70c6, 0x6004, 0xa086, 0x0042, 0x10c0,
+	0x12d5, 0x1078, 0x4b81, 0x1078, 0x4c7a, 0x007c, 0xa186, 0x0027,
+	0x0040, 0x70ce, 0xa186, 0x0014, 0x00c0, 0x70de, 0x6004, 0xa086,
+	0x0042, 0x10c0, 0x12d5, 0x2001, 0x0007, 0x1078, 0x37df, 0x1078,
+	0x4b81, 0x1078, 0x6aa1, 0x1078, 0x4c7a, 0x007c, 0xa182, 0x0040,
+	0x0079, 0x70e2, 0x70f2, 0x70f2, 0x70f2, 0x70f2, 0x70f2, 0x70f2,
+	0x70f2, 0x70f4, 0x7100, 0x70f2, 0x70f2, 0x70f2, 0x70f2, 0x70f2,
+	0x70f2, 0x70f2, 0x1078, 0x12d5, 0x037e, 0x047e, 0x20e1, 0x0005,
+	0x3d18, 0x3e20, 0x2c10, 0x1078, 0x1572, 0x047f, 0x037f, 0x007c,
+	0x6010, 0x0d7e, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x710c, 0x2009,
+	0x0041, 0x0d7f, 0x0078, 0x7112, 0x6003, 0x0007, 0x1078, 0x468d,
+	0x0d7f, 0x007c, 0xa182, 0x0040, 0x0079, 0x7116, 0x7126, 0x7128,
+	0x7134, 0x7140, 0x7126, 0x7126, 0x7126, 0x7126, 0x7126, 0x7126,
+	0x7126, 0x7126, 0x7126, 0x7126, 0x7126, 0x7126, 0x1078, 0x12d5,
+	0x6003, 0x0001, 0x6106, 0x1078, 0x4825, 0x127e, 0x2091, 0x8000,
+	0x1078, 0x4c7a, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078,
+	0x4825, 0x127e, 0x2091, 0x8000, 0x1078, 0x4c7a, 0x127f, 0x007c,
+	0x6003, 0x0003, 0x6106, 0x2c10, 0x1078, 0x19cf, 0x127e, 0x2091,
+	0x8000, 0x1078, 0x4891, 0x1078, 0x4d3a, 0x127f, 0x007c, 0x1078,
+	0x4b81, 0x0078, 0x7155, 0x1078, 0x4c29, 0x6110, 0x81ff, 0x0040,
+	0x7162, 0x0d7e, 0x2168, 0x037e, 0x2019, 0x0029, 0x1078, 0x74fd,
+	0x037f, 0x0d7f, 0x1078, 0x6aa1, 0x1078, 0x4c7a, 0x007c, 0xa182,
+	0x0085, 0x0079, 0x716b, 0x7172, 0x7172, 0x7172, 0x7174, 0x7172,
+	0x7172, 0x7172, 0x1078, 0x12d5, 0x027e, 0x0e7e, 0x2071, 0x7b80,
+	0x7220, 0x1078, 0x7417, 0x0040, 0x7181, 0x6007, 0x0086, 0x0078,
+	0x7183, 0x6007, 0x0087, 0x6003, 0x0001, 0x1078, 0x4825, 0x1078,
+	0x4c7a, 0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x719d,
+	0x6004, 0xa08a, 0x0085, 0x1048, 0x12d5, 0xa08a, 0x008c, 0x10c8,
+	0x12d5, 0xa082, 0x0085, 0x0079, 0x71b0, 0xa186, 0x0027, 0x0040,
+	0x71a5, 0xa186, 0x0014, 0x10c0, 0x12d5, 0x2001, 0x0007, 0x1078,
+	0x37df, 0x1078, 0x4b81, 0x1078, 0x6aa1, 0x1078, 0x4c7a, 0x007c,
+	0x71b7, 0x71b9, 0x71b9, 0x71b7, 0x71b7, 0x71b7, 0x71b7, 0x1078,
+	0x12d5, 0x1078, 0x4b81, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c,
+	0xa182, 0x0085, 0x1048, 0x12d5, 0xa182, 0x008c, 0x10c8, 0x12d5,
+	0xa182, 0x0085, 0x0079, 0x71cc, 0x71d3, 0x71d3, 0x71d3, 0x71d5,
+	0x71d3, 0x71d3, 0x71d3, 0x1078, 0x12d5, 0x007c, 0x1078, 0x4b81,
+	0x1078, 0x6aa1, 0x1078, 0x4c7a, 0x007c, 0x037e, 0x2019, 0x000b,
+	0x1078, 0x71e6, 0x601f, 0x0006, 0x037f, 0x007c, 0x127e, 0x037e,
+	0x087e, 0x2091, 0x8000, 0x2c40, 0x1078, 0x5915, 0x00c0, 0x7213,
+	0x1078, 0x59b6, 0x00c0, 0x7213, 0x6000, 0xa086, 0x0000, 0x0040,
+	0x7213, 0x601c, 0xa086, 0x0007, 0x0040, 0x7213, 0x0d7e, 0x6000,
+	0xa086, 0x0004, 0x00c0, 0x7206, 0x1078, 0x1676, 0x6010, 0x2068,
+	0x1078, 0x693e, 0x0040, 0x720e, 0x1078, 0x74fd, 0x0d7f, 0x6013,
 	0x0000, 0x601f, 0x0007, 0x087f, 0x037f, 0x127f, 0x007c, 0x0f7e,
-	0x0c7e, 0x037e, 0x157e, 0x2079, 0x7280, 0x7938, 0x783c, 0x1078,
-	0x1e1b, 0x00c0, 0x68e8, 0x017e, 0x0c7e, 0x1078, 0x3447, 0x00c0,
-	0x68e8, 0x2011, 0x7290, 0xac98, 0x000a, 0x20a9, 0x0004, 0x1078,
-	0x5a35, 0x00c0, 0x68e8, 0x017f, 0x027f, 0x027e, 0x017e, 0x2019,
-	0x0029, 0x1078, 0x445c, 0x1078, 0x43a9, 0x017f, 0x1078, 0x6a57,
-	0x1078, 0x35cf, 0x017f, 0x1078, 0x3256, 0xa006, 0x0078, 0x68ea,
-	0x0c7f, 0x017f, 0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c, 0x0e7e,
-	0x0d7e, 0x0c7e, 0x047e, 0x037e, 0x027e, 0x2061, 0x7400, 0x2071,
-	0x6d00, 0x7444, 0x7060, 0x8001, 0xa402, 0x00c8, 0x6929, 0x2100,
-	0xac06, 0x0040, 0x691b, 0x6000, 0xa086, 0x0000, 0x0040, 0x691b,
-	0x6018, 0x2068, 0x68a0, 0xa206, 0x00c0, 0x691b, 0x631c, 0xa386,
-	0x0004, 0x0040, 0x6925, 0xa386, 0x0005, 0x0040, 0x6925, 0xa386,
-	0x0006, 0x0040, 0x6925, 0xace0, 0x0008, 0x2001, 0x6d15, 0x2004,
-	0xac02, 0x00c8, 0x6929, 0x0078, 0x68f7, 0xa085, 0x0001, 0x0078,
-	0x692a, 0xa006, 0x027f, 0x037f, 0x047f, 0x0c7f, 0x0d7f, 0x0e7f,
-	0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x2009, 0x6d1e, 0x2104, 0xa086,
-	0x0074, 0x00c0, 0x6988, 0x2069, 0x728e, 0x690c, 0xa182, 0x0100,
-	0x0048, 0x6978, 0x6908, 0xa184, 0x8000, 0x0040, 0x6984, 0xa184,
-	0x0800, 0x0040, 0x6984, 0x6910, 0xa18a, 0x0001, 0x0048, 0x697c,
-	0x6914, 0x2069, 0x72ae, 0x6904, 0x81ff, 0x00c0, 0x6970, 0x690c,
-	0xa182, 0x0100, 0x0048, 0x6978, 0x6908, 0x81ff, 0x00c0, 0x6974,
-	0x6910, 0xa18a, 0x0001, 0x0048, 0x697c, 0x6918, 0xa18a, 0x0001,
-	0x0048, 0x6984, 0x0078, 0x698e, 0x6013, 0x0100, 0x0078, 0x698a,
-	0x6013, 0x0300, 0x0078, 0x698a, 0x6013, 0x0500, 0x0078, 0x698a,
-	0x6013, 0x0700, 0x0078, 0x698a, 0x6013, 0x0900, 0x0078, 0x698a,
-	0x6013, 0x0b00, 0x0078, 0x698a, 0x6013, 0x0f00, 0x0078, 0x698a,
-	0x6013, 0x2d00, 0xa085, 0x0001, 0x0078, 0x698f, 0xa006, 0x017f,
-	0x0d7f, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x027e, 0x037e, 0x157e,
-	0x6218, 0x2268, 0x6b04, 0xa394, 0x00ff, 0xa286, 0x0006, 0x0040,
-	0x69b7, 0xa286, 0x0004, 0x0040, 0x69b7, 0xa394, 0xff00, 0x8217,
-	0xa286, 0x0006, 0x0040, 0x69b7, 0xa286, 0x0004, 0x0040, 0x69b7,
-	0x0c7e, 0x2d60, 0x1078, 0x3459, 0x0c7f, 0x0078, 0x69ea, 0x2011,
-	0x7296, 0xad98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x5a35, 0x00c0,
-	0x69eb, 0x2011, 0x729a, 0xad98, 0x0006, 0x20a9, 0x0004, 0x1078,
-	0x5a35, 0x00c0, 0x69eb, 0x047e, 0x017e, 0x6aa0, 0xa294, 0x00ff,
-	0x8227, 0xa006, 0x2009, 0x6d52, 0x210c, 0xd1a4, 0x0040, 0x69df,
-	0x2009, 0x0029, 0x1078, 0x6bf7, 0x6800, 0xc0e5, 0x6802, 0x2019,
-	0x0029, 0x1078, 0x445c, 0x1078, 0x43a9, 0x2c08, 0x1078, 0x6a57,
-	0x017f, 0x047f, 0xa006, 0x157f, 0x037f, 0x027f, 0x0d7f, 0x0c7f,
-	0x007c, 0x0d7e, 0x2069, 0x728e, 0x6800, 0xa086, 0x0800, 0x0040,
-	0x69fd, 0x6013, 0x0000, 0x0078, 0x69fe, 0xa006, 0x0d7f, 0x007c,
-	0x0c7e, 0x0f7e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2079, 0x728c,
-	0x7930, 0x7834, 0x1078, 0x1e1b, 0x00c0, 0x6a24, 0x1078, 0x3447,
-	0x00c0, 0x6a24, 0x2011, 0x7290, 0xac98, 0x000a, 0x20a9, 0x0004,
-	0x1078, 0x5a35, 0x00c0, 0x6a24, 0x2011, 0x7294, 0xac98, 0x0006,
-	0x20a9, 0x0004, 0x1078, 0x5a35, 0x157f, 0x037f, 0x027f, 0x017f,
-	0x0f7f, 0x0c7f, 0x007c, 0x0c7e, 0x007e, 0x017e, 0x027e, 0x037e,
-	0x157e, 0x2011, 0x7283, 0x2204, 0x8211, 0x220c, 0x1078, 0x1e1b,
-	0x00c0, 0x6a50, 0x1078, 0x3447, 0x00c0, 0x6a50, 0x2011, 0x7296,
-	0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x5a35, 0x00c0, 0x6a50,
-	0x2011, 0x729a, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x5a35,
-	0x157f, 0x037f, 0x027f, 0x017f, 0x007f, 0x0c7f, 0x007c, 0x0e7e,
-	0x0c7e, 0x077e, 0x067e, 0x057e, 0x047e, 0x027e, 0x127e, 0x2091,
-	0x8000, 0x2029, 0x6f19, 0x252c, 0x2021, 0x6f1f, 0x2424, 0x2061,
-	0x7400, 0x2071, 0x6d00, 0x7644, 0x7060, 0x8001, 0xa602, 0x00c8,
-	0x6abc, 0x2100, 0xac06, 0x0040, 0x6ab2, 0x1078, 0x6c0f, 0x0040,
-	0x6ab2, 0x671c, 0xa786, 0x0001, 0x0040, 0x6ab2, 0xa786, 0x0007,
-	0x0040, 0x6ab2, 0x2500, 0xac06, 0x0040, 0x6ab2, 0x2400, 0xac06,
-	0x0040, 0x6ab2, 0x6018, 0x2070, 0x70a0, 0xa206, 0x00c0, 0x6ab2,
-	0x0d7e, 0x6010, 0x2068, 0x1078, 0x6120, 0x0040, 0x6aa6, 0xa786,
-	0x0003, 0x00c0, 0x6ac5, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
-	0x017e, 0x1078, 0x36a1, 0x017f, 0x1078, 0x6276, 0x0d7f, 0x6000,
-	0xa086, 0x0004, 0x00c0, 0x6ab0, 0x017e, 0x1078, 0x15f2, 0x017f,
-	0x1078, 0x6283, 0xace0, 0x0008, 0x2001, 0x6d15, 0x2004, 0xac02,
-	0x00c8, 0x6abc, 0x0078, 0x6a69, 0x127f, 0x027f, 0x047f, 0x057f,
-	0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x007c, 0xa786, 0x0006, 0x00c0,
-	0x6a9b, 0xa386, 0x0005, 0x0040, 0x6ab2, 0x1078, 0x6bb3, 0x0078,
-	0x6aa6, 0x0c7e, 0x0e7e, 0x017e, 0x2c08, 0x2170, 0x1078, 0x6bca,
-	0x017f, 0x0040, 0x6ae0, 0x601c, 0xa084, 0x000f, 0x1079, 0x6ae3,
-	0x0e7f, 0x0c7f, 0x007c, 0x6aeb, 0x6aeb, 0x6aeb, 0x6aeb, 0x6aeb,
-	0x6aeb, 0x6aed, 0x6aeb, 0xa006, 0x007c, 0x047e, 0x017e, 0x7018,
-	0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009,
-	0x0020, 0x1078, 0x6bf7, 0x017f, 0x047f, 0x1078, 0x6884, 0xa085,
-	0x0001, 0x007c, 0x2001, 0x0001, 0x1078, 0x33df, 0x157e, 0x017e,
-	0x027e, 0x037e, 0x20a9, 0x0004, 0x2019, 0x6d05, 0x2011, 0x7296,
-	0x1078, 0x5a35, 0x037f, 0x027f, 0x017f, 0x157f, 0xa005, 0x007c,
-	0x0f7e, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x027e, 0x127e, 0x2091,
-	0x8000, 0x2061, 0x7400, 0x2079, 0x0001, 0x8fff, 0x0040, 0x6b73,
-	0x2071, 0x6d00, 0x7644, 0x7060, 0x8001, 0xa602, 0x00c8, 0x6b73,
-	0x88ff, 0x0040, 0x6b39, 0x2800, 0xac06, 0x00c0, 0x6b69, 0x2079,
-	0x0000, 0x1078, 0x6c0f, 0x0040, 0x6b69, 0x2400, 0xac06, 0x0040,
-	0x6b69, 0x671c, 0xa786, 0x0006, 0x00c0, 0x6b69, 0xa786, 0x0007,
-	0x0040, 0x6b69, 0x88ff, 0x00c0, 0x6b51, 0x6018, 0xa206, 0x00c0,
-	0x6b69, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x6120, 0x0040, 0x6b5c,
-	0x047e, 0x1078, 0x6bb3, 0x047f, 0x0d7f, 0x6000, 0xa086, 0x0004,
-	0x00c0, 0x6b64, 0x1078, 0x15f2, 0x1078, 0x6283, 0x88ff, 0x00c0,
-	0x6b7c, 0xace0, 0x0008, 0x2001, 0x6d15, 0x2004, 0xac02, 0x00c8,
-	0x6b73, 0x0078, 0x6b25, 0xa006, 0x127f, 0x027f, 0x067f, 0x077f,
-	0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5, 0x0001, 0x0078, 0x6b74,
-	0x087e, 0x2041, 0x0000, 0x2c20, 0x2019, 0x0002, 0x6218, 0x1078,
-	0x5387, 0x1078, 0x5428, 0x1078, 0x6b18, 0x087f, 0x007c, 0x027e,
-	0x047e, 0x087e, 0x0c7e, 0x157e, 0x2c20, 0x20a9, 0x007f, 0x2009,
-	0x0000, 0x017e, 0x037e, 0x1078, 0x3447, 0x00c0, 0x6ba8, 0x2c10,
-	0x2041, 0x0000, 0x1078, 0x5387, 0x1078, 0x5428, 0x1078, 0x6b18,
-	0x037f, 0x017f, 0x8108, 0x00f0, 0x6b99, 0x157f, 0x0c7f, 0x087f,
-	0x047f, 0x027f, 0x007c, 0x017e, 0x0f7e, 0x8dff, 0x0040, 0x6bc7,
-	0x6800, 0xa07d, 0x0040, 0x6bc4, 0x6803, 0x0000, 0x6b52, 0x1078,
-	0x36a1, 0x2f68, 0x0078, 0x6bb8, 0x6b52, 0x1078, 0x36a1, 0x0f7f,
-	0x017f, 0x007c, 0x0e7e, 0x047e, 0x037e, 0x2061, 0x7400, 0x2071,
-	0x6d00, 0x7444, 0x7060, 0x8001, 0xa402, 0x00c8, 0x6bf2, 0x2100,
-	0xac06, 0x0040, 0x6be4, 0x6000, 0xa086, 0x0000, 0x0040, 0x6be4,
-	0x6008, 0xa206, 0x0040, 0x6bee, 0xace0, 0x0008, 0x2001, 0x6d15,
-	0x2004, 0xac02, 0x00c8, 0x6bf2, 0x0078, 0x6bcf, 0xa085, 0x0001,
-	0x0078, 0x6bf3, 0xa006, 0x037f, 0x047f, 0x0e7f, 0x007c, 0x0d7e,
-	0x007e, 0x1078, 0x130f, 0x007f, 0x1040, 0x12b7, 0x6837, 0x010d,
-	0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000, 0x685e, 0x6956,
-	0x6c46, 0x684f, 0x0000, 0x1078, 0x36a1, 0x0d7f, 0x007c, 0x6700,
-	0xa786, 0x0000, 0x0040, 0x6c22, 0xa786, 0x0001, 0x0040, 0x6c22,
-	0xa786, 0x000a, 0x0040, 0x6c22, 0xa786, 0x0009, 0x0040, 0x6c22,
-	0xa085, 0x0001, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000,
-	0x2071, 0x6d00, 0xd5a4, 0x0040, 0x6c30, 0x7034, 0x8000, 0x7036,
-	0xd5b4, 0x0040, 0x6c36, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040,
-	0x6c3d, 0x2071, 0x6d0a, 0x1078, 0x6c6c, 0x0e7f, 0x007f, 0x127f,
-	0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x6d00,
-	0xd5a4, 0x0040, 0x6c4e, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040,
-	0x6c54, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0x6c5b, 0x2071,
-	0x6d0a, 0x1078, 0x6c6c, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e,
-	0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x6d02, 0x1078, 0x6c6c,
-	0x0e7f, 0x007f, 0x127f, 0x007c, 0x2e04, 0x8000, 0x2072, 0x00c8,
-	0x6c75, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e, 0x2071,
-	0x6d00, 0x1078, 0x6c6c, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x6d04,
-	0x1078, 0x6c6c, 0x0e7f, 0x007c, 0x0001, 0x0002, 0x0004, 0x0008,
-	0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800,
-	0x1000, 0x2000, 0x4000, 0x8000, 0x614c
+	0x0c7e, 0x037e, 0x157e, 0x2079, 0x7b80, 0x7838, 0xa08c, 0x00ff,
+	0x783c, 0x1078, 0x2085, 0x00c0, 0x724e, 0x017e, 0x0c7e, 0x1078,
+	0x3825, 0x00c0, 0x724e, 0x2011, 0x7b90, 0xac98, 0x000a, 0x20a9,
+	0x0004, 0x1078, 0x616a, 0x00c0, 0x724e, 0x017f, 0x027f, 0x027e,
+	0x017e, 0x2019, 0x0029, 0x1078, 0x5a8a, 0x1078, 0x4962, 0x1078,
+	0x48a5, 0x017f, 0x1078, 0x737b, 0x1078, 0x39a6, 0x017f, 0x1078,
+	0x3621, 0x6612, 0x6516, 0xa006, 0x0078, 0x7250, 0x0c7f, 0x017f,
+	0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c, 0x0c7e, 0x0d7e, 0x017e,
+	0x2009, 0x761e, 0x2104, 0xa086, 0x0074, 0x00c0, 0x72ac, 0x2069,
+	0x7b8e, 0x690c, 0xa182, 0x0100, 0x0048, 0x729c, 0x6908, 0xa184,
+	0x8000, 0x0040, 0x72a8, 0xa184, 0x0800, 0x0040, 0x72a8, 0x6910,
+	0xa18a, 0x0001, 0x0048, 0x72a0, 0x6914, 0x2069, 0x7bae, 0x6904,
+	0x81ff, 0x00c0, 0x7294, 0x690c, 0xa182, 0x0100, 0x0048, 0x729c,
+	0x6908, 0x81ff, 0x00c0, 0x7298, 0x6910, 0xa18a, 0x0001, 0x0048,
+	0x72a0, 0x6918, 0xa18a, 0x0001, 0x0048, 0x72a8, 0x0078, 0x72b2,
+	0x6013, 0x0100, 0x0078, 0x72ae, 0x6013, 0x0300, 0x0078, 0x72ae,
+	0x6013, 0x0500, 0x0078, 0x72ae, 0x6013, 0x0700, 0x0078, 0x72ae,
+	0x6013, 0x0900, 0x0078, 0x72ae, 0x6013, 0x0b00, 0x0078, 0x72ae,
+	0x6013, 0x0f00, 0x0078, 0x72ae, 0x6013, 0x2d00, 0xa085, 0x0001,
+	0x0078, 0x72b3, 0xa006, 0x017f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e,
+	0x0d7e, 0x027e, 0x037e, 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394,
+	0x00ff, 0xa286, 0x0006, 0x0040, 0x72db, 0xa286, 0x0004, 0x0040,
+	0x72db, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x72db,
+	0xa286, 0x0004, 0x0040, 0x72db, 0x0c7e, 0x2d60, 0x1078, 0x3837,
+	0x0c7f, 0x0078, 0x730e, 0x2011, 0x7b96, 0xad98, 0x000a, 0x20a9,
+	0x0004, 0x1078, 0x616a, 0x00c0, 0x730f, 0x2011, 0x7b9a, 0xad98,
+	0x0006, 0x20a9, 0x0004, 0x1078, 0x616a, 0x00c0, 0x730f, 0x047e,
+	0x017e, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x7652,
+	0x210c, 0xd1a4, 0x0040, 0x7303, 0x2009, 0x0029, 0x1078, 0x7541,
+	0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x1078, 0x4962, 0x1078,
+	0x48a5, 0x2c08, 0x1078, 0x737b, 0x017f, 0x047f, 0xa006, 0x157f,
+	0x037f, 0x027f, 0x0d7f, 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0x7b8e,
+	0x6800, 0xa086, 0x0800, 0x0040, 0x7321, 0x6013, 0x0000, 0x0078,
+	0x7322, 0xa006, 0x0d7f, 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e,
+	0x037e, 0x157e, 0x2079, 0x7b8c, 0x7930, 0x7834, 0x1078, 0x2085,
+	0x00c0, 0x7348, 0x1078, 0x3825, 0x00c0, 0x7348, 0x2011, 0x7b90,
+	0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x616a, 0x00c0, 0x7348,
+	0x2011, 0x7b94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x616a,
+	0x157f, 0x037f, 0x027f, 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e,
+	0x007e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2011, 0x7b83, 0x2204,
+	0x8211, 0x220c, 0x1078, 0x2085, 0x00c0, 0x7374, 0x1078, 0x3825,
+	0x00c0, 0x7374, 0x2011, 0x7b96, 0xac98, 0x000a, 0x20a9, 0x0004,
+	0x1078, 0x616a, 0x00c0, 0x7374, 0x2011, 0x7b9a, 0xac98, 0x0006,
+	0x20a9, 0x0004, 0x1078, 0x616a, 0x157f, 0x037f, 0x027f, 0x017f,
+	0x007f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e,
+	0x047e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2029, 0x783f, 0x252c,
+	0x2021, 0x7845, 0x2424, 0x2061, 0x7d00, 0x2071, 0x7600, 0x7644,
+	0x7060, 0x8001, 0xa602, 0x00c8, 0x73e0, 0x2100, 0xac06, 0x0040,
+	0x73d6, 0x1078, 0x7559, 0x0040, 0x73d6, 0x671c, 0xa786, 0x0001,
+	0x0040, 0x73f5, 0xa786, 0x0007, 0x0040, 0x73d6, 0x2500, 0xac06,
+	0x0040, 0x73d6, 0x2400, 0xac06, 0x0040, 0x73d6, 0x1078, 0x756d,
+	0x00c0, 0x73d6, 0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x73bc,
+	0x017e, 0x1078, 0x1676, 0x017f, 0x6010, 0x2068, 0x1078, 0x693e,
+	0x0040, 0x73d3, 0xa786, 0x0003, 0x00c0, 0x73e9, 0x6837, 0x0103,
+	0x6b4a, 0x6847, 0x0000, 0x017e, 0x1078, 0x6b3f, 0x1078, 0x3a7a,
+	0x017f, 0x1078, 0x6a94, 0x0d7f, 0x1078, 0x6aa1, 0xace0, 0x0008,
+	0x2001, 0x7615, 0x2004, 0xac02, 0x00c8, 0x73e0, 0x0078, 0x738d,
+	0x127f, 0x027f, 0x047f, 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f,
+	0x007c, 0xa786, 0x0006, 0x00c0, 0x73c6, 0xa386, 0x0005, 0x0040,
+	0x73d6, 0x1078, 0x74fd, 0x0078, 0x73d3, 0x1078, 0x756d, 0x00c0,
+	0x73d6, 0xa180, 0x0001, 0x2004, 0xa086, 0x0018, 0x00c0, 0x73d6,
+	0x6000, 0xa086, 0x0002, 0x00c0, 0x73d6, 0x1078, 0x6aba, 0x0040,
+	0x7411, 0x1078, 0x6ace, 0x00c0, 0x73d6, 0x1078, 0x5e57, 0x0078,
+	0x7413, 0x1078, 0x22dd, 0x1078, 0x6aa1, 0x0078, 0x73d6, 0x0c7e,
+	0x0e7e, 0x017e, 0x2c08, 0x2170, 0x1078, 0x7514, 0x017f, 0x0040,
+	0x7426, 0x601c, 0xa084, 0x000f, 0x1079, 0x7429, 0x0e7f, 0x0c7f,
+	0x007c, 0x7431, 0x7431, 0x7431, 0x7431, 0x7431, 0x7431, 0x7433,
+	0x7431, 0xa006, 0x007c, 0x047e, 0x017e, 0x7018, 0xa080, 0x0028,
+	0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, 0x1078,
+	0x7541, 0x017f, 0x047f, 0x037e, 0x2019, 0x0002, 0x1078, 0x71e6,
+	0x037f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0001, 0x1078, 0x37bd,
+	0x157e, 0x017e, 0x027e, 0x037e, 0x20a9, 0x0004, 0x2019, 0x7605,
+	0x2011, 0x7b96, 0x1078, 0x616a, 0x037f, 0x027f, 0x017f, 0x157f,
+	0xa005, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x027e,
+	0x127e, 0x2091, 0x8000, 0x2061, 0x7d00, 0x2079, 0x0001, 0x8fff,
+	0x0040, 0x74bd, 0x2071, 0x7600, 0x7644, 0x7060, 0x8001, 0xa602,
+	0x00c8, 0x74bd, 0x88ff, 0x0040, 0x7483, 0x2800, 0xac06, 0x00c0,
+	0x74b3, 0x2079, 0x0000, 0x1078, 0x7559, 0x0040, 0x74b3, 0x2400,
+	0xac06, 0x0040, 0x74b3, 0x671c, 0xa786, 0x0006, 0x00c0, 0x74b3,
+	0xa786, 0x0007, 0x0040, 0x74b3, 0x88ff, 0x00c0, 0x749b, 0x6018,
+	0xa206, 0x00c0, 0x74b3, 0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0,
+	0x74a3, 0x1078, 0x1676, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040,
+	0x74ad, 0x047e, 0x1078, 0x74fd, 0x047f, 0x0d7f, 0x1078, 0x6aa1,
+	0x88ff, 0x00c0, 0x74c6, 0xace0, 0x0008, 0x2001, 0x7615, 0x2004,
+	0xac02, 0x00c8, 0x74bd, 0x0078, 0x746f, 0xa006, 0x127f, 0x027f,
+	0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5, 0x0001,
+	0x0078, 0x74be, 0x087e, 0x2041, 0x0000, 0x2c20, 0x2019, 0x0002,
+	0x6218, 0x1078, 0x5915, 0x1078, 0x59b6, 0x1078, 0x7462, 0x087f,
+	0x007c, 0x027e, 0x047e, 0x087e, 0x0c7e, 0x157e, 0x2c20, 0x20a9,
+	0x007f, 0x2009, 0x0000, 0x017e, 0x037e, 0x1078, 0x3825, 0x00c0,
+	0x74f2, 0x2c10, 0x2041, 0x0000, 0x1078, 0x5915, 0x1078, 0x59b6,
+	0x1078, 0x7462, 0x037f, 0x017f, 0x8108, 0x00f0, 0x74e3, 0x157f,
+	0x0c7f, 0x087f, 0x047f, 0x027f, 0x007c, 0x017e, 0x0f7e, 0x8dff,
+	0x0040, 0x7511, 0x6800, 0xa07d, 0x0040, 0x750e, 0x6803, 0x0000,
+	0x6b52, 0x1078, 0x3a7a, 0x2f68, 0x0078, 0x7502, 0x6b52, 0x1078,
+	0x3a7a, 0x0f7f, 0x017f, 0x007c, 0x0e7e, 0x047e, 0x037e, 0x2061,
+	0x7d00, 0x2071, 0x7600, 0x7444, 0x7060, 0x8001, 0xa402, 0x00c8,
+	0x753c, 0x2100, 0xac06, 0x0040, 0x752e, 0x6000, 0xa086, 0x0000,
+	0x0040, 0x752e, 0x6008, 0xa206, 0x0040, 0x7538, 0xace0, 0x0008,
+	0x2001, 0x7615, 0x2004, 0xac02, 0x00c8, 0x753c, 0x0078, 0x7519,
+	0xa085, 0x0001, 0x0078, 0x753d, 0xa006, 0x037f, 0x047f, 0x0e7f,
+	0x007c, 0x0d7e, 0x007e, 0x1078, 0x132f, 0x007f, 0x1040, 0x12d5,
+	0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000,
+	0x685e, 0x6956, 0x6c46, 0x684f, 0x0000, 0x1078, 0x3a7a, 0x0d7f,
+	0x007c, 0x6700, 0xa786, 0x0000, 0x0040, 0x756c, 0xa786, 0x0001,
+	0x0040, 0x756c, 0xa786, 0x000a, 0x0040, 0x756c, 0xa786, 0x0009,
+	0x0040, 0x756c, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x6018, 0x2070,
+	0x70a0, 0xa206, 0x0e7f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091,
+	0x8000, 0x2071, 0x7640, 0xd5a4, 0x0040, 0x7581, 0x7034, 0x8000,
+	0x7036, 0xd5b4, 0x0040, 0x7587, 0x7030, 0x8000, 0x7032, 0xd5ac,
+	0x0040, 0x758e, 0x2071, 0x764a, 0x1078, 0x75bd, 0x0e7f, 0x007f,
+	0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071,
+	0x7640, 0xd5a4, 0x0040, 0x759f, 0x7034, 0x8000, 0x7036, 0xd5b4,
+	0x0040, 0x75a5, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0x75ac,
+	0x2071, 0x764a, 0x1078, 0x75bd, 0x0e7f, 0x007f, 0x127f, 0x007c,
+	0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x7642, 0x1078,
+	0x75bd, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x2e04, 0x8000, 0x2072,
+	0x00c8, 0x75c6, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e,
+	0x2071, 0x7640, 0x1078, 0x75bd, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
+	0x7644, 0x1078, 0x75bd, 0x0e7f, 0x007c, 0x0001, 0x0002, 0x0004,
+	0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400,
+	0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xaaff
 };
-unsigned short   risc_code_length01 = 0x5c95;
+unsigned short   risc_code_length01 = 0x65e6;
 
diff -urN linux-2.2.6-pre2/drivers/scsi/qlogicfc.c linux-2.2.6-pre3/drivers/scsi/qlogicfc.c
--- linux-2.2.6-pre2/drivers/scsi/qlogicfc.c	1999-02-24 16:27:54.000000000 -0800
+++ linux-2.2.6-pre3/drivers/scsi/qlogicfc.c	2003-08-15 15:05:39.000000000 -0700
@@ -64,12 +64,13 @@
 /* Configuration section **************************************************** */
 
 /* Set the following macro to 1 to reload the ISP2100's firmware.  This is
-   version 1.13 of the firmware. */
+   version 1.15.19 of the firmware. */
 
 #define RELOAD_FIRMWARE		1
 
 #define USE_NVRAM_DEFAULTS      1
 
+#define ISP2100_PORTDB          1
 
 /* Set the following to 1 to include fabric support, fabric support is 
  * currently not as well tested as the other aspects of the driver */
@@ -316,16 +317,13 @@
 
 /* status entry completion status definitions */
 #define CS_COMPLETE			0x0000
-#define CS_INCOMPLETE			0x0001
 #define CS_DMA_ERROR			0x0002
-#define CS_TRANSPORT_ERROR		0x0003
 #define CS_RESET_OCCURRED		0x0004
 #define CS_ABORTED			0x0005
 #define CS_TIMEOUT			0x0006
 #define CS_DATA_OVERRUN			0x0007
-#define CS_ABORT_MSG_FAILED		0x000e
-#define CS_REJECT_MSG_FAILED		0x000f
 #define CS_DATA_UNDERRUN		0x0015
+#define CS_QUEUE_FULL			0x001c
 #define CS_PORT_UNAVAILABLE             0x0028
 #define CS_PORT_LOGGED_OUT              0x0029
 #define CS_PORT_CONFIG_CHANGED		0x002a
@@ -645,9 +643,7 @@
 static void isp2100_print_scsi_cmd(Scsi_Cmnd *);
 #endif
 
-#if DEBUG_ISP2100_INTR
 static void isp2100_print_status_entry(struct Status_Entry *);
-#endif
 
 static struct proc_dir_entry proc_scsi_isp2100 =
 {
@@ -721,7 +717,7 @@
 			scsi_unregister(host);
 			continue;
 		}
-		host->this_id = tmpt->this_id;
+		host->this_id = 0;
 
 		if (request_irq(host->irq, do_isp2100_intr_handler, SA_INTERRUPT | SA_SHIRQ, "qlogicfc", host)) {
 			printk("qlogicfc : interrupt %d already in use\n",
@@ -743,7 +739,7 @@
 		outw(HCCR_CLEAR_RISC_INTR, host->io_port + HOST_HCCR);
 		isp2100_enable_irqs(host);
 		/* wait for the loop to come up */
-		for (wait_time = jiffies + 20 * HZ; wait_time > jiffies && hostdata->loop_up == 0;)
+		for (wait_time = jiffies + 10 * HZ; wait_time > jiffies && hostdata->loop_up == 0;)
 			barrier();
 
 		if (hostdata->loop_up == 0) {
@@ -805,13 +801,17 @@
 	isp2100_mbox_command(host, param);
 
 	if (param[0] == MBOX_COMMAND_COMPLETE) {
-		host->this_id = param[1];
 		hostdata->port_id = ((u_int) param[3]) << 16;
 		hostdata->port_id |= param[2];
+		temp[0].loop_id = param[1];
+		temp[0].wwn = hostdata->wwn;
+	}
+	else {
+	        printk("qlogicfc: error getting scsi id.\n");
 	}
 
-	for (i = 0, j = 0; i <= QLOGICFC_MAX_ID; i++) {
-	        temp[i].loop_id = host->this_id;
+	for (i = 1, j = 1; i <= QLOGICFC_MAX_ID; i++) {
+	        temp[i].loop_id = temp[0].loop_id;
 
 		param[0] = MBOX_GET_PORT_NAME;
 		param[1] = (i << 8) & 0xff00;
@@ -848,7 +848,7 @@
 				}
 			}
 			if (j == QLOGICFC_MAX_ID + 1)
-				hostdata->port_db[i].loop_id = host->this_id;
+				hostdata->port_db[i].loop_id = temp[0].loop_id;
 
 			for (j = 0; j <= QLOGICFC_MAX_ID; j++) {
 				if (hostdata->port_db[j].wwn == temp[i].wwn || !hostdata->port_db[j].wwn) {
@@ -1046,6 +1046,7 @@
 		host->max_id = 0;
 		return 0;
 	}
+
 	out_ptr = inw(host->io_port + MBOX4);
 	in_ptr = hostdata->req_in_ptr;
 
@@ -1099,10 +1100,13 @@
 	cmd->hdr.entry_type = ENTRY_COMMAND;
 	cmd->hdr.entry_cnt = 1;
 	cmd->target_lun = Cmnd->lun;
+#if ISP2100_PORTDB
 	cmd->target_id = hostdata->port_db[Cmnd->target].loop_id;
+#else
+	cmd->target_id = Cmnd->target;
+#endif
 	cmd->total_byte_cnt = (u_int) Cmnd->request_bufflen;
-	cmd->time_out = SCSI_TIMEOUT / HZ;
-
+	cmd->time_out = (SCSI_TIMEOUT / HZ) * 5;
 	memcpy(cmd->cdb, Cmnd->cmnd, Cmnd->cmd_len);
 
 	if (Cmnd->use_sg) {
@@ -1173,41 +1177,38 @@
 
 
 	if (Cmnd->device->tagged_supported) {
-		switch (Cmnd->tag) {
-		case SIMPLE_QUEUE_TAG:
-			cmd->control_flags |= CFLAG_SIMPLE_TAG;
-			break;
-		case HEAD_OF_QUEUE_TAG:
-			cmd->control_flags |= CFLAG_HEAD_TAG;
-			break;
-		case ORDERED_QUEUE_TAG:
+		if ((jiffies - hostdata->tag_ages[Cmnd->target]) > (2 * SCSI_TIMEOUT)) {
 			cmd->control_flags |= CFLAG_ORDERED_TAG;
-			break;
-		default:
-			if ((jiffies - hostdata->tag_ages[Cmnd->target]) > (5 * HZ)) {
+			hostdata->tag_ages[Cmnd->target] = jiffies;
+		} else
+			switch (Cmnd->tag) {
+			case HEAD_OF_QUEUE_TAG:
+				cmd->control_flags |= CFLAG_HEAD_TAG;
+				break;
+			case ORDERED_QUEUE_TAG:
 				cmd->control_flags |= CFLAG_ORDERED_TAG;
-				hostdata->tag_ages[Cmnd->target] = jiffies;
-			} else
+				break;
+			default:
 				cmd->control_flags |= CFLAG_SIMPLE_TAG;
+				break;
 		}
 	}
 	outw(in_ptr, host->io_port + MBOX4);
 	hostdata->req_in_ptr = in_ptr;
 
 	hostdata->queued++;
-
 	num_free = QLOGICFC_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr);
-	num_free = num_free - 2;
+	num_free = (num_free > 2) ? num_free - 2 : 0;
 	host->can_queue = hostdata->queued + num_free;
 	if (host->can_queue > QLOGICFC_REQ_QUEUE_LEN)
 		host->can_queue = QLOGICFC_REQ_QUEUE_LEN;
 	host->sg_tablesize = QLOGICFC_MAX_SG(num_free);
 
 	/* this is really gross */
-	if (host->can_queue < host->host_busy){
+	if (host->can_queue <= host->host_busy){
 	        if (host->can_queue+2 < host->host_busy) 
-		  printk("qlogicfc.c crosses its fingers.\n");
-		host->can_queue = host->host_busy;
+			DEBUG(printk("qlogicfc.c crosses its fingers.\n"));
+		host->can_queue = host->host_busy + 1;
 	}
 
 	LEAVE("isp2100_queuecommand");
@@ -1310,22 +1311,20 @@
 		while (out_ptr != in_ptr) {
 			sts = (struct Status_Entry *) &hostdata->res[out_ptr][0];
 			out_ptr = (out_ptr + 1) & RES_QUEUE_LEN;
-			Cmnd = hostdata->handle_ptrs[sts->handle];
-
-			hostdata->handle_ptrs[sts->handle] = NULL;
-
-			if (hostdata->handle_serials[sts->handle] != Cmnd->serial_number) {
-				hostdata->queued--;
-				hostdata->handle_serials[sts->handle] = 0;
-				outw(out_ptr, host->io_port + MBOX5);
-				continue;
-			}
-			hostdata->handle_serials[sts->handle] = 0;
-
+                 
 			TRACE("done", out_ptr, Cmnd);
 			DEBUG_INTR(isp2100_print_status_entry(sts));
 			if (sts->hdr.entry_type == ENTRY_STATUS) {
+				Cmnd = hostdata->handle_ptrs[sts->handle];
 				Cmnd->result = isp2100_return_status(sts);
+				hostdata->handle_ptrs[sts->handle] = NULL;
+				hostdata->queued--;
+				if (hostdata->handle_serials[sts->handle] != Cmnd->serial_number) {
+					hostdata->handle_serials[sts->handle] = 0;
+					outw(out_ptr, host->io_port + MBOX5);
+					continue;
+				}
+				hostdata->handle_serials[sts->handle] = 0;
 			} else {
 				outw(out_ptr, host->io_port + MBOX5);
 				continue;
@@ -1336,13 +1335,13 @@
 			    || (sts->status_flags & STF_BUS_RESET))
 				hostdata->send_marker = 1;
 
+			memset(Cmnd->sense_buffer, 0, sizeof(Cmnd->sense_buffer));
 			if (sts->scsi_status & 0x0200)
 				memcpy(Cmnd->sense_buffer, sts->req_sense_data,
 				       sizeof(Cmnd->sense_buffer));
 
 			outw(out_ptr, host->io_port + MBOX5);
 
-			hostdata->queued--;
 			if (Cmnd->scsi_done != NULL) {
 				(*Cmnd->scsi_done) (Cmnd);
 			} else
@@ -1356,16 +1355,16 @@
 	in_ptr = hostdata->req_in_ptr;
 
 	num_free = QLOGICFC_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr);
-	num_free = num_free-2;
+	num_free = (num_free > 2) ? num_free - 2 : 0;
 	host->can_queue = hostdata->queued + num_free;
 	if (host->can_queue > QLOGICFC_REQ_QUEUE_LEN)
 		host->can_queue = QLOGICFC_REQ_QUEUE_LEN;
 	host->sg_tablesize = QLOGICFC_MAX_SG(num_free);
 
-	if (host->can_queue < host->host_busy){
+	if (host->can_queue <= host->host_busy){
 	        if (host->can_queue+2 < host->host_busy) 
 		        DEBUG(printk("qlogicfc crosses its fingers.\n"));
-		host->can_queue = host->host_busy;
+		host->can_queue = host->host_busy + 1;
 	}
 
 	outw(HCCR_CLEAR_RISC_INTR, host->io_port + HOST_HCCR);
@@ -1401,16 +1400,7 @@
 	case CS_COMPLETE:
 		host_status = DID_OK;
 		break;
-	case CS_INCOMPLETE:
-		if (!(sts->state_flags & SF_SENT_CDB))
-			host_status = DID_ERROR;
-		else if (!(sts->state_flags & SF_TRANSFERRED_DATA))
-			host_status = DID_ERROR;
-		else if (!(sts->state_flags & SF_GOT_STATUS))
-			host_status = DID_ERROR;
-		break;
 	case CS_DMA_ERROR:
-	case CS_TRANSPORT_ERROR:
 		host_status = DID_ERROR;
 		break;
 	case CS_RESET_OCCURRED:
@@ -1423,7 +1413,6 @@
 		host_status = DID_TIME_OUT;
 		break;
 	case CS_DATA_OVERRUN:
-	case CS_ABORT_MSG_FAILED:
 		host_status = DID_ERROR;
 		break;
 	case CS_DATA_UNDERRUN:
@@ -1434,6 +1423,9 @@
 	case CS_PORT_CONFIG_CHANGED:
 		host_status = DID_BAD_TARGET;
 		break;
+	case CS_QUEUE_FULL:
+		host_status = DID_ERROR;
+		break;
 	default:
 		printk("qlogicfc : unknown completion status 0x%04x\n",
 		       sts->completion_status);
@@ -1539,8 +1531,6 @@
 		ip[0] = 255;
 		ip[1] = 63;
 		ip[2] = size / (ip[0] * ip[1]);
-		if (ip[2] > 1023)
-			ip[2] = 1023;
 	}
 	LEAVE("isp2100_biosparam");
 
@@ -1678,9 +1668,6 @@
 	if (isp2100_read_nvram_word(host, 0) != 0x5349)
 		return 1;
 
-	control_block->max_frame_len = isp2100_read_nvram_word(host, 5);
-	control_block->max_iocb = isp2100_read_nvram_word(host, 6);
-	control_block->exec_throttle = isp2100_read_nvram_word(host, 7);
 	value = isp2100_read_nvram_word(host, 8);
 	control_block->node_name[0] = isp2100_read_nvram_word(host, 9);
 	control_block->node_name[1] = isp2100_read_nvram_word(host, 10);
@@ -1892,8 +1879,6 @@
 }
 
 
-#if DEBUG_ISP2100_INTR
-
 void isp2100_print_status_entry(struct Status_Entry *status)
 {
 	printk("qlogicfc : entry count = 0x%02x, type = 0x%02x, flags = 0x%02x\n",
@@ -1908,7 +1893,6 @@
 
 }
 
-#endif				/* DEBUG_ISP2100_INTR */
 
 
 #if DEBUG_ISP2100
diff -urN linux-2.2.6-pre2/fs/fat/inode.c linux-2.2.6-pre3/fs/fat/inode.c
--- linux-2.2.6-pre2/fs/fat/inode.c	2003-08-15 15:05:39.000000000 -0700
+++ linux-2.2.6-pre3/fs/fat/inode.c	2003-08-15 15:05:39.000000000 -0700
@@ -366,7 +366,6 @@
 		fat32 = 1;
 		MSDOS_SB(sb)->fat_length= CF_LE_W(b->fat32_length)*sector_mult;
 		MSDOS_SB(sb)->root_cluster = CF_LE_L(b->root_cluster);
-			CF_LE_W(b->info_sector), logical_sector_size);
 
 		/* MC - if info_sector is 0, don't multiply by 0 */
 		if(CF_LE_W(b->info_sector) == 0) {
diff -urN linux-2.2.6-pre2/fs/inode.c linux-2.2.6-pre3/fs/inode.c
--- linux-2.2.6-pre2/fs/inode.c	1999-03-22 10:40:30.000000000 -0800
+++ linux-2.2.6-pre3/fs/inode.c	2003-08-15 15:05:39.000000000 -0700
@@ -529,15 +529,6 @@
 }
 
 /*
- * This gets called with I_LOCK held: it needs
- * to read the inode and then unlock it
- */
-static inline void read_inode(struct inode *inode, struct super_block *sb)
-{
-	sb->s_op->read_inode(inode);
-}
-
-/*
  * This is called by things like the networking layer
  * etc that want to get an inode without any inode
  * number, or filesystems that allocate new inodes with
@@ -606,7 +597,7 @@
 		spin_unlock(&inode_lock);
 
 		clean_inode(inode);
-		read_inode(inode, sb);
+		sb->s_op->read_inode(inode);
 
 		/*
 		 * This is special!  We do not need the spinlock
diff -urN linux-2.2.6-pre2/fs/minix/inode.c linux-2.2.6-pre3/fs/minix/inode.c
--- linux-2.2.6-pre2/fs/minix/inode.c	1998-11-22 09:34:01.000000000 -0800
+++ linux-2.2.6-pre3/fs/minix/inode.c	2003-08-15 15:05:39.000000000 -0700
@@ -195,8 +195,8 @@
 	s->u.minix_sb.s_ms = ms;
 	s->u.minix_sb.s_sbh = bh;
 	s->u.minix_sb.s_mount_state = ms->s_state;
-	s->s_blocksize = 1024;
-	s->s_blocksize_bits = 10;
+	s->s_blocksize = BLOCK_SIZE;
+	s->s_blocksize_bits = BLOCK_SIZE_BITS;
 	s->u.minix_sb.s_ninodes = ms->s_ninodes;
 	s->u.minix_sb.s_nzones = ms->s_nzones;
 	s->u.minix_sb.s_imap_blocks = ms->s_imap_blocks;
diff -urN linux-2.2.6-pre2/fs/namei.c linux-2.2.6-pre3/fs/namei.c
--- linux-2.2.6-pre2/fs/namei.c	2003-08-15 15:05:39.000000000 -0700
+++ linux-2.2.6-pre3/fs/namei.c	2003-08-15 15:05:39.000000000 -0700
@@ -1032,17 +1032,13 @@
 	int error;
 
 	error = may_delete(dir, dentry, 0);
-	if (error)
-		goto exit_lock;
-
-	if (!dir->i_op || !dir->i_op->unlink)
-		goto exit_lock;
-
-	DQUOT_INIT(dir);
-
-	error = dir->i_op->unlink(dir, dentry);
-
-exit_lock:
+	if (!error) {
+		error = -EPERM;
+		if (dir->i_op && dir->i_op->unlink) {
+			DQUOT_INIT(dir);
+			error = dir->i_op->unlink(dir, dentry);
+		}
+	}
 	return error;
 }
 
diff -urN linux-2.2.6-pre2/include/asm-alpha/io.h linux-2.2.6-pre3/include/asm-alpha/io.h
--- linux-2.2.6-pre2/include/asm-alpha/io.h	1999-01-10 09:59:59.000000000 -0800
+++ linux-2.2.6-pre3/include/asm-alpha/io.h	2003-08-15 15:05:39.000000000 -0700
@@ -287,7 +287,7 @@
  * String version of IO memory access ops:
  */
 extern void _memcpy_fromio(void *, unsigned long, long);
-extern void _memcpy_toio(unsigned long, void *, long);
+extern void _memcpy_toio(unsigned long, const void *, long);
 extern void _memset_c_io(unsigned long, unsigned long, long);
 
 #define memcpy_fromio(to,from,len) \
diff -urN linux-2.2.6-pre2/include/asm-alpha/semaphore.h linux-2.2.6-pre3/include/asm-alpha/semaphore.h
--- linux-2.2.6-pre2/include/asm-alpha/semaphore.h	1999-03-21 20:53:46.000000000 -0800
+++ linux-2.2.6-pre3/include/asm-alpha/semaphore.h	2003-08-15 15:05:39.000000000 -0700
@@ -115,42 +115,43 @@
 
 extern inline int down_trylock(struct semaphore * sem)
 {
-	long ret, tmp, tmp2;
+	long ret, tmp, tmp2, sub;
 
 	/* "Equivalent" C.  Note that we have to do this all without
 	   (taken) branches in order to be a valid ll/sc sequence.
 
 	   do {
 	       tmp = ldq_l;
-	       ret = 0;
-	       tmp -= 1;
-	       if ((int)tmp < 0)		// count
-	           break;
-	       if ((long)tmp < 0)		// waking
-	           break;
-	       tmp += 0xffffffff00000000;
-	       ret = 1;
+	       sub = 0x0000000100000000;
+	       ret = ((int)tmp <= 0);		// count <= 0 ?
+	       // If we're subtracting one from count, we don't need 
+	       // one from waking and vice versa.
+	       if ((int)tmp > 0) sub = 1;	// count > 0 ?
+	       if ((long)tmp >= 0) ret = 0;	// waking >= 0 ?
+	       if (ret) break;	
+	       tmp -= sub;
 	       tmp = stq_c = tmp;
 	   } while (tmp == 0);
 	*/
 
 	__asm__ __volatile__(
-		"1:	ldq_l	%1,%3\n"
-		"	lda	%0,0\n"
-		"	subl	%1,1,%2\n"
-		"	subq	%1,1,%1\n"
-		"	blt	%2,2f\n"
-		"	blt	%1,2f\n"
-		"	ldah	%1,-32768(%1)\n"
-		"	ldah	%1,-32768(%1)\n"
-		"	lda	%0,1\n"
-		"	stq_c	%1,%3\n"
+		"1:	ldq_l	%1,%4\n"
+		"	lda	%3,1\n"
+		"	addl	%1,0,%2\n"
+		"	sll	%3,32,%3\n"
+		"	cmple	%2,0,%0\n"
+		"	cmovgt	%2,1,%3\n"
+		"	cmovge	%1,0,%0\n"
+		"	bne	%0,2f\n"
+		"	subq	%1,%3,%1\n"
+		"	stq_c	%1,%4\n"
 		"	beq	%1,3f\n"
-		"2:	mb\n"
+		"	mb\n"
+		"2:\n"
 		".section .text2,\"ax\"\n"
 		"3:	br	1b\n"
 		".previous"
-		: "=&r"(ret), "=&r"(tmp), "=&r"(tmp2)
+		: "=&r"(ret), "=&r"(tmp), "=&r"(tmp2), "=&r"(sub)
 		: "m"(*sem)
 		: "memory");
 
diff -urN linux-2.2.6-pre2/include/asm-alpha/semaphore-helper.h linux-2.2.6-pre3/include/asm-alpha/semaphore-helper.h
--- linux-2.2.6-pre2/include/asm-alpha/semaphore-helper.h	1999-03-19 08:06:56.000000000 -0800
+++ linux-2.2.6-pre3/include/asm-alpha/semaphore-helper.h	2003-08-15 15:05:39.000000000 -0700
@@ -50,7 +50,7 @@
  *	0	go to sleep
  *	-EINTR	interrupted
  *
- * We must undo the sem->count down_interruptible increment
+ * We must undo the sem->count down_interruptible decrement
  * simultaneously and atomicly with the sem->waking adjustment,
  * otherwise we can race with wake_one_more.
  *
diff -urN linux-2.2.6-pre2/include/asm-alpha/uaccess.h linux-2.2.6-pre3/include/asm-alpha/uaccess.h
--- linux-2.2.6-pre2/include/asm-alpha/uaccess.h	1998-06-24 14:30:11.000000000 -0700
+++ linux-2.2.6-pre3/include/asm-alpha/uaccess.h	2003-08-15 15:05:39.000000000 -0700
@@ -358,43 +358,55 @@
  * Complex access routines
  */
 
-#define __copy_to_user(to,from,n)   __copy_tofrom_user_nocheck((to),(from),(n))
-#define __copy_from_user(to,from,n) __copy_tofrom_user_nocheck((to),(from),(n))
+extern void __copy_user(void);
 
-#define copy_to_user(to,from,n)   __copy_tofrom_user((to),(from),(n),__cu_to)
-#define copy_from_user(to,from,n) __copy_tofrom_user((to),(from),(n),__cu_from)
+extern inline long
+__copy_tofrom_user_nocheck(void *to, const void *from, long len)
+{
+	register void * __cu_to __asm__("$6") = to;
+	register const void * __cu_from __asm__("$7") = from;
+	register long __cu_len __asm__("$0") = len;
+
+	__asm__ __volatile__(
+		"jsr $28,__copy_user"
+		: "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to)
+		: "0" (__cu_len), "1" (__cu_from), "2" (__cu_to)
+		: "$1","$2","$3","$4","$5","$27","$28","memory");
 
-extern void __copy_user(void);
+	return __cu_len;
+}
 
-#define __copy_tofrom_user_nocheck(to,from,n)				\
-({									\
-	register void * __cu_to __asm__("$6") = (to);			\
-	register const void * __cu_from __asm__("$7") = (from);		\
-	register long __cu_len __asm__("$0") = (n);			\
-	__asm__ __volatile__(						\
-		"jsr $28,(%3),__copy_user"				\
-		: "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to)	\
-		: "r" (__copy_user), "0" (__cu_len),			\
-		  "1" (__cu_from), "2" (__cu_to)			\
-		: "$1","$2","$3","$4","$5","$28","memory");		\
-	__cu_len;							\
-})
+extern inline long
+__copy_tofrom_user(void *to, const void *from, long len, const void *validate)
+{
+	if (__access_ok((long)validate, len, get_fs())) {
+		register void * __cu_to __asm__("$6") = to;
+		register const void * __cu_from __asm__("$7") = from;
+		register long __cu_len __asm__("$0") = len;
+		__asm__ __volatile__(
+			"jsr $28,__copy_user"
+			: "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to)
+			: "0" (__cu_len), "1" (__cu_from), "2" (__cu_to)
+			: "$1","$2","$3","$4","$5","$27","$28","memory");
+		len = __cu_len;
+	}
+	return len;
+}
 
-#define __copy_tofrom_user(to,from,n,v)					    \
-({									    \
-	register void * __cu_to __asm__("$6") = (to);			    \
-	register const void * __cu_from __asm__("$7") = (from);		    \
-	register long __cu_len __asm__("$0") = (n);			    \
-	if (__access_ok(((long)(v)),__cu_len,get_fs())) {		    \
-		__asm__ __volatile__(					    \
-			"jsr $28,(%3),__copy_user"			    \
-			: "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to) \
-			: "r" (__copy_user), "0" (__cu_len),		    \
-			  "1" (__cu_from), "2" (__cu_to)   		    \
-			: "$1","$2","$3","$4","$5","$28","memory");	    \
-	}								    \
-	__cu_len;							    \
-})
+#define __copy_to_user(to,from,n)   __copy_tofrom_user_nocheck((to),(from),(n))
+#define __copy_from_user(to,from,n) __copy_tofrom_user_nocheck((to),(from),(n))
+
+extern inline long
+copy_to_user(void *to, const void *from, long n)
+{
+	return __copy_tofrom_user(to, from, n, to);
+}
+
+extern inline long
+copy_from_user(void *to, const void *from, long n)
+{
+	return __copy_tofrom_user(to, from, n, from);
+}
 
 #define copy_to_user_ret(to,from,n,retval) ({ \
 if (copy_to_user(to,from,n)) \
@@ -408,46 +420,48 @@
 
 extern void __do_clear_user(void);
 
-#define __clear_user(to,n)						\
-({									\
-	register void * __cl_to __asm__("$6") = (to);			\
-	register long __cl_len __asm__("$0") = (n);			\
-	__asm__ __volatile__(						\
-		"jsr $28,(%2),__do_clear_user"				\
-		: "=r"(__cl_len), "=r"(__cl_to)				\
-		: "r"(__do_clear_user), "0"(__cl_len), "1"(__cl_to)	\
-		: "$1","$2","$3","$4","$5","$28","memory");		\
-	__cl_len;							\
-})
+extern inline long
+__clear_user(void *to, long len)
+{
+	register void * __cl_to __asm__("$6") = to;
+	register long __cl_len __asm__("$0") = len;
+	__asm__ __volatile__(
+		"jsr $28,__do_clear_user"
+		: "=r"(__cl_len), "=r"(__cl_to)
+		: "0"(__cl_len), "1"(__cl_to)
+		: "$1","$2","$3","$4","$5","$27","$28","memory");
+	return __cl_len;
+}
 
-#define clear_user(to,n)						\
-({									\
-	register void * __cl_to __asm__("$6") = (to);			\
-	register long __cl_len __asm__("$0") = (n);			\
-	if (__access_ok(((long)__cl_to),__cl_len,get_fs())) {		\
-		__asm__ __volatile__(					\
-			"jsr $28,(%2),__do_clear_user"			\
-			: "=r"(__cl_len), "=r"(__cl_to)			\
-			: "r"(__do_clear_user), "0"(__cl_len), "1"(__cl_to)\
-			: "$1","$2","$3","$4","$5","$28","memory");	\
-	}								\
-	__cl_len;							\
-})
+extern inline long
+clear_user(void *to, long len)
+{
+	if (__access_ok((long)to, len, get_fs())) {
+		register void * __cl_to __asm__("$6") = to;
+		register long __cl_len __asm__("$0") = len;
+		__asm__ __volatile__(
+			"jsr $28,__do_clear_user"
+			: "=r"(__cl_len), "=r"(__cl_to)
+			: "0"(__cl_len), "1"(__cl_to)
+			: "$1","$2","$3","$4","$5","$27","$28","memory");
+		len = __cl_len;
+	}
+	return len;
+}
 
 /* Returns: -EFAULT if exception before terminator, N if the entire
    buffer filled, else strlen.  */
 
 extern long __strncpy_from_user(char *__to, const char *__from, long __to_len);
 
-#define strncpy_from_user(to,from,n)					   \
-({									   \
-	char * __sfu_to = (to);						   \
-	const char * __sfu_from = (from);				   \
-	long __sfu_ret = -EFAULT;			      		   \
-	if (__access_ok(((long)__sfu_from),0,get_fs()))			   \
-		__sfu_ret = __strncpy_from_user(__sfu_to,__sfu_from,(n));  \
-	__sfu_ret;							   \
-})
+extern inline long
+strncpy_from_user(char *to, const char *from, long n)
+{
+	long ret = -EFAULT;
+	if (__access_ok((long)from, 0, get_fs()))
+		ret = __strncpy_from_user(to, from, n);
+	return ret;
+}
 
 /* Returns: 0 if bad, string length+1 (memory size) of string if ok */
 extern long __strlen_user(const char *);
diff -urN linux-2.2.6-pre2/include/linux/mca.h linux-2.2.6-pre3/include/linux/mca.h
--- linux-2.2.6-pre2/include/linux/mca.h	1998-10-17 15:34:26.000000000 -0700
+++ linux-2.2.6-pre3/include/linux/mca.h	2003-08-15 15:05:39.000000000 -0700
@@ -39,27 +39,27 @@
 specify a starting slot beyond zero, to deal with detecting multiple
 devices.  Returns MCA_NOTFOUND if id not found.  Also checks the
 integrated adapters. */
-extern int mca_find_adapter( int id, int start );
-extern int mca_find_unused_adapter( int id, int start );
+extern int mca_find_adapter(int id, int start);
+extern int mca_find_unused_adapter(int id, int start);
 
 /* adapter state info - returns 0 if no */
-extern int mca_isadapter( int slot );
-extern int mca_isenabled( int slot );
+extern int mca_isadapter(int slot);
+extern int mca_isenabled(int slot);
 
-extern int mca_is_adapter_used( int slot );
-extern int mca_mark_as_used( int slot );
-extern void mca_mark_as_unused( int slot );
+extern int mca_is_adapter_used(int slot);
+extern int mca_mark_as_used(int slot);
+extern void mca_mark_as_unused(int slot);
 
 /* gets a byte out of POS register (stored in memory) */
-extern unsigned char mca_read_stored_pos( int slot, int reg );
+extern unsigned char mca_read_stored_pos(int slot, int reg);
 
 /*
 	This can be expanded later.  Right now, it gives us a way of
 	getting meaningful information into the MCA_info structure,
 	so we can have a more interesting /proc/mca.
 */
-extern void mca_set_adapter_name( int slot, char* name );
-extern char* mca_get_adapter_name( int slot );
+extern void mca_set_adapter_name(int slot, char* name);
+extern char* mca_get_adapter_name(int slot);
 
 /*
 	This sets up an information callback for /proc/mca/slot?.  The
@@ -73,8 +73,8 @@
 	unregisters, thus preventing kernel crashes and other such
 	nastiness.
 */
-typedef int (*MCA_ProcFn)( char* buf, int slot, void* dev );
-extern void mca_set_adapter_procfn( int slot, MCA_ProcFn, void* dev );
+typedef int (*MCA_ProcFn)(char* buf, int slot, void* dev);
+extern void mca_set_adapter_procfn(int slot, MCA_ProcFn, void* dev);
 
 /* These routines actually mess with the hardware POS registers.  They
 temporarily disable the device (and interrupts), so make sure you know
@@ -88,13 +88,13 @@
 */
 
 /* read a byte from the specified POS register. */
-extern unsigned char mca_read_pos( int slot, int reg );
+extern unsigned char mca_read_pos(int slot, int reg);
 
 /* write a byte to the specified POS register. */
-extern void mca_write_pos( int slot, int reg, unsigned char byte );
+extern void mca_write_pos(int slot, int reg, unsigned char byte);
 
 /* Should only be called by the NMI interrupt handler, this will do some
 fancy stuff to figure out what might have generated a NMI. */
-extern void mca_handle_nmi( void );
+extern void mca_handle_nmi(void);
 
 #endif /* _LINUX_MCA_H */
diff -urN linux-2.2.6-pre2/include/linux/socket.h linux-2.2.6-pre3/include/linux/socket.h
--- linux-2.2.6-pre2/include/linux/socket.h	1998-12-27 22:18:28.000000000 -0800
+++ linux-2.2.6-pre3/include/linux/socket.h	2003-08-15 15:05:39.000000000 -0700
@@ -246,6 +246,7 @@
 #define SOL_PACKET	263
 #define SOL_ATM		264	/* ATM layer (cell level) */
 #define SOL_AAL		265	/* ATM Adaption Layer (packet level) */
+#define SOL_IRDA        266
 
 /* IPX options */
 #define IPX_TYPE	1
diff -urN linux-2.2.6-pre2/include/net/irda/discovery.h linux-2.2.6-pre3/include/net/irda/discovery.h
--- linux-2.2.6-pre2/include/net/irda/discovery.h	1969-12-31 16:00:00.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/discovery.h	2003-08-15 15:05:39.000000000 -0700
@@ -0,0 +1,65 @@
+/*********************************************************************
+ *                
+ * Filename:      discovery.h
+ * Version:       
+ * Description:   
+ * Status:        Experimental.
+ * Author:        Dag Brattli <dagb@cs.uit.no>
+ * Created at:    Tue Apr  6 16:53:53 1999
+ * Modified at:   Tue Apr  6 20:44:35 1999
+ * Modified by:   Dag Brattli <dagb@cs.uit.no>
+ * 
+ *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
+ *     
+ *     This program is free software; you can redistribute it and/or 
+ *     modify it under the terms of the GNU General Public License as 
+ *     published by the Free Software Foundation; either version 2 of 
+ *     the License, or (at your option) any later version.
+ * 
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *     GNU General Public License for more details.
+ * 
+ *     You should have received a copy of the GNU General Public License 
+ *     along with this program; if not, write to the Free Software 
+ *     Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
+ *     MA 02111-1307 USA
+ *     
+ ********************************************************************/
+
+#ifndef DISCOVERY_H
+#define DISCOVERY_H
+
+#include <asm/param.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irqueue.h>
+
+#define DISCOVERY_EXPIRE_TIMEOUT 6*HZ
+
+/*
+ * The DISCOVERY structure is used for both discovery requests and responses
+ */
+typedef struct {
+	QUEUE queue;             /* Must be first! */
+
+	__u32      saddr;        /* Which link the device was discovered */
+	__u32      daddr;        /* Remote device address */
+	LAP_REASON condition;    /* More info about the discovery */
+
+	__u16_host_order hints;  /* Discovery hint bits */
+	__u8       charset;
+	char       info[32];     /* Usually the name of the device */
+	__u8       info_len;     /* Length of device info field */
+
+	int        gen_addr_bit; /* Need to generate a new device address? */
+	int        nslots;       /* Number of slots to use when discovering */
+	int        timestamp;    /* Time discovered */
+} discovery_t;
+
+void irlmp_add_discovery(hashbin_t *cachelog, discovery_t *discovery);
+void irlmp_add_discovery_log(hashbin_t *cachelog, hashbin_t *log);
+void irlmp_expire_discoveries(hashbin_t *log, int saddr, int force);
+
+#endif
diff -urN linux-2.2.6-pre2/include/net/irda/ircomm_common.h linux-2.2.6-pre3/include/net/irda/ircomm_common.h
--- linux-2.2.6-pre2/include/net/irda/ircomm_common.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/ircomm_common.h	2003-08-15 15:05:39.000000000 -0700
@@ -19,6 +19,9 @@
  *
  ********************************************************************/
 
+#ifndef IRCOMM_H
+#define IRCOMM_H
+
 /* #define DEBUG(n, args...) printk( KERN_DEBUG args) */ /* enable all debug message */
 
 #include <linux/types.h>
@@ -52,16 +55,23 @@
 	IRCOMM_CONTROL_REQUEST,
 } IRCOMM_EVENT;
 
+typedef enum {
+	TX_READY,
+	TX_BUSY,
+
+	IAS_PARAM,
+	CONTROL_CHANNEL,
+} IRCOMM_CMD;
+
+
 
 #define IRCOMM_MAGIC            0x434f4d4d
 #define COMM_INIT_CTRL_PARAM    3          /* length of initial control parameters */
-#define COMM_CTRL_MIN           1          /* length of clen field */
-#define COMM_HEADER_SIZE        (LAP_HEADER+LMP_HEADER+TTP_HEADER+COMM_CTRL_MIN)
+#define COMM_HEADER             1          /* length of clen field */
+#define COMM_HEADER_SIZE        (LAP_HEADER+LMP_HEADER+TTP_HEADER+COMM_HEADER)
 #define COMM_DEFAULT_DATA_SIZE  64
-#define IRCOMM_MAX_CONNECTION   1          /* Don't change */
+#define IRCOMM_MAX_CONNECTION   1          /* Don't change for now */
 
-#define IAS_PARAM               1
-#define CONTROL_CHANNEL         2
 
 
 
@@ -78,7 +88,7 @@
 
 
 #define SERVICETYPE 0x00
-#define PORT_TYPE 0x02
+#define PORT_TYPE 0x01
 #define PORT_NAME 0x02
 #define FIXED_PORT_NAME 0x82
 
@@ -101,10 +111,6 @@
 #define IEEE1284_MODE 0x34
 #define IEEE1284_ECP_EPP_DATA_TRANSFER 0x35
 
-#define TX_READY 0xFE  /* FIXME: this is not defined in IrCOMM spec */
-#define TX_BUSY  0XFF  /*         so we should find another way */
-
-
 /*  parameters of FLOW_CONTROL  */
 
 #define USE_RTS 0x08  /* use RTS on output */
@@ -131,6 +137,20 @@
 
 /*  parameters of DATA_FORMAT */
 
+#define IRCOMM_WLEN5   0x00       /* word length is 5bit */
+#define IRCOMM_WLEN6   0x01       /* word length is 6bit */
+#define IRCOMM_WLEN7   0x02       /* word length is 7bit */
+#define IRCOMM_WLEN8   0x03       /* word length is 8bit */
+
+#define IRCOMM_STOP2   0x04       /* 2 stop bits mode */
+#define IRCOMM_PARENB  0x08       /* parity enable */
+#define IRCOMM_PARODD  0x00       /*  odd parity */
+#define IRCOMM_PAREVEN 0x10       /*  even parity */
+#define IRCOMM_PARMARK 0x20
+#define IRCOMM_PARSPC  0x30
+
+/*  parameters of LINE_STATUS */
+
 #define LSR_OE     0x02    /* Overrun error indicator */
 #define LSR_PE     0x04    /* Parity error indicator */
 #define LSR_FE     0x08    /* Frame error indicator */
@@ -146,31 +166,46 @@
 	int in_use;
 	int null_modem_mode;     /* switch for null modem emulation */
 	int ttp_stop;
+
 	int max_txbuff_size;          
-	int maxsdusize;
+	__u32 maxsdusize;
+
  	__u32 daddr;        /* Device address of the peer device */ 
 	__u32 saddr;
-
-	void (*d_handler)(struct ircomm_cb *self);
+	int                 ias_type;
+	int disconnect_priority; /* P_NORMAL or P_HIGH. see irttp.h */
 	struct notify_t notify;     /* container of callbacks */
+	void (*d_handler)(struct ircomm_cb *self);
 
+	int control_ch_pending;
 	struct sk_buff *ctrl_skb;   /* queue of control channel */
 
+	__u8 dlsap;          /* IrLMP dlsap */
+	__u8 lsap;           /* sap of local device */ 
 	struct tsap_cb *tsap;          /* IrTTP/LMP handle */
 	struct qos_info *qos;         /* Quality of Service */
-	
 	int reason;          /* I don't know about reason: 
 				see Irlmp.c or somewhere :p)*/ 
+	int peer_cap;        /* capability of peer device */
+
+	struct wait_queue   *discovery_wait;
+	struct wait_queue   *ias_wait;
+
+	/* statistics */
+	int                 tx_packets;
+	int                 rx_packets;
+	int                 tx_controls;
+	int                 pending_control_tuples;
+	int                 ignored_control_tuples;
+
 
-	__u8 dlsap;          /* IrLMP dlsap */
-	__u8 lsap;           /* sap of local device */ 
 
 	__u8 pi ;            /* instruction of control channel*/ 
+
 	__u8 port_type;
 	__u8 peer_port_type;
 
 	__u8 servicetype;    
-	__u8 peer_servicetype;
 	__u8 data_format;   
 	__u8 peer_data_format;   
 	__u8 flow_ctrl;
@@ -200,35 +235,26 @@
 	
 	__u32 data_rate;
 	__u32 peer_data_rate;
-	char port_name[60];
-
+	char port_name[33];
+	int port_name_critical;
 };
 
 
 
-void ircomm_connect_request(struct ircomm_cb *self, int maxsdusize);
+int  ircomm_query_ias_and_connect(struct ircomm_cb *self, __u8 servicetype); 
+void ircomm_connect_request(struct ircomm_cb *self);
 void ircomm_connect_response(struct ircomm_cb *self, struct sk_buff *userdata,
-			     int maxsdusize);
+			     __u32 maxsdusize);
 void ircomm_disconnect_request(struct ircomm_cb *self,
-				      struct sk_buff *userdata);
-void ircomm_data_request(struct ircomm_cb *self,
-			 struct sk_buff *userdata);
-void ircomm_control_request(struct ircomm_cb *self);
-void ircomm_append_ctrl(struct ircomm_cb *self, __u8 instruction);
-struct ircomm_cb *ircomm_attach_cable( __u8 servicetype, struct notify_t notify, 
-			 void *handler);
-int ircomm_detach_cable(struct ircomm_cb *self);
-
-
-void ircomm_accept_data_indication(void *instance, void *sap, struct sk_buff *skb);
-void ircomm_accept_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
-				   int maxsdusize, struct sk_buff *skb);
-void ircomm_accept_connect_indication(void *instance, void *sap,
-				      struct qos_info *qos, 
-				      int maxsdusize, struct sk_buff *skb);
-void ircomm_accept_disconnect_indication(void *instance, void *sap, LM_REASON reason,
-					 struct sk_buff *skb);
-void ircomm_accept_flow_indication(void *instance, void *sap, LOCAL_FLOW flow);
-void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state);
+			       struct sk_buff *userdata, int priority);
+int ircomm_data_request(struct ircomm_cb *self,
+			struct sk_buff *userdata);
+void ircomm_control_request(struct ircomm_cb *self, __u8 instruction);
+
+void ircomm_parse_tuples(struct ircomm_cb *self, struct sk_buff *skb, int type);
+
+struct ircomm_cb *ircomm_open_instance(struct notify_t notify);
+int ircomm_close_instance(struct ircomm_cb *self);
 
 
+#endif
diff -urN linux-2.2.6-pre2/include/net/irda/irda_device.h linux-2.2.6-pre3/include/net/irda/irda_device.h
--- linux-2.2.6-pre2/include/net/irda/irda_device.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irda_device.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Haris Zukanovic <haris@stud.cs.uit.no>
  * Created at:    Tue Apr 14 12:41:42 1998
- * Modified at:   Tue Feb  9 14:01:50 1999
+ * Modified at:   Wed Apr  7 17:17:16 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Haris Zukanovic, <haris@stud.cs.uit.no>
@@ -31,17 +31,20 @@
 #include <linux/tty.h>
 #include <linux/netdevice.h>
 
+#include <asm/spinlock.h>
+
 #include <net/irda/irda.h>
 #include <net/irda/qos.h>
 #include <net/irda/irqueue.h>
 
-/* Some non-standard interface flags (should not conflict with any in if.h */
+/* Some non-standard interface flags (should not conflict with any in if.h) */
 #define IFF_SIR 	0x01 /* Supports SIR speeds */
 #define IFF_MIR 	0x02 /* Supports MIR speeds */
 #define IFF_FIR 	0x04 /* Supports FIR speeds */
 #define IFF_PIO   	0x08 /* Supports PIO transfer of data */
 #define IFF_DMA		0x10 /* Supports DMA transfer of data */
-#define IFF_DONGLE      0x20 /* Interface has a dongle attached */
+#define IFF_SHM         0x20 /* Supports shared memory data transfers */
+#define IFF_DONGLE      0x40 /* Interface has a dongle attached */
 
 #define IO_XMIT 0x01
 #define IO_RECV 0x02
@@ -50,12 +53,13 @@
 struct chipio_t {
         int iobase, iobase2;  /* IO base */
         int io_ext, io_ext2;  /* Length of iobase */
+	int membase;          /* Shared memory base */
         int irq, irq2;        /* Interrupts used */
         int fifo_size;        /* FIFO size */
 
         int dma, dma2;        /* DMA channel used */
         int irqflags;         /* interrupt flags (ie, SA_SHIRQ|SA_INTERRUPT) */
-	int direction;        /* Used by some FIR drivers */
+	int direction;        /* Link direction, used by some FIR drivers */
 
 	int baudrate;         /* Currently used baudrate */
 	int dongle_id;        /* Dongle or transceiver currently used */
@@ -107,50 +111,40 @@
 
 	int xbofs;
 	int media_busy;
+	/* spinlock_t lock; */ /* For serializing operations */
 	
 	/* Media busy stuff */
 	struct timer_list media_busy_timer;
-	struct timer_list todo_timer;
-
-	int  (*hard_xmit)( struct sk_buff *skb, struct device *dev);
-        void (*change_speed)( struct irda_device *driver, int baud);
 
+	/* Driver specific implementation */
+        void (*change_speed)(struct irda_device *driver, int baud);
  	int (*is_receiving)(struct irda_device *);     /* receiving? */
 	/* int (*is_tbusy)(struct irda_device *); */   /* transmitting? */
 	void (*wait_until_sent)(struct irda_device *);
-
-	int new_speed; /* Will be removed in future */
 };
 
 extern hashbin_t *irda_device;
 
 /* Function prototypes */
-int  irda_device_init( void);
-void irda_device_cleanup( void);
+int  irda_device_init(void);
+void irda_device_cleanup(void);
 
-int  irda_device_open( struct irda_device *, char *name, void *priv);
-void irda_device_close( struct irda_device *);
+int  irda_device_open(struct irda_device *, char *name, void *priv);
+void irda_device_close(struct irda_device *);
 
 /* Interface to be uses by IrLAP */
-inline void irda_device_set_media_busy( struct irda_device *, int status);
-inline int  irda_device_is_media_busy( struct irda_device *);
-inline int  irda_device_is_receiving( struct irda_device *);
-inline void irda_device_change_speed( struct irda_device *, int);
+inline void irda_device_set_media_busy(struct irda_device *, int status);
+inline int  irda_device_is_media_busy(struct irda_device *);
+inline int  irda_device_is_receiving(struct irda_device *);
+inline void irda_device_change_speed(struct irda_device *, int);
 
-inline struct qos_info *irda_device_get_qos( struct irda_device *self);
-int irda_device_txqueue_empty( struct irda_device *self);
+inline struct qos_info *irda_device_get_qos(struct irda_device *self);
+int irda_device_txqueue_empty(struct irda_device *self);
 
-int irda_device_setup( struct device *dev);
+int irda_device_setup(struct device *dev);
 
-__inline__ int irda_get_mtt( struct sk_buff *skb);
+inline unsigned short irda_get_mtt(struct sk_buff *skb);
 
-void setup_dma( int channel, char *buffer, int count, int mode);
+void setup_dma(int channel, char *buffer, int count, int mode);
 
 #endif
-
-
-
-
-
-
-
diff -urN linux-2.2.6-pre2/include/net/irda/irda.h linux-2.2.6-pre3/include/net/irda/irda.h
--- linux-2.2.6-pre2/include/net/irda/irda.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irda.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Dec  9 21:13:12 1997
- * Modified at:   Wed Jan 27 14:15:50 1999
+ * Modified at:   Tue Apr  6 20:31:08 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -22,11 +22,15 @@
  *     
  ********************************************************************/
 
-#ifndef IRDA_H
-#define IRDA_H
+#ifndef NET_IRDA_H
+#define NET_IRDA_H
 
 #include <linux/config.h>
 #include <linux/skbuff.h>
+#include <linux/kernel.h>
+
+#include <net/irda/qos.h>
+#include <net/irda/irqueue.h>
 
 #ifndef TRUE
 #define TRUE 1
@@ -57,47 +61,6 @@
 #define ASSERT(expr, func)
 #endif /* CONFIG_IRDA_DEBUG */
 
-#ifdef CHECK_SKB
-static unsigned int check_skb = CHECK_SKB;
-
-#define SK_FREED_SKB    0x0DE2C0DE
-#define SK_GOOD_SKB     0xDEC0DED1
-#define SK_HEAD_SKB     0x12231298
-
-extern int skb_check(struct sk_buff *skb,int,int, char *);
-
-#ifdef IS_SKB
-#undef IS_SKB
-#endif
-
-#define IS_SKB(skb, func) \
-if( skb_check((skb), 0, __LINE__,__FILE__) == -1) { \
-       ##func}
-
-#ifdef IS_SKB_HEAD
-#undef IS_SKB_HEAD
-#endif
-
-#define IS_SKB_HEAD(skb)  skb_check((skb), 1, __LINE__,__FILE__)
-
-#define ALLOC_SKB_MAGIC(skb) \
-if( check_skb) \
-        skb->magic_debug_cookie = SK_GOOD_SKB;
-
-#define FREE_SKB_MAGIC(skb) \
-if( check_skb) {\
-	skb->magic_debug_cookie = SK_FREED_SKB; \
-}
-
-#else
-#undef IS_SKB
-#define IS_SKB(skb, func)
-#undef IS_SKB_HEAD
-#define IS_SKB_HEAD(skb) 
-#define ALLOC_SKB_MAGIC(skb) 
-#define FREE_SKB_MAGIC(skb)
-#endif /* CHECK_SKB */
-
 /*
  *  Magic numbers used by Linux/IR. Random numbers which must be unique to 
  *  give the best protection
@@ -117,39 +80,153 @@
 #define IAS_OBJECT_MAGIC   0x34234
 #define IAS_ATTRIB_MAGIC   0x45232
 
-#define IAS_DEVICE_ID 0x5342
+#define IAS_DEVICE_ID 0x5342 
 #define IAS_PNP_ID    0xd342
 #define IAS_OBEX_ID   0x34323
 #define IAS_IRLAN_ID  0x34234
 #define IAS_IRCOMM_ID 0x2343
 #define IAS_IRLPT_ID  0x9876
 
-#endif /* IRDA_H */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+typedef enum { FLOW_STOP, FLOW_START } LOCAL_FLOW;
 
+/* IrDA Socket */
+struct tsap_cb;
+struct irda_sock {
+	__u32 saddr;          /* my local address */
+	__u32 daddr;          /* peer address */
+
+	struct ias_object *ias_obj;
+	struct tsap_cb *tsap; /* TSAP used by this connection */
+	__u8 dtsap_sel;       /* remote TSAP address */
+	__u8 stsap_sel;       /* local TSAP address */
+	
+	__u32 max_sdu_size_rx;
+	__u32 max_sdu_size_tx;
+	struct qos_info qos_tx;
+
+	__u16 mask;           /* Hint bits mask */
+	__u16 hints;          /* Hint bits */
+
+	__u32 ckey;           /* IrLMP client handle */
+	__u32 skey;           /* IrLMP service handle */
+
+	int nslots;           /* Number of slots to use for discovery */
+
+	struct sock *sk;
+	struct wait_queue *ias_wait;       /* Wait for LM-IAS answer */
+
+	LOCAL_FLOW tx_flow;
+	LOCAL_FLOW rx_flow;
+};
 
+/*
+ *  This type is used by the protocols that transmit 16 bits words in 
+ *  little endian format. A little endian machine stores MSB of word in
+ *  byte[1] and LSB in byte[0]. A big endian machine stores MSB in byte[0] 
+ *  and LSB in byte[1].
+ */
+typedef union {
+	__u16 word;
+	__u8  byte[2];
+} __u16_host_order;
 
+/*
+ *  Information monitored by some layers
+ */
+struct irda_statistics
+{
+        int     rx_packets;             /* total packets received       */
+        int     tx_packets;             /* total packets transmitted    */
+        int     rx_errors;              /* bad packets received         */
+        int     tx_errors;              /* packet transmit problems     */
+        int     rx_dropped;             /* no space in linux buffers    */
+        int     tx_dropped;             /* no space available in linux  */
+	int     rx_compressed;
+	int     tx_compressed;
+	int     rx_bytes;               /* total bytes received         */
+	int     tx_bytes;               /* total bytes transmitted      */
+
+        int     multicast;              /* multicast packets received   */
+        int     collisions;
+	
+        /* detailed rx_errors: */
+        int     rx_length_errors;
+        int     rx_over_errors;         /* receiver ring buff overflow  */
+        int     rx_crc_errors;          /* recved pkt with crc error    */
+        int     rx_frame_errors;        /* recv'd frame alignment error */
+        int     rx_fifo_errors;         /* recv'r fifo overrun          */
+        int     rx_missed_errors;       /* receiver missed packet       */
+
+        /* detailed tx_errors */
+        int     tx_aborted_errors;
+        int     tx_carrier_errors;
+        int     tx_fifo_errors;
+        int     tx_heartbeat_errors;
+        int     tx_window_errors;
+};
+
+/* Misc status information */
+typedef enum {
+	STATUS_OK,
+	STATUS_ABORTED,
+	STATUS_NO_ACTIVITY,
+	STATUS_NOISY,
+	STATUS_REMOTE,
+} LINK_STATUS;
+
+typedef enum {
+	LOCK_NO_CHANGE,
+	LOCK_LOCKED,
+	LOCK_UNLOCKED,
+} LOCK_STATUS;
+
+typedef enum { /* FIXME check the two first reason codes */
+	LAP_DISC_INDICATION=1, /* Received a disconnect request from peer */
+	LAP_NO_RESPONSE,       /* To many retransmits without response */
+	LAP_RESET_INDICATION,  /* To many retransmits, or invalid nr/ns */
+	LAP_FOUND_NONE,        /* No devices were discovered */
+	LAP_MEDIA_BUSY,
+	LAP_PRIMARY_CONFLICT,
+} LAP_REASON;
+
+/*  
+ *  IrLMP disconnect reasons. The order is very important, since they 
+ *  correspond to disconnect reasons sent in IrLMP disconnect frames, so
+ *  please do not touch :-)
+ */
+typedef enum {
+	LM_USER_REQUEST = 1,  /* User request */
+	LM_LAP_DISCONNECT,    /* Unexpected IrLAP disconnect */
+	LM_CONNECT_FAILURE,   /* Failed to establish IrLAP connection */
+	LM_LAP_RESET,         /* IrLAP reset */
+	LM_INIT_DISCONNECT,   /* Link Management initiated disconnect */
+	LM_LSAP_NOTCONN,      /* Data delivered on unconnected LSAP */
+	LM_NON_RESP_CLIENT,   /* Non responsive LM-MUX client */
+	LM_NO_AVAIL_CLIENT,   /* No available LM-MUX client */
+	LM_CONN_HALF_OPEN,    /* Connection is half open */
+	LM_BAD_SOURCE_ADDR,   /* Illegal source address (i.e 0x00) */
+} LM_REASON;
+#define LM_UNKNOWN 0xff       /* Unspecified disconnect reason */
 
+/*
+ *  Notify structure used between transport and link management layers
+ */
+struct notify_t {
+	int (*data_indication)(void *priv, void *sap, struct sk_buff *skb);
+	int (*udata_indication)(void *priv, void *sap, struct sk_buff *skb);
+	void (*connect_confirm)(void *instance, void *sap, 
+				struct qos_info *qos, __u32 max_sdu_size,
+				struct sk_buff *skb);
+	void (*connect_indication)(void *instance, void *sap, 
+				   struct qos_info *qos, __u32 max_sdu_size,
+				   struct sk_buff *skb);
+	void (*disconnect_indication)(void *instance, void *sap, 
+				      LM_REASON reason, struct sk_buff *);
+	void (*flow_indication)(void *instance, void *sap, LOCAL_FLOW flow);
+	void *instance; /* Layer instance pointer */
+	char name[16];  /* Name of layer */
+};
 
+#define NOTIFY_MAX_NAME 16
 
+#endif /* NET_IRDA_H */
diff -urN linux-2.2.6-pre2/include/net/irda/iriap.h linux-2.2.6-pre3/include/net/irda/iriap.h
--- linux-2.2.6-pre2/include/net/irda/iriap.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/iriap.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Aug 21 00:02:07 1997
- * Modified at:   Tue Jan 26 11:50:33 1999
+ * Modified at:   Mon Mar 22 13:15:04 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -34,8 +34,8 @@
 #include <net/irda/irqueue.h>
 #include <net/irda/timer.h>
 
-#define LST 0x80
-#define ACK 0x40
+#define IAP_LST 0x80
+#define IAP_ACK 0x40
 
 #define IAS_SERVER 0
 #define IAS_CLIENT 1
@@ -91,13 +91,9 @@
 void iriap_getvaluebyclass_confirm(struct iriap_cb *self, struct sk_buff *skb);
 
 void iriap_send_ack( struct iriap_cb *self);
-void iriap_data_indication( void *instance, void *sap, struct sk_buff *skb);
-void iriap_connect_confirm( void *instance, void *sap, struct qos_info *qos, 
-			    int max_sdu_size, struct sk_buff *skb);
-void iriap_connect_indication( void *instance, void *sap, 
-			       struct qos_info *qos, int max_sdu_size,
-			       struct sk_buff *skb);
-void iriap_call_indication( struct iriap_cb *self, struct sk_buff *skb);
+void iriap_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
+			   __u32 max_sdu_size, struct sk_buff *skb);
+void iriap_call_indication(struct iriap_cb *self, struct sk_buff *skb);
 
 void iriap_register_server(void);
 
diff -urN linux-2.2.6-pre2/include/net/irda/irkbd.h linux-2.2.6-pre3/include/net/irda/irkbd.h
--- linux-2.2.6-pre2/include/net/irda/irkbd.h	1969-12-31 16:00:00.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irkbd.h	2003-08-15 15:05:39.000000000 -0700
@@ -0,0 +1,91 @@
+/*********************************************************************
+ *                
+ * Filename:      irkbd.h
+ * Version:       0.2
+ * Description:   IrDA Keyboard/Mouse driver (Tekram IR-660)
+ * Status:        Experimental.
+ * Author:        Dag Brattli <dagb@cs.uit.no>
+ * Created at:    Mon Mar  1 00:24:19 1999
+ * Modified at:   Thu Mar 11 14:54:00 1999
+ * Modified by:   Dag Brattli <dagb@cs.uit.no>
+ * 
+ *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
+ *      
+ *     This program is free software; you can redistribute it and/or 
+ *     modify it under the terms of the GNU General Public License as 
+ *     published by the Free Software Foundation; either version 2 of 
+ *     the License, or (at your option) any later version.
+ *  
+ *     Neither Dag Brattli nor University of Tromsø admit liability nor
+ *     provide warranty for any of this software. This material is 
+ *     provided "AS-IS" and at no charge.
+ *     
+ ********************************************************************/
+
+#ifndef IRKBD_H
+#define IRKBD_H
+
+/* Some commands */
+#define IRKBD_CMD_INIT_KBD   0xfe
+#define IRKBD_CMD_INIT_MOUSE 0xff
+#define IRKBD_CMD_ENABLE     0x41
+#define IRKBD_CMD_LED        0x31
+#define IRKBD_CMD_KDB_SPEED  0x33
+
+/* Some responses */
+#define IRKBD_RSP_KBDOK      0x11
+#define IRKBD_RSP_KBDERR     0x12
+#define IRKBD_RSP_MSOK       0x21
+#define IRKBD_RSP_MSERR      0x22
+#define IRKBD_RSP_LEDOK      0x31
+#define IRKBD_RSP_KBDSPEEDOK 0x33
+#define IRKBD_RSP_RSPN41     0x41
+
+#define IRKBD_RATE       2 /* Polling rate, should be 15 ms */
+#define IRKBD_TIMEOUT  100 /* 1000 ms */
+
+#define SUBFRAME_MASK     0xc0
+#define SUBFRAME_MOUSE    0x80
+#define SUBFRAME_KEYBOARD 0x40
+#define SUBFRAME_RESPONSE 0x00
+
+#define IRKBD_MAX_HEADER (TTP_HEADER+LMP_HEADER+LAP_HEADER)
+
+#define IRKBD_BUF_SIZE 4096 /* Must be power of 2! */
+
+enum {
+	IRKBD_IDLE,       /* Not connected */
+	IRKBD_INIT_KBD,   /* Initializing keyboard */
+	IRKBD_INIT_MOUSE, /* Initializing mouse */
+	IRKBD_POLLING,    /* Polling device */
+};
+
+/* Main structure */
+struct irkbd_cb {
+	struct miscdevice dev;
+	char devname[9];    /* name of the registered device */
+	int state;
+
+	int count;          /* Open count */
+
+	__u32 saddr;        /* my local address */
+	__u32 daddr;        /* peer address */
+
+	struct tsap_cb *tsap;		
+	__u8 dtsap_sel;     /* remote TSAP address */
+	__u8 stsap_sel;     /* local TSAP address */
+
+	struct timer_list watchdog_timer;
+
+	LOCAL_FLOW tx_flow;
+	LOCAL_FLOW rx_flow;
+
+	__u8 scancodes[IRKBD_BUF_SIZE]; /* Buffer for mouse events */
+	int head;
+	int tail;
+
+	struct wait_queue *read_wait;
+	struct fasync_struct *async;
+};
+
+#endif /* IRKBD_H */
diff -urN linux-2.2.6-pre2/include/net/irda/irlan_client.h linux-2.2.6-pre3/include/net/irda/irlan_client.h
--- linux-2.2.6-pre2/include/net/irda/irlan_client.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irlan_client.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Wed Feb  3 14:29:49 1999
+ * Modified at:   Thu Feb 25 21:05:53 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -33,7 +33,7 @@
 #include <net/irda/irlan_event.h>
 
 void irlan_client_start_kick_timer(struct irlan_cb *self, int timeout);
-void irlan_client_discovery_indication(DISCOVERY*);
+void irlan_client_discovery_indication(discovery_t *);
 void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr);
 
 void irlan_client_open_ctrl_tsap( struct irlan_cb *self);
diff -urN linux-2.2.6-pre2/include/net/irda/irlan_common.h linux-2.2.6-pre3/include/net/irda/irlan_common.h
--- linux-2.2.6-pre2/include/net/irda/irlan_common.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irlan_common.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Wed Feb 17 23:28:53 1999
+ * Modified at:   Tue Apr  6 16:19:41 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -25,6 +25,8 @@
 #ifndef IRLAN_H
 #define IRLAN_H
 
+#include <asm/param.h>  /* for HZ */
+
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/skbuff.h>
@@ -34,7 +36,7 @@
 #include <net/irda/irttp.h>
 
 #define IRLAN_MTU        1518
-#define IRLAN_TIMEOUT    1000
+#define IRLAN_TIMEOUT    10*HZ /* 10 seconds */
 
 /* Command packet types */
 #define CMD_GET_PROVIDER_INFO   0
diff -urN linux-2.2.6-pre2/include/net/irda/irlan_eth.h linux-2.2.6-pre3/include/net/irda/irlan_eth.h
--- linux-2.2.6-pre2/include/net/irda/irlan_eth.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irlan_eth.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Oct 15 08:36:58 1998
- * Modified at:   Fri Jan 29 15:20:45 1999
+ * Modified at:   Mon Mar 22 12:57:11 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -25,8 +25,8 @@
 #ifndef IRLAN_ETH_H
 #define IRLAN_ETH_H
 
-void irlan_eth_receive( void *instance, void *sap, struct sk_buff *skb);
-int  irlan_eth_xmit( struct sk_buff *skb, struct device *dev);
+int  irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb);
+int  irlan_eth_xmit(struct sk_buff *skb, struct device *dev);
 
 void irlan_eth_flow_indication( void *instance, void *sap, LOCAL_FLOW flow);
 
diff -urN linux-2.2.6-pre2/include/net/irda/irlan_provider.h linux-2.2.6-pre3/include/net/irda/irlan_provider.h
--- linux-2.2.6-pre2/include/net/irda/irlan_provider.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irlan_provider.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Sat Jan 30 16:22:24 1999
+ * Modified at:   Mon Mar  8 15:32:35 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -40,7 +40,8 @@
 					 struct sk_buff *skb);
 
 void irlan_provider_connect_indication(void *instance, void *sap, 
-				       struct qos_info *qos, int max_sdu_size,
+				       struct qos_info *qos, 
+				       __u32 max_sdu_size,
 				       struct sk_buff *skb);
 void irlan_provider_connect_response(struct irlan_cb *, struct tsap_cb *);
 
diff -urN linux-2.2.6-pre2/include/net/irda/irlap_event.h linux-2.2.6-pre3/include/net/irda/irlap_event.h
--- linux-2.2.6-pre2/include/net/irda/irlap_event.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irlap_event.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Aug 16 00:59:29 1997
- * Modified at:   Thu Feb 11 00:41:02 1999
+ * Modified at:   Tue Apr  6 17:10:38 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -25,7 +25,8 @@
 #ifndef IRLAP_EVENT_H
 #define IRLAP_EVENT_H
 
-#include "irmod.h"
+#include <net/irda/irda.h>
+#include <net/irda/discovery.h>
 
 struct irlap_cb;
 
@@ -67,6 +68,7 @@
 	RECV_DISCOVERY_XID_RSP,
 	RECV_SNRM_CMD,
 	RECV_TEST_CMD,
+	RECV_TEST_RSP,
 	RECV_UA_RSP,
 	RECV_DM_RSP,
 	RECV_I_CMD,
@@ -108,7 +110,7 @@
 	int  slot;     /* Random chosen slot */
 	int  s;        /* Current slot */
 
-	DISCOVERY *discovery; /* Discovery information */
+	discovery_t *discovery; /* Discovery information */
 };
 
 extern const char *irlap_state[];
diff -urN linux-2.2.6-pre2/include/net/irda/irlap_frame.h linux-2.2.6-pre3/include/net/irda/irlap_frame.h
--- linux-2.2.6-pre2/include/net/irda/irlap_frame.h	1998-12-17 09:01:03.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irlap_frame.h	2003-08-15 15:05:39.000000000 -0700
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irlap_frame.h
- * Version:       0.3
+ * Version:       0.9
  * Description:   Build and transmit IrLAP frames
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Aug 19 10:27:26 1997
- * Modified at:   Mon Dec 14 14:22:23 1998
+ * Modified at:   Fri Mar 26 14:10:53 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <linux/skbuff.h>
 
-#include <net/irda/irmod.h>
+#include <net/irda/irda.h>
 #include <net/irda/irlap.h>
 #include <net/irda/qos.h>
 
@@ -59,70 +59,58 @@
 #define I_FRAME   0x00 /* Information Format */
 #define UI_FRAME  0x03 /* Unnumbered Information */
 
-#define CMD_FRAME  0x01
-#define RSP_FRAME  0x00
+#define CMD_FRAME 0x01
+#define RSP_FRAME 0x00
 
-#define PF_BIT 0x10 /* Poll/final bit */
-
-#define IR_S                  0x01    /* Supervisory frames */
-#define IR_RR                 0x01    /* Receiver ready */
-#define IR_RNR                0x05    /* Receiver not ready */
-#define IR_REJ                0x09    /* Reject */
-#define IR_U                  0x03    /* Unnumbered frames */
-#define IR_SNRM               0x2f    /* Set Asynchronous Balanced Mode */
-
-#define IR_DISC               0x43    /* Disconnect */
-#define IR_DM                 0x0f    /* Disconnected mode */
-#define IR_UA                 0x63    /* Unnumbered acknowledge */
-#define IR_FRMR               0x87    /* Frame reject */
-#define IR_UI                 0x03    /* Unnumbered information */
+#define PF_BIT    0x10 /* Poll/final bit */
 
 struct xid_frame {
-	__u8  caddr     __attribute__((packed)); /* Connection address */
-	__u8  control   __attribute__((packed));
-	__u8  ident     __attribute__((packed)); /* Should always be XID_FORMAT */ 
-	__u32 saddr     __attribute__((packed)); /* Source device address */
-	__u32 daddr     __attribute__((packed)); /* Destination device address */
-	__u8  flags     __attribute__((packed)); /* Discovery flags */
-	__u8  slotnr    __attribute__((packed));
-	__u8  version   __attribute__((packed));
-	__u8  discovery_info[0]  __attribute__((packed));
-};
+	__u8  caddr; /* Connection address */
+	__u8  control;
+	__u8  ident; /* Should always be XID_FORMAT */ 
+	__u32 saddr; /* Source device address */
+	__u32 daddr; /* Destination device address */
+	__u8  flags; /* Discovery flags */
+	__u8  slotnr;
+	__u8  version;
+	__u8  discovery_info[0];
+} PACK;
 
 struct test_frame {
 	__u8 caddr;          /* Connection address */
 	__u8 control;
-	__u8 saddr;          /* Source device address */
-	__u8 daddr;          /* Destination device address */
-	__u8 *info;          /* Information */
-};
+	__u32 saddr;         /* Source device address */
+	__u32 daddr;         /* Destination device address */
+	__u8 info[0];        /* Information */
+} PACK;
 
 struct ua_frame {
-	__u8 caddr   __attribute__((packed));
-	__u8 control __attribute__((packed));
+	__u8 caddr;
+	__u8 control;
 
-	__u32 saddr     __attribute__((packed)); /* Source device address */
-	__u32 daddr     __attribute__((packed)); /* Dest device address */
+	__u32 saddr; /* Source device address */
+	__u32 daddr; /* Dest device address */
 	__u8  params[0];
-};
+} PACK;
 	
 struct i_frame {
-	__u8 caddr   __attribute__((packed));
-	__u8 control __attribute__((packed));
-	__u8 data[0] __attribute__((packed));
-};
+	__u8 caddr;
+	__u8 control;
+	__u8 data[0];
+} PACK;
 
 struct snrm_frame {
-	__u8  caddr   __attribute__((packed));
-	__u8  control __attribute__((packed));
-	__u32 saddr   __attribute__((packed));
-	__u32 daddr   __attribute__((packed));
-	__u8  ncaddr  __attribute__((packed));
+	__u8  caddr;
+	__u8  control;
+	__u32 saddr;
+	__u32 daddr;
+	__u8  ncaddr;
 	__u8  params[0];
-};
+} PACK;
 
 /* Per-packet information we need to hide inside sk_buff */
 struct irlap_skb_cb {
+	int magic; /* Be sure that we can trust the information */
 	int mtt;   /* minimum turn around time */
 	int xbofs; /* number of xbofs required */
 	int vs;    /* next frame to send */
@@ -132,8 +120,10 @@
 __inline__ void irlap_insert_mtt( struct irlap_cb *self, struct sk_buff *skb);
 
 void irlap_send_discovery_xid_frame( struct irlap_cb *, int S, __u8 s, 
-				     __u8 command, DISCOVERY *discovery);
+				     __u8 command, discovery_t *discovery);
 void irlap_send_snrm_frame( struct irlap_cb *, struct qos_info *);
+void irlap_send_test_frame(struct irlap_cb *self, __u32 daddr, 
+			   struct sk_buff *cmd);
 void irlap_send_ua_response_frame( struct irlap_cb *, struct qos_info *);
 void irlap_send_ui_frame( struct irlap_cb *self, struct sk_buff *skb,
 			  int command);
@@ -150,6 +140,4 @@
 void irlap_send_i_frame( struct irlap_cb *, struct sk_buff *, int command);
 void irlap_send_ui_frame( struct irlap_cb *, struct sk_buff *, int command);
 
-/* void irlap_input( struct irlap_cb *self, struct sk_buff *skb); */
-
 #endif
diff -urN linux-2.2.6-pre2/include/net/irda/irlap.h linux-2.2.6-pre3/include/net/irda/irlap.h
--- linux-2.2.6-pre2/include/net/irda/irlap.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irlap.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Aug  4 20:40:53 1997
- * Modified at:   Mon Jan 25 13:58:59 1999
+ * Modified at:   Fri Mar 26 15:15:17 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -157,23 +157,19 @@
 
 	int discovery_count;
 	hashbin_t *discovery_log;
- 	DISCOVERY *discovery_cmd;
+ 	discovery_t *discovery_cmd;
 
 	struct qos_info qos_tx;    /* QoS requested by peer */
 	struct qos_info qos_rx;    /* QoS requested by self */
 
 	struct notify_t notify; /* Callbacks to IrLMP */
 
-	int     mtt_required;  /* Minumum turnaround time required */
-	int     xbofs_delay;   /* Nr of XBOF's used to MTT */
-	int     bofs_count;    /* Negotiated extra BOFs */
+	int    mtt_required;  /* Minumum turnaround time required */
+	int    xbofs_delay;   /* Nr of XBOF's used to MTT */
+	int    bofs_count;    /* Negotiated extra BOFs */
 
  	struct irda_statistics stats;
 
-#ifdef CONFIG_IRDA_RECYCLE_RR
-	struct sk_buff *recycle_rr_skb;
-#endif
-
 #ifdef CONFIG_IRDA_COMPRESSION
 	struct irda_compressor compressor;
         struct irda_compressor decompressor;
@@ -210,9 +206,9 @@
 
 void irlap_test_request( __u8 *info, int len);
 
-void irlap_discovery_request( struct irlap_cb *, DISCOVERY *discovery);
-void irlap_discovery_confirm( struct irlap_cb *, hashbin_t *discovery_log);
-void irlap_discovery_indication( struct irlap_cb *, DISCOVERY *discovery);
+void irlap_discovery_request(struct irlap_cb *, discovery_t *discovery);
+void irlap_discovery_confirm(struct irlap_cb *, hashbin_t *discovery_log);
+void irlap_discovery_indication(struct irlap_cb *, discovery_t *discovery);
 
 void irlap_reset_indication( struct irlap_cb *self);
 void irlap_reset_confirm(void);
diff -urN linux-2.2.6-pre2/include/net/irda/irlmp_event.h linux-2.2.6-pre3/include/net/irda/irlmp_event.h
--- linux-2.2.6-pre2/include/net/irda/irlmp_event.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irlmp_event.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Aug  4 20:40:53 1997
- * Modified at:   Thu Feb 11 00:42:41 1999
+ * Modified at:   Thu Feb 25 20:49:16 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -92,7 +92,7 @@
 
 	int reason;
 
-	DISCOVERY *discovery;
+	discovery_t *discovery;
 };
 
 extern const char *irlmp_state[];
diff -urN linux-2.2.6-pre2/include/net/irda/irlmp_frame.h linux-2.2.6-pre3/include/net/irda/irlmp_frame.h
--- linux-2.2.6-pre2/include/net/irda/irlmp_frame.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irlmp_frame.h	2003-08-15 15:05:39.000000000 -0700
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irlmp_frame.h
- * Version:       0.1
+ * Version:       0.9
  * Description:   
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Aug 19 02:09:59 1997
- * Modified at:   Tue Feb  2 11:07:45 1999
+ * Modified at:   Tue Apr  6 17:12:57 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -27,31 +27,31 @@
 
 #include <linux/skbuff.h>
 
-/* Frame opcodes */
+#include <net/irda/discovery.h>
+
+/* IrLMP frame opcodes */
 #define CONNECT_CMD    0x01
 #define CONNECT_CNF    0x81
 #define DISCONNECT     0x02
 #define ACCESSMODE_CMD 0x03
 #define ACCESSMODE_CNF 0x83
 
-#define CONTROL_BIT 0x80
+#define CONTROL_BIT    0x80
 
-inline void irlmp_send_data_pdu( struct lap_cb *self, __u8 dlsap, __u8 slsap, 
-				 int expedited, struct sk_buff *skb);
-void irlmp_send_lcf_pdu( struct lap_cb *self, __u8 dlsap, __u8 slsap, 
-			 __u8 opcode, struct sk_buff *skb);
-void irlmp_link_data_indication( struct lap_cb *, int reliable, 
-				 struct sk_buff *);
-void irlmp_link_connect_indication( struct lap_cb *, __u32 saddr, __u32 daddr,
-				    struct qos_info *qos, struct sk_buff *skb);
-void irlmp_link_connect_request( __u32 daddr);
-void irlmp_link_connect_confirm( struct lap_cb *self, struct qos_info *qos, 
-				 struct sk_buff *skb);
-void irlmp_link_disconnect_indication( struct lap_cb *self, 
-				       struct irlap_cb *irlap, 
-				       LAP_REASON reason, 
-				       struct sk_buff *); 
-void irlmp_link_discovery_confirm( struct lap_cb *self, hashbin_t *log);
-/* void irlmp_link_disconnect_request( void); */
+inline void irlmp_send_data_pdu(struct lap_cb *self, __u8 dlsap, __u8 slsap, 
+				int expedited, struct sk_buff *skb);
+void irlmp_send_lcf_pdu(struct lap_cb *self, __u8 dlsap, __u8 slsap, 
+			__u8 opcode, struct sk_buff *skb);
+void irlmp_link_data_indication(struct lap_cb *, int reliable, 
+				struct sk_buff *);
+void irlmp_link_connect_indication(struct lap_cb *, __u32 saddr, __u32 daddr,
+				   struct qos_info *qos, struct sk_buff *skb);
+void irlmp_link_connect_request(__u32 daddr);
+void irlmp_link_connect_confirm(struct lap_cb *self, struct qos_info *qos, 
+				struct sk_buff *skb);
+void irlmp_link_disconnect_indication(struct lap_cb *, struct irlap_cb *, 
+				      LAP_REASON reason, struct sk_buff *); 
+void irlmp_link_discovery_confirm(struct lap_cb *self, hashbin_t *log);
+void irlmp_link_discovery_indication(struct lap_cb *, discovery_t *discovery);
 
 #endif
diff -urN linux-2.2.6-pre2/include/net/irda/irlmp.h linux-2.2.6-pre3/include/net/irda/irlmp.h
--- linux-2.2.6-pre2/include/net/irda/irlmp.h	1999-03-07 15:26:43.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irlmp.h	2003-08-15 15:05:39.000000000 -0700
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irlmp.h
- * Version:       0.3
+ * Version:       0.9
  * Description:   IrDA Link Management Protocol (LMP) layer
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 17 20:54:32 1997
- * Modified at:   Thu Feb  4 11:06:24 1999
+ * Modified at:   Tue Apr  6 20:05:14 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -25,14 +25,17 @@
 #ifndef IRLMP_H
 #define IRLMP_H
 
+#include <asm/param.h>  /* for HZ */
+
 #include <linux/config.h>
 #include <linux/types.h>
 
-#include <net/irda/irmod.h>
+#include <net/irda/irda.h>
 #include <net/irda/qos.h>
 #include <net/irda/irlap.h>
 #include <net/irda/irlmp_event.h>
 #include <net/irda/irqueue.h>
+#include <net/irda/discovery.h>
 
 /* LSAP-SEL's */
 #define LSAP_MASK     0x7f
@@ -53,25 +56,7 @@
 
 #define LM_MAX_CONNECTIONS  10
 
-/* Hint bit positions for first hint byte */
-#define HINT_PNP         0x01
-#define HINT_PDA         0x02
-#define HINT_COMPUTER    0x04
-#define HINT_PRINTER     0x08
-#define HINT_MODEM       0x10
-#define HINT_FAX         0x20
-#define HINT_LAN         0x40
-#define HINT_EXTENSION   0x80
-
-/* Hint bit positions for second hint byte (first extension byte) */
-#define HINT_TELEPHONY   0x01
-#define HINT_FILE_SERVER 0x02
-#define HINT_COMM        0x04
-#define HINT_MESSAGE     0x08
-#define HINT_HTTP        0x10
-#define HINT_OBEX        0x20
-
-#define LM_IDLE_TIMEOUT  200 /* 2 seconds for now */
+#define LM_IDLE_TIMEOUT     2*HZ /* 2 seconds for now */
 
 typedef enum {
 	S_PNP,
@@ -84,23 +69,27 @@
 	S_TELEPHONY,
 	S_COMM,
 	S_OBEX,
+	S_ANY,
+	S_END,
 } SERVICE;
 
-#define S_END 0xff
+typedef void (*DISCOVERY_CALLBACK1) (discovery_t *);
+typedef void (*DISCOVERY_CALLBACK2) (hashbin_t *);
 
-#define CLIENT 1
-#define SERVER 2
+typedef struct {
+	QUEUE queue; /* Must be first */
 
-typedef void (*DISCOVERY_CALLBACK) ( DISCOVERY*);
+	__u16 hints; /* Hint bits */
+} irlmp_service_t;
 
-struct irlmp_registration {
+typedef struct {
 	QUEUE queue; /* Must be first */
 
-	int service; /* LAN, OBEX, COMM etc. */
-	int type;    /* Client or server or both */
+	__u16 hint_mask;
 
-	DISCOVERY_CALLBACK discovery_callback;
-};
+	DISCOVERY_CALLBACK1 callback1;
+	DISCOVERY_CALLBACK2 callback2;
+} irlmp_client_t;
 
 struct lap_cb; /* Forward decl. */
 
@@ -142,17 +131,13 @@
 
 	IRLMP_STATE lap_state;
 
-	struct irlap_cb *irlap; /* Instance of IrLAP layer */
-
+	struct irlap_cb *irlap;    /* Instance of IrLAP layer */
 	hashbin_t *lsaps;         /* LSAP associated with this link */
 
-	__u8  caddr;            /* Connection address */
-
+	__u8  caddr;  /* Connection address */
  	__u32 saddr;  /* Source device address */
  	__u32 daddr;  /* Destination device address */
 	
-	hashbin_t *cachelog;    /* Discovered devices for this link */
-
 	struct qos_info *qos;  /* LAP QoS for this session */
 	struct timer_list idle_timer;
 };
@@ -176,8 +161,8 @@
 
 	__u8 conflict_flag;
 	
-	DISCOVERY  discovery_cmd; /* Discovery command to use by IrLAP */
-	DISCOVERY  discovery_rsp; /* Discovery response to use by IrLAP */
+	discovery_t discovery_cmd; /* Discovery command to use by IrLAP */
+	discovery_t discovery_rsp; /* Discovery response to use by IrLAP */
 
 	int free_lsap_sel;
 
@@ -188,25 +173,34 @@
 
  	hashbin_t *links;         /* IrLAP connection table */
 	hashbin_t *unconnected_lsaps;
- 	hashbin_t *registry;
+ 	hashbin_t *clients;
+	hashbin_t *services;
+
+	hashbin_t *cachelog;
+	int running;
 
-	__u8 hint[2]; /* Hint bits */
+	spinlock_t lock;
+
+	__u16_host_order hints; /* Hint bits */
 };
 
 /* Prototype declarations */
 int  irlmp_init(void);
 void irlmp_cleanup(void);
-
 struct lsap_cb *irlmp_open_lsap( __u8 slsap, struct notify_t *notify);
 void irlmp_close_lsap( struct lsap_cb *self);
 
-void irlmp_register_layer( int service, int type, int do_discovery, 
-			      DISCOVERY_CALLBACK);
-void irlmp_unregister_layer( int service, int type);
-
-void irlmp_register_irlap( struct irlap_cb *self, __u32 saddr, 
-			   struct notify_t *);
-void irlmp_unregister_irlap( __u32 saddr);
+__u16 irlmp_service_to_hint(int service);
+__u32 irlmp_register_service(__u16 hints);
+int irlmp_unregister_service(__u32 handle);
+__u32 irlmp_register_client(__u16 hint_mask, DISCOVERY_CALLBACK1 callback1,
+			    DISCOVERY_CALLBACK2 callback2);
+int irlmp_unregister_client(__u32 handle);
+int irlmp_update_client(__u32 handle, __u16 hint_mask, 
+			DISCOVERY_CALLBACK1, DISCOVERY_CALLBACK2);
+
+void irlmp_register_link(struct irlap_cb *, __u32 saddr, struct notify_t *);
+void irlmp_unregister_link(__u32 saddr);
 
 int  irlmp_connect_request( struct lsap_cb *, __u8 dlsap_sel, 
 			    __u32 saddr, __u32 daddr,
@@ -214,16 +208,16 @@
 void irlmp_connect_indication( struct lsap_cb *self, struct sk_buff *skb);
 void irlmp_connect_response( struct lsap_cb *, struct sk_buff *);
 void irlmp_connect_confirm( struct lsap_cb *, struct sk_buff *);
+struct lsap_cb *irlmp_dup(struct lsap_cb *self, void *instance);
 
-
-void irlmp_disconnect_indication( struct lsap_cb *self, LM_REASON reason, 
-				  struct sk_buff *userdata);
-void irlmp_disconnect_request( struct lsap_cb *, struct sk_buff *userdata);
-
-void irlmp_discovery_confirm( struct lap_cb *, hashbin_t *discovery_log);
-void irlmp_discovery_indication( struct lap_cb *, DISCOVERY *discovery);
-void irlmp_discovery_request( int nslots);
-DISCOVERY *irlmp_get_discovery_response(void);
+void irlmp_disconnect_indication(struct lsap_cb *self, LM_REASON reason, 
+				 struct sk_buff *userdata);
+void irlmp_disconnect_request(struct lsap_cb *, struct sk_buff *userdata);
+
+void irlmp_discovery_confirm(hashbin_t *discovery_log);
+void irlmp_discovery_request(int nslots);
+void irlmp_do_discovery(int nslots);
+discovery_t *irlmp_get_discovery_response(void);
 
 void irlmp_data_request( struct lsap_cb *, struct sk_buff *);
 void irlmp_udata_request( struct lsap_cb *, struct sk_buff *);
@@ -240,9 +234,11 @@
 __u32 irlmp_get_saddr(struct lsap_cb *self);
 __u32 irlmp_get_daddr(struct lsap_cb *self);
 
-
 extern char *lmp_reasons[];
 extern int sysctl_discovery_slots;
+extern int sysctl_discovery;
 extern struct irlmp_cb *irlmp;
 
+static inline hashbin_t *irlmp_get_cachelog(void) { return irlmp->cachelog; }
+
 #endif
diff -urN linux-2.2.6-pre2/include/net/irda/irmod.h linux-2.2.6-pre3/include/net/irda/irmod.h
--- linux-2.2.6-pre2/include/net/irda/irmod.h	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irmod.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Dec 15 13:58:52 1997
- * Modified at:   Thu Feb 11 15:14:30 1999
+ * Modified at:   Tue Mar 16 22:27:41 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  *
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -29,7 +29,6 @@
 #include <linux/miscdevice.h>
 
 #include <net/irda/irqueue.h>
-#include <net/irda/qos.h>
 
 #define IRMGR_IOC_MAGIC 'm'
 #define IRMGR_IOCTNPC     _IO(IRMGR_IOC_MAGIC, 1)
@@ -45,7 +44,6 @@
 	EVENT_IRLAN_STOP,
 	EVENT_IRLPT_START,
 	EVENT_IRLPT_STOP,
-/* 	EVENT_IROBEX_INIT, */
 	EVENT_IROBEX_START,
 	EVENT_IROBEX_STOP,
 	EVENT_IRDA_STOP,
@@ -100,176 +98,28 @@
 	QUEUE *todo_queue;  /* Todo list */
 };
 
-typedef struct {
-        char irda_call[7];  /* 6 call + SSID (shifted ascii!) */
-} irda_address;
-
-struct sockaddr_irda {
-	short sirda_family;
-	irda_address sirda_call;
-        int sirda_ndigis;
-};
-
-/*
- *  This type is used by the protocols that transmit 16 bits words in 
- *  little endian format. A little endian machine stores MSB of word in
- *  byte[1] and LSB in byte[0]. A big endian machine stores MSB in byte[0] 
- *  and LSB in byte[1].
- */
-typedef union {
-	__u16 word;
-	__u8  byte[2];
-} __u16_host_order;
-
-/*
- *  Information monitored by some layers
- */
-struct irda_statistics
-{
-        int     rx_packets;             /* total packets received       */
-        int     tx_packets;             /* total packets transmitted    */
-        int     rx_errors;              /* bad packets received         */
-        int     tx_errors;              /* packet transmit problems     */
-        int     rx_dropped;             /* no space in linux buffers    */
-        int     tx_dropped;             /* no space available in linux  */
-	int     rx_compressed;
-	int     tx_compressed;
-	int     rx_bytes;               /* total bytes received         */
-	int     tx_bytes;               /* total bytes transmitted      */
+int irmod_init_module(void);
+void irmod_cleanup_module(void);
 
-        int     multicast;              /* multicast packets received   */
-        int     collisions;
-	
-        /* detailed rx_errors: */
-        int     rx_length_errors;
-        int     rx_over_errors;         /* receiver ring buff overflow  */
-        int     rx_crc_errors;          /* recved pkt with crc error    */
-        int     rx_frame_errors;        /* recv'd frame alignment error */
-        int     rx_fifo_errors;         /* recv'r fifo overrun          */
-        int     rx_missed_errors;       /* receiver missed packet       */
-
-        /* detailed tx_errors */
-        int     tx_aborted_errors;
-        int     tx_carrier_errors;
-        int     tx_fifo_errors;
-        int     tx_heartbeat_errors;
-        int     tx_window_errors;
-};
+inline int irda_lock(int *lock);
+inline int irda_unlock(int *lock);
 
-typedef enum {
-	NO_CHANGE,
-	LOCKED,
-	UNLOCKED,
-} LOCK_STATUS;
+void irda_notify_init(struct notify_t *notify);
 
-/* Misc status information */
-typedef enum {
-	STATUS_OK,
-	STATUS_ABORTED,
-	STATUS_NO_ACTIVITY,
-	STATUS_NOISY,
-	STATUS_REMOTE,
-} LINK_STATUS;
-
-typedef enum { /* FIXME check the two first reason codes */
-	LAP_DISC_INDICATION=1, /* Received a disconnect request from peer */
-	LAP_NO_RESPONSE,       /* To many retransmits without response */
-	LAP_RESET_INDICATION,  /* To many retransmits, or invalid nr/ns */
-	LAP_FOUND_NONE,        /* No devices were discovered */
-	LAP_MEDIA_BUSY,
-	LAP_PRIMARY_CONFLICT,
-} LAP_REASON;
-
-/*  
- *  IrLMP disconnect reasons. The order is very important, since they 
- *  correspond to disconnect reasons sent in IrLMP disconnect frames, so
- *  please do not touch :-)
- */
-typedef enum {
-	LM_USER_REQUEST = 1,  /* User request */
-	LM_LAP_DISCONNECT,    /* Unexpected IrLAP disconnect */
-	LM_CONNECT_FAILURE,   /* Failed to establish IrLAP connection */
-	LM_LAP_RESET,         /* IrLAP reset */
-	LM_INIT_DISCONNECT,   /* Link Management initiated disconnect */
-	LM_LSAP_NOTCONN,      /* Data delivered on unconnected LSAP */
-	LM_NON_RESP_CLIENT,   /* Non responsive LM-MUX client */
-	LM_NO_AVAIL_CLIENT,   /* No available LM-MUX client */
-	LM_CONN_HALF_OPEN,    /* Connection is half open */
-	LM_BAD_SOURCE_ADDR,   /* Illegal source address (i.e 0x00) */
-} LM_REASON;
-#define LM_UNKNOWN 0xff       /* Unspecified disconnect reason */
+void irda_execute_as_process(void *self, TODO_CALLBACK callback, __u32 param);
+void irmanager_notify(struct irmanager_event *event);
 
-/*
- *  IrLMP character code values
- */
-#define CS_ASCII       0x00
-#define	CS_ISO_8859_1  0x01
-#define	CS_ISO_8859_2  0x02
-#define	CS_ISO_8859_3  0x03
-#define	CS_ISO_8859_4  0x04
-#define	CS_ISO_8859_5  0x05
-#define	CS_ISO_8859_6  0x06
-#define	CS_ISO_8859_7  0x07
-#define	CS_ISO_8859_8  0x08
-#define	CS_ISO_8859_9  0x09
-#define CS_UNICODE     0xff
-	
-/*
- * The DISCOVERY structure is used for both discovery requests and responses
- */
-#define DISCOVERY struct discovery_t
-struct discovery_t {
-	QUEUE queue;              /* Must be first! */
-
-	__u32      saddr;        /* Which link the device was discovered */
-	__u32      daddr;        /* Remote device address */
-	LAP_REASON condition;    /* More info about the discovery */
-
-	__u8       hint[2];      /* Discovery hint bits */
-	__u8       charset;
-	char       info[32];     /* Usually the name of the device */
-	__u8       info_len;     /* Length of device info field */
+extern void irda_proc_modcount(struct inode *, int);
+void irda_mod_inc_use_count(void);
+void irda_mod_dec_use_count(void);
 
-	int        gen_addr_bit; /* Need to generate a new device address? */
-	int        nslots;       /* Number of slots to use when discovering */
-};
+#endif /* IRMOD_H */
 
-typedef enum { FLOW_STOP, FLOW_START } LOCAL_FLOW;
 
-/*
- *  Notify structure used between transport and link management layers
- */
-struct notify_t {
-	void (*data_indication)( void *instance, void *sap, 
-				 struct sk_buff *skb);
-	void (*udata_indication)( void *instance, void *sap, 
-				  struct sk_buff *skb);
-	void (*connect_confirm)( void *instance, void *sap, 
-				 struct qos_info *qos, int max_sdu_size,
-				 struct sk_buff *skb);
-	void (*connect_indication)( void *instance, void *sap, 
-				    struct qos_info *qos, int max_sdu_size,
-				    struct sk_buff *skb);
-	void (*disconnect_indication)( void *instance, void *sap, 
-				       LM_REASON reason, struct sk_buff *);
-	void (*flow_indication)( void *instance, void *sap, LOCAL_FLOW flow);
-	void *instance; /* Layer instance pointer */
-	char name[16];  /* Name of layer */
-};
 
-#define NOTIFY_MAX_NAME 16
 
-int irmod_init_module(void);
-void irmod_cleanup_module(void);
 
-inline int irda_lock(int *lock);
-inline int irda_unlock(int *lock);
 
-void irda_notify_init(struct notify_t *notify);
 
-void irda_execute_as_process(void *self, TODO_CALLBACK callback, __u32 param);
-void irmanager_notify(struct irmanager_event *event);
 
-extern void irda_proc_modcount(struct inode *, int);
 
-#endif
diff -urN linux-2.2.6-pre2/include/net/irda/irobex.h linux-2.2.6-pre3/include/net/irda/irobex.h
--- linux-2.2.6-pre2/include/net/irda/irobex.h	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irobex.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Jul  4 22:43:57 1998
- * Modified at:   Tue Jan 26 11:49:55 1999
+ * Modified at:   Thu Mar 11 16:11:54 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -70,6 +70,9 @@
 	__u32 daddr;        /* peer address */
 	unsigned long time_discovered;
 
+	__u32 ckey;           /* IrLMP client handle */
+	__u32 skey;           /* IrLMP service handle */
+
         char devname[9];    /* name of the registered device */
 	struct tsap_cb *tsap;
 	int eof;
diff -urN linux-2.2.6-pre2/include/net/irda/irqueue.h linux-2.2.6-pre3/include/net/irda/irqueue.h
--- linux-2.2.6-pre2/include/net/irda/irqueue.h	1998-12-17 09:01:03.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irqueue.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Jun  9 13:26:50 1998
- * Modified at:   Sun Oct 25 00:26:31 1998
+ * Modified at:   Thu Feb 25 20:34:21 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (C) 1998, Aage Kvalnes <aage@cs.uit.no>
@@ -30,7 +30,7 @@
 #include <linux/types.h>
 #include <asm/spinlock.h>
 
-#include <net/irda/irda.h>
+/* #include <net/irda/irda.h> */
 
 #ifndef QUEUE_H
 #define QUEUE_H
@@ -51,6 +51,10 @@
 #define HASHBIN_SIZE   8
 #define HASHBIN_MASK   0x7
 
+#ifndef ALIGN 
+#define ALIGN __attribute__((aligned))
+#endif
+
 typedef void (*FREE_FUNC)( void *arg);
 
 /*
diff -urN linux-2.2.6-pre2/include/net/irda/irttp.h linux-2.2.6-pre3/include/net/irda/irttp.h
--- linux-2.2.6-pre2/include/net/irda/irttp.h	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irttp.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:31 1997
- * Modified at:   Tue Feb  2 10:55:18 1999
+ * Modified at:   Mon Mar 22 13:17:30 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -27,8 +27,9 @@
 
 #include <linux/types.h>
 #include <linux/skbuff.h>
+#include <asm/spinlock.h>
 
-#include <net/irda/irmod.h>
+#include <net/irda/irda.h>
 #include <net/irda/irlmp.h>
 #include <net/irda/qos.h>
 #include <net/irda/irqueue.h>
@@ -50,6 +51,7 @@
 #define P_HIGH      1
 
 #define SAR_DISABLE 0
+#define SAR_UNBOUND 0xffffffff
 
 /*
  *  This structure contains all data assosiated with one instance of a TTP 
@@ -79,23 +81,22 @@
 	struct sk_buff_head rx_fragments;
 	int tx_queue_lock;
 	int rx_queue_lock;
+	spinlock_t lock;
 
 	struct notify_t notify;       /* Callbacks to client layer */
 
 	struct irda_statistics stats;
 	struct timer_list todo_timer; 
 	
-	int rx_sdu_busy;     /* RxSdu.busy */
-	int rx_sdu_size;     /* Current size of a partially received frame */
-	int rx_max_sdu_size; /* Max receive user data size */
+	int   rx_sdu_busy;     /* RxSdu.busy */
+	__u32 rx_sdu_size;     /* Current size of a partially received frame */
+	__u32 rx_max_sdu_size; /* Max receive user data size */
 
-	int tx_sdu_busy;     /* TxSdu.busy */
-	int tx_max_sdu_size; /* Max transmit user data size */
+	int tx_sdu_busy;       /* TxSdu.busy */
+	int tx_max_sdu_size;   /* Max transmit user data size */
 
-        int no_defrag;       /* Don't reassemble received fragments */
-
-	int close_pend;      /* Close, but disconnect_pend */
-	int disconnect_pend; /* Disconnect, but still data to send */
+	int close_pend;        /* Close, but disconnect_pend */
+	int disconnect_pend;   /* Disconnect, but still data to send */
 	struct sk_buff *disconnect_skb;
 };
 
@@ -115,24 +116,19 @@
 int irttp_data_request(struct tsap_cb *self, struct sk_buff *skb);
 int irttp_udata_request(struct tsap_cb *self, struct sk_buff *skb);
 
-void irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel, 
-			   __u32 saddr, __u32 daddr,
-			   struct qos_info *qos, int max_sdu_size, 
-			   struct sk_buff *userdata);
+int irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel, 
+			  __u32 saddr, __u32 daddr,
+			  struct qos_info *qos, __u32 max_sdu_size, 
+			  struct sk_buff *userdata);
 void irttp_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
-			   int max_sdu_size, struct sk_buff *skb);
-void irttp_connect_response(struct tsap_cb *self, int max_sdu_size, 
+			   __u32 max_sdu_size, struct sk_buff *skb);
+void irttp_connect_response(struct tsap_cb *self, __u32 max_sdu_size, 
 			    struct sk_buff *userdata);
-
+struct tsap_cb *irttp_dup(struct tsap_cb *self, void *instance);
 void irttp_disconnect_request(struct tsap_cb *self, struct sk_buff *skb,
 			      int priority);
 void irttp_flow_request(struct tsap_cb *self, LOCAL_FLOW flow);
 
-static __inline__ void irttp_no_reassemble(struct tsap_cb *self)
-{
-	self->no_defrag = TRUE;
-}
-
 static __inline __u32 irttp_get_saddr(struct tsap_cb *self)
 {
 	return irlmp_get_saddr(self->lsap);
diff -urN linux-2.2.6-pre2/include/net/irda/irvtd_driver.h linux-2.2.6-pre3/include/net/irda/irvtd_driver.h
--- linux-2.2.6-pre2/include/net/irda/irvtd_driver.h	1998-12-17 09:01:03.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irvtd_driver.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,122 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      irvtd_driver.h
- * Version:       0.1
- * 
- *     Copyright (c) 1998, Takahide Higuchi <thiguchi@pluto.dti.ne.jp>, 
- *     All Rights Reserved.
- *     
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version.
- *
- *     I, Takahide Higuchi, provide no warranty for any of this software. 
- *     This material is provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-#include <linux/tty.h>
-
-#include <net/irda/irlap.h>
-#include <net/irda/irlmp.h>
-#include <net/irda/irttp.h>
-
-
-#define VSP_TYPE_NORMAL   1
-#define VSP_TYPE_CALLOUT  2
-#define IRCOMM_MAJOR  60;  /* Zero means automatic allocation
-                              60,61,62,and 63 is reserved for experiment */
-#define IRVTD_MINOR 64
-#define IRVTD_CALLOUT_MINOR 32
-
-#define IRVTD_TYPE_NORMAL 11
-#define IRVTD_TYPE_CALLOUT 12
-
-
-#define IRCOMM_HEADER 1       
-#define IRCOMM_RESERVE LAP_HEADER+LMP_HEADER+TTP_HEADER+IRCOMM_HEADER
-
-
-
-
-
-/*
- * Definitions for ircomm_cb_struct flags field
- *  this section is "stolen" from linux-kernel (drivers/char/serial.c)
- */
-#define IRVTD_ASYNC_HUP_NOTIFY 0x0001 /* Notify getty on hangups and closes 
-				   on the callout port */
-/* #define IRVTD_ASYNC_FOURPORT  0x0002 */
-/* Set OU1, OUT2 per AST Fourport settings */
-
-#define IRVTD_ASYNC_SAK	0x0004	/* Secure Attention Key (Orange book) */
-
-#define IRVTD_ASYNC_SPLIT_TERMIOS 0x0008 /* Separate termios for dialin/callout */
-
-#define IRVTD_ASYNC_SPD_MASK	0x0030
-#define IRVTD_ASYNC_SPD_HI	0x0010	/* Use 56000 instead of 38400 bps */
-
-#define IRVTD_ASYNC_SPD_VHI	0x0020  /* Use 115200 instead of 38400 bps */
-#define IRVTD_ASYNC_SPD_CUST	0x0030  /* Use user-specified divisor */
-
-#define IRVTD_ASYNC_SKIP_TEST	0x0040  /* Skip UART test during autoconfiguration */
-#define IRVTD_ASYNC_AUTO_IRQ    0x0080  /* Do automatic IRQ during autoconfiguration */
-#define IRVTD_ASYNC_SESSION_LOCKOUT 0x0100 /* Lock out cua opens based on session */
-#define IRVTD_ASYNC_PGRP_LOCKOUT    0x0200  /* Lock out cua opens based on pgrp */
-#define IRVTD_ASYNC_CALLOUT_NOHUP   0x0400 /* Don't do hangups for cua device */
-
-#define IRVTD_ASYNC_FLAGS	0x0FFF	/* Possible legal async flags */
-#define IRVTD_ASYNC_USR_MASK 0x0430	/* Legal flags that non-privileged
-				 * users can set or reset */
-
-/* Internal flags used only by kernel/chr_drv/serial.c */
-#define IRVTD_ASYNC_INITIALIZED	0x80000000 /* Serial port was initialized */
-#define IRVTD_ASYNC_CALLOUT_ACTIVE	0x40000000 /* Call out device is active */
-#define IRVTD_ASYNC_NORMAL_ACTIVE	0x20000000 /* Normal device is active */
-#define IRVTD_ASYNC_BOOT_AUTOCONF	0x10000000 /* Autoconfigure port on bootup */
-#define IRVTD_ASYNC_CLOSING		0x08000000 /* Serial port is closing */
-#define IRVTD_ASYNC_CTS_FLOW		0x04000000 /* Do CTS flow control */
-#define IRVTD_ASYNC_CHECK_CD		0x02000000 /* i.e., CLOCAL */
-#define IRVTD_ASYNC_SHARE_IRQ		0x01000000 /* for multifunction cards */
-
-
-#define IRVTD_ASYNC_CLOSING_WAIT_INF  0
-#define IRVTD_ASYNC_CLOSING_WAIT_NONE 65535
-
-/**************************************/
-
-#define DELTA_DTR 0x01
-#define DELTA_RTS 0x02
-#define MCR_DTR 0x04
-#define MCR_RTS 0x08
-
-#define DELTA_CTS 0x01
-#define DELTA_DSR 0x02
-#define DELTA_RI  0x04 
-#define DELTA_DCD 0x08
-#define MSR_CTS   0x10
-#define MSR_DSR   0x20
-#define MSR_RI    0x40 
-#define MSR_DCD   0x80
-
-#define LSR_OE     0x02    /* Overrun error indicator */
-#define LSR_PE     0x04    /* Parity error indicator */
-#define LSR_FE     0x08    /* Frame error indicator */
-#define LSR_BI     0x01    /* Break interrupt indicator */
-
-
-
-/**************************************/
-
-
-
-
-int irvtd_register_ttydriver(void);
-void irvtd_unregister_ttydriver(void);
-
-void irvtd_flush_chars(struct tty_struct *tty);
-
-
-
-
diff -urN linux-2.2.6-pre2/include/net/irda/irvtd.h linux-2.2.6-pre3/include/net/irda/irvtd.h
--- linux-2.2.6-pre2/include/net/irda/irvtd.h	1998-12-17 09:01:03.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/irvtd.h	2003-08-15 15:05:39.000000000 -0700
@@ -17,12 +17,13 @@
  *
  ********************************************************************/
 
-#ifndef IRCOMM_H
-#define IRCOMM_H
+#ifndef IRVTD_H
+#define IRVTD_H
 
 #include <linux/types.h>
 #include <linux/ioctl.h>
 #include <linux/tqueue.h>
+#include <linux/serial.h>
 
 #include <net/irda/irmod.h>
 #include <net/irda/qos.h>
@@ -34,18 +35,11 @@
 #define IRVTD_RX_QUEUE_HIGH 10
 #define IRVTD_RX_QUEUE_LOW  2
 
+#define IRCOMM_MAJOR  60;  /* Zero means automatic allocation
+                              60,61,62,and 63 is reserved for experiment */
+#define IRVTD_MINOR 64
+
 
-/*
- * Serial input interrupt line counters -- external structure
- * Four lines can interrupt: CTS, DSR, RI, DCD
- *
- * this structure must be compatible with serial_icounter_struct defined in
- * <linux/serial.h>.
- */
-struct icounter_struct {
-        int cts, dsr, rng, dcd;
-        int reserved[16];
-};
 
 struct irvtd_cb {
 
@@ -53,9 +47,10 @@
 
 	/* if daddr is NULL, remote device have not been discovered yet */
 
+	int tx_disable;
 	int rx_disable;
-	struct sk_buff *txbuff;     /* buffer queue */
-	struct sk_buff_head rxbuff;     /* buffer queue */
+	struct sk_buff *txbuff;     
+	struct sk_buff_head rxbuff; 
 	struct ircomm_cb *comm;     /* ircomm instance */
 
 	/* 
@@ -63,7 +58,6 @@
 	 * See linux/serial.h
 	 */
 
-	int baud_base;
 	int flags;
 	struct tty_struct *tty;
 
@@ -75,30 +69,24 @@
 	struct wait_queue       *delta_msr_wait;
 	struct wait_queue       *tx_wait;
 
-	struct tq_struct        rx_tqueue;
+	struct timer_list       timer;
 
 	long pgrp;
 	long session;  
-	struct termios normal_termios;
-	struct termios callout_termios;
 	unsigned short  closing_wait;     /* time to wait before closing */
 	unsigned short  close_delay;
 	
+	int custom_divisor;
 	int mcr;
 	int msr;
 	int cts_stoptx;
 	int ttp_stoptx;
 	int ttp_stoprx;
-	struct icounter_struct icount;
+	int disconnect_pend;
+	struct serial_icounter_struct icount;
 	int read_status_mask;
 	int ignore_status_mask;
 };
 
 
-/* Debug function */
-
-/* #define CHECK_SKB(skb) check_skb((skb),  __LINE__,__FILE__) */
-
-
-
 #endif
diff -urN linux-2.2.6-pre2/include/net/irda/timer.h linux-2.2.6-pre3/include/net/irda/timer.h
--- linux-2.2.6-pre2/include/net/irda/timer.h	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/timer.h	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Aug 16 00:59:29 1997
- * Modified at:   Thu Feb  4 11:05:24 1999
+ * Modified at:   Tue Apr  6 16:17:16 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997, 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -26,6 +26,8 @@
 #ifndef TIMER_H
 #define TIMER_H
 
+#include <asm/param.h>  /* for HZ */
+
 #include <net/irda/irda.h>
 #include <net/irda/irmod.h>
 #include <net/irda/irlap.h>
@@ -35,46 +37,46 @@
 /* 
  *  Timeout definitions, some defined in IrLAP p. 92
  */
-#define POLL_TIMEOUT        45             /* Must never exceed 500 ms */
-#define FINAL_TIMEOUT       50             /* Must never exceed 500 ms */
+#define POLL_TIMEOUT        450*HZ/1000    /* Must never exceed 500 ms */
+#define FINAL_TIMEOUT       500*HZ/1000    /* Must never exceed 500 ms */
 
 /* 
  *  Normally twice of p-timer. Note 3, IrLAP p. 60 suggests at least twice 
  *  duration of the P-timer.
  */
 #define WD_TIMEOUT          POLL_TIMEOUT*2
-#define MEDIABUSY_TIMEOUT   50             /* 500 msec */
+#define MEDIABUSY_TIMEOUT   500*HZ/1000    /* 500 msec */
 
 /*
  *  Slot timer must never exceed 85 ms, and must always be at least 25 ms, 
  *  suggested to  75-85 msec by IrDA lite
  */
-#define SLOT_TIMEOUT             8
-#define QUERY_TIMEOUT          100
+#define SLOT_TIMEOUT            80*HZ/1000
+#define QUERY_TIMEOUT           HZ          /* 1 sec */
 
-#define WATCHDOG_TIMEOUT      2000                /* 20 sec */
+#define WATCHDOG_TIMEOUT        20*HZ       /* 20 sec */
 
-typedef void (*TIMER_CALLBACK)( unsigned long);
+typedef void (*TIMER_CALLBACK)(unsigned long);
 
-void irda_start_timer( struct timer_list *ptimer, int timeout, int data,
-		       TIMER_CALLBACK callback);
+void irda_start_timer(struct timer_list *ptimer, int timeout, int data,
+		      TIMER_CALLBACK callback);
 
-inline void irlap_start_slot_timer( struct irlap_cb *self, int timeout);
-inline void irlap_start_query_timer( struct irlap_cb *self, int timeout);
-inline void irlap_start_final_timer( struct irlap_cb *self, int timeout);
-inline void irlap_start_wd_timer( struct irlap_cb *self, int timeout);
-inline void irlap_start_backoff_timer( struct irlap_cb *self, int timeout);
+inline void irlap_start_slot_timer(struct irlap_cb *self, int timeout);
+inline void irlap_start_query_timer(struct irlap_cb *self, int timeout);
+inline void irlap_start_final_timer(struct irlap_cb *self, int timeout);
+inline void irlap_start_wd_timer(struct irlap_cb *self, int timeout);
+inline void irlap_start_backoff_timer(struct irlap_cb *self, int timeout);
 
-inline void irda_device_start_mbusy_timer( struct irda_device *self);
+inline void irda_device_start_mbusy_timer(struct irda_device *self);
 
 struct lsap_cb;
 struct lap_cb;
-inline void irlmp_start_watchdog_timer( struct lsap_cb *, int timeout);
-inline void irlmp_start_discovery_timer( struct irlmp_cb *, int timeout);
+inline void irlmp_start_watchdog_timer(struct lsap_cb *, int timeout);
+inline void irlmp_start_discovery_timer(struct irlmp_cb *, int timeout);
 inline void irlmp_start_idle_timer(struct lap_cb *, int timeout);
 
 struct irobex_cb;
-inline void irobex_start_watchdog_timer( struct irobex_cb *, int timeout);
+inline void irobex_start_watchdog_timer(struct irobex_cb *, int timeout);
 
 #endif
 
diff -urN linux-2.2.6-pre2/include/net/irda/uircc.h linux-2.2.6-pre3/include/net/irda/uircc.h
--- linux-2.2.6-pre2/include/net/irda/uircc.h	1999-01-20 11:05:33.000000000 -0800
+++ linux-2.2.6-pre3/include/net/irda/uircc.h	2003-08-15 15:05:39.000000000 -0700
@@ -7,7 +7,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Dec 26 11:00:49 1998
- * Modified at:   Tue Jan 19 23:52:46 1999
+ * Modified at:   Thu Mar 11 01:37:20 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -77,6 +77,7 @@
 
 #define UIRCC_CR12          0x0c /* Timer counter initial value (low byte) */
 #define UIRCC_CR13          0x0d /* Timer counter initial value (high byte) */
+#define UIRCC_CR15          0x0f
 
 /* Status registers (read only) */
 #define UIRCC_SR0           0x00 /* Transmit/receive status register */
@@ -102,9 +103,10 @@
 #define UIRCC_SR9           0x09 /* System status 1 */
 
 #define UIRCC_SR10          0x0a /* Modem select status */
-
+#define UIRCC_SR11          0x0b
 #define UIRCC_SR12          0x0c /* Timer counter status (low byte) */
 #define UIRCC_SR13          0x0d /* Timer counter status (high byte) */
+#define UIRCC_SR15          0x0f
 
 /* Private data for each instance */
 struct uircc_cb {
diff -urN linux-2.2.6-pre2/include/net/sock.h linux-2.2.6-pre3/include/net/sock.h
--- linux-2.2.6-pre2/include/net/sock.h	1999-03-28 10:04:27.000000000 -0800
+++ linux-2.2.6-pre3/include/net/sock.h	2003-08-15 15:05:39.000000000 -0700
@@ -81,6 +81,10 @@
 #include <net/dn.h>
 #endif
 
+#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
+#include <net/irda/irda.h>
+#endif
+
 #ifdef CONFIG_FILTER
 #include <linux/filter.h>
 #endif
@@ -491,6 +495,9 @@
 #if defined(CONFIG_ECONET) || defined(CONFIG_ECONET_MODULE)
 		struct econet_opt	*af_econet;
 #endif
+#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
+		struct irda_sock        *irda;
+#endif
 	} protinfo;  		
 
 	/* IP 'private area' or will be eventually. */
diff -urN linux-2.2.6-pre2/MAINTAINERS linux-2.2.6-pre3/MAINTAINERS
--- linux-2.2.6-pre2/MAINTAINERS	1999-03-22 11:18:17.000000000 -0800
+++ linux-2.2.6-pre3/MAINTAINERS	2003-08-15 15:05:39.000000000 -0700
@@ -395,7 +395,7 @@
 P:      Dag Brattli
 M:      Dag Brattli <dagb@cs.uit.no>
 L:      linux-irda@list.uit.no
-W:      http://www.cs.uit.no/~dagb/irda/
+W:      http://www.cs.uit.no/linux-irda/
 S:      Maintained
 
 ISDN SUBSYSTEM
diff -urN linux-2.2.6-pre2/net/irda/af_irda.c linux-2.2.6-pre3/net/irda/af_irda.c
--- linux-2.2.6-pre2/net/irda/af_irda.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/af_irda.c	2003-08-15 15:05:39.000000000 -0700
@@ -1,16 +1,16 @@
 /*********************************************************************
  *                
  * Filename:      af_irda.c
- * Version:       0.1
+ * Version:       0.6
  * Description:   IrDA sockets implementation
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun May 31 10:12:43 1998
- * Modified at:   Sat Feb 20 01:31:15 1999
+ * Modified at:   Wed Apr  7 17:32:27 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * Sources:       af_netroom.c, af_ax25.x
+ * Sources:       af_netroom.c, af_ax25.c, af_rose.c, af_x25.c etc.
  * 
- *     Copyright (c) 1997 Dag Brattli, All Rights Reserved.
+ *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
  *      
  *     This program is free software; you can redistribute it and/or 
  *     modify it under the terms of the GNU General Public License as 
@@ -30,37 +30,359 @@
 #include <linux/init.h>
 #include <linux/if_arp.h>
 #include <linux/net.h>
+#include <linux/irda.h>
 
 #include <asm/uaccess.h>
 
 #include <net/sock.h>
 
 #include <net/irda/irda.h>
-#include <net/irda/irmod.h>
+#include <net/irda/iriap.h>
+#include <net/irda/irias_object.h>
 #include <net/irda/irttp.h>
 
-extern int irda_init(void);
+extern int  irda_init(void);
 extern void irda_cleanup(void);
-extern int irlap_input(struct sk_buff *, struct device *, struct packet_type *);
+extern int  irlap_driver_rcv(struct sk_buff *, struct device *, 
+			     struct packet_type *);
 
 static struct proto_ops irda_proto_ops;
+static hashbin_t *cachelog = NULL;
+static struct wait_queue *discovery_wait; /* Wait for discovery */
 
 #define IRDA_MAX_HEADER (TTP_HEADER+LMP_HEADER+LAP_HEADER)
 
-#define IRDA_SOCKETS
+/*
+ * Function irda_data_indication (instance, sap, skb)
+ *
+ *    Received some data from TinyTP. Just queue it on the receive queue
+ *
+ */
+static int irda_data_indication(void *instance, void *sap, struct sk_buff *skb)
+{
+	struct irda_sock *self;
+	struct sock *sk;
+	int err;
+
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	self = (struct irda_sock *) instance;
+	ASSERT(self != NULL, return -1;);
+
+	sk = self->sk;
+	ASSERT(sk != NULL, return -1;);
+
+	err = sock_queue_rcv_skb(sk, skb);
+	if (err) {
+		DEBUG(1, __FUNCTION__ "(), error: no more mem!\n");
+		self->rx_flow = FLOW_STOP;
+
+		/* When we return error, TTP will need to requeue the skb */
+		return err;
+	}
+
+	return 0;
+}
+
+/*
+ * Function irda_disconnect_indication (instance, sap, reason, skb)
+ *
+ *    Connection has been closed. Chech reason to find out why
+ *
+ */
+static void irda_disconnect_indication(void *instance, void *sap, 
+				       LM_REASON reason, struct sk_buff *skb)
+{
+	struct irda_sock *self;
+	struct sock *sk;
+
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	self = (struct irda_sock *) instance;
+
+	sk = self->sk;
+	if (sk == NULL)
+		return;
+
+	sk->state     = TCP_CLOSE;
+        sk->err       = reason;
+        sk->shutdown |= SEND_SHUTDOWN;
+	if (!sk->dead) {
+		sk->state_change(sk);
+                sk->dead = 1;
+        }
+}
+
+/*
+ * Function irda_connect_confirm (instance, sap, qos, max_sdu_size, skb)
+ *
+ *    Connections has been confirmed by the remote device
+ *
+ */
+static void irda_connect_confirm(void *instance, void *sap, 
+				 struct qos_info *qos,
+				 __u32 max_sdu_size, struct sk_buff *skb)
+{
+	struct irda_sock *self;
+	struct sock *sk;
+
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	self = (struct irda_sock *) instance;
+
+	self->max_sdu_size_tx = max_sdu_size;
+	memcpy(&self->qos_tx, qos, sizeof(struct qos_info));
+
+	sk = self->sk;
+	if (sk == NULL)
+		return;
+
+	/* We are now connected! */
+	sk->state = TCP_ESTABLISHED;
+	sk->state_change(sk);
+}
+
+/*
+ * Function irda_connect_indication(instance, sap, qos, max_sdu_size, userdata)
+ *
+ *    Incomming connection
+ *
+ */
+static void irda_connect_indication(void *instance, void *sap, 
+				    struct qos_info *qos, __u32 max_sdu_size,
+				    struct sk_buff *skb)
+{
+	struct irda_sock *self;
+	struct sock *sk;
+
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	self = (struct irda_sock *) instance;
+	
+	self->max_sdu_size_tx = max_sdu_size;
+	memcpy(&self->qos_tx, qos, sizeof(struct qos_info));
+
+	sk = self->sk;
+	if (sk == NULL)
+		return;
+	
+	skb_queue_tail(&sk->receive_queue, skb);
+
+	sk->state_change(sk);
+}
+
+/*
+ * Function irda_connect_response (handle)
+ *
+ *    Accept incomming connection
+ *
+ */
+void irda_connect_response(struct irda_sock *self)
+{
+	struct sk_buff *skb;
+
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	ASSERT(self != NULL, return;);
+
+	skb = dev_alloc_skb(64);
+	if (skb == NULL) {
+		DEBUG( 0, __FUNCTION__ "() Could not allocate sk_buff!\n");
+		return;
+	}
+
+	/* Reserve space for MUX_CONTROL and LAP header */
+	skb_reserve(skb, TTP_HEADER+LMP_CONTROL_HEADER+LAP_HEADER);
+
+	irttp_connect_response(self->tsap, self->max_sdu_size_rx, skb);
+}
+
+
+/*
+ * Function irda_flow_indication (instance, sap, flow)
+ *
+ *    Used by TinyTP to tell us if it can accept more data or not
+ *
+ */
+static void irda_flow_indication(void *instance, void *sap, LOCAL_FLOW flow) 
+{
+	struct irda_sock *self;
+	struct sock *sk;
+
+	DEBUG(1, __FUNCTION__ "()\n");
+	
+	self = (struct irda_sock *) instance;
+	ASSERT(self != NULL, return;);
+
+	sk = self->sk;
+	ASSERT(sk != NULL, return;);
+	
+	switch (flow) {
+	case FLOW_STOP:
+		DEBUG( 0, __FUNCTION__ "(), IrTTP wants us to slow down\n");
+		self->tx_flow = flow;
+		break;
+	case FLOW_START:
+		self->tx_flow = flow;
+		DEBUG(0, __FUNCTION__ "(), IrTTP wants us to start again\n");
+		wake_up_interruptible(sk->sleep);
+		break;
+	default:
+		DEBUG( 0, __FUNCTION__ "(), Unknown flow command!\n");
+	}
+}
+
+/*
+ * Function irda_get_value_confirm (obj_id, value, priv)
+ *
+ *    Got answer from remote LM-IAS
+ *
+ */
+static void irda_get_value_confirm(__u16 obj_id, struct ias_value *value, 
+				   void *priv)
+{
+	struct irda_sock *self;
+	
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	ASSERT(priv != NULL, return;);
+	self = (struct irda_sock *) priv;
+	
+	if (!self)
+		return;
+
+	/* Check if request succeeded */
+	if (!value) {
+		DEBUG(0, __FUNCTION__ "(), IAS query failed!\n");
+
+		/* Wake up any processes waiting for result */
+		wake_up_interruptible(&self->ias_wait);
+		return;
+	}
+
+	switch (value->type) {
+	case IAS_INTEGER:
+		DEBUG(4, __FUNCTION__ "() int=%d\n", value->t.integer);
+		
+		if (value->t.integer != -1) {
+			self->dtsap_sel = value->t.integer;
+		} else 
+			self->dtsap_sel = 0;
+		break;
+	default:
+		DEBUG(0, __FUNCTION__ "(), bad type!\n");
+		break;
+	}
+	/* Wake up any processes waiting for result */
+	wake_up_interruptible(&self->ias_wait);
+}
+
+/*
+ * Function irda_discovery_indication (log)
+ *
+ *    Got a discovery log from IrLMP, wake ut any process waiting for answer
+ *
+ */
+static void irda_discovery_indication(hashbin_t *log)
+{
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	cachelog = log;
+
+	/* Wake up process if its waiting for device to be discovered */
+	wake_up_interruptible(&discovery_wait);
+}
+
+/*
+ * Function irda_open_tsap (self)
+ *
+ *    Open local Transport Service Access Point (TSAP)
+ *
+ */
+static int irda_open_tsap(struct irda_sock *self, __u8 tsap_sel, char *name)
+{
+	struct notify_t notify;
+	
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	/* Initialize callbacks to be used by the IrDA stack */
+	irda_notify_init(&notify);
+	notify.connect_confirm       = irda_connect_confirm;
+	notify.connect_indication    = irda_connect_indication;
+	notify.disconnect_indication = irda_disconnect_indication;
+	notify.data_indication       = irda_data_indication;
+	notify.flow_indication       = irda_flow_indication;
+	notify.instance = self;
+	strncpy(notify.name, name, NOTIFY_MAX_NAME);
+
+	self->tsap = irttp_open_tsap(tsap_sel, DEFAULT_INITIAL_CREDIT,
+				     &notify);	
+	if (self->tsap == NULL) {
+		DEBUG( 0, __FUNCTION__ "(), Unable to allocate TSAP!\n");
+		return -1;
+	}
+	/* Remember which TSAP selector we actually got */
+	self->stsap_sel = self->tsap->stsap_sel;
 
-#ifdef IRDA_SOCKETS
+	return 0;
+}
+
+/*
+ * Function irda_find_lsap_sel (self, name)
+ *
+ *    Try to lookup LSAP selector in remote LM-IAS
+ *
+ */
+static int irda_find_lsap_sel(struct irda_sock *self, char *name)
+{
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	ASSERT(self != NULL, return -1;);
+
+	/* Query remote LM-IAS */
+	iriap_getvaluebyclass_request(name, "IrDA:TinyTP:LsapSel",
+				      self->saddr, self->daddr,
+				      irda_get_value_confirm, self);
+	/* Wait for answer */
+	interruptible_sleep_on(&self->ias_wait);
+
+	if (self->dtsap_sel)
+		return 0;
+
+	return -ENETUNREACH; /* May not be true */
+}
 
 /*
  * Function irda_getname (sock, uaddr, uaddr_len, peer)
  *
- *    
+ *    Return the our own, or peers socket address (sockaddr_irda)
  *
  */
-static int irda_getname( struct socket *sock, struct sockaddr *uaddr,
-			 int *uaddr_len, int peer)
+static int irda_getname(struct socket *sock, struct sockaddr *uaddr,
+			int *uaddr_len, int peer)
 {
-	DEBUG( 0, __FUNCTION__ "(), Not implemented!\n");
+	struct sockaddr_irda saddr;
+	struct sock *sk = sock->sk;
+
+	if (peer) {
+		if (sk->state != TCP_ESTABLISHED)
+			return -ENOTCONN;
+		
+		saddr.sir_family = AF_IRDA;
+		saddr.sir_lsap_sel = sk->protinfo.irda->dtsap_sel;
+		saddr.sir_addr = sk->protinfo.irda->daddr;
+	} else {
+		saddr.sir_family = AF_IRDA;
+		saddr.sir_lsap_sel = sk->protinfo.irda->stsap_sel;
+		saddr.sir_addr = sk->protinfo.irda->saddr;
+	}
+	
+	DEBUG(1, __FUNCTION__ "(), tsap_sel = %#x\n", saddr.sir_lsap_sel);
+	DEBUG(1, __FUNCTION__ "(), addr = %08x\n", saddr.sir_addr);
+
+	if (*uaddr_len > sizeof (struct sockaddr_irda))
+		*uaddr_len = sizeof (struct sockaddr_irda);
+	memcpy(uaddr, &saddr, *uaddr_len);
 
 	return 0;
 }
@@ -68,22 +390,148 @@
 /*
  * Function irda_listen (sock, backlog)
  *
- *    
+ *    Just move to the listen state
  *
  */
 static int irda_listen( struct socket *sock, int backlog)
 {
 	struct sock *sk = sock->sk;
 
-	if (sk->type == SOCK_SEQPACKET && sk->state != TCP_LISTEN) {
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	if (sk->type == SOCK_STREAM && sk->state != TCP_LISTEN) {
 		sk->max_ack_backlog = backlog;
 		sk->state           = TCP_LISTEN;
+
 		return 0;
 	}
-
+	
 	return -EOPNOTSUPP;
 }
 
+/*
+ * Function irda_bind (sock, uaddr, addr_len)
+ *
+ *    Used by servers to register their well known TSAP
+ *
+ */
+static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
+{
+	struct sock *sk = sock->sk;
+	struct sockaddr_irda *addr = (struct sockaddr_irda *) uaddr;
+	struct irda_sock *self;
+	__u16 hints = 0;
+	int err;
+
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	self = sk->protinfo.irda;
+	ASSERT(self != NULL, return -1;);
+
+	if ((addr_len < sizeof(struct sockaddr_irda)) || 
+	    (addr_len > sizeof(struct sockaddr_irda)))
+		return -EINVAL;
+
+	err = irda_open_tsap(self, addr->sir_lsap_sel, addr->sir_name);
+	if (err < 0)
+		return -ENOMEM;
+	
+	/*  Register with LM-IAS */
+	self->ias_obj = irias_new_object(addr->sir_name, jiffies);
+	irias_add_integer_attrib(self->ias_obj, "IrDA:TinyTP:LsapSel", 
+				 self->stsap_sel);
+	irias_insert_object(self->ias_obj);
+
+	/* Fill in some default hint bits values */
+	if (strncmp(addr->sir_name, "OBEX", 4) == 0)
+		hints = irlmp_service_to_hint(S_OBEX);
+	
+	if (hints)
+		self->skey = irlmp_register_service(hints);
+
+	return 0;
+}
+
+/*
+ * Function irda_accept (sock, newsock, flags)
+ *
+ *    Wait for incomming connection
+ *
+ */
+static int irda_accept(struct socket *sock, struct socket *newsock, int flags)
+{
+	struct irda_sock *self, *new;
+	struct sock *sk = sock->sk;
+	struct sock *newsk;
+	struct sk_buff *skb;
+
+	self = sk->protinfo.irda;
+	ASSERT(self != NULL, return -1;);
+
+	if (sock->state != SS_UNCONNECTED)
+		return -EINVAL;
+
+	if ((sk = sock->sk) == NULL)
+		return -EINVAL;
+
+	if (sk->type != SOCK_STREAM)
+		return -EOPNOTSUPP;
+
+	if (sk->state != TCP_LISTEN)
+		return -EINVAL;
+
+	/*
+	 *	The read queue this time is holding sockets ready to use
+	 *	hooked into the SABM we saved
+	 */
+	do {
+		if ((skb = skb_dequeue(&sk->receive_queue)) == NULL) {
+			if (flags & O_NONBLOCK)
+				return -EWOULDBLOCK;
+
+			interruptible_sleep_on(sk->sleep);
+			if (signal_pending(current)) 
+				return -ERESTARTSYS;
+		}
+	} while (skb == NULL);
+
+ 	newsk = newsock->sk;
+	newsk->state = TCP_ESTABLISHED;
+
+	new = newsk->protinfo.irda;
+	ASSERT(new != NULL, return -1;);
+
+	/* Now attach up the new socket */
+	new->tsap = irttp_dup(self->tsap, new);
+	if (!new->tsap) {
+		DEBUG(0, __FUNCTION__ "(), dup failed!\n");
+		return -1;
+	}
+		
+	new->stsap_sel = new->tsap->stsap_sel;
+	new->dtsap_sel = new->tsap->dtsap_sel;
+	new->saddr = irttp_get_saddr(new->tsap);
+	new->saddr = irttp_get_saddr(new->tsap);
+
+	new->max_sdu_size_tx = self->max_sdu_size_tx;
+	new->max_sdu_size_rx = self->max_sdu_size_rx;
+	memcpy(&new->qos_tx, &self->qos_tx, sizeof(struct qos_info));
+
+	/* Clean up the original one to keep it in listen state */
+	self->tsap->dtsap_sel = self->tsap->lsap->dlsap_sel = LSAP_ANY;
+	self->tsap->lsap->lsap_state = LSAP_DISCONNECTED;
+
+	skb->sk = NULL;
+	skb->destructor = NULL;
+	kfree_skb(skb);
+	sk->ack_backlog--;
+
+	newsock->state = SS_CONNECTED;
+
+	irda_connect_response(new);
+
+	return 0;
+}
 
 /*
  * Function irda_connect (sock, uaddr, addr_len, flags)
@@ -91,17 +539,18 @@
  *    Connect to a IrDA device
  *
  */
-static int irda_connect( struct socket *sock, struct sockaddr *uaddr,
-	int addr_len, int flags)
+static int irda_connect(struct socket *sock, struct sockaddr *uaddr,
+			int addr_len, int flags)
 {
-#if 0
-	struct sock *sk = (struct sock *)sock->data;
-	struct sockaddr_irda *addr = (struct sockaddr_irda *)uaddr;
-	irda_address *user, *source = NULL;
-	struct device *dev;
+	struct sock *sk = sock->sk;
+	struct sockaddr_irda *addr = (struct sockaddr_irda *) uaddr;
+	struct irda_sock *self;
+	int err;
+
+	self = sk->protinfo.irda;
+
+	DEBUG(1, __FUNCTION__ "()\n");
 
-	DEBUG( 0, __FUNCTION__ "()\n");
-	
 	if (sk->state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) {
 		sock->state = SS_CONNECTED;
 		return 0;   /* Connect completed during a ERESTARTSYS event */
@@ -121,6 +570,36 @@
 	if (addr_len != sizeof(struct sockaddr_irda))
 		return -EINVAL;
 
+	/* Check if user supplied the required destination device address */
+	if (!addr->sir_addr)
+		return -EINVAL;
+
+	self->daddr = addr->sir_addr;
+	DEBUG(1, __FUNCTION__ "(), daddr = %08x\n", self->daddr);
+
+	/* Query remote LM-IAS */
+	err = irda_find_lsap_sel(self, addr->sir_name);
+	if (err) {
+		DEBUG(0, __FUNCTION__ "(), connect failed!\n");
+		return err;
+	}
+
+	/* Check if we have opened a local TSAP */
+	if (!self->tsap)
+		irda_open_tsap(self, LSAP_ANY, addr->sir_name);
+	
+	/* Move to connecting socket, start sending Connect Requests */
+	sock->state = SS_CONNECTING;
+	sk->state   = TCP_SYN_SENT;
+
+	/* Connect to remote device */
+	err = irttp_connect_request(self->tsap, self->dtsap_sel, 
+				    self->saddr, self->daddr, NULL, 
+				    self->max_sdu_size_rx, NULL);
+	if (err) {
+		DEBUG(0, __FUNCTION__ "(), connect failed!\n");
+		return err;
+	}
 
 	/* Now the loop */
 	if (sk->state != TCP_ESTABLISHED && (flags & O_NONBLOCK))
@@ -130,9 +609,9 @@
 	
 	/* A Connect Ack with Choke or timeout or failed routing will go to
 	 * closed.  */
-	while ( sk->state == TCP_SYN_SENT) {
-		interruptible_sleep_on( sk->sleep);
-		if (current->signal & ~current->blocked) {
+	while (sk->state == TCP_SYN_SENT) {
+		interruptible_sleep_on(sk->sleep);
+		if (signal_pending(current)) {
 			sti();
 			return -ERESTARTSYS;
 		}
@@ -141,13 +620,13 @@
 	if (sk->state != TCP_ESTABLISHED) {
 		sti();
 		sock->state = SS_UNCONNECTED;
-		return sock_error( sk);	/* Always set at this point */
+		return sock_error(sk);	/* Always set at this point */
 	}
 	
 	sock->state = SS_CONNECTED;
-
+	
 	sti();
-#endif
+	
 	return 0;
 }
 
@@ -160,51 +639,79 @@
 static int irda_create(struct socket *sock, int protocol)
 {
 	struct sock *sk;
+	struct irda_sock *self;
 
-	DEBUG( 0, __FUNCTION__ "()\n");
-
-	/* Compatibility */
-	if (sock->type == SOCK_PACKET) {
-		static int warned; 
-		if (net_families[PF_PACKET]==NULL)
-		{
-#if defined(CONFIG_KMOD) && defined(CONFIG_PACKET_MODULE)
-			char module_name[30];
-			sprintf(module_name,"net-pf-%d", PF_PACKET);
-			request_module(module_name);
-			if (net_families[PF_PACKET] == NULL)
-#endif
-				return -ESOCKTNOSUPPORT;
-		}
-		if (!warned++)
-			printk(KERN_INFO "%s uses obsolete (PF_INET,SOCK_PACKET)\n", current->comm);
-		return net_families[PF_PACKET]->create(sock, protocol);
-	}
+	DEBUG(2, __FUNCTION__ "()\n");
 	
-/* 	if (sock->type != SOCK_SEQPACKET || protocol != 0) */
-/* 		return -ESOCKTNOSUPPORT; */
+	/* Check for valid socket type */
+	switch (sock->type) {
+	case SOCK_STREAM:   /* FALLTHROUGH */
+	case SOCK_SEQPACKET:
+		break;
+	default:
+		return -ESOCKTNOSUPPORT;
+	}
 
 	/* Allocate socket */
 	if ((sk = sk_alloc(PF_IRDA, GFP_ATOMIC, 1)) == NULL)
 		return -ENOMEM;
 	
+	self = kmalloc(sizeof(struct irda_sock), GFP_ATOMIC);
+	if (self == NULL)
+		return -ENOMEM;
+	memset(self, 0, sizeof(struct irda_sock));
+
+	self->sk = sk;
+	sk->protinfo.irda = self;
+
 	sock_init_data(sock, sk);
 
 	sock->ops    = &irda_proto_ops;
 	sk->protocol = protocol;
 
+	/* Register as a client with IrLMP */
+	self->ckey = irlmp_register_client(0, NULL, NULL);
+	self->mask = 0xffff;
+	self->rx_flow = self->tx_flow = FLOW_START;
+	self->max_sdu_size_rx = SAR_DISABLE; /* Default value */
+	self->nslots = 6; /* Default for now */
+
+	/* Notify that we are using the irda module, so nobody removes it */
+	irda_mod_inc_use_count();
+
 	return 0;
 }
 
 /*
- * Function irda_destroy_socket (tsap)
+ * Function irda_destroy_socket (self)
  *
  *    Destroy socket
  *
  */
-void irda_destroy_socket(struct tsap_cb *tsap)
+void irda_destroy_socket(struct irda_sock *self)
 {
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(2, __FUNCTION__ "()\n");
+
+	ASSERT(self != NULL, return;);
+
+	/* Unregister with IrLMP */
+	irlmp_unregister_client(self->ckey);
+	irlmp_unregister_service(self->skey);
+
+	/* Unregister with LM-IAS */
+	if (self->ias_obj)
+		irias_delete_object(self->ias_obj->name);
+
+	if (self->tsap) {
+		irttp_disconnect_request(self->tsap, NULL, P_NORMAL);
+		irttp_close_tsap(self->tsap);
+		self->tsap = NULL;
+	}
+
+	kfree(self);
+
+	/* Notify that we are not using the irda module anymore */
+	irda_mod_dec_use_count();
 
 	return;
 }
@@ -215,41 +722,108 @@
  *    
  *
  */
-static int irda_release( struct socket *sock, struct socket *peer)
+static int irda_release(struct socket *sock, struct socket *peer)
 {
-#if 0
-        struct sock *sk = (struct sock *)sock->data;
+	struct sock *sk = sock->sk;
 	
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(1, __FUNCTION__ "()\n");
 
-
-        if (sk == NULL) return 0;
+        if (sk == NULL) 
+		return 0;
 	
-        if (sk->type == SOCK_SEQPACKET) {                    
+	sk->state       = TCP_CLOSE;
+	sk->shutdown   |= SEND_SHUTDOWN;
+	sk->state_change(sk);
+	sk->dead        = 1;
 
-	
-	} else {
-		sk->state       = TCP_CLOSE;
-                sk->shutdown   |= SEND_SHUTDOWN;
-                sk->state_change(sk);
-                sk->dead        = 1;
-                irda_destroy_socket( sk->protinfo.irda);
-        }
+	irda_destroy_socket(sk->protinfo.irda);
+
+        sock->sk   = NULL;      
+        sk->socket = NULL;      /* Not used, but we should do this. */
 
-        sock->data = NULL;      
-        sk->socket = NULL;      /* Not used, but we should do this. **/
-#endif
         return 0;
 }
 
+/*
+ * Function irda_sendmsg (sock, msg, len, scm)
+ *
+ *    Send message down to TinyTP
+ *
+ */
+static int irda_sendmsg(struct socket *sock, struct msghdr *msg, int len, 
+			struct scm_cookie *scm)
+{
+	struct sock *sk = sock->sk;
+/* 	struct sockaddr_irda *addr = (struct sockaddr_irda *) msg->msg_name; */
+	struct irda_sock *self;
+	struct sk_buff *skb;
+	unsigned char *asmptr;
+	int err;
+
+	DEBUG(4, __FUNCTION__ "(), len=%d\n", len);
+
+	if (msg->msg_flags & ~MSG_DONTWAIT)
+		return -EINVAL;
+
+	if (sk->shutdown & SEND_SHUTDOWN) {
+		send_sig(SIGPIPE, current, 0);
+		return -EPIPE;
+	}
+
+	self = sk->protinfo.irda;
+	ASSERT(self != NULL, return -1;);
+
+	/* Check if IrTTP is wants us to slow down */
+	while (self->tx_flow == FLOW_STOP) {
+		DEBUG(2, __FUNCTION__ "(), IrTTP is busy, going to sleep!\n");
+		interruptible_sleep_on(sk->sleep);
+		
+		/* Check if we are still connected */
+		if (sk->state != TCP_ESTABLISHED)
+			return -ENOTCONN;
+	}
+
+	skb = sock_alloc_send_skb(sk, len + IRDA_MAX_HEADER, 0, 
+				  msg->msg_flags & MSG_DONTWAIT, &err);
+	if (!skb)
+		return -ENOBUFS;
+
+	skb_reserve(skb, IRDA_MAX_HEADER);
+	
+	DEBUG(4, __FUNCTION__ "(), appending user data\n");
+	asmptr = skb->h.raw = skb_put(skb, len);
+	memcpy_fromiovec(asmptr, msg->msg_iov, len);
+
+	/* 
+	 * Just send the message to TinyTP, and let it deal with possible 
+	 * errors. No need to duplicate all that here
+	 */
+	err = irttp_data_request(self->tsap, skb);
+	if (err) {
+		DEBUG(0, __FUNCTION__ "(), err=%d\n", err);
+		return err;
+	}
+	return len;
+}
+
+/*
+ * Function irda_recvmsg (sock, msg, size, flags, scm)
+ *
+ *    Try to receive message and copy it to user
+ *
+ */
 static int irda_recvmsg(struct socket *sock, struct msghdr *msg, int size,
 			int flags, struct scm_cookie *scm)
 {
+	struct irda_sock *self;
 	struct sock *sk = sock->sk;
 	struct sk_buff *skb;
 	int copied, err;
 
-	DEBUG(0, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
+
+	self = sk->protinfo.irda;
+	ASSERT(self != NULL, return -1;);
 
 	skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, 
 				flags & MSG_DONTWAIT, &err);
@@ -267,6 +841,20 @@
 
 	skb_free_datagram(sk, skb);
 
+	/*
+	 *  Check if we have previously stopped IrTTP and we know
+	 *  have more free space in our rx_queue. If so tell IrTTP
+	 *  to start delivering frames again before our rx_queue gets
+	 *  empty
+	 */
+	if (self->rx_flow == FLOW_STOP) {
+		if ((atomic_read(&sk->rmem_alloc) << 2) <= sk->rcvbuf) {
+			DEBUG(2, __FUNCTION__ "(), Starting IrTTP\n");
+			self->rx_flow = FLOW_START;
+			irttp_flow_request(self->tsap, FLOW_START);
+		}
+	}
+
 	return copied;
 }
 
@@ -279,10 +867,11 @@
 }
 
 
-unsigned int irda_poll( struct file *file, struct socket *sock, 
-			struct poll_table_struct *wait)
+unsigned int irda_poll(struct file *file, struct socket *sock, 
+		       struct poll_table_struct *wait)
 {
 	DEBUG(0, __FUNCTION__ "()\n");
+
 	return 0;
 }
 
@@ -296,7 +885,7 @@
 {
 	struct sock *sk = sock->sk;
 
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(0, __FUNCTION__ "(), cmd=%#x\n", cmd);
 	
 	switch (cmd) {
 	case TIOCOUTQ: {
@@ -343,13 +932,163 @@
 		return -EINVAL;
 		
 	default:
-		return dev_ioctl(cmd, (void *)arg);
+		return dev_ioctl(cmd, (void *) arg);
 	}
 
 	/*NOTREACHED*/
 	return 0;
 }
 
+/*
+ * Function irda_setsockopt (sock, level, optname, optval, optlen)
+ *
+ *    Set some options for the socket
+ *
+ */
+static int irda_setsockopt(struct socket *sock, int level, int optname, 
+			   char *optval, int optlen)
+{
+ 	struct sock *sk = sock->sk;
+	struct irda_sock *self;
+	int opt;
+	
+	DEBUG(0, __FUNCTION__ "()\n");
+
+	self = sk->protinfo.irda;
+	ASSERT(self != NULL, return -1;);
+
+	if (level != SOL_IRLMP)
+		return -ENOPROTOOPT;
+	
+	if (optlen < sizeof(int))
+		return -EINVAL;
+	
+	if (get_user(opt, (int *)optval))
+		return -EFAULT;
+	
+	switch (optname) {
+	case IRLMP_IAS_SET:
+		DEBUG(0, __FUNCTION__ "(), sorry not impl. yet!\n");
+		return 0;
+	case IRTTP_MAX_SDU_SIZE:
+		DEBUG(0, __FUNCTION__ "(), setting max_sdu_size = %d\n", opt);
+		self->max_sdu_size_rx = opt;
+		break;
+	default:
+		return -ENOPROTOOPT;
+	}
+	return 0;
+}
+
+/*
+ * Function irda_getsockopt (sock, level, optname, optval, optlen)
+ *
+ *    
+ *
+ */
+static int irda_getsockopt(struct socket *sock, int level, int optname, 
+			   char *optval, int *optlen)
+{
+	struct sock *sk = sock->sk;
+	struct irda_sock *self;
+	struct irda_device_list *list;
+	__u8 optbuf[sizeof(struct irda_device_list) +
+		   sizeof(struct irda_device_info)*10];
+	discovery_t *discovery;
+	int val = 0;
+	int len = 0;
+	int i = 0;
+
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	self = sk->protinfo.irda;
+
+	if (level != SOL_IRLMP)
+		return -ENOPROTOOPT;
+
+	if (get_user(len, optlen))
+		return -EFAULT;
+
+	switch (optname) {
+	case IRLMP_ENUMDEVICES:
+		DEBUG(1, __FUNCTION__ "(), IRLMP_ENUMDEVICES\n");
+		
+		/* Tell IrLMP we want to be notified */
+		irlmp_update_client(self->ckey, self->mask, NULL, 
+				    irda_discovery_indication);
+
+		/* Do some discovery */
+		irlmp_discovery_request(self->nslots);
+
+		/* Devices my be discovered already */
+		if (!cachelog) {
+			DEBUG(2, __FUNCTION__ "(), no log!\n");
+
+			/* Sleep until device(s) discovered */
+			interruptible_sleep_on(&discovery_wait);
+			if (!cachelog)
+				return -1;
+		}
+
+		list = (struct irda_device_list *) optbuf;
+		/* 
+		 * Now, check all discovered devices (if any), and notify
+		 * client only about the services that the client is
+		 * interested in 
+		 */
+		discovery = (discovery_t *) hashbin_get_first(cachelog);
+		while (discovery != NULL) {
+			/* Mask out the ones we don't want */
+			if (discovery->hints.word & self->mask) {
+				/* Copy discovery information */
+				list->dev[i].saddr = discovery->saddr;
+				list->dev[i].daddr = discovery->daddr;
+				list->dev[i].charset = discovery->charset;
+				list->dev[i].hints[0] = discovery->hints.byte[0];
+				list->dev[i].hints[1] = discovery->hints.byte[1];
+				strncpy(list->dev[i].info, discovery->info, 22);
+				if (++i >= 10)
+					break;
+			}
+			discovery = (discovery_t *) hashbin_get_next(cachelog);
+		}
+		cachelog = NULL;
+
+		list->len = i;
+		len = sizeof(struct irda_device_list) +
+			sizeof(struct irda_device_info) * i;
+
+		DEBUG(1, __FUNCTION__ "(), len=%d, i=%d\n", len, i);
+
+		if (put_user(len, optlen))
+			return -EFAULT;
+		
+		if (copy_to_user(optval, &optbuf, len))
+			return -EFAULT;
+		break;
+	case IRTTP_MAX_SDU_SIZE:
+		if (self->max_sdu_size_tx != SAR_DISABLE)
+			val = self->max_sdu_size_tx;
+		else
+			/* SAR is disabled, so use the IrLAP data size
+			 * instead */
+			val = self->qos_tx.data_size.value - IRDA_MAX_HEADER;
+
+		DEBUG(0, __FUNCTION__ "(), getting max_sdu_size = %d\n", val);
+		len = sizeof(int);
+		if (put_user(len, optlen))
+			return -EFAULT;
+		
+		if (copy_to_user(optval, &val, len))
+			return -EFAULT;
+		break;
+	default:
+		return -ENOPROTOOPT;
+	}
+
+	return 0;
+}
+
 static struct net_proto_family irda_family_ops =
 {
 	PF_IRDA,
@@ -361,24 +1100,28 @@
 	
 	sock_no_dup,
 	irda_release,
-	sock_no_bind,
+	irda_bind,
 	irda_connect,
 	sock_no_socketpair,
-	sock_no_accept,
+	irda_accept,
 	irda_getname,
 	irda_poll,
 	irda_ioctl,
 	irda_listen,
 	irda_shutdown,
-	sock_no_setsockopt,
-	sock_no_getsockopt,
+	irda_setsockopt,
+	irda_getsockopt,
 	sock_no_fcntl,
-	sock_no_sendmsg,
+	irda_sendmsg,
 	irda_recvmsg
 };
 
-#endif /* IRDA_SOCKETS */
-
+/*
+ * Function irda_device_event (this, event, ptr)
+ *
+ *    
+ *
+ */
 static int irda_device_event(struct notifier_block *this, unsigned long event,
 			     void *ptr)
 {
@@ -412,7 +1155,7 @@
 {
 	0,	/* MUTTER ntohs(ETH_P_IRDA),*/
 	NULL,
-	irlap_input, /* irda_driver_rcv, */
+	irlap_driver_rcv,
 	NULL,
 	NULL,
 };
@@ -449,6 +1192,7 @@
  *    Remove IrDA protocol layer
  *
  */
+#ifdef MODULE
 void irda_proto_cleanup(void)
 {
 	DEBUG( 4, __FUNCTION__ "\n");
@@ -463,4 +1207,4 @@
 	
         return;
 }
-
+#endif /* MODULE */
diff -urN linux-2.2.6-pre2/net/irda/Config.in linux-2.2.6-pre3/net/irda/Config.in
--- linux-2.2.6-pre2/net/irda/Config.in	1999-01-20 11:05:33.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/Config.in	2003-08-15 15:05:39.000000000 -0700
@@ -12,7 +12,6 @@
     if [ "$CONFIG_IRDA" != "n" ] ; then
       comment 'IrDA protocols'
       source net/irda/irlan/Config.in
-      source net/irda/irobex/Config.in
       source net/irda/ircomm/Config.in
       source net/irda/irlpt/Config.in
 
@@ -21,7 +20,6 @@
         comment '   IrDA options'
         bool '   Cache last LSAP' CONFIG_IRDA_CACHE_LAST_LSAP
 	bool '   Fast RRs' CONFIG_IRDA_FAST_RR
-        bool '   Recycle RRs' CONFIG_IRDA_RECYCLE_RR
 	bool '   Debug information' CONFIG_IRDA_DEBUG
       fi
     fi
diff -urN linux-2.2.6-pre2/net/irda/discovery.c linux-2.2.6-pre3/net/irda/discovery.c
--- linux-2.2.6-pre2/net/irda/discovery.c	1969-12-31 16:00:00.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/discovery.c	2003-08-15 15:05:39.000000000 -0700
@@ -0,0 +1,245 @@
+/*********************************************************************
+ *                
+ * Filename:      discovery.c
+ * Version:       0.1
+ * Description:   Routines for handling discoveries at the IrLMP layer
+ * Status:        Experimental.
+ * Author:        Dag Brattli <dagb@cs.uit.no>
+ * Created at:    Tue Apr  6 15:33:50 1999
+ * Modified at:   Tue Apr  6 20:26:46 1999
+ * Modified by:   Dag Brattli <dagb@cs.uit.no>
+ * 
+ *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
+ *     
+ *     This program is free software; you can redistribute it and/or 
+ *     modify it under the terms of the GNU General Public License as 
+ *     published by the Free Software Foundation; either version 2 of 
+ *     the License, or (at your option) any later version.
+ * 
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *     GNU General Public License for more details.
+ * 
+ *     You should have received a copy of the GNU General Public License 
+ *     along with this program; if not, write to the Free Software 
+ *     Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
+ *     MA 02111-1307 USA
+ *     
+ ********************************************************************/
+
+#include <linux/socket.h>
+#include <linux/irda.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irlmp.h>
+
+#include <net/irda/discovery.h>
+
+/*
+ * Function irlmp_add_discovery (cachelog, discovery)
+ *
+ *    
+ *
+ */
+void irlmp_add_discovery(hashbin_t *cachelog, discovery_t *discovery)
+{
+	discovery_t *old;
+
+	DEBUG(2, __FUNCTION__ "()\n");
+
+	/* Check if we have discovered this device before */
+	old = hashbin_remove(cachelog, discovery->daddr, NULL);
+	if (old)
+		kfree(old);
+
+	/* Insert the new and updated version */
+	hashbin_insert(cachelog, (QUEUE *) discovery, discovery->daddr, NULL);
+}
+
+/*
+ * Function irlmp_add_discovery_log (cachelog, log)
+ *
+ *    
+ *
+ */
+void irlmp_add_discovery_log(hashbin_t *cachelog, hashbin_t *log)
+{
+	discovery_t *discovery;
+
+	DEBUG(2, __FUNCTION__ "()\n");
+
+	/*
+	 *  If log is missing this means that IrLAP was unable to perform the
+	 *  discovery, so restart discovery again with just the half timeout
+	 *  of the normal one.
+	 */
+	if (log == NULL) {
+		/* irlmp_start_discovery_timer(irlmp, 150); */
+		return;
+	}
+
+	discovery = (discovery_t *) hashbin_remove_first(log);
+	while (discovery != NULL) {
+		irlmp_add_discovery(cachelog, discovery);
+
+		discovery = (discovery_t *) hashbin_remove_first(log);
+	}
+	
+	/* Delete the now empty log */
+	hashbin_delete(log, (FREE_FUNC) kfree);
+}
+
+/*
+ * Function irlmp_expire_discoveries (log, saddr, force)
+ *
+ *    Go through all discoveries and expire all that has stayed to long
+ *
+ */
+void irlmp_expire_discoveries(hashbin_t *log, int saddr, int force)
+{
+	discovery_t *discovery, *curr;
+
+	DEBUG(3, __FUNCTION__ "()\n");
+
+	discovery = (discovery_t *) hashbin_get_first(log);
+	while (discovery != NULL) {
+		curr = discovery;
+
+		/* Be sure to be one item ahead */
+		discovery = (discovery_t *) hashbin_get_next(log);
+
+		/* Test if it's time to expire this discovery */
+		if ((curr->saddr == saddr) && (force ||
+		    ((jiffies - curr->timestamp) > DISCOVERY_EXPIRE_TIMEOUT)))
+		{
+			curr = hashbin_remove(log, curr->daddr, NULL);
+			if (curr)
+				kfree(curr);
+		}
+	}
+}
+
+/*
+ * Function irlmp_dump_discoveries (log)
+ *
+ *    Print out all discoveries in log
+ *
+ */
+void irlmp_dump_discoveries(hashbin_t *log)
+{
+	discovery_t *discovery;
+
+	ASSERT(log != NULL, return;);
+
+	discovery = (discovery_t *) hashbin_get_first(log);
+	while (discovery != NULL) {
+		DEBUG(0, "Discovery:\n");
+		DEBUG(0, "  daddr=%08x\n", discovery->daddr);
+		DEBUG(0, "  saddr=%08x\n", discovery->saddr); 
+		DEBUG(0, "  name=%s\n", discovery->info);
+
+		discovery = (discovery_t *) hashbin_get_next(log);
+	}
+}
+
+/*
+ * Function irlmp_find_device (name, saddr)
+ *
+ *    Look through the discovery log at each of the links and try to find 
+ *    the device with the given name. Return daddr and saddr. If saddr is
+ *    specified, that look at that particular link only (not impl).
+ */
+__u32 irlmp_find_device(hashbin_t *cachelog, char *name, __u32 *saddr)
+{
+	discovery_t *d;
+	unsigned long flags;
+
+	spin_lock_irqsave(&irlmp->lock, flags);
+
+	/* Look at all discoveries for that link */
+	d = (discovery_t *) hashbin_get_first(cachelog);
+	while (d != NULL) {
+		DEBUG(1, "Discovery:\n");
+		DEBUG(1, "  daddr=%08x\n", d->daddr);
+		DEBUG(1, "  name=%s\n", d->info);
+		
+		if (strcmp(name, d->info) == 0) {
+			*saddr = d->saddr;
+			
+			spin_unlock_irqrestore(&irlmp->lock, flags);
+			return d->daddr;
+		}
+		d = (discovery_t *) hashbin_get_next(cachelog);
+	}
+
+	spin_unlock_irqrestore(&irlmp->lock, flags);
+
+	return 0;
+}
+
+/*
+ * Function proc_discovery_read (buf, start, offset, len, unused)
+ *
+ *    Print discovery information in /proc file system
+ *
+ */
+int discovery_proc_read(char *buf, char **start, off_t offset, int len, 
+			int unused)
+{
+	discovery_t *discovery;
+	unsigned long flags;
+	hashbin_t *cachelog = irlmp_get_cachelog();
+
+	if (!irlmp)
+		return len;
+
+	len = sprintf(buf, "IrLMP: Discovery log:\n\n");	
+	
+	save_flags(flags);
+	cli();
+	
+	discovery = (discovery_t *) hashbin_get_first(cachelog);
+	while ( discovery != NULL) {
+		len += sprintf( buf+len, "  name: %s,", 
+				discovery->info);
+		
+		len += sprintf( buf+len, " hint: ");
+		if ( discovery->hints.byte[0] & HINT_PNP)
+			len += sprintf( buf+len, "PnP Compatible ");
+		if ( discovery->hints.byte[0] & HINT_PDA)
+			len += sprintf( buf+len, "PDA/Palmtop ");
+		if ( discovery->hints.byte[0] & HINT_COMPUTER)
+			len += sprintf( buf+len, "Computer ");
+		if ( discovery->hints.byte[0] & HINT_PRINTER)
+			len += sprintf( buf+len, "Printer ");
+		if ( discovery->hints.byte[0] & HINT_MODEM)
+			len += sprintf( buf+len, "Modem ");
+		if ( discovery->hints.byte[0] & HINT_FAX)
+			len += sprintf( buf+len, "Fax ");
+		if ( discovery->hints.byte[0] & HINT_LAN)
+			len += sprintf( buf+len, "LAN Access ");
+		
+		if ( discovery->hints.byte[1] & HINT_TELEPHONY)
+			len += sprintf( buf+len, "Telephony ");
+		if ( discovery->hints.byte[1] & HINT_FILE_SERVER)
+			len += sprintf( buf+len, "File Server ");       
+		if ( discovery->hints.byte[1] & HINT_COMM)
+			len += sprintf( buf+len, "IrCOMM ");
+		if ( discovery->hints.byte[1] & HINT_OBEX)
+			len += sprintf( buf+len, "IrOBEX ");
+		
+		len += sprintf(buf+len, ", saddr: 0x%08x", 
+			       discovery->saddr);
+
+		len += sprintf(buf+len, ", daddr: 0x%08x\n", 
+			       discovery->daddr);
+		
+		len += sprintf( buf+len, "\n");
+		
+		discovery = (discovery_t *) hashbin_get_next(cachelog);
+	}
+	restore_flags(flags);
+
+	return len;
+}
diff -urN linux-2.2.6-pre2/net/irda/ircomm/attach.c linux-2.2.6-pre3/net/irda/ircomm/attach.c
--- linux-2.2.6-pre2/net/irda/ircomm/attach.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/ircomm/attach.c	1969-12-31 16:00:00.000000000 -0800
@@ -1,360 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      attach.c
- * Version:       
- * Description:   An implementation of IrCOMM service interface.
- * Status:        Experimental.
- * Author:        Takahide Higuchi <thiguchi@pluto.dti.ne.jp>
- *
- *     Copyright (c) 1998, Takahide Higuchi, <thiguchi@pluto.dti.ne.jp>,
- *     All Rights Reserved.
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     I, Takahide Higuchi, provide no warranty for any of this software.
- *     This material is provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-
-/*
- * ----------------------------------------------------------------------
- * IrIAS related things for IrCOMM
- * If you are to use ircomm layer, use ircomm_attach_cable to
- * setup it and register your program.
- * ----------------------------------------------------------------------
- */
-
-
-#include <linux/sched.h>
-#include <linux/tqueue.h>
-
-#include <net/irda/irlap.h>
-#include <net/irda/irttp.h>
-#include <net/irda/iriap.h>
-#include <net/irda/irias_object.h>
-
-#include <net/irda/ircomm_common.h>
-
-extern struct ircomm_cb **ircomm;
-struct ircomm_cb *discovering_instance;
-
-static void got_lsapsel(struct ircomm_cb * info);
-static void query_lsapsel(struct ircomm_cb * self);
-void ircomm_getvalue_confirm( __u16 obj_id, struct ias_value *value, 
-			      void *priv);
-
-#if 0
-static char *rcsid = "$Id: attach.c,v 1.11 1998/10/22 12:02:20 dagb Exp $";
-#endif
-
-
-/*
- * handler for iriap_getvaluebyclass_request() 
- *
- */
-void ircomm_getvalue_confirm( __u16 obj_id, struct ias_value *value,void *priv)
-{
-	struct ircomm_cb *self = (struct ircomm_cb *) priv;
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRCOMM_MAGIC, return;);
-
-	/* Check if request succeeded */
-	if ( !value) {
-		DEBUG( 0, __FUNCTION__ "(), got NULL value!\n");
-
-		return;
-	}
-
-	DEBUG(0, __FUNCTION__"type(%d)\n", value->type);
-
-	switch(value->type){
-
- 	case IAS_OCT_SEQ:
- 		/* 
-		 * FIXME:we should use data which came here
-		 * it is used for nothing at this time 
-		 */
-		
-#if 1
-		DEBUG(0, "octet sequence is:\n");
-		{
-			int i;
-			for ( i=0;i<value->len;i++)
-				printk("%02x",
-				       (int)(*value->t.oct_seq + i) );
-			printk("\n");
-		}
-#endif
-		query_lsapsel(self);
-		break;
-
-	case IAS_INTEGER:
-		/* LsapSel seems to be sent to me */	
-
-		if ( value->t.integer == -1){
-			DEBUG( 0, "ircomm_getvalue_confirm: invalid value!\n");
-			return;
-		}
-		if(self->state == COMM_IDLE){
-			self->dlsap = value->t.integer;
-			got_lsapsel(self);
-		}
-		break;
-
-	case IAS_STRING:
-		DEBUG(0, __FUNCTION__":STRING is not implemented\n");
-		DEBUG(0, __FUNCTION__":received string:%s\n", value->t.string);
-		query_lsapsel(self);  /* experiment */
-		break;
-
-	case IAS_MISSING:
-		DEBUG( 0, __FUNCTION__":MISSING is not implemented\n");
-		break;
-   
-	default:
-		DEBUG( 0, __FUNCTION__":unknown type!\n");
-		break;
-	}
-}
-
-static void got_lsapsel(struct ircomm_cb * self)
-{
-	struct notify_t notify;
-
-	DEBUG(0, "ircomm:got_lsapsel: got peersap!(%d)\n", self->dlsap );
-
-	/* remove tsap for server */
-	irttp_close_tsap(self->tsap);
-
-	/* create TSAP for initiater ... */
-	irda_notify_init(&notify);
-	notify.data_indication = ircomm_accept_data_indication;
-	notify.connect_confirm = ircomm_accept_connect_confirm;
-	notify.connect_indication = ircomm_accept_connect_indication;
-	notify.flow_indication = ircomm_accept_flow_indication;
-	notify.disconnect_indication = ircomm_accept_disconnect_indication;
-	strncpy( notify.name, "IrCOMM cli", NOTIFY_MAX_NAME);
-	notify.instance = self;
-	
-	self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT, 
-				     &notify);
-	ASSERT(self->tsap != NULL, return;);
-
-	/*
-	 * invoke state machine  
-	 * and notify that I'm ready to accept connect_request
-	 */
-
-	ircomm_next_state(self, COMM_IDLE);	
-  	if(self->d_handler)
- 		self->d_handler(self);
-}
-		
-static void query_lsapsel(struct ircomm_cb * self)
-{
-	DEBUG(0, "ircomm:query_lsapsel..\n");
-
-	/*  
-	 *  since we've got Parameters field of IAS, we are to get peersap.
-	 */
-	
-	if (!(self->servicetype & THREE_WIRE_RAW)) {
-		iriap_getvaluebyclass_request( 
-			"IrDA:IrCOMM", "IrDA:TinyTP:LsapSel",
-			self->saddr, self->daddr,
-			ircomm_getvalue_confirm, self );
-	} else {
-		DEBUG(0, __FUNCTION__ "THREE_WIRE_RAW is not implemented!\n");
-	}
-}
-
-
-
-/*
- * ircomm_discovery_indication()
- *    Remote device is discovered, try query the remote IAS to see which
- *    device it is, and which services it has.
- */
-
-void ircomm_discovery_indication( DISCOVERY *discovery)
-{
-	struct ircomm_cb *self;
-
- 	DEBUG( 0, "ircomm_discovery_indication\n");
-	
-	self = discovering_instance;
-	ASSERT(self != NULL, return;);
-	ASSERT(self->magic == IRCOMM_MAGIC, return;);
-
-	self->daddr = discovery->daddr;
-	self->saddr = discovery->saddr;
-
-	DEBUG( 0, "ircomm_discovery_indication:daddr=%08x\n", self->daddr);
-
-	/* query "Parameters" attribute of LM-IAS */
-
-	DEBUG(0, "ircomm:querying parameters..\n");
-#if 0
-	iriap_getvaluebyclass_request(self->daddr, "IrDA:IrCOMM",
-				      "Parameters",
-				      ircomm_getvalue_confirm,
-				      self);
-#else
-	query_lsapsel(self);
-#endif
-	return;
-}
-
-
-struct ircomm_cb * ircomm_attach_cable( __u8 servicetype,
-					struct notify_t notify, 
-					void *handler )
-{
-	int i;
-	struct ircomm_cb *self = NULL;
-	struct notify_t server_notify;
-	struct ias_object* obj;
-
-	/* FIXME: it should not be hard coded */
-	__u8 oct_seq[6] = { 0,1,4,1,1,1 }; 
-
-	ASSERT(ircomm != NULL,return NULL;);
-	DEBUG(0,"ircomm_attach_cable:\n");
-
-
-	/* find free handle */
-
-	for(i = 0; i < IRCOMM_MAX_CONNECTION; i++){
-		ASSERT(ircomm[i] != NULL,return(NULL););
-		if(!ircomm[i]->in_use){
-			self = ircomm[i];
-			break;
-		}
-	}
-
-	if (!self){
-		DEBUG(0,"ircomm_attach_cable:no free handle!\n");
-		return (NULL);
-	}
-
-	self->in_use = 1;
-	self->servicetype = servicetype;
-
-	DEBUG(0,"attach_cable:servicetype:%d\n",servicetype);
-	self->d_handler = handler;
-	self->notify = notify;
-
-	/* register server.. */
-
-	/*
-	 * TODO: since server TSAP is currentry hard coded,
-	 * we can use *only one* IrCOMM connection.
-	 * We have to create one more TSAP and register IAS entry dynamically 
-	 * each time when we are to allocate new server here.
-	 */
-	irda_notify_init(&server_notify);
-	server_notify.data_indication = ircomm_accept_data_indication;
-	server_notify.connect_confirm = ircomm_accept_connect_confirm;
-	server_notify.connect_indication = ircomm_accept_connect_indication;
-	server_notify.flow_indication = ircomm_accept_flow_indication;
-	server_notify.disconnect_indication = ircomm_accept_disconnect_indication;
-	server_notify.instance = self;
-	strncpy( server_notify.name, "IrCOMM srv", NOTIFY_MAX_NAME);
-
-	self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT,
-				     &server_notify);
-	if(!self->tsap){
-		DEBUG(0,"ircomm:Sorry, failed to allocate server_tsap\n");
-		return NULL;
-	}
-
-        /* 
-         *  Register with LM-IAS
-         */
-	obj = irias_new_object( "IrDA:IrCOMM", IAS_IRCOMM_ID);
-	irias_add_integer_attrib( obj, "IrDA:TinyTP:LsapSel", 
-				  self->tsap->stsap_sel );
-
-	/* FIXME: it should not be hard coded */
-
-	irias_add_octseq_attrib( obj, "Parameters", 
-				 &oct_seq[0], 6);
-	irias_insert_object( obj);
-
-/* 	obj = irias_new_object( "IrDA:IrCOMM", IAS_IRCOMM_ID); */
-/* 	irias_add_octseq_attrib( obj, "Parameters", len, &octseq); */
-/* 	irias_insert_object( obj); */
-
-
-
-	/* and start discovering .. */
-	discovering_instance = self;
-
-	switch(servicetype){
-	case NINE_WIRE:
-		DEBUG(0,"ircomm_attach_cable:discovering..\n");
-		irlmp_register_layer(S_COMM , CLIENT|SERVER, TRUE,
-				     ircomm_discovery_indication);
-		break;
-
-/* 	case CENTRONICS: */
-/* 	case THREE_WIRE: */
-/* 	case THREE_WIRE_RAW: */
-
-	default:
-		DEBUG(0,"ircomm_attach_cable:requested servicetype is not "
-		      "implemented!\n");
-		return NULL;
-	}
-
-	ircomm_next_state(self, COMM_IDLE);	
-	return (self);
-}
-
-int ircomm_detach_cable(struct ircomm_cb *self)
-{
-	ASSERT( self != NULL, return -EIO;);
-	ASSERT( self->magic == IRCOMM_MAGIC, return -EIO;);
-
-	DEBUG(0,"ircomm_detach_cable:\n");
-
-	/* shutdown ircomm layer */
-	if(self->state != COMM_IDLE ){
-		DEBUG(0,"ircomm:detach_cable:not IDLE\n");
-		if(self->state != COMM_WAITI)
-			ircomm_disconnect_request(self, NULL);
-	}
-
-
-	switch(self->servicetype){
-/* 	case CENTRONICS: */
-	case NINE_WIRE:
-/* 	case THREE_WIRE: */
-		irlmp_unregister_layer( S_COMM, CLIENT|SERVER );
-		break;
-
-/* 	case THREE_WIRE_RAW: */
-/* 		irlmp_unregister( S_COMM ) */
-/*		irlmp_unregister( S_PRINTER) */
-/* 		break; */
-
-	default:
-		DEBUG(0,"ircomm_detach_cable:requested servicetype is not "
-		      "implemented!\n");
-		return -ENODEV;
-	}
-
-	/* remove tsaps */
-	if(self->tsap)
-		irttp_close_tsap(self->tsap);
-
-	self->tsap = NULL;
-	self->in_use = 0;
-
-	return 0;
-}
diff -urN linux-2.2.6-pre2/net/irda/ircomm/ircomm_common.c linux-2.2.6-pre3/net/irda/ircomm/ircomm_common.c
--- linux-2.2.6-pre2/net/irda/ircomm/ircomm_common.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/ircomm/ircomm_common.c	2003-08-15 15:05:39.000000000 -0700
@@ -33,23 +33,19 @@
 #include <linux/proc_fs.h>
 #include <linux/init.h>
 
-#include <net/irda/irmod.h>
+#include <net/irda/irda.h>
 #include <net/irda/irlmp.h>
 #include <net/irda/iriap.h>
 #include <net/irda/irttp.h>
+#include <net/irda/irias_object.h>
 
 #include <net/irda/ircomm_common.h>
 
-#if 0
-static char *rcsid = "$Id: ircomm_common.c,v 1.13 1998/10/13 12:59:05 takahide Exp $";
-#endif
-static char *version = "IrCOMM_common, $Revision: 1.13 $ $Date: 1998/10/13 12:59:05 $ (Takahide Higuchi)";
-
-
+static char *revision_date = "Tue Mar  2 02:03:58 1999";
 
 
-static void ircomm_state_discovery( struct ircomm_cb *self,
-				  IRCOMM_EVENT event, struct sk_buff *skb );
+static void ircomm_state_discovery(struct ircomm_cb *self,
+				   IRCOMM_EVENT event, struct sk_buff *skb );
 static void ircomm_state_idle( struct ircomm_cb *self, IRCOMM_EVENT event, 
 			       struct sk_buff *skb );
 static void ircomm_state_waiti( struct ircomm_cb *self, IRCOMM_EVENT event, 
@@ -60,12 +56,35 @@
 			       struct sk_buff *skb );
 static void ircomm_do_event( struct ircomm_cb *self, IRCOMM_EVENT event,
 			     struct sk_buff *skb);
-void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state);
+static void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state);
+
+static void ircomm_discovery_indication(discovery_t *discovery);
+static void ircomm_tx_controlchannel(struct ircomm_cb *self );
+static int ircomm_proc_read(char *buf, char **start, off_t offset,
+			    int len, int unused);
+
+static void query_lsapsel(struct ircomm_cb * self);
+static void ircomm_getvalue_confirm( __u16 obj_id, struct ias_value *value, 
+				     void *priv);
+
+
+static __u32 ckey;
+static __u32 skey;
+struct ircomm_cb *discovering_instance;
+
+/*
+ * debug parameter ircomm_cs:
+ *  0 = client/server, 1 = client only 2 = server only
+ * usage for example: 
+ *  insmod ircomm ircomm_cs=1
+ *  LILO boot : Linux ircomm_cs=2   etc.
+ */
+
+static int ircomm_cs = 0;
+MODULE_PARM(ircomm_cs, "i");
+
 
-int ircomm_check_handle(int handle);
 
-static void ircomm_parse_control(struct ircomm_cb *self, struct sk_buff *skb,
-				 int type);
 static char *ircommstate[] = {
 	"DISCOVERY",
 	"IDLE",
@@ -109,9 +128,6 @@
 	"IRCOMM_CONTROL_REQUEST",
 };
 
-int ircomm_proc_read(char *buf, char **start, off_t offset,
-		     int len, int unused);
-
 #ifdef CONFIG_PROC_FS
 extern struct proc_dir_entry proc_irda;
 struct proc_dir_entry proc_ircomm = {
@@ -132,13 +148,13 @@
 	ircomm_state_conn,
 };
 
-
 __initfunc(int ircomm_init(void))
 {
 	int i;
 
-	printk( KERN_INFO "%s\n", version);
-	DEBUG( 4, "ircomm_common:init_module\n");
+	printk( "Linux-IrDA: IrCOMM protocol ( revision:%s ) \n",
+		revision_date);
+	DEBUG( 4, __FUNCTION__"()\n");
 
 	/* allocate master array */
 
@@ -146,7 +162,7 @@
 						IRCOMM_MAX_CONNECTION,
 						GFP_KERNEL);
 	if ( ircomm == NULL) {
-		printk( KERN_WARNING "IrCOMM: Can't allocate ircomm array!\n");
+		printk( KERN_ERR __FUNCTION__"(): kmalloc failed!\n");
 		return -ENOMEM;
 	}
 
@@ -158,7 +174,7 @@
 		ircomm[i] = kmalloc( sizeof(struct ircomm_cb), GFP_KERNEL );
 
 		if(!ircomm[i]){
-			printk(KERN_ERR "ircomm:kmalloc failed!\n");
+			printk( KERN_ERR __FUNCTION__"(): kmalloc failed!\n");
 			return -ENOMEM;
 		} 
 
@@ -194,14 +210,17 @@
 	proc_register( &proc_irda, &proc_ircomm);
 #endif /* CONFIG_PROC_FS */
 
+
+	discovering_instance = NULL;
 	return 0;
 }
 
+#ifdef MODULE
 void ircomm_cleanup(void)
 {
 	int i;
 
-	DEBUG( 4, "ircomm_common:cleanup_module\n");
+	DEBUG( 4, "ircomm:cleanup_module\n");
 	/*
 	 * free some resources
 	 */
@@ -227,8 +246,9 @@
 
 #ifdef CONFIG_PROC_FS
 	proc_unregister( &proc_irda, proc_ircomm.low_ino);
-#endif
+#endif /* CONFIG_PROC_FS */
 }
+#endif /* MODULE */
 
 /*
  * ---------------------------------------------------------------------- 
@@ -236,23 +256,26 @@
  * ---------------------------------------------------------------------- 
  */
 
-void ircomm_accept_data_indication(void *instance, void *sap, 
-				   struct sk_buff *skb)
+static int ircomm_accept_data_indication(void *instance, void *sap, 
+					 struct sk_buff *skb)
 {
 	
 	struct ircomm_cb *self = (struct ircomm_cb *)instance;
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRCOMM_MAGIC, return;);
-	ASSERT( skb != NULL, return;);
+	ASSERT( self != NULL, return -1;);
+	ASSERT( self->magic == IRCOMM_MAGIC, return -1;);
+	ASSERT( skb != NULL, return -1;);
        
-	DEBUG(4,"ircomm_accept_data_indication:\n");
+	DEBUG(4,__FUNCTION__"():\n");
 	ircomm_do_event( self, TTP_DATA_INDICATION, skb);
+	self->rx_packets++;
+	
+	return 0;
 }
 
-void ircomm_accept_connect_confirm(void *instance, void *sap,
+static void ircomm_accept_connect_confirm(void *instance, void *sap,
 				   struct qos_info *qos, 
-				   int maxsdusize, struct sk_buff *skb)
+				   __u32 maxsdusize, struct sk_buff *skb)
 {
 
 	struct ircomm_cb *self = (struct ircomm_cb *)instance;
@@ -262,7 +285,7 @@
 	ASSERT( skb != NULL, return;);
 	ASSERT( qos != NULL, return;);
 
-	DEBUG(0,"ircomm_accept_connect_confirm:\n");
+	DEBUG(0,__FUNCTION__"(): got connected!\n");
 
 	if(maxsdusize == SAR_DISABLE)
 		self->max_txbuff_size = qos->data_size.value; 
@@ -277,9 +300,9 @@
 	ircomm_do_event( self, TTP_CONNECT_CONFIRM, skb);
 }
 
-void ircomm_accept_connect_indication(void *instance, void *sap,
+static void ircomm_accept_connect_indication(void *instance, void *sap,
 				      struct qos_info *qos,
-				      int maxsdusize,
+				      __u32 maxsdusize,
 				      struct sk_buff *skb )
 {
 	struct ircomm_cb *self = (struct ircomm_cb *)instance;
@@ -289,7 +312,7 @@
 	ASSERT( skb != NULL, return;);
 	ASSERT( qos != NULL, return;);
 
-	DEBUG(0,"ircomm_accept_connect_indication:\n");
+	DEBUG(0,__FUNCTION__"()\n");
 
 	if(maxsdusize == SAR_DISABLE)
 		self->max_txbuff_size = qos->data_size.value;
@@ -298,9 +321,14 @@
 
 	self->qos = qos;
 	ircomm_do_event( self, TTP_CONNECT_INDICATION, skb);
+
+	/* stop connecting */
+	wake_up_interruptible( &self->discovery_wait);
+	wake_up_interruptible( &self->ias_wait);
+
 }
 
-void ircomm_accept_disconnect_indication(void *instance, void *sap, 
+static void ircomm_accept_disconnect_indication(void *instance, void *sap, 
 					 LM_REASON reason,
 					 struct sk_buff *skb)
 {
@@ -308,15 +336,16 @@
 
 	ASSERT( self != NULL, return;);
 	ASSERT( self->magic == IRCOMM_MAGIC, return;);
-	ASSERT( skb != NULL, return;);
 
-	DEBUG(0,"ircomm_accept_disconnect_indication:\n");
+	DEBUG(0,__FUNCTION__"():\n");
 	ircomm_do_event( self, TTP_DISCONNECT_INDICATION, skb);
+
 }
 
-void ircomm_accept_flow_indication( void *instance, void *sap, LOCAL_FLOW cmd)
+static void ircomm_accept_flow_indication( void *instance, void *sap,
+					   LOCAL_FLOW cmd)
 {
-	
+	IRCOMM_CMD command;
 	struct ircomm_cb *self = (struct ircomm_cb *)instance;
 
 	ASSERT( self != NULL, return;);
@@ -324,34 +353,32 @@
 
 	switch(cmd){
 	case FLOW_START:
-		DEBUG(0,"ircomm_accept_flow_indication:START\n"); 
-
-		self->pi = TX_READY;
+		DEBUG(4,__FUNCTION__"():START\n"); 
+		command = TX_READY;
 		self->ttp_stop = 0;
 		if(self->notify.flow_indication)
 			self->notify.flow_indication( self->notify.instance, 
-						      self, cmd);
-		ircomm_control_request(self);
+						      self, command);
 		break;
 		
 	case FLOW_STOP:
-		DEBUG(0,"ircomm_accept_flow_indication:STOP\n"); 
-		self->pi = TX_BUSY;
+		DEBUG(4,__FUNCTION__":STOP\n"); 
+		command = TX_BUSY;
 		self->ttp_stop = 1;
 		if(self->notify.flow_indication)
 			self->notify.flow_indication( self->notify.instance, 
-						      self, cmd);
+						      self, command);
 		break;
 
 	default:
-		DEBUG(0,"ircomm_accept_flow_indication:unknown status!\n"); 
+		DEBUG(0,__FUNCTION__"();unknown status!\n"); 
 	}
 
 }
 
 /* 
  * ----------------------------------------------------------------------
- * Implementation of actions,descrived in section 7.4 of the reference.
+ * Impl. of actions (descrived in section 7.4 of the reference)
  * ----------------------------------------------------------------------
  */
 
@@ -360,33 +387,25 @@
 {
 	/* TODO: we have to send/build userdata field which contains 
 	   InitialControlParameters */
-	/* but userdata field is not implemeted in irttp.c.. */
 
 	switch(self->servicetype){
 	case THREE_WIRE_RAW:
-		/* not implemented yet! Do nothing */
-		DEBUG(0, "ircomm:issue_connect_request:"
-		      "not implemented servicetype!");
+		DEBUG(0, __FUNCTION__"():THREE_WIRE_RAW is not implemented\n");
 		break;
 
 	case DEFAULT: 
-		irttp_connect_request(self->tsap, self->dlsap, 
-				      self->saddr, self->daddr,
-				      NULL, self->maxsdusize, NULL);  
- 		break; 
-		
 	case THREE_WIRE:
 	case NINE_WIRE:
 	case CENTRONICS:
 
 		irttp_connect_request(self->tsap, self->dlsap, 
 				      self->saddr, self->daddr, 
-				      NULL, self->maxsdusize, NULL); 
+				      NULL, self->maxsdusize, userdata); 
 		break;
 
 	default:
-		DEBUG(0,"ircomm:issue_connect_request:Illegal servicetype %d\n"
-		      ,self->servicetype);
+		printk(KERN_ERR __FUNCTION__"():Illegal servicetype %d\n"
+		       ,self->servicetype);
 	}
 }	
 
@@ -401,7 +420,7 @@
 	if(self->notify.disconnect_indication)
 		self->notify.disconnect_indication( self->notify.instance,
 						    self,
-						    self->reason,skb);
+						    self->reason, skb);
 						    
 }
 
@@ -429,6 +448,7 @@
 
 static void connect_confirmation(struct ircomm_cb *self, struct sk_buff *skb)
 {
+	DEBUG(4 ,__FUNCTION__"()\n");
 
 	/* give a connect_confirm to the client */
 	if( self->notify.connect_confirm )
@@ -440,11 +460,10 @@
 				   struct sk_buff *skb)
 {
 
-	DEBUG(0,"ircomm:issue_connect_response:\n");
+	DEBUG(0,__FUNCTION__"()\n");
 	
 	if( self->servicetype == THREE_WIRE_RAW){
-		DEBUG(0,"ircomm:issue_connect_response():3WIRE-RAW is not " 
-		      "implemented yet !\n");
+		DEBUG(0,__FUNCTION__"():THREE_WIRE_RAW is not implemented yet\n");
 		/* irlmp_connect_rsp(); */
 	} else {
 		irttp_connect_response(self->tsap, self->maxsdusize, skb);
@@ -455,10 +474,11 @@
 				     struct sk_buff *userdata)
 {
 	if(self->servicetype == THREE_WIRE_RAW){
-		DEBUG(0,"ircomm:issue_disconnect_request():3wireraw is not implemented!");
+		DEBUG(0,__FUNCTION__"():3wireraw is not implemented\n");
 	}
 	else
-		irttp_disconnect_request(self->tsap, NULL, P_NORMAL);
+		irttp_disconnect_request(self->tsap, userdata, 
+					 self->disconnect_priority);
 }
     
 static void issue_data_request(struct ircomm_cb *self,
@@ -468,52 +488,74 @@
 
 	if(self->servicetype == THREE_WIRE_RAW){
 		/* irlmp_data_request(self->lmhandle,userdata); */
-		DEBUG(0,"ircomm:issue_data_request():not implemented!");
+		DEBUG(0,__FUNCTION__"():not implemented!");
 		return;
 	}
 
-	DEBUG(4,"ircomm:issue_data_request():sending frame\n");
+	DEBUG(4,__FUNCTION__"():sending frame\n");
 	err = irttp_data_request(self->tsap , userdata  );
-	if(err)
-		DEBUG(0,"ircomm:ttp_data_request failed\n");
-	if(userdata && err)
-		dev_kfree_skb( userdata);
-
+	if(err){
+		printk(KERN_ERR __FUNCTION__":ttp_data_request failed\n");
+		if(userdata)
+			dev_kfree_skb( userdata);
+	}
+	self->tx_packets++;
 }
 
 static void issue_control_request(struct ircomm_cb *self,
 				  struct sk_buff *userdata )
 {
-	if(self->servicetype == THREE_WIRE_RAW){
-		DEBUG(0,"THREE_WIRE_RAW is not implemented\n");
+	int err;
+
+	DEBUG(4,__FUNCTION__"()\n"); 
+	if(self->servicetype == THREE_WIRE_RAW)
+	{
+		DEBUG(0,__FUNCTION__"():THREE_WIRE_RAW is not implemented\n");
 		
-	}else {
-		irttp_data_request(self->tsap,userdata);
+	}
+	else 
+	{
+		err = irttp_data_request(self->tsap,userdata);
+		if(err)
+		{
+			printk( __FUNCTION__"():ttp_data_request failed\n");
+			if(userdata)
+				dev_kfree_skb( userdata);
+		}
+		else
+			self->tx_controls++;
+
+		self->pending_control_tuples = 0;
 	}
 }
 
 static void process_data(struct ircomm_cb *self, struct sk_buff *skb )
 {
 	
-	DEBUG(4,"ircomm:process_data:skb_len is(%d),clen_is(%d)\n",
+	DEBUG(4,__FUNCTION__":skb->len=%d, ircomm header = 1, clen=%d\n",
 	      (int)skb->len ,(int)skb->data[0]);
 
-	/* 
-	 * we always have to parse control channel
-	 *  (see page17 of IrCOMM standard) 
+	/* we have to parse control channel when receiving.  (see
+	 * page17 of IrCOMM standard) but it is not parsed here since
+	 * upper layer may have some receive buffer.
+	 *
+	 * hence upper layer have to parse it when it consumes a packet.
+	 *   -- TH
 	 */
 
- 	ircomm_parse_control(self, skb, CONTROL_CHANNEL);
+ 	/* ircomm_parse_control(self, skb, CONTROL_CHANNEL); */
 
 	if(self->notify.data_indication && skb->len)
 		self->notify.data_indication(self->notify.instance, self,
 					     skb);
 }
 
-void ircomm_data_indication(struct ircomm_cb *self, struct sk_buff *skb)
+int ircomm_data_indication(struct ircomm_cb *self, struct sk_buff *skb)
 {
 	/* Not implemented yet:THREE_WIRE_RAW service uses this function.  */
 	DEBUG(0,"ircomm_data_indication:not implemented yet!\n");
+
+	return 0;
 }
 
 
@@ -528,15 +570,15 @@
 			     struct sk_buff *skb) 
 {
 	
-	DEBUG( 4, "ircomm_do_event: STATE = %s, EVENT = %s\n",
+	DEBUG( 4, __FUNCTION__": STATE = %s, EVENT = %s\n",
 	       ircommstate[self->state], ircommevent[event]);
 	(*state[ self->state ]) ( self, event, skb);
 }
 
-void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state) 
+static void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state) 
 {
 	self->state = state;
-	DEBUG( 0, "ircomm_next_state: NEXT STATE = %d(%s), sv(%d)\n", 
+	DEBUG( 0, __FUNCTION__": NEXT STATE=%d(%s), servicetype=(%d)\n", 
 	       (int)state, ircommstate[self->state],self->servicetype);
 }
 
@@ -549,8 +591,7 @@
 static void ircomm_state_discovery( struct ircomm_cb *self,
 				    IRCOMM_EVENT event, struct sk_buff *skb )
 {
-	DEBUG(0,"ircomm_state_discovery: "
-	      "why call me? \n");
+	printk(KERN_ERR __FUNCTION__"():why call me? something is wrong..\n");
 	if(skb)
 		dev_kfree_skb( skb);
 }
@@ -578,15 +619,13 @@
 
 	case LMP_CONNECT_INDICATION:
 
-		/* I think this is already done in irlpt_event.c */
-
-		DEBUG(0,"ircomm_state_idle():LMP_CONNECT_IND is notimplemented!");
+		DEBUG(0,__FUNCTION__"():LMP_CONNECT_IND is notimplemented!");
  		/* connect_indication_three_wire_raw(); */
  		/* ircomm_next_state(self, COMM_WAITR); */
 		break;
 
 	default:
-		DEBUG(0,"ircomm_state_idle():unknown event =%d(%s)\n",
+		DEBUG(0,__FUNCTION__"():unknown event =%d(%s)\n",
 		      event, ircommevent[event]);
 	}
 }
@@ -616,7 +655,7 @@
 /* 		ircomm_next_state(self, COMM_IDLE); */
 /* 		break; */
 	default:
-		DEBUG(0,"ircomm_state_waiti:unknown event =%d(%s)\n",
+		DEBUG(0,__FUNCTION__"():unknown event =%d(%s)\n",
 		      event, ircommevent[event]);
 	}
 }
@@ -636,8 +675,7 @@
 	        /* issue_connect_response */
 		
 		if(self->servicetype==THREE_WIRE_RAW){
-			DEBUG(0,"ircomm:issue_connect_response:"
-			      "THREE_WIRE_RAW is not implemented!\n");
+			DEBUG(0,__FUNCTION__"():3WIRE_RAW is not implemented\n");
 			/* irlmp_connect_response(Vpeersap,
 			 *                         ACCEPT,null);
 			 */
@@ -677,19 +715,15 @@
 	switch(event){
 	case TTP_DATA_INDICATION:
 		process_data(self, skb);
-		/* stay CONN state*/
 		break;
 	case IRCOMM_DATA_REQUEST:
 		issue_data_request(self, skb);
-		/* stay CONN state*/
 		break;
 /* 	case LMP_DATA_INDICATION: */
 /* 		ircomm_data_indicated(); */
-/* 		 stay CONN state */
 /* 		break; */
 	case IRCOMM_CONTROL_REQUEST:
 		issue_control_request(self, skb);
-		/* stay CONN state*/
 		break;
 	case TTP_DISCONNECT_INDICATION:
 		ircomm_next_state(self, COMM_IDLE);
@@ -712,16 +746,189 @@
 
 /*
  *  ----------------------------------------------------------------------
- *  ircomm requests
+ *  IrCOMM service interfaces and supporting functions
  *
  *  ----------------------------------------------------------------------
  */
 
-
-void ircomm_connect_request(struct ircomm_cb *self, int maxsdusize)
+int ircomm_query_ias_and_connect(struct ircomm_cb *self, __u8 servicetype)
 {
+	int retval=0;
+	__u16 hints;
+
+	ASSERT( self != NULL, return -EFAULT;);
+	ASSERT( self->magic == IRCOMM_MAGIC, return -EFAULT;);
+	DEBUG(4,__FUNCTION__"():servicetype = %d\n",servicetype);
 
 	/*
+	 * wait if another instance is discovering now
+	 */  
+	if(discovering_instance){
+		interruptible_sleep_on( &self->discovery_wait);
+		if(signal_pending(current)){
+			return -EINTR; /* cought a signal */
+		}
+		if(self->state == COMM_CONN)
+			return 0;  /* got connected */
+	}
+	ASSERT(discovering_instance == NULL, return -EFAULT;);
+	discovering_instance = self;
+	
+	/*
+	 * start discovering
+	 */
+	hints = irlmp_service_to_hint(S_COMM);
+
+	DEBUG(0,__FUNCTION__"():start discovering..\n");
+	switch (ircomm_cs) {
+	case 0:
+		skey = irlmp_register_service(hints);
+		ckey = irlmp_register_client(hints, ircomm_discovery_indication,
+					     NULL);
+		break;
+		
+	case 1:    /* client only */
+		DEBUG( 0, __FUNCTION__"():client only mode\n");
+		ckey = irlmp_register_client(hints, ircomm_discovery_indication,
+					     NULL);
+		break;
+
+	case 2:     /*  server only  */
+	default:
+		DEBUG( 0, __FUNCTION__"():server only mode\n");
+		skey = irlmp_register_service(hints);
+		discovering_instance = NULL;
+		return 0;
+	}
+
+
+	/*
+	 * waiting for discovery
+	 */
+	interruptible_sleep_on( &self->discovery_wait);
+	if(signal_pending(current)){
+		retval = -EINTR; goto bailout; /* cought a signal */
+	}
+	if(self->state == COMM_CONN)
+		goto bailout;     /* got connected */
+
+	/*
+	 * query Parameters field of IAS and waiting for answer
+	 */
+
+	self->servicetype = 0;
+	DEBUG(0, __FUNCTION__"():querying IAS: Parameters..\n");
+	iriap_getvaluebyclass_request( "IrDA:IrCOMM", "Parameters",
+				       self->saddr, self->daddr,
+				       ircomm_getvalue_confirm, self );
+
+	interruptible_sleep_on( &self->ias_wait);
+	if(signal_pending(current)){
+		retval = -EINTR; goto bailout; /* cought a signal */
+	}
+	if(self->state == COMM_CONN)
+		goto bailout;     /* got connected */
+
+
+	/* really got Parameters field? */
+	if(self->ias_type != IAS_OCT_SEQ){
+		retval = -EFAULT;
+		goto bailout;
+	}
+
+	/* 
+	 * check if servicetype we want is available 
+	 */
+	self->peer_cap = self->servicetype;
+
+	DEBUG(0,__FUNCTION__"():peer capability is:\n");
+	DEBUG(0,"3wire raw: %s\n",((self->servicetype & THREE_WIRE_RAW) ? "yes":"no"));
+	DEBUG(0,"3wire    : %s\n",((self->servicetype & THREE_WIRE) ? "yes":"no"));
+	DEBUG(0,"9wire    : %s\n",((self->servicetype & NINE_WIRE) ? "yes":"no"));
+	DEBUG(0,"IEEE1284 : %s\n",((self->servicetype & CENTRONICS) ? "yes":"no"));
+
+	self->servicetype &= servicetype;
+	if(!(self->servicetype)){
+		retval = -ENODEV;
+		goto bailout;
+	}
+
+	/*
+	 * then choose better one 
+	 */
+
+	if(self->servicetype & THREE_WIRE_RAW)
+		servicetype = THREE_WIRE_RAW;
+	if(self->servicetype & THREE_WIRE)
+		servicetype = THREE_WIRE;
+	if(self->servicetype & NINE_WIRE)
+		servicetype = NINE_WIRE;
+	if(self->servicetype & CENTRONICS)
+		servicetype = CENTRONICS;
+
+	self->servicetype = servicetype;
+#if 1
+	/*
+	 * waiting for discovery again 
+	 */
+	interruptible_sleep_on( &self->discovery_wait);
+	if(signal_pending(current)){
+		retval = -EINTR; goto bailout; /* cought a signal */
+	}
+	if(self->state == COMM_CONN)
+		goto bailout;     /* got connected */
+#endif
+	/*
+	 * query lsapsel field and waiting for answer
+	 */
+	query_lsapsel(self);
+	interruptible_sleep_on( &self->ias_wait);
+	if(signal_pending(current)){
+		retval = -EINTR; goto bailout; /* cought a signal */
+	}
+	if(self->state == COMM_CONN)
+		goto bailout;     /* got connected */
+
+	/* really got Lsapsel field? */
+	if(self->ias_type != IAS_INTEGER){
+		retval = -EFAULT;
+		goto bailout;
+	} 
+#if 1
+	/*
+	 * waiting for discovery again...
+	 */
+	interruptible_sleep_on( &self->discovery_wait);
+	if(signal_pending(current)){
+		retval = -EINTR; goto bailout; /* cought a signal */
+	}
+	if(self->state == COMM_CONN)
+		goto bailout;     /* got connected */
+#endif
+
+	/* succeed! ready to connect */
+	discovering_instance = NULL;
+	ircomm_connect_request(self);
+	return 0; 
+
+ bailout:
+	/* failed.  not ready to connect */
+	discovering_instance = NULL;
+	irlmp_unregister_service(skey);
+	irlmp_unregister_client(ckey);
+	return retval;
+}
+
+/* 
+ * ircomm_connect_request()
+ * Impl. of this function is differ from one of the reference.
+ * This functin does discovery as well as sending connect request
+ */
+
+
+void ircomm_connect_request(struct ircomm_cb *self)
+{
+	/*
 	 * TODO:build a packet which contains "initial control parameters"
 	 * and send it with connect_request
 	 */
@@ -729,14 +936,17 @@
 	ASSERT( self != NULL, return;);
 	ASSERT( self->magic == IRCOMM_MAGIC, return;);
 
-	DEBUG(0,"ircomm_connect_request:\n");
 
-	self->maxsdusize = maxsdusize;
+	DEBUG(0, __FUNCTION__"():sending connect_request...\n");
+
+	ircomm_control_request(self, SERVICETYPE); /*servictype*/
+
+	self->maxsdusize = SAR_DISABLE;
 	ircomm_do_event( self, IRCOMM_CONNECT_REQUEST, NULL);
 }
 
 void ircomm_connect_response(struct ircomm_cb *self, struct sk_buff *userdata,
-			     int maxsdusize)
+			     __u32 maxsdusize)
 {
 
 	ASSERT( self != NULL, return;);
@@ -753,11 +963,8 @@
 	if(!userdata){
 		/* FIXME: check for errors and initialize? DB */
 		userdata = dev_alloc_skb(COMM_DEFAULT_DATA_SIZE);
-		if(!userdata){
-		  DEBUG(0, __FUNCTION__"alloc_skb failed\n");
-		  return;
-		}
-		IS_SKB(userdata, return;);
+		ASSERT(userdata != NULL, return;);
+
 		skb_reserve(userdata,COMM_HEADER_SIZE);
 	}
 
@@ -771,33 +978,70 @@
 }	
 
 void ircomm_disconnect_request(struct ircomm_cb *self, 
-			       struct sk_buff *userdata)
+			       struct sk_buff *userdata,
+			       int priority)
 {
 
 	ASSERT( self != NULL, return;);
 	ASSERT( self->magic == IRCOMM_MAGIC, return;);
+	DEBUG(0,__FUNCTION__"()\n");
+
+	/* unregister layer */
+	switch (ircomm_cs) {
+	case 1:    /* client only */
+		irlmp_unregister_client(ckey);
+		break;
+
+	case 2:     /*  server only  */
+		irlmp_unregister_service(skey);
+		break;
+	case 0:
+	default:
+		irlmp_unregister_client(ckey);
+		irlmp_unregister_service(skey);
+		break;
+	}
 
-	DEBUG(0,"ircomm_disconnect_request\n");
-	ircomm_do_event(self, IRCOMM_DISCONNECT_REQUEST, NULL);
+	self->disconnect_priority = priority;
+	if(priority != P_HIGH)
+		self->disconnect_priority = P_NORMAL;
+
+	ircomm_do_event(self, IRCOMM_DISCONNECT_REQUEST, userdata);
 }	
 
 
-void ircomm_data_request(struct ircomm_cb *self, struct sk_buff *userdata)
+int ircomm_data_request(struct ircomm_cb *self, struct sk_buff *userdata)
 {
+	__u8 * frame;
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRCOMM_MAGIC, return;);
-	ASSERT( userdata != NULL, return;);
+	DEBUG(4,__FUNCTION__"()\n");
+	ASSERT( self != NULL, return -EFAULT;);
+	ASSERT( self->magic == IRCOMM_MAGIC, return -EFAULT;);
+	ASSERT( userdata != NULL, return -EFAULT;);
 	
+
 	if(self->state != COMM_CONN){
-		DEBUG(4,"ignore IRCOMM_DATA_REQUEST:not connected\n");
-		if(userdata)
-			dev_kfree_skb(userdata);
-		return;
+		DEBUG(4,__FUNCTION__"():not connected, data is ignored\n");
+		return -EINVAL;
 	}
 
-	DEBUG(4,"ircomm_data_request\n");
+	if(self->ttp_stop)
+		return -EBUSY;
+
+	if(self->control_ch_pending){
+		/* send control_channel */
+		ircomm_tx_controlchannel(self);
+	}
+
+	if(self->ttp_stop)
+		return -EBUSY;
+
+	/* add "clen" field */
+	frame = skb_push(userdata,1);
+	frame[0]=0;          /* without control channel */
+
 	ircomm_do_event(self, IRCOMM_DATA_REQUEST, userdata);
+	return 0;
 }
 
 /*
@@ -807,20 +1051,25 @@
  *  ----------------------------------------------------------------------
  */
 
-static void ircomm_tx_ctrlbuffer(struct ircomm_cb *self )
+
+static void ircomm_tx_controlchannel(struct ircomm_cb *self )
 {
 
 	__u8 clen;
 	struct sk_buff *skb = self->ctrl_skb;
 	
-	DEBUG(4,"ircomm_tx_ctrlbuffer:\n");
+	DEBUG(4,__FUNCTION__"()\n");
+	/* 'self' should have been checked */
+	ASSERT(!self->ttp_stop, return ;);
+	ASSERT(self->state == COMM_CONN, return ;);
 
 	/* add "clen" field */
 
 	clen=skb->len;
-	if(clen){
-		skb_push(skb,1);
-		skb->data[0]=clen;
+	ASSERT(clen != 0,return;);
+
+	skb_push(skb,1);
+	skb->data[0]=clen;
 
 #if 0
 	printk("tx_ctrl:");
@@ -831,148 +1080,106 @@
 		printk("\n");
 	}
 #endif
-
-		ircomm_do_event(self, IRCOMM_CONTROL_REQUEST, skb);
-
-		skb = dev_alloc_skb(COMM_DEFAULT_DATA_SIZE);
-		if (skb==NULL){
-			DEBUG(0,"ircomm_tx_ctrlbuffer:alloc_skb failed!\n");
-			return;
-		}
-		skb_reserve(skb,COMM_HEADER_SIZE);
-		self->ctrl_skb = skb;
-	}
-}
-
-
-void ircomm_control_request(struct ircomm_cb *self)
-{
 	
-	struct sk_buff *skb;
+	ircomm_do_event(self, IRCOMM_CONTROL_REQUEST, skb);
+	self->control_ch_pending = 0;
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRCOMM_MAGIC, return;);
+	skb = dev_alloc_skb(COMM_DEFAULT_DATA_SIZE);
+	ASSERT(skb != NULL, return ;);
 
-	DEBUG(0, "ircomm_control_request:\n");
-
-	if(self->ttp_stop || self->state != COMM_CONN){
-		DEBUG(0,"ircomm_control_request:can't send it.. ignore it\n");
-		return;
-	}
-	
-	skb = self->ctrl_skb;
-	IS_SKB(skb,return;);
-		
-	if(skb->len)
-		ircomm_tx_ctrlbuffer(self);
+	skb_reserve(skb,COMM_HEADER_SIZE);
+	self->ctrl_skb = skb;
 }
 
 
 static void append_tuple(struct ircomm_cb *self, __u8 instruction, __u8 pl , 
 			 __u8 *value)
 {
-
 	__u8 *frame;
 	struct sk_buff *skb;
-	int i,c;
+	int i,c = 0;
+	unsigned long flags;
+
+	save_flags(flags);cli();
 
 	skb = self->ctrl_skb;
 	ASSERT(skb != NULL, return;);
-	IS_SKB(skb,return;);
 	
-	/*if there is little room in the packet... */
-
-	if(skb->len > COMM_DEFAULT_DATA_SIZE - COMM_HEADER_SIZE - (pl+2)){
-		if(!self->ttp_stop && self->state == COMM_CONN){
-
-			/* send a packet if we can */
-			ircomm_tx_ctrlbuffer(self);
-			skb = self->ctrl_skb;
-		} else {
-			DEBUG(0, "ircomm_append_ctrl:there's no room.. ignore it\n");
-
-			/* TODO: we have to detect whether we have to resend some
-			   information after ttp_stop is cleared */
-
-			/* self->resend_ctrl = 1; */
-			return;
-		}
+	if(skb_tailroom(skb) < (pl+2)){
+		DEBUG(0, __FUNCTION__"there's no room.. ignore it\n");
+		self->ignored_control_tuples++;
+		restore_flags(flags);
+		return;
 	}
 
 	frame = skb_put(skb,pl+2);
-	c = 0;
 	frame[c++] = instruction;     /* PI */
 	frame[c++] = pl;              /* PL */
 	for(i=0; i < pl ; i++)
 		frame[c++] = *value++;   /* PV */
-	
+	restore_flags(flags);	
+	self->pending_control_tuples++;
+	self->control_ch_pending = 1;
 }
 
 
 
 /*
- * ircomm_append_ctrl();
+ * ircomm_control_request();
  * this function is exported as a request to send some control-channel tuples
  * to peer device
  */
 
-void ircomm_append_ctrl(struct ircomm_cb *self,  __u8 instruction)
+void ircomm_control_request(struct ircomm_cb *self,  __u8 instruction)
 {
 
-	__u8  pv[70];
+	__u8  pv[32];      /* 32 max, for PORT_NAME */
 	__u8  *value = &pv[0];
 	__u32 temp;
+	int notsupp=0;
 
 	ASSERT( self != NULL, return;);
 	ASSERT( self->magic == IRCOMM_MAGIC, return;);
 
-	if(self->state != COMM_CONN)
-		return;
-
 	if(self->servicetype == THREE_WIRE_RAW){
-		DEBUG(0,"THREE_WIRE_RAW shuold not use me!\n");
+		DEBUG(0,__FUNCTION__"():THREE_WIRE_RAW shuold not use me!\n");
 		return;
 	}
 
-	DEBUG(4,"ircomm_append_ctrl:\n");
+	DEBUG(4,__FUNCTION__"()\n");
 
 	/* find parameter and its length */
 
-	switch(instruction){
+	if(self->servicetype == THREE_WIRE) goto threewire;
+	if(self->servicetype == NINE_WIRE) goto ninewire;
 
-	case POLL_FOR_LINE_SETTINGS:
-	case STATUS_QUERY:
+
+	/* FIXME: centronics service is not fully implemented yet*/
+	switch(instruction){
 	case IEEE1284_MODE_SUPPORT:
 	case IEEE1284_DEVICEID:
 		append_tuple(self,instruction,0,NULL);
 		break;
-
-	case SERVICETYPE:
-		value[0] = self->servicetype;
-		append_tuple(self,instruction,1,value);
+	case STATUS_QUERY:
+		append_tuple(self,instruction,0,NULL);
 		break;
-	case DATA_FORMAT:
-		value[0] = self->data_format;
+	case SET_BUSY_TIMEOUT:
+		value[0] = self->busy_timeout;
 		append_tuple(self,instruction,1,value);
 		break;
-	case FLOW_CONTROL:
-		if(self->null_modem_mode){
+ 	case IEEE1284_ECP_EPP_DATA_TRANSFER: 
+		value[0] = self->ecp_epp_mode;
+		value[1] = self->channel_or_addr;
+		append_tuple(self,instruction,2,value); 
+		break; 
+	default:
+		notsupp=1;
+	}
 
-			/* inside out */
-			value[0]  = (self->flow_ctrl & 0x55) << 1;
-			value[0] |= (self->flow_ctrl & 0xAA) >> 1;
-		}else{
-			value[0] = self->flow_ctrl;
-		}
-		append_tuple(self,instruction,1,value);
-		break;
-	case LINESTATUS:
-		value[0] = self->line_status;
-		append_tuple(self,instruction,1,value);
-		break;
-	case BREAK_SIGNAL:
-		value[0] = self->break_signal;
-		append_tuple(self,instruction,1,value);
+ ninewire:
+	switch(instruction){
+	case POLL_FOR_LINE_SETTINGS:
+		append_tuple(self,instruction,0,NULL);
 		break;
 	case DTELINE_STATE:		
 		if(self->null_modem_mode){
@@ -1003,8 +1210,42 @@
 		value[0] = self->dce;
 		append_tuple(self,instruction,1,value);
 		break;
-	case SET_BUSY_TIMEOUT:
-		value[0] = self->busy_timeout;
+
+	default:
+		notsupp=1;
+	}
+
+ threewire:
+	switch(instruction){
+
+	case SERVICETYPE:
+		value[0] = self->servicetype;
+		append_tuple(self,instruction,1,value);
+		break;
+
+	case DATA_FORMAT:
+		value[0] = self->data_format;
+		append_tuple(self,instruction,1,value);
+		break;
+
+	case FLOW_CONTROL:
+		if(self->null_modem_mode){
+			/* inside out */
+			value[0]  = (self->flow_ctrl & 0x55) << 1;
+			value[0] |= (self->flow_ctrl & 0xAA) >> 1;
+		}else{
+			value[0] = self->flow_ctrl;
+		}
+		append_tuple(self,instruction,1,value);
+		break;
+
+	case LINESTATUS:
+		value[0] = self->line_status;
+		append_tuple(self,instruction,1,value);
+		break;
+
+	case BREAK_SIGNAL:
+		value[0] = self->break_signal;
 		append_tuple(self,instruction,1,value);
 		break;
 
@@ -1020,12 +1261,6 @@
 		append_tuple(self,instruction,2,value); 
 		break; 
 
- 	case IEEE1284_ECP_EPP_DATA_TRANSFER: 
-		value[0] = self->ecp_epp_mode;
-		value[1] = self->channel_or_addr;
-		append_tuple(self,instruction,2,value); 
-		break; 
-
 	case DATA_RATE:
 		temp = self->data_rate;
 		value[3] = (__u8)((temp >> 24) & 0x000000ff);
@@ -1034,203 +1269,422 @@
 		value[0] = (__u8)(temp & 0x000000ff);
  		append_tuple(self,instruction,4,value);
  		break;
-
 #if 0
 	case PORT_NAME:
 	case FIXED_PORT_NAME:
 		temp = strlen(&self->port_name);
-		if(temp < 70){
+		if(temp < 32){
 			value = (__u8) (self->port_name);
 			append_tuple(self,instruction,temp,value);
-		}
-		break;
+		}else
+			DEBUG(0,__FUNCTION__"() PORT_NAME:too long\n");
 #endif
-
-/* TODO: control tuples for centronics emulation is not implemented */
-/* 	case IEEE1284_MODE: */
+		break;
 
 	default:
-		DEBUG(0,"ircomm_append_ctrl:instruction(0x%02x)is not"
-		      "implemented\n",instruction);
+		if(notsupp)
+			DEBUG(0,__FUNCTION__"():instruction(0x%02x)is not"
+			      "implemented\n",instruction);
 	}
 
 
 }
 
-static void ircomm_parse_control(struct ircomm_cb *self,
-				 struct sk_buff *skb,
-				 int type)
+void ircomm_parse_tuples(struct ircomm_cb *self, struct sk_buff *skb, int type)
 {
 
 	__u8 *data;
-	__u8 pi,pl,pv[64];
+	__u8 pi,plen;
 	int clen = 0;
-	int i,indicate,count = 0;
+	int indicate=0;
 
-	
-	data = skb->data;
-	if(type == IAS_PARAM) 
-		clen = ((data[count++] << 8) & data[count++]); /* MSB first */
-	else /* CONTROL_CHANNEL */
-		clen = data[count++];
+	ASSERT(skb != NULL, return;);
+	ASSERT(self != NULL, return ;);
+	ASSERT(self->magic == IRCOMM_MAGIC, return ;);
 
 
-	if(clen == 0){
-		skb_pull( skb, 1);  /* remove clen field */
-		return;
+#ifdef IRCOMM_DEBUG_TUPLE
+	DEBUG(0, __FUNCTION__"():tuple sequence is:\n");
+	{
+		int i;
+		for ( i=0;i< skb->len;i++)
+			printk("%02x", (__u8)(skb->data[i]));
+		printk("\n");
 	}
+#endif
 
+	data = skb->data;
+	if(type == IAS_PARAM)
+	{
+		clen = (data[0] << 8) & 0xff00;
+		clen |= data[1] & 0x00ff;
+		ASSERT( clen <= (skb->len - 2) && clen <= 1024, goto corrupted;);
+		DEBUG(4, __FUNCTION__"():IAS_PARAM len = %d\n",clen );
+		skb_pull( skb, 2);
+	}
+	else
+	{
+		/* CONTROL_CHANNEL */
+		clen = data[0];
+		ASSERT( clen < skb->len, goto corrupted;);
+		DEBUG(4, __FUNCTION__"():CONTROL_CHANNEL:len = %d\n",clen );
+		skb_pull( skb, 1);
+	}
 
+	while( clen >= 2 ){
+		data = skb->data;
+		indicate = 0;
 
-
-	while( count < clen ){
 		/* 
 		 * parse controlparameters and set value into structure 
 		 */
-		pi = data[count++];
-		pl = data[count++];
-			
-		DEBUG(0, "parse_control:instruction(0x%02x)\n",pi) ;
+		pi = data[0];
+		plen = data[1];
 
+		ASSERT( clen >= 2+plen, goto corrupted; );
+		DEBUG(4, __FUNCTION__"():instruction=0x%02x,len=%d\n",
+		      pi, plen) ;
 
-		/* copy a tuple into pv[] */
 
-#ifdef IRCOMM_DEBUG_TUPLE
-		printk("data:");
-		for(i=0; i < pl; i++){
-			pv[i] = data[count++];
-			printk("%02x",pv[i]);
-		}
-		printk("\n");
-#else
-		for(i=0; i < pl; i++)
-			pv[i] = data[count++];
-#endif			
+		switch(pi)
+		{
+		case POLL_FOR_LINE_SETTINGS:
+			ircomm_control_request(self, DTELINE_STATE);
+			break;
 		
-
-		/* parse pv */
-		indicate = 0;
-
-		switch(pi){
-			
-			/*
-			 * for 3-wire/9-wire/centronics
-			 */
-			
 		case SERVICETYPE:
-			self->peer_servicetype = pv[0];
+			self->servicetype = data[2];
 			break;
+
 		case PORT_TYPE:
-			self->peer_port_type = pv[0];
-			break;
-#if 0 
-		case PORT_NAME:
-			self->peer_port_name = *pv;
-			break;
-		case FIXED_PORT_NAME:
-			self->peer_port_name = *pv;
-			/* 
-			 * We should not connect if user of IrCOMM can't
-			 * recognize the port name
-			 */
-			self->port_name_critical = TRUE;
-			break;
-#endif
-		case DATA_RATE:     
-			self->peer_data_rate	= (pv[3]<<24) & (pv[2]<<16)
-				& (pv[1]<<8) & pv[0];
-			indicate = 1;
+			self->peer_port_type = data[2];
 			break;
+
 		case DATA_FORMAT:   
-			self->peer_data_format = pv[0];
+			self->peer_data_format = data[2];
 			break;
+
 		case FLOW_CONTROL:
-			self->peer_flow_ctrl = pv[0];
-			indicate = 1;
-			break;
-		case XON_XOFF_CHAR:
-			self->peer_xon_char = pv[0];
-			self->peer_xoff_char = pv[1];
-			indicate = 1;
-			break;
-		case ENQ_ACK_CHAR:
-			self->peer_enq_char = pv[0];
-			self->peer_ack_char = pv[1];
+			self->peer_flow_ctrl = data[2];
 			indicate = 1;
 			break;
+
 		case LINESTATUS:
-			self->peer_line_status = pv[0];
+			self->peer_line_status = data[2];
 			indicate = 1;
 			break;
+
 		case BREAK_SIGNAL:
-			self->peer_break_signal = pv[0];
+			self->peer_break_signal = data[2];
 			/* indicate = 1; */
 			break;
-			
-			/*
-			 * for 9-wire
-			 */
+
+		case DCELINE_STATE:
+			self->peer_dce = data[2];
+			indicate = 1;
+			break;
 
 		case DTELINE_STATE:
 			if(self->null_modem_mode){
 				/* input DTR as {DSR & CD & RI} */
 				self->peer_dce = 0;
-				if(pv[0] & DELTA_DTR)
-					self->peer_dce |= DELTA_DSR|DELTA_RI|DELTA_DCD;
-				if(pv[0] & MCR_DTR)
-					self->peer_dce |= MSR_DSR|MSR_RI|MSR_DCD;
-
+				if(data[2] & DELTA_DTR)
+					self->peer_dce |= (DELTA_DSR|
+							   DELTA_RI|
+							   DELTA_DCD);
+				if(data[2] & MCR_DTR)
+					self->peer_dce |= (MSR_DSR|
+							   MSR_RI|
+							   MSR_DCD);
 				/* rts as cts */
-				if(pv[0] & DELTA_RTS)
+				if(data[2] & DELTA_RTS)
 					self->peer_dce |= DELTA_CTS;
-				if(pv[0] & MCR_RTS)
+				if(data[2] & MCR_RTS)
 					self->peer_dce |= MSR_CTS;
 			}else{
-				self->peer_dte = pv[0];
+				self->peer_dte = data[2];
 			}
 			indicate = 1;			
 			break;
+			
+		case XON_XOFF_CHAR:
+			self->peer_xon_char = data[2];
+			self->peer_xoff_char = data[3];
+			indicate = 1;
+			break;
 
-		case DCELINE_STATE:
-			self->peer_dce = pv[0];
+		case ENQ_ACK_CHAR:
+			self->peer_enq_char = data[2];
+			self->peer_ack_char = data[3];
 			indicate = 1;
 			break;
 
-		case POLL_FOR_LINE_SETTINGS:
-			ircomm_append_ctrl(self, DTELINE_STATE);
-			ircomm_control_request(self);
+		case DATA_RATE:
+			self->peer_data_rate = (  data[5]<<24
+						  & data[4]<<16
+						  & data[3]<<8
+						  & data[2]);
+			indicate = 1;
+			break;
+
+		case PORT_NAME:
+			ASSERT(plen <= 32 , goto corrupted;);
+			memcpy(self->port_name, data + 2, plen);
+			*(__u8 *)(self->port_name+plen) = 0;
 			break;
 
-			/*
-			 * for centronics .... not implemented yet
+		case FIXED_PORT_NAME:
+			ASSERT(plen <= 32 , goto corrupted;);
+			memcpy(self->port_name, data + 2, plen);
+			*(__u8 *)(self->port_name+plen) = 0;
+			/* 
+			 * We should not connect if user of IrCOMM can't
+			 * recognize the port name
 			 */
-/* 			case STATUS_QUERY: */
-/* 			case SET_BUSY_TIMEOUT: */
-/* 			case IEEE1284_MODE_SUPPORT: */
-/* 			case IEEE1284_DEVICEID: */
-/* 			case IEEE1284_MODE: */
-/* 			case IEEE1284_ECP_EPP_DATA_TRANSFER:	 */
-			
-		default:
-			DEBUG(0, "ircomm_parse_control:not implemented "
-			      "instruction(%d)\n", pi);
+			self->port_name_critical = TRUE;
 			break;
+
+		default:
+			DEBUG(0, __FUNCTION__
+			      "():not implemented (PI=%d)\n", pi);
 		}
 
-		if(indicate && self->notify.flow_indication 
-		   && type == CONTROL_CHANNEL){
-			
-			DEBUG(0,"ircomm:parse_control:indicating..:\n");
+
+		if(indicate && 
+		   self->notify.flow_indication && type == CONTROL_CHANNEL)
+		{
+			DEBUG(4,__FUNCTION__":indicating..:\n");
 			self->pi = pi;
 			if(self->notify.flow_indication)
-				self->notify.flow_indication(self->notify.instance, self, 0);
-			indicate = 0;
+				self->notify.flow_indication(self->notify.instance,
+							     self,
+							     CONTROL_CHANNEL);
+		}
+		skb_pull(skb, 2+plen);
+		clen -= (2+plen);
+	}
+
+	return;
+
+ corrupted:
+	skb_pull(skb, skb->len);   /* remove suspicious data */
+	return;
+}
+
+/*
+ * ----------------------------------------------------------------------
+ * Function ircomm_open_instance() ,ircomm_close_instance() and friends
+ *
+ * ircomm_open_instance discoveres the peer device and then issues a
+ * connect request
+ * ----------------------------------------------------------------------
+ */
+
+
+
+/*
+ * ircomm_getvalue_confirm()
+ * handler for iriap_getvaluebyclass_request() 
+ */
+
+static void ircomm_getvalue_confirm( __u16 obj_id, struct ias_value *value,
+				     void *priv)
+{
+	struct ircomm_cb *self = (struct ircomm_cb *) priv;
+	struct sk_buff *skb= NULL;
+	__u8 *frame;
+	ASSERT( self != NULL, return;);
+	ASSERT( self->magic == IRCOMM_MAGIC, return;);
+
+	/* Check if request succeeded */
+	if ( !value) {
+		DEBUG( 0, __FUNCTION__ "(), got NULL value!\n");
+		return;
+	}
+
+	DEBUG(4, __FUNCTION__"():type(%d)\n", value->type);
+
+	self->ias_type = value->type;
+	switch(value->type){
+ 	case IAS_OCT_SEQ:
+		
+		DEBUG(4, __FUNCTION__"():got octet sequence:\n");
+#if 0
+		{
+			int i;
+			for ( i=0;i<value->len;i++)
+				printk("%02x",
+				       (__u8)(*(value->t.oct_seq + i)));
+			printk("\n");
 		}
+#endif
+		skb = dev_alloc_skb((value->len) + 2);
+		ASSERT(skb != NULL, return;);
+		frame = skb_put(skb,2);
+		/* MSB first */
+		frame[0] = ( value->len >> 8 ) & 0xff;
+		frame[1] = value->len & 0xff;
+		
+		frame = skb_put(skb,value->len);
+		memcpy(frame, value->t.oct_seq, value->len);
+		ircomm_parse_tuples(self, skb, IAS_PARAM);
+		kfree_skb(skb);
+
+		wake_up_interruptible( &self->ias_wait);
+		break;
+
+	case IAS_INTEGER:
+		/* LsapSel seems to be sent to me */	
+		DEBUG(0, __FUNCTION__"():got lsapsel = %d\n", value->t.integer);
+
+		if ( value->t.integer == -1){
+			DEBUG( 0, __FUNCTION__"():invalid value!\n");
+			return;
+		}
+
+		if(self->state == COMM_IDLE){
+			self->dlsap = value->t.integer;
+
+			wake_up_interruptible( &self->ias_wait);
+		}
+		break;
+
+	case IAS_MISSING:
+		DEBUG( 0, __FUNCTION__":got IAS_MISSING\n");
+		break;
+   
+	default:
+		DEBUG( 0, __FUNCTION__":got unknown (strange?)type!\n");
+		break;
+	}
+}
+
+
+/*
+ * query_lsapsel()
+ *    quering the remote IAS to ask which
+ *    dlsap we should use
+ */
+
+static void query_lsapsel(struct ircomm_cb * self)
+{
+	DEBUG(0, __FUNCTION__"():querying IAS: Lsapsel...\n");
+
+	if (!(self->servicetype & THREE_WIRE_RAW)) {
+		iriap_getvaluebyclass_request( 
+			"IrDA:IrCOMM", "IrDA:TinyTP:LsapSel",
+			self->saddr, self->daddr,
+			ircomm_getvalue_confirm, self );
+	} else {
+		DEBUG(0, __FUNCTION__ "THREE_WIRE_RAW is not implemented!\n");
 	}
-	skb_pull( skb, 1+clen);
+}
+
+/*
+ * ircomm_discovery_indication()
+ *    Remote device is discovered, try query the remote IAS to see which
+ *    device it is, and which services it has.
+ */
+
+static void ircomm_discovery_indication(discovery_t *discovery)
+{
+	struct ircomm_cb *self;
+
+	self = discovering_instance;
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == IRCOMM_MAGIC, return;);
+
+	self->daddr = discovery->daddr;
+	self->saddr = discovery->saddr;
+
+	DEBUG( 0, __FUNCTION__"():daddr=%08x\n", self->daddr);
+
+	wake_up_interruptible( &self->discovery_wait);
 	return;
 }
 
+
+struct ircomm_cb * ircomm_open_instance( struct notify_t client_notify)
+{
+	int i;
+	struct ircomm_cb *self = NULL;
+	struct notify_t notify;
+	unsigned long flags;
+
+	ASSERT(ircomm != NULL,return NULL;);
+	DEBUG(0,__FUNCTION__"():\n");
+
+	/* find free handle */
+
+	save_flags(flags);
+	cli();
+	for(i = 0; i < IRCOMM_MAX_CONNECTION; i++){
+		ASSERT(ircomm[i] != NULL,return(NULL););
+		if(!ircomm[i]->in_use){
+			self = ircomm[i];
+			break;
+		}
+	}
+
+	if (!self){
+		DEBUG(0,__FUNCTION__"():no free handle!\n");
+		return (NULL);
+	}
+
+	self->in_use = 1;
+	restore_flags(flags);
+
+	self->notify = client_notify;
+	self->ttp_stop = 0;
+	self->control_ch_pending = 0;
+
+	/* register callbacks */
+
+	irda_notify_init(&notify);
+	notify.data_indication = ircomm_accept_data_indication;
+	notify.connect_confirm = ircomm_accept_connect_confirm;
+	notify.connect_indication = ircomm_accept_connect_indication;
+	notify.flow_indication = ircomm_accept_flow_indication;
+	notify.disconnect_indication = ircomm_accept_disconnect_indication;
+	notify.instance = self;
+	strncpy( notify.name, "IrCOMM", NOTIFY_MAX_NAME);
+
+	self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT,
+				     &notify);
+	if(!self->tsap){
+		DEBUG(0,__FUNCTION__"failed to allocate tsap\n");
+		return NULL;
+	}
+
+	ircomm_next_state(self, COMM_IDLE);	
+	return (self);
+}
+
+int ircomm_close_instance(struct ircomm_cb *self)
+{
+	ASSERT( self != NULL, return -EIO;);
+	ASSERT( self->magic == IRCOMM_MAGIC, return -EIO;);
+	ASSERT( self->ctrl_skb != NULL, return -EIO;);
+
+	DEBUG(0,__FUNCTION__"()\n");
+
+	/* shutdown ircomm layer */
+	if(self->state != COMM_IDLE && self->state != COMM_WAITI)
+	{
+		DEBUG(0,__FUNCTION__"():force disconnecting..\n");
+		ircomm_disconnect_request(self, NULL, P_HIGH);
+	}
+
+	skb_trim(self->ctrl_skb,0);
+	/* remove a tsap */
+	if(self->tsap)
+		irttp_close_tsap(self->tsap);
+	self->tsap = NULL;
+	self->in_use = 0;
+	return 0;
+}
+
+
 /*
  * ----------------------------------------------------------------------
  * Function init_module(void) ,cleanup_module()
@@ -1241,21 +1695,21 @@
  */
 
 #ifdef MODULE
-
 int init_module(void) 
 {
-	ircomm_init();
+	int err;
 
-	DEBUG( 4, "ircomm:init_module:done\n");
-	return 0;
+	err = ircomm_init();
+
+	DEBUG( 4, __FUNCTION__"():done.\n");
+	return err;
 }
 	
 void cleanup_module(void)
 {
 	ircomm_cleanup();
-	DEBUG( 0, "ircomm_common:cleanup_module:done.\n");
+	DEBUG( 4, __FUNCTION__"():done.\n");
 }
-
 #endif /* MODULE */
 
 /************************************************************
@@ -1278,46 +1732,85 @@
 	len = 0;
 	for (i=0; i<IRCOMM_MAX_CONNECTION; i++) {
 
+		len += sprintf(buf+len, "instance %d:\n",i);
+		if(ircomm[i]->in_use == 0){
+			len += sprintf(buf+len, "\tunused\n");
+			continue;
+		}
+
 		if (ircomm[i] == NULL || ircomm[i]->magic != IRCOMM_MAGIC) {
-			len += sprintf(buf+len, "???\t");
-		}else {
-			switch (ircomm[i]->servicetype) {
-			case UNKNOWN:
-				index = 0;
-				break;
-			case THREE_WIRE_RAW:
-				index = 1;
-				break;
-			case THREE_WIRE:
-				index = 2;
-				break;
-			case NINE_WIRE:
-				index = 3;
-				break;
-			case CENTRONICS:
-				index = 4;
-				break;
-			default:
-				index = 0;
-				break;
-			}
-			len += sprintf(buf+len, "service: %s\t",
-				       ircommservicetype[index]);
-			if(index){
-				len += sprintf(buf+len, "porttype: %s  ",
-					       ircommporttype[ircomm[i]->port_type]);
-				len += sprintf(buf+len, "state: %s  ",
-					       ircommstate[ircomm[i]->state]);
-				len += sprintf(buf+len, "user: %s  ",
-					       ircomm[i]->notify.name);
-				len += sprintf(buf+len, "nullmodem emulation: %s",
-					       (ircomm[i]->null_modem_mode ? "yes":"no"));
-			}
+			len += sprintf(buf+len, "\tbroken???\n");
+			continue;
+		}
+
+		switch (ircomm[i]->servicetype) {
+		case UNKNOWN:
+			index = 0;
+			break;
+		case THREE_WIRE_RAW:
+			index = 1;
+			break;
+		case THREE_WIRE:
+			index = 2;
+			break;
+		case NINE_WIRE:
+			index = 3;
+			break;
+		case CENTRONICS:
+			index = 4;
+			break;
+		default:
+			index = 0;
+			break;
 		}
-		len += sprintf(buf+len, "\n");
+		len += sprintf(buf+len, "    service: %s  ",
+			       ircommservicetype[index]);
+		if(!index)
+			continue;
+
+		len += sprintf(buf+len, "porttype: %s  ",
+			       ircommporttype[ircomm[i]->port_type]);
+		len += sprintf(buf+len, "state: %s  ",
+			       ircommstate[ircomm[i]->state]);
+		len += sprintf(buf+len, "user: %s\n",
+			       ircomm[i]->notify.name);
+		
+		len += sprintf(buf+len, "    tx packets: %d  ",
+			       ircomm[i]->tx_packets);
+		len += sprintf(buf+len, "rx packets: %d  ",
+			       ircomm[i]->rx_packets);
+		len += sprintf(buf+len, "tx controls: %d\n",
+			       ircomm[i]->tx_controls);
+		
+		len += sprintf(buf+len, "    pending tuples: %d  ",
+			       ircomm[i]->pending_control_tuples);
+		len += sprintf(buf+len, "    ignored tuples: %d\n",
+			       ircomm[i]->ignored_control_tuples);
+		
+		len += sprintf(buf+len, "    nullmodem emulation: %s  ",
+			       (ircomm[i]->null_modem_mode ? "yes":"no"));
+		len += sprintf(buf+len, "IrTTP: %s\n",
+			       (ircomm[i]->ttp_stop ? "BUSY":"READY"));
+
+		len += sprintf(buf+len, "    Peer capability: ");
+		if(ircomm[i]->peer_cap & THREE_WIRE_RAW)
+			len += sprintf(buf+len, "3wire-raw ");
+		if(ircomm[i]->peer_cap & THREE_WIRE)
+			len += sprintf(buf+len, "3wire ");
+		if(ircomm[i]->peer_cap & NINE_WIRE)
+			len += sprintf(buf+len, "9wire ");
+		if(ircomm[i]->peer_cap & CENTRONICS)
+			len += sprintf(buf+len, "centronics");
+
+		len += sprintf(buf+len, "\n    Port name: %s\n",
+			       (ircomm[i]->port_name));
 	}
+
 	return len;
 }
 
 #endif /* CONFIG_PROC_FS */
 
+
+
+
diff -urN linux-2.2.6-pre2/net/irda/ircomm/irvtd.c linux-2.2.6-pre3/net/irda/ircomm/irvtd.c
--- linux-2.2.6-pre2/net/irda/ircomm/irvtd.c	1998-12-18 08:06:39.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/ircomm/irvtd.c	1969-12-31 16:00:00.000000000 -0800
@@ -1,153 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      irvtd.c
- * Version:       
- * Description:   A virtual tty driver implementaion,
- *                which also may be called as "Port Emulation Entity"
- *                in IrCOMM specification.
- * Status:        Experimental.
- * Author:        Takahide Higuchi <thiguchi@pluto.dti.ne.jp>
- * Source:        irlpt.c
- *
- *     Copyright (c) 1998, Takahide Higuchi, <thiguchi@pluto.dti.ne.jp>,
- *     All Rights Reserved.
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     I, Takahide Higuchi, provide no warranty for any of this software.
- *     This material is provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-/* #include <linux/module.h> */
-
-#include <linux/init.h>
-
-#include <net/irda/irda.h>
-#include <net/irda/irlmp.h>
-
-#include <net/irda/irvtd.h>
-#include <net/irda/irvtd_driver.h>
-
-struct irvtd_cb **irvtd = NULL;
-extern struct ircomm_cb **ircomm;
-
-#if 0
-static char *rcsid = "$Id: irvtd.c,v 1.2 1998/09/27 08:37:04 takahide Exp $";
-#endif
-static char *version = "IrVTD, $Revision: 1.2 $ $Date: 1998/09/27 08:37:04 $ (Takahide Higuchi)";
-
-
-/************************************************************
- *    init & cleanup this module 
- ************************************************************/
-
-/*
- * Function init_module(void)
- *
- *   Initializes the ircomm control structure
- *   This Function is called when you do insmod.
- */
-
-__initfunc(int irvtd_init(void))
-{
-	int i;
-
-	DEBUG( 4, "irvtd:init_module:\n");
-	printk( KERN_INFO "%s\n", version);
-
-	/* we allocate master array */
-
-	irvtd = (struct irvtd_cb **) kmalloc( sizeof(void *) *
-						COMM_MAX_TTY,GFP_KERNEL);
-	if ( irvtd == NULL) {
-		printk( KERN_WARNING "irvtd: Can't allocate array!\n");
-		return -ENOMEM;
-	}
-
-	memset( irvtd, 0, sizeof(void *) * COMM_MAX_TTY);
-
-
-	/* we initialize structure */
-
-	for (i=0; i < COMM_MAX_TTY; i++){
-		irvtd[i] = kmalloc( sizeof(struct irvtd_cb), GFP_KERNEL);	
-		if(irvtd[i] == NULL){
-			printk(KERN_ERR "ircomm_open(): kmalloc failed!\n");
-			return -ENOMEM;
-		}
-
-		memset( irvtd[i], 0, sizeof(struct irvtd_cb));
-		irvtd[i]->magic = IRVTD_MAGIC;
-	}
-
-	/* 
-	 * initialize a "port emulation entity"
-	 */
-
-	if(irvtd_register_ttydriver()){
-		printk( KERN_WARNING "IrCOMM: Error in ircomm_register_device\n");
-		return -ENODEV;
-	}
-
-
-	DEBUG( 4, "irvtd:init_module:done\n");
-	return 0;
-}
-
-void irvtd_cleanup(void)
-{
-	int i;
-	DEBUG( 4, "--> ircomm:cleanup_module\n");
-
-	/*
-	 * free some resources
-	 */
-	if (irvtd) {
-		for (i=0; i<COMM_MAX_TTY; i++) {
-			if (irvtd[i]) {
-				DEBUG( 4, "freeing structures\n");
-				/* irvtd_close();  :{| */
-				kfree(irvtd[i]);
-				irvtd[i] = NULL;
-			}
-		}
-		DEBUG( 4, "freeing master array\n");
-		kfree(irvtd);
-		irvtd = NULL;
-	}
-
-
-
-	DEBUG( 0, "unregister_ttydriver..\n");
- 	irvtd_unregister_ttydriver();
-
-	DEBUG( 4, "ircomm:cleanup_module -->\n");
-}
-
-#ifdef MODULE
-
-int init_module(void) 
-{
-	irvtd_init();
-	return 0;
-}
-
-
-/*
- * Function ircomm_cleanup (void)
- *   This is called when you rmmod.
- */
-
-void cleanup_module(void)
-{
-	irvtd_cleanup();
-}
-
-#endif /* MODULE */
-
-
-
diff -urN linux-2.2.6-pre2/net/irda/ircomm/irvtd_driver.c linux-2.2.6-pre3/net/irda/ircomm/irvtd_driver.c
--- linux-2.2.6-pre2/net/irda/ircomm/irvtd_driver.c	1998-12-17 09:01:03.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/ircomm/irvtd_driver.c	2003-08-15 15:05:39.000000000 -0700
@@ -2,7 +2,7 @@
  *                
  * Filename:      irvtd_driver.c
  * Version:       
- * Description:   An implementation of "port emulation entity" of IrCOMM
+ * Description:   Virtual tty driver (the "port emulation entity" of IrCOMM)
  * Status:        Experimental.
  * Author:        Takahide Higuchi <thiguchi@pluto.dti.ne.jp>
  * Source:        serial.c by Linus Torvalds
@@ -22,17 +22,20 @@
  ********************************************************************/
 
 #include <linux/module.h>
+#include <linux/init.h>
+
 #include <linux/fs.h>
 #include <linux/sched.h>
 #include <linux/termios.h>
+#include <linux/tty.h>
 #include <asm/segment.h>
 #include <asm/uaccess.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irttp.h>
+#include <net/irda/irias_object.h>
 
 #include <net/irda/irvtd.h>
-#include <net/irda/irvtd_driver.h>
 
 #ifndef MIN
 #define MIN(a,b)        ((a) < (b) ? (a) : (b))
@@ -41,14 +44,15 @@
 #define DO_RESTART
 #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
 
-static char *irvtd_ttyname = "irnine";
-struct tty_driver irvtd_drv, irvtd_callout_driver;
+struct tty_driver irvtd_drv;
 struct tty_struct *irvtd_table[COMM_MAX_TTY];
 struct termios *irvtd_termios[COMM_MAX_TTY];
 struct termios *irvtd_termios_locked[COMM_MAX_TTY];
-static int ircomm_vsd_refcount;
-extern struct ircomm_cb **ircomm;
-extern struct irvtd_cb **irvtd;
+static int irvtd_refcount;
+struct irvtd_cb **irvtd = NULL;
+
+static char *revision_date = "Wed Mar 10 15:33:03 1999";
+
 
 /*
  * prototypes
@@ -71,157 +75,38 @@
 void irvtd_hangup(struct tty_struct *tty);
 void irvtd_flush_buffer(struct tty_struct *tty);
 
-static void flush_txbuff(struct irvtd_cb *info);
 static void change_speed(struct irvtd_cb *driver);
-static void irvtd_write_to_tty( void *instance );
-
+static void irvtd_write_to_tty( struct irvtd_cb *);
+static void irvtd_send_data_request( struct irvtd_cb *);
 static void irvtd_break(struct tty_struct *tty, int break_state);
 static void irvtd_send_xchar(struct tty_struct *tty, char ch);
+static void irvtd_wait_until_sent(struct tty_struct *tty, int timeout);
 
-#if 0
-static char *rcsid = "$Id: irvtd_driver.c,v 1.13 1998/12/06 10:09:07 takahide Exp $";
-#endif
-
-
-
-
-/*
- * Function ircomm_register_device(void) 
- *   we register "port emulation entity"(see IrCOMM specification) here
- *   as a tty device.
- *   it will be called when you insmod.
- *   ( This function derives from linux/drivers/char/serial.c )
- */
-
-int irvtd_register_ttydriver(void){
-
-        DEBUG( 4, "-->irvtd_register_ttydriver\n");
-
-	/* setup virtual serial port device */
-
-        /* Initialize the tty_driver structure ,which is defined in 
-	   tty_driver.h */
-        
-        memset(&irvtd_drv, 0, sizeof(struct tty_driver));
-	irvtd_drv.magic = IRVTD_MAGIC;
-	irvtd_drv.name = irvtd_ttyname;
-	irvtd_drv.major = IRCOMM_MAJOR;
-	irvtd_drv.minor_start = IRVTD_MINOR;
-	irvtd_drv.num = COMM_MAX_TTY;
-	irvtd_drv.type = TTY_DRIVER_TYPE_SERIAL;  /* see tty_driver.h */
-	irvtd_drv.subtype = IRVTD_TYPE_NORMAL;      /* private type */
-
-	/*
-	 * see drivers/char/tty_io.c and termios(3)
-	 */
-
-        irvtd_drv.init_termios = tty_std_termios;
-        irvtd_drv.init_termios.c_cflag =
-		B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-        irvtd_drv.flags = TTY_DRIVER_REAL_RAW;   /* see tty_driver.h */
-        irvtd_drv.refcount = &ircomm_vsd_refcount;
-
-	/* pointer to the tty data structures */
-
-        irvtd_drv.table = irvtd_table;  
-        irvtd_drv.termios = irvtd_termios;
-        irvtd_drv.termios_locked = irvtd_termios_locked;
-
-        /*
-         * Interface table from the kernel(tty driver) to the ircomm
-         * layer
-         */
-
-        irvtd_drv.open = irvtd_open;
-        irvtd_drv.close = irvtd_close;
-        irvtd_drv.write = irvtd_write;
-        irvtd_drv.put_char = irvtd_put_char;
-	irvtd_drv.flush_chars = irvtd_flush_chars;
-        irvtd_drv.write_room = irvtd_write_room;
-	irvtd_drv.chars_in_buffer = irvtd_chars_in_buffer; 
-        irvtd_drv.flush_buffer = irvtd_flush_buffer;
- 	irvtd_drv.ioctl = irvtd_ioctl; 
-	irvtd_drv.throttle = irvtd_throttle;
-	irvtd_drv.unthrottle = irvtd_unthrottle;
- 	irvtd_drv.set_termios = irvtd_set_termios;
-	irvtd_drv.stop = NULL;          /*  irvtd_stop; */
-	irvtd_drv.start = NULL;         /* irvtd_start; */
-        irvtd_drv.hangup = irvtd_hangup;
-
-        irvtd_drv.send_xchar = irvtd_send_xchar;
-	irvtd_drv.break_ctl = irvtd_break;
-	irvtd_drv.read_proc = NULL;
-	irvtd_drv.wait_until_sent = NULL;
-
-        /*
-         * The callout device is just like normal device except for
-         * minor number and the subtype.
-         */
-
-	/* What is difference between callout device and normal device? */
-	/* My system dosen't have /dev/cua??, so we don't need it? :{| */
-	irvtd_callout_driver = irvtd_drv;
-	irvtd_callout_driver.name = "irninecua";
-	irvtd_callout_driver.minor_start = IRVTD_CALLOUT_MINOR; 
-	irvtd_callout_driver.subtype = IRVTD_TYPE_CALLOUT;
-
-
-	if (tty_register_driver(&irvtd_drv)){
-		DEBUG(0,"IrCOMM:Couldn't register tty driver\n");
-		return(1);
-	}
-	if (tty_register_driver(&irvtd_callout_driver))
-		DEBUG(0,"IrCOMM:Couldn't register callout tty driver\n");
-
-	DEBUG( 4, "irvtd_register_ttydriver: done.\n");
-	return(0);
-}
-
-
-/*
- * Function irvtd_unregister_device(void) 
- *   it will be called when you rmmod
- */
-
-void irvtd_unregister_ttydriver(void){
-
-	int err;	
-        DEBUG( 4, "--> irvtd_unregister_device\n");
-
-	/* unregister tty device   */
-
-	err = tty_unregister_driver(&irvtd_drv);
-        if (err)
-                printk("IrCOMM: failed to unregister vtd driver(%d)\n",err);
-	err = tty_unregister_driver(&irvtd_callout_driver);
-        if (err)
-                printk("IrCOMM: failed to unregister vtd_callout driver(%d)\n", err);
-
-        DEBUG( 4, "irvtd_unregister_device -->\n");
-	return;
-}
+static void irvtd_start_timer( struct irvtd_cb *driver);
+static void irvtd_timer_expired(unsigned long data);
 
+static int line_info(char *buf, struct irvtd_cb *driver);
+static int irvtd_read_proc(char *buf, char **start, off_t offset, int len,
+			   int *eof, void *unused);
 
 
 /*
  * ----------------------------------------------------------------------
- * Routines for Virtual tty driver
+ * 
  *
- *   most of infomation is descrived in linux/tty_driver.h, but
- *   a function ircomm_receive() derives from receive_chars() which is
- *   in 2.0.30 kernel (driver/char/serial.c).
- *   if you want to understand them, please see related kernel source 
- *   (and my comments :).
+
  * ----------------------------------------------------------------------
  */
 
 /*
- * ----------------------------------------------------------------------
- * ircomm_receive_data()
+ **********************************************************************
+ *
+ * ircomm_receive_data() and friends
  *
  * like interrupt handler in the serial.c,we receive data when 
  * ircomm_data_indication comes
- * ----------------------------------------------------------------------
+ *
+ **********************************************************************
  */
 
 
@@ -231,25 +116,22 @@
  * send incoming/queued data to tty
  */
 
-static void irvtd_write_to_tty( void *instance ){
-	
+static void irvtd_write_to_tty( struct irvtd_cb *driver)
+{	
 	int status, c, flag;
-	
 	struct sk_buff *skb;
-	struct irvtd_cb *driver = (struct irvtd_cb *)instance;
 	struct tty_struct *tty = driver->tty;
 	
-	/* does instance still exist ? should be checked */
-	ASSERT(driver->magic == IRVTD_MAGIC, return;);
-	
-	if(driver->rx_disable ){
-		DEBUG(0,__FUNCTION__"rx_disable is true:do_nothing..\n");
-		return;
-	}
-	
 	skb = skb_dequeue(&driver->rxbuff);
-	ASSERT(skb != NULL, return;); /* there's nothing */
-	IS_SKB(skb, return;);
+	if(skb == NULL)
+		return; /* there's nothing */
+
+
+	/* 
+	 * we should parse controlchannel field here. 
+	 * (see process_data() in ircomm.c)
+	 */
+	ircomm_parse_tuples(driver->comm, skb, CONTROL_CHANNEL);
 	
 #ifdef IRVTD_DEBUG_RX
 	printk("received data:");
@@ -264,12 +146,6 @@
 	status = driver->comm->peer_line_status & driver->read_status_mask;
 	
 	/* 
-	 * FIXME: we must do ircomm_parse_ctrl() here, instead of 
-	 * ircomm_common.c!! 
-	 */
-	
-
-	/* 
 	 * if there are too many errors which make a character ignored,
 	 * drop characters
 	 */
@@ -289,7 +165,7 @@
 		DEBUG(0,"handling break....\n");
 		
 		flag = TTY_BREAK;
-		if (driver->flags & IRVTD_ASYNC_SAK)
+		if (driver->flags & ASYNC_SAK)
 			/*
 			 * do_SAK() seems to be an implementation of the 
 			 * idea called "Secure Attention Key",
@@ -311,7 +187,8 @@
 		flag = TTY_NORMAL;
 	
 	if(c){
-		DEBUG(0,"writing %d chars to tty\n",c);
+		DEBUG(4,"writing %d chars to tty\n",c);
+		driver->icount.rx += c;
 		memset(tty->flip.flag_buf_ptr, flag, c);
 		memcpy(tty->flip.char_buf_ptr, skb->data, c);
 		tty->flip.flag_buf_ptr += c;
@@ -325,205 +202,207 @@
 	else
 	{
 		/* queue rest of data again */
-		DEBUG(0,__FUNCTION__":retrying frame!\n");
+		DEBUG(4,__FUNCTION__":retrying frame!\n");
+
+		/* build a dummy control channel */
+		skb_push(skb,1);
+		*skb->data = 0;  /* clen is 0 */
 		skb_queue_head( &driver->rxbuff, skb );
 	}
 	
-	/*
-	 * in order to optimize this routine, these two tasks should be
-	 * queued in following order
-	 * ( see run_task_queue() and queue_task() in tqueue.h
-	 */
-	if(skb_queue_len(&driver->rxbuff))
-		/* let me try again! */
-		queue_task(&driver->rx_tqueue, &tq_timer);
 	if(c)
-		/* read your buffer! */
-		queue_task(&tty->flip.tqueue, &tq_timer);
+	/* let the process read its buffer! */
+		tty_flip_buffer_push(tty);
 	
-
-	if(skb_queue_len(&driver->rxbuff)< IRVTD_RX_QUEUE_LOW
-	   &&  driver->ttp_stoprx){
+	if(skb_queue_len(&driver->rxbuff)< IRVTD_RX_QUEUE_LOW &&
+	   driver->ttp_stoprx){
 		irttp_flow_request(driver->comm->tsap, FLOW_START);
 		driver->ttp_stoprx = 0;
 	}
+
+	if(skb_queue_empty(&driver->rxbuff) && driver->disconnect_pend){
+		/* disconnect */
+		driver->disconnect_pend = 0;
+		driver->rx_disable = 1;
+		tty_hangup(driver->tty);
+	}
 }
 
-void irvtd_receive_data(void *instance, void *sap, struct sk_buff *skb){
-	
+static int irvtd_receive_data(void *instance, void *sap, struct sk_buff *skb)
+{	
 	struct irvtd_cb *driver = (struct irvtd_cb *)instance;
 
-	ASSERT(driver != NULL, return;);
-	ASSERT(driver->magic == IRVTD_MAGIC, return;);
+	ASSERT(driver != NULL, return -1;);
+	ASSERT(driver->magic == IRVTD_MAGIC, return -1;);
+	DEBUG(4, __FUNCTION__"(): queue frame\n");
 
 	/* queue incoming data and make bottom half handler ready */
 
 	skb_queue_tail( &driver->rxbuff, skb );
-	if(skb_queue_len(&driver->rxbuff) == 1)
-		irvtd_write_to_tty(driver);
+
 	if(skb_queue_len(&driver->rxbuff) > IRVTD_RX_QUEUE_HIGH){
 		irttp_flow_request(driver->comm->tsap, FLOW_STOP);
 		driver->ttp_stoprx = 1;
 	}
-	return;
+	return 0;
 }
 
-#if 0
-void irvtd_receive_data(void *instance, void *sap, struct sk_buff *skb){
+/*
+ ***********************************************************************
+ *
+ * irvtd_send_data() and friends
+ *
+ * like interrupt handler in the serial.c,we send data when 
+ * a timer is expired
+ *
+ ***********************************************************************
+ */
+
+
+static void irvtd_start_timer( struct irvtd_cb *driver)
+{
+	ASSERT( driver != NULL, return;);
+	ASSERT( driver->magic == IRVTD_MAGIC, return;);
+
+	del_timer( &driver->timer);
 	
-	int flag,status;
-	__u8 c;
-	struct tty_struct *tty;
-	struct irvtd_cb *driver = (struct irvtd_cb *)instance;
+	driver->timer.data     = (unsigned long) driver;
+	driver->timer.function = &irvtd_timer_expired;
+	driver->timer.expires  = jiffies + (HZ / 20);  /* 50msec */
+	
+	add_timer( &driver->timer);
+}
 
-	ASSERT(driver != NULL, return;);
-	ASSERT(driver->magic == IRVTD_MAGIC, return;);
 
-	if(driver->rx_disable ){
-		DEBUG(0,__FUNCTION__"rx_disable is true:do nothing\n");
-		return;
+static void irvtd_timer_expired(unsigned long data)
+{
+	struct irvtd_cb *driver = (struct irvtd_cb *)data;
+
+	ASSERT(driver != NULL,return;);
+	ASSERT(driver->magic == IRVTD_MAGIC,return;);
+	DEBUG(4, __FUNCTION__"()\n");
+
+	if(!(driver->tty->hw_stopped) && !(driver->tx_disable))
+		irvtd_send_data_request(driver);
+
+	if(!(driver->rx_disable)){
+		irvtd_write_to_tty(driver);
 	}
+	
+	/* start our timer again and again */
+	irvtd_start_timer(driver);
+}
 
-	tty = driver->tty;
-	status = driver->comm->peer_line_status & driver->read_status_mask;
 
-	c = MIN(skb->len, (TTY_FLIPBUF_SIZE - tty->flip.count));
-	DEBUG(0, __FUNCTION__"skb_len=%d, tty->flip.count=%d \n"
-	      ,(int)skb->len, tty->flip.count);
+static void irvtd_send_data_request(struct irvtd_cb *driver)
+{
+	int err;
+	struct sk_buff *skb = driver->txbuff;
 
-#ifdef IRVTD_DEBUG_RX
-	printk("received data:");
+	ASSERT(skb != NULL,return;);
+	DEBUG(4, __FUNCTION__"()\n");
+
+	if(!skb->len)
+		return;   /* no data to send */
+
+#ifdef IRVTD_DEBUG_TX
+	DEBUG(4, "flush_txbuff:count(%d)\n",(int)skb->len);
 	{
 		int i;
 		for ( i=0;i<skb->len;i++)
-			printk("%02x ", skb->data[i]);
+			printk("%02x", skb->data[i]);
 		printk("\n");
 	}
 #endif
 
-	/* 
-	 * if there are too many errors which make a character ignored,
-	 * drop characters
-	 */
-
-	if(status & driver->ignore_status_mask){
-		DEBUG(0,__FUNCTION__"I/O error:ignore characters.\n");
-		dev_kfree_skb(skb, FREE_READ);
-		return;
-	} 
-	
-	if (driver->comm->peer_break_signal ) {
-		driver->comm->peer_break_signal = 0;
-		DEBUG(0,"handling break....\n");
-		
-		flag = TTY_BREAK;
-		if (driver->flags & IRVTD_ASYNC_SAK)
-			/*
-			 * do_SAK() seems to be an implementation of the 
-			 * idea called "Secure Attention Key",
-			 * which seems to be discribed in "Orange book".
-			 * (which is published by U.S.military!!?? )
-			 * see source of do_SAK() but what is "Orange book"!?
-			 */
-			do_SAK(tty);
-	}else if (status & LSR_PE)
-		flag = TTY_PARITY;
-	else if (status & LSR_FE)
-		flag = TTY_FRAME;
-	else if (status & LSR_OE)
-		flag = TTY_OVERRUN;
-	else 
-		flag = TTY_NORMAL;
+	DEBUG(4, __FUNCTION__"():sending %d bytes\n",(int)skb->len );
+	driver->icount.tx += skb->len;
+	err = ircomm_data_request(driver->comm, driver->txbuff);
+	if (err){
+		ASSERT(err == 0,;);
+		DEBUG(0,"%d chars are lost\n",(int)skb->len);
+		skb_trim(skb, 0);
+	}
 
-	if(c){
-		DEBUG(0,"writing %d chars to tty\n",c);
-		memset(tty->flip.flag_buf_ptr, flag, c);
-		memcpy(tty->flip.char_buf_ptr, skb->data, c);
-		tty->flip.flag_buf_ptr += c;
-		tty->flip.char_buf_ptr += c;
-		tty->flip.count += c;
-		skb_pull(skb,c);
-		queue_task_irq_off(&tty->flip.tqueue, &tq_timer);
+	/* allocate a new frame */
+	skb = driver->txbuff = dev_alloc_skb(driver->comm->max_txbuff_size);
+	if (skb == NULL){
+		printk(__FUNCTION__"():flush_txbuff():alloc_skb failed!\n");
+	} else {
+		skb_reserve(skb, COMM_HEADER_SIZE);
 	}
-	if(skb->len >0)
-		DEBUG(0,__FUNCTION__":dropping frame!\n");
-	dev_kfree_skb(skb, FREE_READ);
-	DEBUG(4,__FUNCTION__":done\n");
+
+	wake_up_interruptible(&driver->tty->write_wait);
 }
-#endif
+
 
 /*
- * ----------------------------------------------------------------------
+ ***********************************************************************
+ *
  * indication/confirmation handlers:
- * they will be registerd in irvtd_startup() to know that we
- * discovered (or we are discovered by) remote device.
- * ----------------------------------------------------------------------
+ *
+ * these routines are handlers for IrCOMM protocol stack
+ *
+ ***********************************************************************
  */
 
-/* this function is called whed ircomm_attach_cable succeed */
-
-void irvtd_attached(struct ircomm_cb *comm){
-
-	ASSERT(comm != NULL, return;);
-	ASSERT(comm->magic == IRCOMM_MAGIC, return;);
-
-	DEBUG(0,"irvtd_attached:sending connect_request"
-	      " for servicetype(%d)..\n",comm->servicetype);
-	ircomm_connect_request(comm, SAR_DISABLE );
-}
-
 
 /*
- * irvtd_connect_confirm()
- *  ircomm_connect_request which we have send have succeed!
+ * Function irvtd_connect_confirm (instance, sap, qos, max_sdu_size, skb)
+ *
+ *    ircomm_connect_request which we have send have succeed!
+ *
  */
-
 void irvtd_connect_confirm(void *instance, void *sap, struct qos_info *qos,
-			   int max_sdu_size, struct sk_buff *skb){
-
+			   __u32 max_sdu_size, struct sk_buff *skb)
+{
 	struct irvtd_cb *driver = (struct irvtd_cb *)instance;
 	ASSERT(driver != NULL, return;);
 	ASSERT(driver->magic == IRVTD_MAGIC, return;);
 
 	/*
+	 * set default value
+	 */
+	
+	driver->msr |= (MSR_DCD|MSR_RI|MSR_DSR|MSR_CTS);
+
+	/*
 	 * sending initial control parameters here
-	 *
-	 * TODO: it must be done in ircomm_connect_request()
 	 */
 #if 1
 	if(driver->comm->servicetype ==	THREE_WIRE_RAW)
 		return;                /* do nothing */
 
-	ircomm_append_ctrl(driver->comm, SERVICETYPE);
-	/* ircomm_append_ctrl(self, DATA_RATE); */
-	ircomm_append_ctrl(driver->comm, DATA_FORMAT);
-	ircomm_append_ctrl(driver->comm, FLOW_CONTROL);
-	ircomm_append_ctrl(driver->comm, XON_XOFF_CHAR);
-	/* ircomm_append_ctrl(driver->comm, ENQ_ACK_CHAR); */
+	ircomm_control_request(driver->comm, SERVICETYPE);
+	ircomm_control_request(driver->comm, DATA_RATE);
+	ircomm_control_request(driver->comm, DATA_FORMAT);
+	ircomm_control_request(driver->comm, FLOW_CONTROL);
+	ircomm_control_request(driver->comm, XON_XOFF_CHAR);
+	/* ircomm_control_request(driver->comm, ENQ_ACK_CHAR); */
 
 	switch(driver->comm->servicetype){
 	case CENTRONICS:
 		break;
 
 	case NINE_WIRE:
-		ircomm_append_ctrl(driver->comm, DTELINE_STATE);
+		ircomm_control_request(driver->comm, DTELINE_STATE);
 		break;
 	default:
 	}
-	ircomm_control_request(driver->comm);
 #endif
 	
-
+	driver->tx_disable = 0;
 	wake_up_interruptible(&driver->open_wait);
 }
 
 /*
- * irvtd_connect_indication()
- *  we are discovered and being requested to connect by remote device !
+ * Function irvtd_connect_indication (instance, sap, qos, max_sdu_size, skb)
+ *
+ *    we are discovered and being requested to connect by remote device !
+ *
  */
-
 void irvtd_connect_indication(void *instance, void *sap, struct qos_info *qos,
-			      int max_sdu_size, struct sk_buff *skb)
+			      __u32 max_sdu_size, struct sk_buff *skb)
 {
 
 	struct irvtd_cb *driver = (struct irvtd_cb *)instance;
@@ -539,42 +418,81 @@
 
 	ircomm_connect_response(comm, NULL, SAR_DISABLE );
 
+	/*
+	 * set default value
+	 */
+	driver->msr |= (MSR_DCD|MSR_RI|MSR_DSR|MSR_CTS);
+	driver->tx_disable = 0;
 	wake_up_interruptible(&driver->open_wait);
 }
 
-
-
+/*
+ * Function irvtd_disconnect_indication (instance, sap, reason, skb)
+ *
+ *    This is a handler for ircomm_disconnect_indication. since this
+ *    function is called in the context of interrupt handler,
+ *    interruptible_sleep_on() MUST not be used.
+ */
 void irvtd_disconnect_indication(void *instance, void *sap , LM_REASON reason,
-				 struct sk_buff *skb){
-
+				 struct sk_buff *skb)
+{
 	struct irvtd_cb *driver = (struct irvtd_cb *)instance;
+
 	ASSERT(driver != NULL, return;);
 	ASSERT(driver->tty != NULL, return;);
 	ASSERT(driver->magic == IRVTD_MAGIC, return;);
 
 	DEBUG(4,"irvtd_disconnect_indication:\n");
-	tty_hangup(driver->tty);
+
+	driver->tx_disable = 1;
+	driver->disconnect_pend = 1;
 }
 
 /*
- * irvtd_control_indication
+ * Function irvtd_control_indication (instance, sap, cmd)
+ *
+ *    
  *
  */
-
-
-void irvtd_control_indication(void *instance, void *sap, LOCAL_FLOW flow){
-
+void irvtd_control_indication(void *instance, void *sap, IRCOMM_CMD cmd)
+{
 	struct irvtd_cb *driver = (struct irvtd_cb *)instance;
-	__u8 pi; /* instruction of control channel */
 
 	ASSERT(driver != NULL, return;);
 	ASSERT(driver->magic == IRVTD_MAGIC, return;);
 
-	DEBUG(0,"irvtd_control_indication:\n");
+	DEBUG(4,__FUNCTION__"()\n");
 
-	pi = driver->comm->pi;
+	if(cmd == TX_READY){
+		driver->ttp_stoptx = 0;
+		driver->tty->hw_stopped = driver->cts_stoptx;
+		irvtd_start_timer( driver);
 
-	switch(pi){
+		if(driver->cts_stoptx)
+			return;
+
+		/* 
+		 * driver->tty->write_wait will keep asleep if
+		 * our txbuff is full.
+		 * now that we can send packets to IrTTP layer,
+		 * we kick it here.
+		 */
+		if ((driver->tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && 
+		    driver->tty->ldisc.write_wakeup)
+			(driver->tty->ldisc.write_wakeup)(driver->tty);
+		return;
+	}
+
+	if(cmd == TX_BUSY){
+		driver->ttp_stoptx = driver->tty->hw_stopped = 1;
+		del_timer( &driver->timer);
+		return;
+	}
+
+
+	ASSERT(cmd == CONTROL_CHANNEL,return;);
+
+	switch(driver->comm->pi){
 
 	case DCELINE_STATE:
 	driver->msr = driver->comm->peer_dce;
@@ -591,19 +509,23 @@
 		wake_up_interruptible(&driver->delta_msr_wait);
 	}
 
-	if ((driver->flags & IRVTD_ASYNC_CHECK_CD) && (driver->msr & DELTA_DCD)) {
+	if ((driver->flags & ASYNC_CHECK_CD) && (driver->msr & DELTA_DCD)) {
 
 		DEBUG(0,"CD now %s...\n",
 		      (driver->msr & MSR_DCD) ? "on" : "off");
 
-		if (driver->msr & DELTA_DCD)
+		if (driver->msr & MSR_DCD)
+		{
+			/* DCD raised! */
 			wake_up_interruptible(&driver->open_wait);
-		else if (!((driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) &&
-			   (driver->flags & IRVTD_ASYNC_CALLOUT_NOHUP))) {
-
-                        DEBUG(0,"irvtd_control_indication:hangup..\n");
+		}
+		else
+		{
+			/* DCD falled */
+                        DEBUG(0,__FUNCTION__"():hangup..\n");
 			tty_hangup(driver->tty);
 		}
+
 	}
 
 	if (driver->comm->flow_ctrl & USE_CTS) {
@@ -632,102 +554,44 @@
 
 				driver->cts_stoptx = 1;
 				driver->tty->hw_stopped = 1;
-/* 				driver->IER &= ~UART_IER_THRI; */
-/* 				serial_out(info, UART_IER, info->IER); */
                         }
                 }
         }
-
-
 	break;
 
-	case TX_READY:
-		driver->ttp_stoptx = 0;
-		driver->tty->hw_stopped = driver->cts_stoptx;
-
-		/* 
-		 * driver->tty->write_wait will keep asleep if
-		 * our txbuff is not empty.
-		 * so if we can really send a packet now,
-		 * send it and then wake it up.
-		 */
-
-		if(driver->cts_stoptx)
-			break;
-
-		flush_txbuff(driver);
-		if ((driver->tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && 
-		     driver->tty->ldisc.write_wakeup)
-			(driver->tty->ldisc.write_wakeup)(driver->tty);
-		break;
-
-	case TX_BUSY:
-		driver->ttp_stoptx = driver->tty->hw_stopped = 1;
-		break;
 	default:
-		DEBUG(0,"irvtd:unknown control..\n");
-	
+		DEBUG(0,__FUNCTION__"():PI = 0x%02x is not implemented\n",
+		      (int)driver->comm->pi);
 	}
 }
 
+/*
+ ***********************************************************************
+ *
+ * driver kernel interfaces
+ * these functions work as an interface between the kernel and this driver
+ *
+ ***********************************************************************
+ */
+
+
 
 /*
  * ----------------------------------------------------------------------
  * irvtd_open() and friends
  *
- * 
  * ----------------------------------------------------------------------
  */
 
 
-static int irvtd_block_til_ready(struct tty_struct *tty, struct file * filp,
-				 struct irvtd_cb *driver)
-{
-
- 	struct wait_queue wait = { current, NULL };
-	int		retval;
-	int		do_clocal = 0;
-
-	/*
-	 * If the device is in the middle of being closed, then block
-	 * (sleep) until it's done, and (when being woke up)then try again.
-	 */
-
-	if (tty_hung_up_p(filp) ||
-	    (driver->flags & IRVTD_ASYNC_CLOSING)) {
-		if (driver->flags & IRVTD_ASYNC_CLOSING)
-			interruptible_sleep_on(&driver->close_wait);
-#ifdef DO_RESTART
-		if (driver->flags & IRVTD_ASYNC_HUP_NOTIFY)
-			return -EAGAIN;
-		else
-			return -ERESTARTSYS;
-#else
-		return -EAGAIN;
-#endif
-	}
-
-	/*
-	 * If this is a callout device, then just make sure the normal
-	 * device isn't being used.
-	 */
+static int irvtd_block_til_ready(struct tty_struct *tty, struct file * filp,
+				 struct irvtd_cb *driver)
+{
 
-	if (tty->driver.subtype == IRVTD_TYPE_CALLOUT) {
-		if (driver->flags & IRVTD_ASYNC_NORMAL_ACTIVE)
-			return -EBUSY;
-		if ((driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) &&
-		    (driver->flags & IRVTD_ASYNC_SESSION_LOCKOUT) &&
-		    (driver->session != current->session))
-			return -EBUSY;
-		if ((driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) &&
-		    (driver->flags & IRVTD_ASYNC_PGRP_LOCKOUT) &&
-		    (driver->pgrp != current->pgrp))
-			return -EBUSY;
+ 	struct wait_queue wait = { current, NULL };
+	int		retval = 0;
+	int		do_clocal = 0;
 
-		driver->flags |= IRVTD_ASYNC_CALLOUT_ACTIVE;
-		return 0;
-	}
-	
 	/*
 	 * If non-blocking mode is set, or the port is not enabled,
 	 * then make the check up front and then exit.
@@ -735,64 +599,48 @@
 
 	if ((filp->f_flags & O_NONBLOCK) ||
 	    (tty->flags & (1 << TTY_IO_ERROR))) {
-		if (driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE)
-			return -EBUSY;
 
-		driver->flags |= IRVTD_ASYNC_NORMAL_ACTIVE;
 		return 0;
 	}
 
-	if (driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) {
-		if (driver->normal_termios.c_cflag & CLOCAL)
-			do_clocal = 1;
-	} else {
-		if (tty->termios->c_cflag & CLOCAL)
-			do_clocal = 1;
-	}
-	
+	if (tty->termios->c_cflag & CLOCAL)
+		do_clocal = 1;
+
+
 	/*
 	 * We wait until ircomm_connect_request() succeed or
 	 *   ircomm_connect_indication comes
-	 *
-	 * This is what is written in serial.c:
-	 * "Block waiting for the carrier detect and the line to become
-	 * free (i.e., not in use by the callout).  While we are in
-	 * this loop, driver->count is dropped by one, so that
-	 * rs_close() knows when to free things.  We restore it upon
-	 * exit, either normal or abnormal."
 	 */
 
-	retval = 0;
+
 	add_wait_queue(&driver->open_wait, &wait);
 
-	DEBUG(0,"block_til_ready before block: line%d, count = %d\n",
-	       driver->line, driver->count);
+	DEBUG(0,__FUNCTION__"():before block( line = %d, count = %d )\n",
+	      driver->line, driver->count);
 
-	cli();
-	if (!tty_hung_up_p(filp)) 
-		driver->count--;
-	sti();
 	driver->blocked_open++;
 
-
+	/* wait for a connection established */
 	while (1) {
 		current->state = TASK_INTERRUPTIBLE;
+		
+		if (driver->comm->state == COMM_CONN){
+			/* 
+			 * signal DTR and RTS
+			 */
+			driver->comm->dte = driver->mcr |= (MCR_DTR  |
+							    MCR_RTS  |
+							    DELTA_DTR|
+							    DELTA_RTS );
 
-	if (!(driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) &&
-	    (driver->comm->state == COMM_CONN)){
-		/* 
-		 * signal DTR and RTS
-		 */
-		driver->comm->dte = driver->mcr |= (MCR_DTR | MCR_RTS |DELTA_DTR|DELTA_RTS);
+			ircomm_control_request(driver->comm, DTELINE_STATE);
+		}
 
-		ircomm_append_ctrl(driver->comm, DTELINE_STATE);
-		ircomm_control_request(driver->comm);
-	}
 
 		if (tty_hung_up_p(filp) ||
-		    !(driver->flags & IRVTD_ASYNC_INITIALIZED)) {
+		    !(driver->flags & ASYNC_INITIALIZED)) {
 #ifdef DO_RESTART
-			if (driver->flags & IRVTD_ASYNC_HUP_NOTIFY)
+			if (driver->flags & ASYNC_HUP_NOTIFY)
 				retval = -EAGAIN;
 			else
 				retval = -ERESTARTSYS;	
@@ -802,15 +650,9 @@
 			break;
 		}
 
-		/*
-		 * if clocal == 0 or received DCD or state become CONN,then break
-		 */
-
-		if (!(driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) &&
-		    !(driver->flags & IRVTD_ASYNC_CLOSING) &&
+		if (!(driver->flags & ASYNC_CLOSING) &&
 		    (driver->comm->state == COMM_CONN) && 
-		    ( do_clocal || (driver->msr & MSR_DCD) )
-		    )
+		    ( do_clocal || (driver->msr & MSR_DCD)))
 			break;
 
 		if(signal_pending(current)){
@@ -818,63 +660,51 @@
 			break;
 		}
 
-#ifdef IRVTD_DEBUG_OPEN
-		printk(KERN_INFO"block_til_ready blocking:"
-		       " ttys%d, count = %d\n", driver->line, driver->count);
-#endif
+
+		DEBUG(4,__FUNCTION__"():blocking( %s%d, count = %d )\n",
+		      tty->driver.name, driver->line, driver->count);
+
 		schedule();
 	}
 
 	current->state = TASK_RUNNING;
 	remove_wait_queue(&driver->open_wait, &wait);
 
-	if (!tty_hung_up_p(filp))
-		driver->count++;
 	driver->blocked_open--;
-#ifdef IRVTD_DEBUG_OPEN
-	printk("block_til_ready after blocking: ttys%d, count = %d\n",
-	       driver->line, driver->count);
-#endif
+
+	DEBUG(0, __FUNCTION__"():after blocking\n");
+
 	if (retval)
 		return retval;
-	driver->flags |= IRVTD_ASYNC_NORMAL_ACTIVE;
 	return 0;
 }	
 
-static void change_speed(struct irvtd_cb *driver){
-
+static void change_speed(struct irvtd_cb *driver)
+{
 	unsigned cflag,cval;
 
 	if (!driver->tty || !driver->tty->termios || !driver->comm)
 		return;
 	cflag = driver->tty->termios->c_cflag;
 
-
-
-	/*
-	 * change baud rate here. but not implemented now
-	 */
-
-
-
-
 	/* 
 	 * byte size and parity
 	 */
-	switch (cflag & CSIZE) {
-	      case CS5: cval = 0x00; break;
-	      case CS6: cval = 0x01; break;
-	      case CS7: cval = 0x02; break;
-	      case CS8: cval = 0x03; break;
-	      default:  cval = 0x00; break;	/* too keep GCC shut... */
+	switch (cflag & CSIZE) 
+	{
+	case CS5: cval = IRCOMM_WLEN5; break;
+	case CS6: cval = IRCOMM_WLEN6; break;
+	case CS7: cval = IRCOMM_WLEN7; break;
+	case CS8: cval = IRCOMM_WLEN8; break;
+	default:  cval = IRCOMM_WLEN5; break;	/* too keep GCC shut... */
 	}
 	if (cflag & CSTOPB) {      /* use 2 stop bit mode */
-		cval |= 0x04;
+		cval |= IRCOMM_STOP2;
 	}
 	if (cflag & PARENB)
-		cval |= 0x08;
+		cval |= IRCOMM_PARENB;    /* enable parity check */
 	if (!(cflag & PARODD))
-		cval |= 0x10;
+		cval |= IRCOMM_PAREVEN;         /* even parity */
 	
 	/* CTS flow control flag and modem status interrupts */
 
@@ -884,74 +714,69 @@
 		driver->comm->flow_ctrl |= ~USE_CTS;
 	
 	if (cflag & CLOCAL)
-		driver->flags &= ~IRVTD_ASYNC_CHECK_CD;
+		driver->flags &= ~ASYNC_CHECK_CD;
 	else
-		driver->flags |= IRVTD_ASYNC_CHECK_CD;
+		driver->flags |= ASYNC_CHECK_CD;
 	
 	/*
 	 * Set up parity check flag
 	 */
 
-	driver->read_status_mask = LSR_OE ;
+	driver->read_status_mask = LSR_OE;
 	if (I_INPCK(driver->tty))
 		driver->read_status_mask |= LSR_FE | LSR_PE;
 	if (I_BRKINT(driver->tty) || I_PARMRK(driver->tty))
 		driver->read_status_mask |= LSR_BI;
 	
+	/*
+	 * Characters to ignore
+	 */
 	driver->ignore_status_mask = 0;
+	if (I_IGNPAR(driver->tty))
+		driver->ignore_status_mask |= LSR_PE | LSR_FE;
 
 	if (I_IGNBRK(driver->tty)) {
 		driver->ignore_status_mask |= LSR_BI;
-		driver->read_status_mask |= LSR_BI;
 		/*
 		 * If we're ignore parity and break indicators, ignore 
 		 * overruns too.  (For real raw support).
 		 */
-		if (I_IGNPAR(driver->tty)) {
-			driver->ignore_status_mask |= LSR_OE | \
-				LSR_PE | LSR_FE;
-			driver->read_status_mask |= LSR_OE | \
-				LSR_PE | LSR_FE;
-		}
+		if (I_IGNPAR(driver->tty)) 
+			driver->ignore_status_mask |= LSR_OE;
 	}
-	driver->comm->data_format = cval;
-	ircomm_append_ctrl(driver->comm, DATA_FORMAT);
- 	ircomm_append_ctrl(driver->comm, FLOW_CONTROL);
-	ircomm_control_request(driver->comm);
 
-	/* output to IrCOMM here*/
+	driver->comm->data_format = cval;
+	ircomm_control_request(driver->comm, DATA_FORMAT);
+ 	ircomm_control_request(driver->comm, FLOW_CONTROL);
 }
 
 
 
 
-static int irvtd_startup(struct irvtd_cb *driver){
-
+static int irvtd_startup(struct irvtd_cb *driver)
+{
+	int retval = 0;
+	struct ias_object* obj;
 	struct notify_t irvtd_notify;
 
+	/* FIXME: it should not be hard coded */
+	__u8 oct_seq[6] = { 0,1,4,1,1,1 }; 
 
-	DEBUG(4,"irvtd_startup:\n" );
+	DEBUG(4,__FUNCTION__"()\n" );
+	if(driver->flags & ASYNC_INITIALIZED)
+		return 0;
 
 	/*
 	 * initialize our tx/rx buffer
 	 */
 
-	if(driver->flags & IRVTD_ASYNC_INITIALIZED)
-		return(0);
-
 	skb_queue_head_init(&driver->rxbuff);
-	driver->rx_tqueue.data = driver;
-	driver->rx_tqueue.routine = irvtd_write_to_tty;
-
-	if(!driver->txbuff){
-		driver->txbuff = dev_alloc_skb(COMM_DEFAULT_DATA_SIZE); 
-		if (!driver->txbuff){
-			DEBUG(0,"irvtd_open():alloc_skb failed!\n");
-			return -ENOMEM;
-		}
-
-		skb_reserve(driver->txbuff, COMM_HEADER_SIZE);
+	driver->txbuff = dev_alloc_skb(COMM_DEFAULT_DATA_SIZE); 
+	if (!driver->txbuff){
+		DEBUG(0,__FUNCTION__"():alloc_skb failed!\n");
+		return -ENOMEM;
 	}
+	skb_reserve(driver->txbuff, COMM_HEADER_SIZE);
 
 	irda_notify_init(&irvtd_notify);
 	irvtd_notify.data_indication = irvtd_receive_data;
@@ -959,19 +784,38 @@
 	irvtd_notify.connect_indication = irvtd_connect_indication;
 	irvtd_notify.disconnect_indication = irvtd_disconnect_indication;
 	irvtd_notify.flow_indication = irvtd_control_indication;
+	strncpy( irvtd_notify.name, "ircomm_tty", NOTIFY_MAX_NAME);
 	irvtd_notify.instance = driver;
-	strncpy( irvtd_notify.name, "irvtd", NOTIFY_MAX_NAME);
 
+	driver->comm = ircomm_open_instance(irvtd_notify);
+	if(!driver->comm){
+		return -ENODEV;
+	}
+
+
+	/* 
+         *  Register with LM-IAS as a server
+         */
+
+	obj = irias_new_object( "IrDA:IrCOMM", IAS_IRCOMM_ID);
+	irias_add_integer_attrib( obj, "IrDA:TinyTP:LsapSel", 
+				  driver->comm->tsap->stsap_sel );
+
+	irias_add_octseq_attrib( obj, "Parameters", &oct_seq[0], 6);
+	irias_insert_object( obj);
+
+	driver->flags |= ASYNC_INITIALIZED;
 	/*
-	 * register ourself as a service user of IrCOMM
-	 *	   TODO: other servicetype(i.e. 3wire,3wireraw) 
+	 * discover a peer device
+	 *	   TODO: other servicetype(i.e. 3wire,3wireraw) support
 	 */
+	retval = ircomm_query_ias_and_connect(driver->comm, NINE_WIRE);
+	if(retval){
+		DEBUG(0, __FUNCTION__"(): ircomm_query_ias returns %d\n",
+		      retval);
+		return retval;
+	}
 
-	driver->comm = ircomm_attach_cable(NINE_WIRE, irvtd_notify,
-					   irvtd_attached);
-	if(driver->comm == NULL)
-		return -ENODEV;
-	
 	/*
 	 * TODO:we have to initialize control-channel here!
 	 *   i.e.set something into RTS,CTS and so on....
@@ -981,63 +825,83 @@
 		clear_bit(TTY_IO_ERROR, &driver->tty->flags);
 
 	change_speed(driver);
+	irvtd_start_timer( driver);
 
-	driver->flags |= IRVTD_ASYNC_INITIALIZED;
+	driver->rx_disable = 0;
+	driver->tx_disable = 1;
+	driver->disconnect_pend = 0;
 	return 0;
 }
 
 
-int irvtd_open(struct tty_struct * tty, struct file * filp){
-	
+int irvtd_open(struct tty_struct * tty, struct file * filp)
+{
 	struct irvtd_cb *driver;
 	int retval;
 	int line;
 
-	DEBUG(4, "irvtd_open():\n");
+	DEBUG(4, __FUNCTION__"():\n");
+	MOD_INC_USE_COUNT;
 
 	line = MINOR(tty->device) - tty->driver.minor_start;
-	if ((line <0) || (line >= COMM_MAX_TTY))
+	if ((line <0) || (line >= COMM_MAX_TTY)){
+		MOD_DEC_USE_COUNT;
 		return -ENODEV;
+	}
+
 	driver = irvtd[line];
-	driver->line = line;
+	ASSERT(driver != NULL, MOD_DEC_USE_COUNT;return -ENOMEM;);
+	ASSERT(driver->magic == IRVTD_MAGIC, MOD_DEC_USE_COUNT;return -EINVAL;);
+
 	driver->count++;
 
-	DEBUG(0, "irvtd_open : %s%d count %d\n", tty->driver.name, line, 
+	DEBUG(0, __FUNCTION__"():%s%d count %d\n", tty->driver.name, line, 
 	      driver->count);
 	
 	tty->driver_data = driver;
 	driver->tty = tty;
 
-	
+	driver->tty->low_latency = (driver->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+
+	/*
+	 * If the device is in the middle of being closed, then block
+	 * (sleep) until it's done, then exit.
+	 */
+
+	if (tty_hung_up_p(filp) ||
+	    (driver->flags & ASYNC_CLOSING)) {
+		if (driver->flags & ASYNC_CLOSING)
+			interruptible_sleep_on(&driver->close_wait);
+#ifdef DO_RESTART
+		if (driver->flags & ASYNC_HUP_NOTIFY)
+			return -EAGAIN;
+		else
+			return -ERESTARTSYS;
+#else
+		return -EAGAIN;
+#endif
+	}
+
 	/* 
 	 * start up discovering process and ircomm_layer 
 	 */
 	
 	retval = irvtd_startup(driver);
-	if (retval)
+	if (retval){
+		DEBUG(0, __FUNCTION__"():irvtd_startup returns %d\n",retval);
 		return retval;
-	MOD_INC_USE_COUNT;
+	}
 
 	retval = irvtd_block_til_ready(tty, filp, driver);
 	if (retval){
-		DEBUG(0,"irvtd_open returning after block_til_ready with %d\n",
-		      retval);
+		DEBUG(0,__FUNCTION__
+		      "():returning after block_til_ready (errno = %d)\n", retval);
                 return retval;
 	}
 
-	if ((driver->count == 1) && driver->flags & IRVTD_ASYNC_SPLIT_TERMIOS){
-		if(tty->driver.subtype == IRVTD_TYPE_NORMAL)
-			*tty->termios = driver->normal_termios;
-		else
-			*tty->termios = driver->callout_termios;
-
- 		change_speed(driver);
-	}
-	
 	driver->session = current->session;
 	driver->pgrp = current->pgrp;
-	driver->rx_disable = 0;
-	return (0);
+	return 0;
 }
 
 
@@ -1052,15 +916,55 @@
  * ----------------------------------------------------------------------
  */
 
+/*
+ * Function irvtd_wait_until_sent (tty, timeout)
+ *
+ *    wait until Tx queue of IrTTP is empty 
+ *
+ */
+static void irvtd_wait_until_sent(struct tty_struct *tty, int timeout)
+{
+	struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
+	unsigned long orig_jiffies;
+
+	ASSERT(driver != NULL, return;);
+	ASSERT(driver->magic == IRVTD_MAGIC, return;);
+	ASSERT(driver->comm != NULL, return;);
+
+	DEBUG(0, __FUNCTION__"():\n");	
+	if(!tty->closing)
+		return;   /* nothing to do */
+	
+	/* 
+	 * at disconnection, we should wait until Tx queue of IrTTP is
+	 * flushed
+	 */
+
+ 	ircomm_disconnect_request(driver->comm, NULL, P_NORMAL);
+	orig_jiffies = jiffies;
+
+	while (driver->comm->tsap->disconnect_pend) {
+		DEBUG(0, __FUNCTION__"():wait..\n");
+		current->state = TASK_INTERRUPTIBLE;
+		current->counter = 0;	/* make us low-priority */
+		schedule_timeout(HZ);    /* 1sec */
+		if (signal_pending(current))
+			break;
+		if (timeout && time_after(jiffies, orig_jiffies + timeout))
+			break;
+	}
+	current->state = TASK_RUNNING;
+}
+
 
 static void irvtd_shutdown(struct irvtd_cb * driver)
 {
 	unsigned long	flags;
 
-	if (!(driver->flags & IRVTD_ASYNC_INITIALIZED))
+	if (!(driver->flags & ASYNC_INITIALIZED))
 		return;
 
-	DEBUG(4,"irvtd_shutdown:\n");
+	DEBUG(0,__FUNCTION__"()\n");
 
 	/*
 	 * This comment is written in serial.c:
@@ -1075,8 +979,8 @@
  		driver->mcr &= ~(MCR_DTR|MCR_RTS);
 
 	driver->comm->dte = driver->mcr;
-	ircomm_append_ctrl(driver->comm, DTELINE_STATE );
-	ircomm_control_request(driver->comm);
+	ircomm_control_request(driver->comm, DTELINE_STATE );
+
 
 
 	save_flags(flags); cli(); /* Disable interrupts */
@@ -1084,42 +988,49 @@
 	if (driver->tty)
 		set_bit(TTY_IO_ERROR, &driver->tty->flags);
 	
-	ircomm_detach_cable(driver->comm);
+	del_timer( &driver->timer);
+
+	irias_delete_object("IrDA:IrCOMM");
 
 	/*
 	 * Free the transmit buffer here 
 	 */
+
+	while(skb_queue_len(&driver->rxbuff)){
+		struct sk_buff *skb;
+		skb = skb_dequeue( &driver->rxbuff);
+		dev_kfree_skb(skb);
+	}
 	if(driver->txbuff){
-		dev_kfree_skb(driver->txbuff);     /* is it OK?*/
+		dev_kfree_skb(driver->txbuff);
 		driver->txbuff = NULL;
 	}
-
-	driver->flags &= ~IRVTD_ASYNC_INITIALIZED;
+	ircomm_close_instance(driver->comm);
+	driver->comm = NULL;
+	driver->flags &= ~ASYNC_INITIALIZED;
 	restore_flags(flags);
 }
 
-
-
-void irvtd_close(struct tty_struct * tty, struct file * filp){
-
+void irvtd_close(struct tty_struct * tty, struct file * filp)
+{
 	struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
 	int line;
 	unsigned long flags;
 
-	DEBUG(0, "irvtd_close:refc(%d)\n",ircomm_vsd_refcount);
+	DEBUG(0, __FUNCTION__"():refcount= %d\n",irvtd_refcount);
 
 	ASSERT(driver != NULL, return;);
 	ASSERT(driver->magic == IRVTD_MAGIC, return;);
 
 	save_flags(flags);cli();
 
-	/* 
-	 * tty_hung_up_p() is defined as 
-	 *   " return(filp->f_op == &hung_up_tty_fops); "
-	 *	 see driver/char/tty_io.c
-	 */
 
 	if(tty_hung_up_p(filp)){
+		/*
+		 * upper tty layer caught a HUP signal and called irvtd_hangup()
+		 * before. so we do nothing here.
+		 */
+		DEBUG(0, __FUNCTION__"():tty_hung_up_p.\n");
 		MOD_DEC_USE_COUNT;
 		restore_flags(flags);
 		return;
@@ -1127,7 +1038,7 @@
 	
 
 	line = MINOR(tty->device) - tty->driver.minor_start;
-	DEBUG(0, "irvtd_close : %s%d count %d\n", tty->driver.name, line, 
+	DEBUG(0, __FUNCTION__"():%s%d count %d\n", tty->driver.name, line, 
 	      driver->count);
 
 	if ((tty->count == 1) && (driver->count != 1)) {
@@ -1143,313 +1054,207 @@
 		driver->count = 1;
 	}
 	if (--driver->count < 0) {
-		printk("irvtd_close: bad count for line%d: %d\n",
+		printk(KERN_ERR"irvtd_close: bad count for line%d: %d\n",
 		       line, driver->count);
 		driver->count = 0;
 	}
 
 	if (driver->count) { 	/* do nothing */
+		DEBUG(0, __FUNCTION__"():driver->count is not 0\n");
 		MOD_DEC_USE_COUNT;
 		restore_flags(flags);
 		return; 
 	}
 
-	driver->flags |= IRVTD_ASYNC_CLOSING;
-	
-	/*
-	 * Save the termios structure, since this port may have
-	 * separate termios for callout and dialin.
-	 */
-
-	if (driver->flags & IRVTD_ASYNC_NORMAL_ACTIVE)
-		driver->normal_termios = *tty->termios;
-	if (driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE)
-		driver->callout_termios = *tty->termios;
+	driver->flags |= ASYNC_CLOSING;
 	
 	/*
 	 * Now we wait for the transmit buffer to clear; and we notify 
 	 * the line discipline to only process XON/XOFF characters.
 	 */
 	tty->closing = 1;
-	if (driver->closing_wait != IRVTD_ASYNC_CLOSING_WAIT_NONE)
+	if (driver->closing_wait != ASYNC_CLOSING_WAIT_NONE){
+		DEBUG(4, __FUNCTION__"():calling tty_wait_until_sent()\n");
 		tty_wait_until_sent(tty, driver->closing_wait);
+	}
+	/* 
+	 * we can send disconnect_request with P_HIGH since
+	 * tty_wait_until_sent() and irvtd_wait_until_sent() should
+	 * have disconnected the link
+	 */
+	ircomm_disconnect_request(driver->comm, NULL, P_HIGH);
 	
 	/* 
 	 * Now we stop accepting input.
 	 */
 
 	driver->rx_disable = TRUE;
-
-	/* 
-	 * Now we flush our buffer.., and shutdown ircomm service layer
-	 */
-
-	/* drop our tx/rx buffer */
- 	if (tty->driver.flush_buffer) 
- 		tty->driver.flush_buffer(tty);  
-
-	while(skb_queue_len(&driver->rxbuff)){
-		struct sk_buff *skb;
-		skb = skb_dequeue( &driver->rxbuff);
-		dev_kfree_skb(skb);
-	}
-
-	/* drop users buffer? */
+	/* drop ldisc's buffer */
 	if (tty->ldisc.flush_buffer)
 		tty->ldisc.flush_buffer(tty);
 
-
+ 	if (tty->driver.flush_buffer) 
+ 		tty->driver.flush_buffer(driver->tty);  
 
 	tty->closing = 0;
 	driver->tty = NULL;
 
-	/*
-	 * ad-hoc coding:
-	 * we wait 2 sec before ircomm_detach_cable so that 
-	 * irttp will send all contents of its queue
-	 */
-
-#if 0
-	if (driver->blocked_open) {
+	if (driver->blocked_open)
+	{
 		if (driver->close_delay) {
-#endif
-
 			/* kill time */
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(driver->close_delay + 2*HZ);
-#if 0
+			schedule_timeout(driver->close_delay);
 		}
 		wake_up_interruptible(&driver->open_wait);
 	}
-#endif
-	
-	driver->flags &= ~(IRVTD_ASYNC_NORMAL_ACTIVE|
-			   IRVTD_ASYNC_CALLOUT_ACTIVE|
-			   IRVTD_ASYNC_CLOSING);
+	irvtd_shutdown(driver);
+	driver->flags &= ~ASYNC_CLOSING;
         wake_up_interruptible(&driver->close_wait); 
 
-	irvtd_shutdown(driver);
 	MOD_DEC_USE_COUNT;
         restore_flags(flags);
-	DEBUG(4,"irvtd_close:done:refc(%d)\n",ircomm_vsd_refcount);
+	DEBUG(4, __FUNCTION__"():done\n");
 }
 
-
-
 /*
  * ----------------------------------------------------------------------
  * irvtd_write() and friends
  * This routine will be called when something data are passed from
  * kernel or user.
- *
- * NOTE:I have stolen copy_from_user() from 2.0.30 kernel(linux/isdnif.h)
- * to access user space of memory carefully. Thanks a lot!:)
  * ----------------------------------------------------------------------
  */
 
 int irvtd_write(struct tty_struct * tty, int from_user,
-			const unsigned char *buf, int count){
-
-	struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
+		const unsigned char *buf, int count)
+{
+	struct irvtd_cb *driver;
 	int c = 0;
 	int wrote = 0;
-	struct sk_buff *skb = NULL;
+ 	unsigned long flags;
+	struct sk_buff *skb;
 	__u8 *frame;
 
-	DEBUG(4, "irvtd_write():\n");
+	ASSERT(tty != NULL, return -EFAULT;);
+	driver = (struct irvtd_cb *)tty->driver_data;
+	ASSERT(driver != NULL, return -EFAULT;);
+	ASSERT(driver->magic == IRVTD_MAGIC, return -EFAULT;);
 
-	if (!tty || !driver->txbuff)
-                return 0;
+	DEBUG(4, __FUNCTION__"()\n");
 
 
-	
+	save_flags(flags);
 	while(1){
+		cli();
 		skb = driver->txbuff;
-		
-		c = MIN(count, (skb_tailroom(skb) - COMM_HEADER_SIZE));
-		if (c <= 0) 
+		ASSERT(skb != NULL, break;);
+		c = MIN(count, (skb_tailroom(skb)));
+		if (c <= 0)
 			break;
 
 		/* write to the frame */
 
-
 		frame = skb_put(skb,c);
 		if(from_user){
 			copy_from_user(frame,buf,c);
 		} else
 			memcpy(frame, buf, c);
 
-		/* flush the frame */
-		irvtd_flush_chars(tty);
+		restore_flags(flags);
 		wrote += c;
 		count -= c;
+		buf += c;
 	}
+	restore_flags(flags);
 	return (wrote);
 }
 
 /*
- * ----------------------------------------------------------------------
- * irvtd_put_char()
- * This routine is called by the kernel to pass a single character.
- * If we exausted our buffer,we can ignore the character!
- * ----------------------------------------------------------------------
+ * Function irvtd_put_char (tty, ch)
+ *
+ *    This routine is called by the kernel to pass a single character.
+ *    If we exausted our buffer,we can ignore the character!
+ *
  */
-void irvtd_put_char(struct tty_struct *tty, unsigned char ch){
-
+void irvtd_put_char(struct tty_struct *tty, unsigned char ch)
+{
 	__u8 *frame ;
 	struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
-	struct sk_buff *skb = driver->txbuff;
+	struct sk_buff *skb;
+	unsigned long flags;
 
-	ASSERT(tty->driver_data != NULL, return;);
+	ASSERT(driver != NULL, return;);
+	DEBUG(4, __FUNCTION__"()\n");
 
-	DEBUG(4, "irvtd_put_char:\n");
-	if(!driver->txbuff)
-		return;
 
+	save_flags(flags);cli();
+	skb = driver->txbuff;
+	ASSERT(skb != NULL,return;);
+	ASSERT(skb_tailroom(skb) > 0, return;);
 	DEBUG(4, "irvtd_put_char(0x%02x) skb_len(%d) MAX(%d):\n",
-	      (int)ch ,(int)skb->len,
-	      driver->comm->maxsdusize - COMM_HEADER_SIZE);
-
-	/* append a character  */
-
-	frame = skb_put(skb,1);
-	frame[0] = ch;
-	return;
-}
-
-/*
- * ----------------------------------------------------------------------
- * irvtd_flush_chars() and friend
- * This routine will be called after a series of characters was written using 
- * irvtd_put_char().We have to send them down to IrCOMM.
- * ----------------------------------------------------------------------
- */
-
-static void flush_txbuff(struct irvtd_cb *driver){
-	
-	struct sk_buff *skb = driver->txbuff;
-	struct tty_struct *tty = driver->tty;
-	ASSERT(tty != NULL, return;);
-
-#ifdef IRVTD_DEBUG_TX
-	printk("flush_txbuff:");
-	{
-		int i;
-		for ( i=0;i<skb->len;i++)
-			printk("%02x", skb->data[i]);
-		printk("\n");
-	}
-#else
-	DEBUG(4, "flush_txbuff:count(%d)\n",(int)skb->len);
-#endif
-
-	/* add "clen" field */
-	skb_push(skb,1);
-	skb->data[0]=0;          /* without control channel */
-
-	ircomm_data_request(driver->comm, driver->txbuff);
-
-	/* allocate new frame */
-	skb = driver->txbuff = dev_alloc_skb(driver->comm->max_txbuff_size);
-	if (skb == NULL){
-		printk(KERN_ERR"flush_txbuff():alloc_skb failed!\n");
-	} else {
-		skb_reserve(skb, COMM_HEADER_SIZE);
-	}
-	wake_up_interruptible(&driver->tty->write_wait);
-}
-
-void irvtd_flush_chars(struct tty_struct *tty){
-
-	struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
-	if(!driver || driver->magic != IRVTD_MAGIC || !driver->txbuff){
-		DEBUG(0,"irvtd_flush_chars:null structure:ignore\n");
-		return;
-	}
-	DEBUG(4, "irvtd_flush_chars():\n");
-
-	while(tty->hw_stopped){
-		DEBUG(4,"irvtd_flush_chars:hw_stopped:sleep..\n");
-		tty_wait_until_sent(tty,0);
-		DEBUG(4,"irvtd_flush_chars:waken up!\n");
-		if(!driver->txbuff->len)
-			return;
-	}
-
-	flush_txbuff(driver);
-}
-
+	      (int)ch ,(int)skb->len,
+	      driver->comm->max_txbuff_size - COMM_HEADER_SIZE);
 
+	/* append a character  */
+	frame = skb_put(skb,1);
+	frame[0] = ch;
 
+	restore_flags(flags);
+	return;
+}
 
 /*
- * ----------------------------------------------------------------------
- * irvtd_write_room()
- * This routine returns the room that our buffer has now.
+ * Function irvtd_write_room (tty)
+ *
+ *    This routine returns the room that our buffer has now.
  *
- * NOTE: 
- * driver/char/n_tty.c drops a character(s) when this routine returns 0,
- * and then linux will be frozen after a few minutes :(    why? bug?
- * ( I found this on linux-2.0.33 )
- * So this routine flushes a buffer if there is few room,     TH
- * ----------------------------------------------------------------------
  */
-
 int irvtd_write_room(struct tty_struct *tty){
 
 	int ret;
-	struct sk_buff *skb = (struct sk_buff *)((struct irvtd_cb *) tty->driver_data)->txbuff;
-
-	if(!skb){
-		DEBUG(0,"irvtd_write_room:NULL skb\n");
-		return(0);
-	}
-
-	ret = skb_tailroom(skb) - COMM_HEADER_SIZE;
+	struct sk_buff *skb = ((struct irvtd_cb *) tty->driver_data)->txbuff;
 
-	if(ret < 0){
-		DEBUG(0,"irvtd_write_room:error:room is %d!",ret);
-		ret = 0;
-	}
-	DEBUG(4, "irvtd_write_room:\n");
-	DEBUG(4, "retval(%d)\n",ret);
+	ASSERT(skb !=NULL, return 0;);
 
+	ret = skb_tailroom(skb);
 
-	/* flush buffer automatically to avoid kernel freeze :< */
-	if(ret < 8)    /* why 8? there's no reason :) */
-		irvtd_flush_chars(tty);
+	DEBUG(4, __FUNCTION__"(): room is %d bytes\n",ret);
 
 	return(ret);
 }
 
 /*
- * ----------------------------------------------------------------------
- * irvtd_chars_in_buffer()
- * This function returns how many characters which have not been sent yet 
- * are still in buffer.
- * ----------------------------------------------------------------------
+ * Function irvtd_chars_in_buffer (tty)
+ *
+ *    This function returns how many characters which have not been sent yet 
+ *    are still in buffer.
+ *
  */
-
 int irvtd_chars_in_buffer(struct tty_struct *tty){
 
-	struct sk_buff *skb = 
-		(struct sk_buff *) ((struct irvtd_cb *)tty->driver_data) ->txbuff;
-	DEBUG(4, "irvtd_chars_in_buffer()\n");
-
-	if(!skb){
-		printk(KERN_ERR"irvtd_chars_in_buffer:NULL skb\n");
-		return(0);
-	}
+	struct sk_buff *skb;
+	unsigned long flags;
+
+	DEBUG(4, __FUNCTION__"()\n");
+
+	save_flags(flags);cli();
+	skb = ((struct irvtd_cb *) tty->driver_data)->txbuff;
+	if(skb == NULL) goto err;
+
+	restore_flags(flags);
 	return (skb->len );
+err:	
+	ASSERT(skb != NULL, ;);
+	restore_flags(flags);
+	return 0;   /* why not -EFAULT or such? see driver/char/serial.c */
 }
 
 /*
- * ----------------------------------------------------------------------
- * irvtd_break()
- * routine which turns the break handling on or off
- * ----------------------------------------------------------------------
+ * Function irvtd_break (tty, break_state)
+ *
+ *    Routine which turns the break handling on or off
+ *
  */
-
 static void irvtd_break(struct tty_struct *tty, int break_state){
 	
  	struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
@@ -1463,14 +1268,14 @@
 	if (break_state == -1)
 	{
 		driver->comm->break_signal = 0x01;
-		ircomm_append_ctrl(driver->comm, BREAK_SIGNAL);
-		ircomm_control_request(driver->comm);
+		ircomm_control_request(driver->comm, BREAK_SIGNAL);
+
 	}
 	else
 	{
 		driver->comm->break_signal = 0x00;
-		ircomm_append_ctrl(driver->comm, BREAK_SIGNAL);
-		ircomm_control_request(driver->comm);
+		ircomm_control_request(driver->comm, BREAK_SIGNAL);
+
 	}
 
 	restore_flags(flags);
@@ -1497,8 +1302,7 @@
 		| ((driver->msr & DELTA_RI) ? TIOCM_RNG : 0)
 		| ((driver->msr & DELTA_DSR) ? TIOCM_DSR : 0)
 		| ((driver->msr & DELTA_CTS) ? TIOCM_CTS : 0);
-	put_user(result,value);
-	return 0;
+	return put_user(result,value);
 }
 
 static int set_modem_info(struct irvtd_cb * driver, unsigned int cmd,
@@ -1537,19 +1341,111 @@
 	}
 	
 	driver->comm->dte = driver->mcr;
-	ircomm_append_ctrl(driver->comm, DTELINE_STATE );
-	ircomm_control_request(driver->comm);
+	ircomm_control_request(driver->comm, DTELINE_STATE );
+
 	return 0;
 }
 
-int irvtd_ioctl(struct tty_struct *tty, struct file * file,
-		unsigned int cmd, unsigned long arg){
+static int get_serial_info(struct irvtd_cb * driver,
+			   struct serial_struct * retinfo)
+{
+	struct serial_struct tmp;
+   
+	if (!retinfo)
+		return -EFAULT;
+	memset(&tmp, 0, sizeof(tmp));
+	tmp.line = driver->line;
+	tmp.flags = driver->flags;
+	tmp.baud_base = driver->comm->data_rate;
+	tmp.close_delay = driver->close_delay;
+	tmp.closing_wait = driver->closing_wait;
+
+	/* for compatibility  */
+
+ 	tmp.type = PORT_16550A;
+ 	tmp.port = 0;
+ 	tmp.irq = 0;
+	tmp.xmit_fifo_size = 0;
+	tmp.hub6 = 0;   
+	tmp.custom_divisor = driver->custom_divisor;
+
+	if (copy_to_user(retinfo,&tmp,sizeof(*retinfo)))
+		return -EFAULT;
+	return 0;
+}
+
+static int set_serial_info(struct irvtd_cb * driver,
+			   struct serial_struct * new_info)
+{
+	struct serial_struct new_serial;
+	struct irvtd_cb old_driver;
+
+	if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
+		return -EFAULT;
+
+	old_driver = *driver;
+  
+	if (!capable(CAP_SYS_ADMIN)) {
+		if ((new_serial.baud_base != driver->comm->data_rate) ||
+		    (new_serial.close_delay != driver->close_delay) ||
+		    ((new_serial.flags & ~ASYNC_USR_MASK) !=
+		     (driver->flags & ~ASYNC_USR_MASK)))
+			return -EPERM;
+		driver->flags = ((driver->flags & ~ASYNC_USR_MASK) |
+				 (new_serial.flags & ASYNC_USR_MASK));
+		driver->custom_divisor = new_serial.custom_divisor;
+		goto check_and_exit;
+	}
 
+	/*
+	 * OK, past this point, all the error checking has been done.
+	 * At this point, we start making changes.....
+	 */
+
+	if(driver->comm->data_rate != new_serial.baud_base){
+		driver->comm->data_rate = new_serial.baud_base;
+		if(driver->comm->state == COMM_CONN)
+			ircomm_control_request(driver->comm,DATA_RATE);
+	}
+	driver->close_delay = new_serial.close_delay * HZ/100;
+	driver->closing_wait = new_serial.closing_wait * HZ/100;
+	driver->custom_divisor = new_serial.custom_divisor;
+
+	driver->flags = ((driver->flags & ~ASYNC_FLAGS) |
+			 (new_serial.flags & ASYNC_FLAGS));
+	driver->tty->low_latency = (driver->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+
+ check_and_exit:
+	if (driver->flags & ASYNC_INITIALIZED) {
+		if (((old_driver.flags & ASYNC_SPD_MASK) !=
+		     (driver->flags & ASYNC_SPD_MASK)) ||
+		    (old_driver.custom_divisor != driver->custom_divisor)) {
+			if ((driver->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
+				driver->tty->alt_speed = 57600;
+			if ((driver->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
+				driver->tty->alt_speed = 115200;
+			if ((driver->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
+				driver->tty->alt_speed = 230400;
+			if ((driver->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
+				driver->tty->alt_speed = 460800;
+			change_speed(driver);
+		}
+	}
+	return 0;
+}
+
+
+
+
+int irvtd_ioctl(struct tty_struct *tty, struct file * file,
+		unsigned int cmd, unsigned long arg)
+{
 	int error;
+	unsigned long flags;
  	struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
 
-	struct icounter_struct cnow;
-	struct icounter_struct *p_cuser;	/* user space */
+	struct serial_icounter_struct cnow,cprev;
+	struct serial_icounter_struct *p_cuser;	/* user space */
 
 
 	DEBUG(4,"irvtd_ioctl:requested ioctl(0x%08x)\n",cmd);
@@ -1557,7 +1453,6 @@
 #ifdef IRVTD_DEBUG_IOCTL
 	{
 		/* kill time so that debug messages will come slowly  */
-		unsigned long flags;
 		save_flags(flags);cli();
 		current->state = TASK_INTERRUPTIBLE;
 		current->timeout = jiffies + HZ/4; /*0.25sec*/
@@ -1572,7 +1467,6 @@
 	    (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT) &&
 	    (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
 		if (tty->flags & (1 << TTY_IO_ERROR)){
-			DEBUG(0,"irvtd_ioctl:I/O error...\n");
 			return -EIO;
 		}
 	}
@@ -1580,143 +1474,89 @@
 	switch (cmd) {
 
 	case TIOCMGET:
-		error = verify_area(VERIFY_WRITE, (void *) arg,
-				    sizeof(unsigned int));
-		if (error)
-			return error;
 		return get_modem_info(driver, (unsigned int *) arg);
 
 	case TIOCMBIS:
 	case TIOCMBIC:
 	case TIOCMSET:
 		return set_modem_info(driver, cmd, (unsigned int *) arg);
-#if 0
-	/*
-	 * we wouldn't implement them since we don't use serial_struct
-	 */
 	case TIOCGSERIAL:
-		error = verify_area(VERIFY_WRITE, (void *) arg,
-				    sizeof(struct serial_struct));
-		if (error)
-			return error;
-		return irvtd_get_serial_info(driver,
-				       (struct serial_struct *) arg);
+		return get_serial_info(driver, (struct serial_struct *) arg);
 	case TIOCSSERIAL:
-		error = verify_area(VERIFY_READ, (void *) arg,
-				    sizeof(struct serial_struct));
-		if (error)
-			return error;
-		return irvtd_set_serial_info(driver,
-				       (struct serial_struct *) arg);
-
-
-	case TIOCSERGETLSR: /* Get line status register */
-		error = verify_area(VERIFY_WRITE, (void *) arg,
-				    sizeof(unsigned int));
-		if (error)
-			return error;
-		else
-			return get_lsr_info(driver, (unsigned int *) arg);
-#endif		
-
-/*
- *  I think we don't need them
- */
-/* 	case TIOCSERCONFIG: */
-		
+		return set_serial_info(driver, (struct serial_struct *) arg);
 
-/*
- * They cannot be implemented because we don't use async_struct 
- * which is defined in serial.h
- */
-
-/* 	case TIOCSERGSTRUCT: */
-/* 		error = verify_area(VERIFY_WRITE, (void *) arg, */
-/* 				    sizeof(struct async_struct)); */
-/* 		if (error) */
-/* 			return error; */
-/* 		memcpy_tofs((struct async_struct *) arg, */
-/* 			    driver, sizeof(struct async_struct)); */
-/* 		return 0; */
-		
-/* 	case TIOCSERGETMULTI: */
-/* 		error = verify_area(VERIFY_WRITE, (void *) arg, */
-/* 				    sizeof(struct serial_multiport_struct)); */
-/* 		if (error) */
-/* 			return error; */
-/* 		return get_multiport_struct(driver, */
-/* 					    (struct serial_multiport_struct *) arg); */
-/* 	case TIOCSERSETMULTI: */
-/* 		error = verify_area(VERIFY_READ, (void *) arg, */
-/* 				    sizeof(struct serial_multiport_struct)); */
-/* 		if (error) */
-/* 			return error; */
-/* 		return set_multiport_struct(driver, */
-/* 					    (struct serial_multiport_struct *) arg); */
-		/*
-		 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)
-		 * to change
-		 * - mask passed in arg for lines of interest
- 		 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
-		 * Caller should use TIOCGICOUNT to see which one it was
-		 */
 
 	case TIOCMIWAIT:
+		save_flags(flags); cli();
+		/* note the counters on entry */
+		cprev = driver->icount;
+		restore_flags(flags);
 		while (1) {
 			interruptible_sleep_on(&driver->delta_msr_wait);
-			/* see if a signal did it */
-/* 			if (current->signal & ~current->blocked) */
-/* 				return -ERESTARTSYS; */
-
-			if ( ((arg & TIOCM_RNG) && (driver->msr & DELTA_RI))  ||
-			     ((arg & TIOCM_DSR) && (driver->msr & DELTA_DSR)) ||
-			     ((arg & TIOCM_CD)  && (driver->msr & DELTA_DCD)) ||
-			     ((arg & TIOCM_CTS) && (driver->msr & DELTA_CTS))) {
+				/* see if a signal did it */
+			if (signal_pending(current))
+				return -ERESTARTSYS;
+			save_flags(flags); cli();
+			cnow = driver->icount; /* atomic copy */
+			restore_flags(flags);
+			if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 
+			    cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
+				return -EIO; /* no change => error */
+			if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
+			     ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
+			     ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) ||
+			     ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
 				return 0;
 			}
+			cprev = cnow;
 		}
 		/* NOTREACHED */
 
-
 	case TIOCGICOUNT:
-		/* 
-		 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
-		 * Return: write counters to the user passed counter struct
-		 * NB: both 1->0 and 0->1 transitions are counted except for
-		 *     RI where only 0->1 is counted.
-		 */
-		error = verify_area(VERIFY_WRITE, (void *) arg,
-				    sizeof(struct icounter_struct));
-		if (error)
-			return error;
-		cli();
+		save_flags(flags); cli();
 		cnow = driver->icount;
-		sti();
-		p_cuser = (struct icounter_struct *) arg;
-		put_user(cnow.cts, &p_cuser->cts);
-		put_user(cnow.dsr, &p_cuser->dsr);
-		put_user(cnow.rng, &p_cuser->rng);
-		put_user(cnow.dcd, &p_cuser->dcd);
+		restore_flags(flags);
+		p_cuser = (struct serial_icounter_struct *) arg;
+		error = put_user(cnow.cts, &p_cuser->cts);
+		if (error) return error;
+		error = put_user(cnow.dsr, &p_cuser->dsr);
+		if (error) return error;
+		error = put_user(cnow.rng, &p_cuser->rng);
+		if (error) return error;
+		error = put_user(cnow.dcd, &p_cuser->dcd);
+		if (error) return error;
+		error = put_user(cnow.rx, &p_cuser->rx);
+		if (error) return error;
+		error = put_user(cnow.tx, &p_cuser->tx);
+		if (error) return error;
+		error = put_user(cnow.frame, &p_cuser->frame);
+		if (error) return error;
+		error = put_user(cnow.overrun, &p_cuser->overrun);
+		if (error) return error;
+		error = put_user(cnow.parity, &p_cuser->parity);
+		if (error) return error;
+		error = put_user(cnow.brk, &p_cuser->brk);
+		if (error) return error;
+		error = put_user(cnow.buf_overrun, &p_cuser->buf_overrun);
+		if (error) return error;			
 		return 0;
+		
+		
+		/* ioctls which are imcompatible with serial.c */
 
-
-	case TIOCGSERIAL:
-	case TIOCSSERIAL:
+	case TIOCSERGSTRUCT:
+		DEBUG(0,__FUNCTION__"():sorry, TIOCSERGSTRUCT is not supported\n");
+		return -ENOIOCTLCMD;  
 	case TIOCSERGETLSR:
+		DEBUG(0,__FUNCTION__"():sorry, TIOCSERGETLSR is not supported\n");
+		return -ENOIOCTLCMD;  
  	case TIOCSERCONFIG:
-	case TIOCSERGWILD:
-	case TIOCSERSWILD:
-	case TIOCSERGSTRUCT:
-	case TIOCSERGETMULTI:
-	case TIOCSERSETMULTI:
-		DEBUG(0,"irvtd_ioctl:sorry, ioctl(0x%08x)is not implemented\n",cmd);
-		return -ENOIOCTLCMD;  /* ioctls which are imcompatible with serial.c */
-
-	case TCSETS:
-	case TCGETS:
-	case TCFLSH:
+		DEBUG(0,__FUNCTION__"():sorry, TIOCSERCONFIG is not supported\n");
+		return -ENOIOCTLCMD;  
+
+
 	default:
-		return -ENOIOCTLCMD;  /* ioctls which we must not touch */
+		return -ENOIOCTLCMD;  /* ioctls which we must ignore */
 	}
 	return 0;
 }
@@ -1781,8 +1621,8 @@
 	driver->mcr &= ~MCR_RTS; 
 	driver->mcr |= DELTA_RTS; 
 	driver->comm->dte = driver->mcr;
-	ircomm_append_ctrl(driver->comm, DTELINE_STATE );
-	ircomm_control_request(driver->comm);
+	ircomm_control_request(driver->comm, DTELINE_STATE );
+
         irttp_flow_request(driver->comm->tsap, FLOW_STOP);
 }
 
@@ -1795,8 +1635,8 @@
 
 	driver->mcr |= (MCR_RTS|DELTA_RTS);
 	driver->comm->dte = driver->mcr;
-	ircomm_append_ctrl(driver->comm, DTELINE_STATE );
-	ircomm_control_request(driver->comm);
+	ircomm_control_request(driver->comm, DTELINE_STATE );
+
         irttp_flow_request(driver->comm->tsap, FLOW_START);
 }
 
@@ -1829,19 +1669,17 @@
  * ------------------------------------------------------------
  * irvtd_hangup()
  * This routine notifies that tty layer have got HUP signal
- * Is this routine right ? :{|
  * ------------------------------------------------------------
  */
 
 void irvtd_hangup(struct tty_struct *tty){
 
 	struct irvtd_cb *info = (struct irvtd_cb *)tty->driver_data;
-	DEBUG(0, "irvtd_hangup()\n");
+	DEBUG(0, __FUNCTION__"()\n");
 
 	irvtd_flush_buffer(tty);
 	irvtd_shutdown(info);
 	info->count = 0;
-	info->flags &= ~(IRVTD_ASYNC_NORMAL_ACTIVE|IRVTD_ASYNC_CALLOUT_ACTIVE);
 	info->tty = NULL;
 	wake_up_interruptible(&info->open_wait);
 }
@@ -1851,15 +1689,18 @@
 	struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
 	struct sk_buff *skb;
 
-	skb = (struct sk_buff *)driver->txbuff;
+	skb = driver->txbuff;
+	ASSERT(skb != NULL, return;); 
 
-	DEBUG(4, "irvtd_flush_buffer:%d chars are gone..\n",(int)skb->len);
-	skb_trim(skb,0); 
+	if(skb->len){
+		DEBUG(0, __FUNCTION__"():%d chars in txbuff are lost..\n",(int)skb->len);
+		skb_trim(skb,0); 
+	}
 	
 	/* write_wait is a wait queue of tty_wait_until_sent().
 	 * see tty_io.c of kernel 
 	 */
- 	wake_up_interruptible(&tty->write_wait); 
+	wake_up_interruptible(&tty->write_wait); 
 
 	if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
 	    tty->ldisc.write_wakeup)
@@ -1867,3 +1708,275 @@
 }
 
 
+
+/*
+ * Function ircomm_register_device(void), init_module() and friends
+ *
+ *   we register "port emulation entity"(see IrCOMM specification) here
+ *   as a tty device.
+ */
+
+int irvtd_register_ttydriver(void){
+
+        DEBUG( 4, "-->irvtd_register_ttydriver\n");
+
+	/* setup virtual serial port device */
+
+        /* Initialize the tty_driver structure ,which is defined in 
+	   tty_driver.h */
+        
+        memset(&irvtd_drv, 0, sizeof(struct tty_driver));
+	irvtd_drv.magic = IRVTD_MAGIC;
+	irvtd_drv.driver_name = "IrCOMM_tty";
+	irvtd_drv.name = "irnine";
+	irvtd_drv.major = IRCOMM_MAJOR;
+	irvtd_drv.minor_start = IRVTD_MINOR;
+	irvtd_drv.num = COMM_MAX_TTY;
+	irvtd_drv.type = TTY_DRIVER_TYPE_SERIAL;  /* see tty_driver.h */
+
+
+	/*
+	 * see drivers/char/tty_io.c and termios(3)
+	 */
+
+        irvtd_drv.init_termios = tty_std_termios;
+        irvtd_drv.init_termios.c_cflag =
+		B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+        irvtd_drv.flags = TTY_DRIVER_REAL_RAW;   /* see tty_driver.h */
+        irvtd_drv.refcount = &irvtd_refcount;
+
+	/* pointer to the tty data structures */
+
+        irvtd_drv.table = irvtd_table;  
+        irvtd_drv.termios = irvtd_termios;
+        irvtd_drv.termios_locked = irvtd_termios_locked;
+
+        /*
+         * Interface table from the kernel(tty driver) to the ircomm
+         * layer
+         */
+
+        irvtd_drv.open = irvtd_open;
+        irvtd_drv.close = irvtd_close;
+        irvtd_drv.write = irvtd_write;
+        irvtd_drv.put_char = irvtd_put_char;
+	irvtd_drv.flush_chars = NULL;
+        irvtd_drv.write_room = irvtd_write_room;
+	irvtd_drv.chars_in_buffer = irvtd_chars_in_buffer; 
+        irvtd_drv.flush_buffer = irvtd_flush_buffer;
+ 	irvtd_drv.ioctl = irvtd_ioctl; 
+	irvtd_drv.throttle = irvtd_throttle;
+	irvtd_drv.unthrottle = irvtd_unthrottle;
+ 	irvtd_drv.set_termios = irvtd_set_termios;
+	irvtd_drv.stop = NULL;          /*  irvtd_stop; */
+	irvtd_drv.start = NULL;         /* irvtd_start; */
+        irvtd_drv.hangup = irvtd_hangup;
+
+        irvtd_drv.send_xchar = irvtd_send_xchar;
+	irvtd_drv.break_ctl = irvtd_break;
+	irvtd_drv.read_proc = irvtd_read_proc;
+ 	irvtd_drv.wait_until_sent = irvtd_wait_until_sent;
+
+
+
+	if (tty_register_driver(&irvtd_drv)){
+		DEBUG(0,"IrCOMM:Couldn't register tty driver\n");
+		return(1);
+	}
+
+	DEBUG( 4, "irvtd_register_ttydriver: done.\n");
+	return(0);
+}
+
+
+/*
+ * Function irvtd_unregister_device(void) 
+ *   it will be called when you rmmod
+ */
+
+void irvtd_unregister_ttydriver(void){
+
+	int err;	
+        DEBUG( 4, "--> irvtd_unregister_device\n");
+
+	/* unregister tty device   */
+
+	err = tty_unregister_driver(&irvtd_drv);
+        if (err)
+                printk("IrCOMM: failed to unregister vtd driver(%d)\n",err);
+        DEBUG( 4, "irvtd_unregister_device -->\n");
+	return;
+}
+
+/*
+ **********************************************************************
+ *    proc stuff
+ *
+ **********************************************************************
+ */
+
+static int line_info(char *buf, struct irvtd_cb *driver)
+{
+	int	ret=0;
+
+	ASSERT(driver != NULL,goto exit;);
+	ASSERT(driver->magic == IRVTD_MAGIC,goto exit;);
+
+	ret += sprintf(buf, "tx: %d rx: %d"
+		      ,driver->icount.tx, driver->icount.rx);
+
+	if (driver->icount.frame)
+                ret += sprintf(buf+ret, " fe:%d", driver->icount.frame);
+        if (driver->icount.parity)
+                ret += sprintf(buf+ret, " pe:%d", driver->icount.parity);
+        if (driver->icount.brk)
+                ret += sprintf(buf+ret, " brk:%d", driver->icount.brk);  
+        if (driver->icount.overrun)
+                ret += sprintf(buf+ret, " oe:%d", driver->icount.overrun);
+
+	if (driver->mcr & MCR_RTS)
+                ret += sprintf(buf+ret, "|RTS");
+        if (driver->msr & MSR_CTS)
+                ret += sprintf(buf+ret, "|CTS");
+        if (driver->mcr & MCR_DTR)
+                ret += sprintf(buf+ret, "|DTR");
+        if (driver->msr & MSR_DSR)
+                ret += sprintf(buf+ret, "|DSR");
+        if (driver->msr & MSR_DCD)
+                ret += sprintf(buf+ret, "|CD");
+	if (driver->msr & MSR_RI) 
+		ret += sprintf(buf+ret, "|RI");
+
+ exit:
+	ret += sprintf(buf+ret, "\n");
+	return ret;
+}
+
+
+
+static int irvtd_read_proc(char *buf, char **start, off_t offset, int len,
+		 int *eof, void *unused)
+{
+	int i, count = 0, l;
+	off_t	begin = 0;
+
+	count += sprintf(buf, "driver revision:%s\n", revision_date);
+	for (i = 0; i < COMM_MAX_TTY && count < 4000; i++) {
+		l = line_info(buf + count, irvtd[i]);
+		count += l;
+		if (count+begin > offset+len)
+			goto done;
+		if (count+begin < offset) {
+			begin += count;
+			count = 0;
+		}
+	}
+	*eof = 1;
+done:
+	if (offset >= count+begin)
+		return 0;
+	*start = buf + (begin-offset);
+	return ((len < begin+count-offset) ? len : begin+count-offset);
+}
+
+
+
+
+/************************************************************
+ *    init & cleanup this module 
+ ************************************************************/
+
+__initfunc(int irvtd_init(void))
+{
+	int i;
+
+	DEBUG( 4, __FUNCTION__"()\n");
+	printk( KERN_INFO 
+		"ircomm_tty: virtual tty driver for IrCOMM ( revision:%s )\n",
+		revision_date);
+
+
+	/* allocate a master array */
+
+	irvtd = (struct irvtd_cb **) kmalloc( sizeof(void *) *
+						COMM_MAX_TTY,GFP_KERNEL);
+	if ( irvtd == NULL) {
+		printk( KERN_WARNING __FUNCTION__"(): kmalloc failed!\n");
+		return -ENOMEM;
+	}
+
+	memset( irvtd, 0, sizeof(void *) * COMM_MAX_TTY);
+
+	for (i=0; i < COMM_MAX_TTY; i++){
+		irvtd[i] = kmalloc( sizeof(struct irvtd_cb), GFP_KERNEL);	
+		if(irvtd[i] == NULL){
+			printk(KERN_ERR __FUNCTION__"(): kmalloc failed!\n");
+			return -ENOMEM;
+		}
+		memset( irvtd[i], 0, sizeof(struct irvtd_cb));
+		irvtd[i]->magic = IRVTD_MAGIC;
+		irvtd[i]->line = i;
+		irvtd[i]->closing_wait = 30*HZ ;
+		irvtd[i]->close_delay = 5*HZ/10 ; 
+	}
+
+	/* 
+	 * initialize a "port emulation entity"
+	 */
+
+	if(irvtd_register_ttydriver()){
+		printk( KERN_WARNING "IrCOMM: Error in ircomm_register_device\n");
+		return -ENODEV;
+	}
+
+	return 0;
+}
+
+void irvtd_cleanup(void)
+{
+	int i;
+	DEBUG( 4, __FUNCTION__"()\n");
+
+	/*
+	 * free some resources
+	 */
+	if (irvtd) {
+		for (i=0; i<COMM_MAX_TTY; i++) {
+			if (irvtd[i]) {
+				if(irvtd[i]->comm)
+					ircomm_close_instance(irvtd[i]->comm);
+				if(irvtd[i]->txbuff)
+					dev_kfree_skb(irvtd[i]->txbuff);
+				DEBUG( 4, "freeing structures\n");
+				kfree(irvtd[i]);
+				irvtd[i] = NULL;
+			}
+		}
+		DEBUG( 4, "freeing master array\n");
+		kfree(irvtd);
+		irvtd = NULL;
+	}
+
+ 	irvtd_unregister_ttydriver();
+
+}
+
+#ifdef MODULE
+
+int init_module(void) 
+{
+	irvtd_init();
+	return 0;
+}
+
+/*
+ * Function ircomm_cleanup (void)
+ *   This is called when you rmmod.
+ */
+
+void cleanup_module(void)
+{
+	irvtd_cleanup();
+}
+
+#endif /* MODULE */
diff -urN linux-2.2.6-pre2/net/irda/ircomm/Makefile linux-2.2.6-pre3/net/irda/ircomm/Makefile
--- linux-2.2.6-pre2/net/irda/ircomm/Makefile	1998-12-17 09:01:03.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/ircomm/Makefile	2003-08-15 15:05:39.000000000 -0700
@@ -8,9 +8,9 @@
 # Note 2! The CFLAGS definition is now in the main makefile...
 
 O_TARGET := ircomm_n_vtd.o
-O_OBJS	 := ircomm_common.o attach.o irvtd.o irvtd_driver.o
+O_OBJS	 := ircomm_common.o irvtd_driver.o
 M_OBJS   := ircomm.o ircomm_tty.o
-MI_OBJS  := ircomm_common.o attach.o irvtd.o irvtd_driver.o
+MI_OBJS  := ircomm_common.o irvtd_driver.o
 
 OX_OBJS  += 
 
@@ -18,10 +18,10 @@
 
 ifeq ($(CONFIG_IRCOMM),m)
 ircomm.o:  $(MI_OBJS)
-	$(LD) $(LD_RFLAG) -r -o $@ ircomm_common.o attach.o
+	$(LD) $(LD_RFLAG) -r -o $@ ircomm_common.o
 
 ircomm_tty.o: $(MI_OBJS)
-	$(LD) $(LD_RFLAG) -r -o $@ irvtd.o irvtd_driver.o
+	$(LD) $(LD_RFLAG) -r -o $@ irvtd_driver.o
 endif
 
 include $(TOPDIR)/Rules.make
diff -urN linux-2.2.6-pre2/net/irda/irda_device.c linux-2.2.6-pre3/net/irda/irda_device.c
--- linux-2.2.6-pre2/net/irda/irda_device.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irda_device.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Wed Sep  2 20:22:08 1998
- * Modified at:   Tue Feb 16 17:36:04 1999
+ * Modified at:   Wed Apr  7 17:16:54 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -36,6 +36,7 @@
 #include <asm/segment.h>
 #include <asm/uaccess.h>
 #include <asm/dma.h>
+#include <asm/spinlock.h>
 
 #include <net/pkt_sched.h>
 
@@ -108,11 +109,11 @@
 
 void irda_device_cleanup(void)
 {
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( irda_device != NULL, return;);
+	ASSERT(irda_device != NULL, return;);
 
-	hashbin_delete( irda_device, (FREE_FUNC) irda_device_close);
+	hashbin_delete(irda_device, (FREE_FUNC) irda_device_close);
 }
 
 /*
@@ -121,80 +122,83 @@
  *    Open a new IrDA port device
  *
  */
-int irda_device_open( struct irda_device *self, char *name, void *priv)
+int irda_device_open(struct irda_device *self, char *name, void *priv)
 {        
 	int result;
 	int i=0;
-	
-	/* Check that a minimum of allocation flags are specified */
-	ASSERT(( self->rx_buff.flags & (GFP_KERNEL|GFP_ATOMIC)) != 0, 
-	       return -1;);
-	ASSERT(( self->tx_buff.flags & (GFP_KERNEL|GFP_ATOMIC)) != 0, 
-	       return -1;);
-
-	ASSERT( self->tx_buff.truesize > 0, return -1;);
-	ASSERT( self->rx_buff.truesize > 0, return -1;);
-
-	self->rx_buff.data = ( __u8 *) kmalloc( self->rx_buff.truesize, 
-						self->rx_buff.flags);
-	self->tx_buff.data = ( __u8 *) kmalloc( self->tx_buff.truesize, 
-						self->tx_buff.flags);
-
-	if ( self->rx_buff.data == NULL || self->tx_buff.data == NULL)   {
-		DEBUG( 0, "IrDA Self: no space for buffers!\n");
-		irda_device_close( self);
-		return -ENOMEM;
+
+	/* Allocate memory if needed */
+	if (self->rx_buff.truesize > 0) {
+		self->rx_buff.data = ( __u8 *) kmalloc(self->rx_buff.truesize,
+						       self->rx_buff.flags);
+		if (self->rx_buff.data == NULL)
+			return -ENOMEM;
+
+		memset(self->rx_buff.data, 0, self->rx_buff.truesize);
 	}
+	if (self->tx_buff.truesize > 0) {
+		self->tx_buff.data = ( __u8 *) kmalloc(self->tx_buff.truesize, 
+						       self->tx_buff.flags);
+		if (self->tx_buff.data == NULL)
+			return -ENOMEM;
 
-	memset( self->rx_buff.data, 0, self->rx_buff.truesize);
-	memset( self->tx_buff.data, 0, self->tx_buff.truesize);
+		memset(self->tx_buff.data, 0, self->tx_buff.truesize);
+	}
 	
-	self->magic = IRDA_DEVICE_MAGIC;
+      	self->magic = IRDA_DEVICE_MAGIC;
 
 	self->rx_buff.in_frame = FALSE;
 	self->rx_buff.state = OUTSIDE_FRAME;
 
 	/* Initialize timers */
-	init_timer( &self->media_busy_timer);	
-
-	/* Open new IrLAP layer instance */
-	self->irlap = irlap_open( self);
+	init_timer(&self->media_busy_timer);	
 
 	/* A pointer to the low level implementation */
 	self->priv = priv;
 
 	/* Initialize IrDA net device */
 	do {
-		sprintf( self->name, "%s%d", "irda", i++);
-	} while ( dev_get( self->name) != NULL);
+		sprintf(self->name, "%s%d", "irda", i++);
+	} while (dev_get(self->name) != NULL);
 	
 	self->netdev.name = self->name;
 	self->netdev.priv = (void *) self;
 	self->netdev.next = NULL;
 
-	if (( result = register_netdev( &self->netdev)) != 0) {
-		DEBUG( 0, __FUNCTION__ "(), register_netdev() failed!\n");
+	if ((result = register_netdev(&self->netdev)) != 0) {
+		DEBUG(0, __FUNCTION__ "(), register_netdev() failed!\n");
 		return -1;
 	}
-
+	
 	/* 
 	 * Make the description for the device. self->netdev.name will get
 	 * a name like "irda0" and the self->descriptin will get a name
 	 * like "irda0 <-> irtty0" 
 	 */
-	strncpy( self->description, self->name, 5);
-	strcat( self->description, " <-> ");
-	strncat( self->description, name, 23);
-
-	hashbin_insert( irda_device, (QUEUE *) self, (int) self, NULL);
-
+	strncpy(self->description, self->name, 5);
+	strcat(self->description, " <-> ");
+	strncat(self->description, name, 23);
+	
+	hashbin_insert(irda_device, (QUEUE *) self, (int) self, NULL);
+	
 	/* Open network device */
-	dev_open( &self->netdev);
+	dev_open(&self->netdev);
 
-	printk( "IrDA device %s registered.\n", self->name);
+	printk("IrDA device %s registered.\n", self->name);
 
-	irda_device_set_media_busy( self, FALSE);
+	irda_device_set_media_busy(self, FALSE);
+
+	/* 
+	 * Open new IrLAP layer instance, now that everything should be
+	 * initialized properly 
+	 */
+	self->irlap = irlap_open(self);
         
+	/* It's now safe to initilize the saddr */
+	memcpy(self->netdev.dev_addr, &self->irlap->saddr, 4);
+
+	DEBUG(4, __FUNCTION__ "()->\n");
+
 	return 0;
 }
 
@@ -204,29 +208,29 @@
  *    Close this instance of the irda_device, just deallocate buffers
  *
  */
-void __irda_device_close( struct irda_device *self)
+void __irda_device_close(struct irda_device *self)
 {
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRDA_DEVICE_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == IRDA_DEVICE_MAGIC, return;);
 
-	dev_close( &self->netdev);
-
-	/* Remove netdevice */
-	unregister_netdev( &self->netdev);
+	/* We do this test to know if the device has been registered at all */
+	if (self->netdev.type == ARPHRD_IRDA) {
+		dev_close(&self->netdev);
+		
+		/* Remove netdevice */
+		unregister_netdev(&self->netdev);
+	}
 
 	/* Stop timers */
-	del_timer( &self->todo_timer);
-	del_timer( &self->media_busy_timer);
+	del_timer(&self->media_busy_timer);
 
-	if ( self->tx_buff.data) {
-		kfree( self->tx_buff.data);
-	}
+	if (self->tx_buff.data)
+		kfree(self->tx_buff.data);
 
-	if ( self->rx_buff.data) {
-		kfree( self->rx_buff.data);
-	}
+	if (self->rx_buff.data)
+		kfree(self->rx_buff.data);
 
 	self->magic = 0;
 }
@@ -237,20 +241,21 @@
  *    
  *
  */
-void irda_device_close( struct irda_device *self)
+void irda_device_close(struct irda_device *self)
 {
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRDA_DEVICE_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == IRDA_DEVICE_MAGIC, return;);
 
-	/* Stop IrLAP */
-	irlap_close( self->irlap);
+	/* Stop and remove instance of IrLAP */
+	if (self->irlap)
+		irlap_close(self->irlap);
 	self->irlap = NULL;
 
-	hashbin_remove( irda_device, (int) self, NULL);
+	hashbin_remove(irda_device, (int) self, NULL);
 
-	__irda_device_close( self);
+	__irda_device_close(self);
 }
 
 /*
@@ -259,20 +264,20 @@
  *    Called when we have detected that another station is transmiting
  *    in contention mode.
  */
-void irda_device_set_media_busy( struct irda_device *self, int status) 
+void irda_device_set_media_busy(struct irda_device *self, int status) 
 {
-	DEBUG( 4, __FUNCTION__ "(%s)\n", status ? "TRUE" : "FALSE");
+	DEBUG(4, __FUNCTION__ "(%s)\n", status ? "TRUE" : "FALSE");
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRDA_DEVICE_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == IRDA_DEVICE_MAGIC, return;);
 
-	if ( status) {
+	if (status) {
 		self->media_busy = TRUE;
-		irda_device_start_mbusy_timer( self);
+		irda_device_start_mbusy_timer(self);
 		DEBUG( 4, "Media busy!\n");
 	} else {
 		self->media_busy = FALSE;
-		del_timer( &self->media_busy_timer);
+		del_timer(&self->media_busy_timer);
 	}
 }
 
@@ -282,30 +287,26 @@
  *    When this function is called, we will have a process context so its
  *    possible for us to sleep, wait or whatever :-)
  */
-static void __irda_device_change_speed( struct irda_device *self, int speed)
+static void __irda_device_change_speed(struct irda_device *self, int speed)
 {
-	DEBUG(4, __FUNCTION__ "(), <%ld>\n", jiffies);
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRDA_DEVICE_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == IRDA_DEVICE_MAGIC, return;);
 	
 	/*
 	 *  Is is possible to change speed yet? Wait until the last byte 
 	 *  has been transmitted.
 	 */
-	if ( self->wait_until_sent) {
-		self->wait_until_sent( self);
-		
-		if ( self->change_speed) {
-			self->change_speed( self, speed);
-			
+	if (self->wait_until_sent) {
+		self->wait_until_sent(self);
+		if (self->change_speed) {
+			self->change_speed(self, speed);
+
 			/* Update the QoS value only */
 			self->qos.baud_rate.value = speed;
 		}
 	} else {
-		DEBUG(0, __FUNCTION__ "(), Warning, wait_until_sent() "
-		      "has not implemented by the device driver!\n");
-		
+		printk(KERN_WARNING "wait_until_sent() "
+		       "has not implemented by the IrDA device driver!\n");
 	}
 }
 
@@ -315,15 +316,16 @@
  *    Change the speed of the currently used irda_device
  *
  */
-inline void irda_device_change_speed( struct irda_device *self, int speed)
+inline void irda_device_change_speed(struct irda_device *self, int speed)
 {
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRDA_DEVICE_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == IRDA_DEVICE_MAGIC, return;);
 
-	irda_execute_as_process(
-		self, (TODO_CALLBACK) __irda_device_change_speed, speed);
+	irda_execute_as_process(self, 
+				(TODO_CALLBACK) __irda_device_change_speed, 
+				speed);
 }
 
 inline int irda_device_is_media_busy( struct irda_device *self)
@@ -353,19 +355,6 @@
 	return &self->qos;
 }
 
-void irda_device_todo_expired( unsigned long data)
-{
-	struct irda_device *self = ( struct irda_device *) data;
-
-	DEBUG( 4, __FUNCTION__ "()\n");
-	
-	/* Check that we still exist */
-	if ( !self || self->magic != IRDA_DEVICE_MAGIC) {
-		return;
-	}
-	__irda_device_change_speed( self, self->new_speed);
-}
-
 static struct enet_statistics *irda_device_get_stats( struct device *dev)
 {
 	struct irda_device *priv = (struct irda_device *) dev->priv;
@@ -379,18 +368,18 @@
  *    This function should be used by low level device drivers in a similar way
  *    as ether_setup() is used by normal network device drivers
  */
-int irda_device_setup( struct device *dev) 
+int irda_device_setup(struct device *dev) 
 {
 	struct irda_device *self;
 
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( dev != NULL, return -1;);
+	ASSERT(dev != NULL, return -1;);
 
 	self = (struct irda_device *) dev->priv;
 
-	ASSERT( self != NULL, return -1;);
-	ASSERT( self->magic == IRDA_DEVICE_MAGIC, return -1;);	
+	ASSERT(self != NULL, return -1;);
+	ASSERT(self->magic == IRDA_DEVICE_MAGIC, return -1;);	
 
 	dev->get_stats	     = irda_device_get_stats;
 	dev->rebuild_header  = irda_device_net_rebuild_header;
@@ -401,17 +390,16 @@
         dev->addr_len        = 0;
 
         dev->type            = ARPHRD_IRDA;
-        dev->tx_queue_len    = 10;  /* Short queues in IrDA */
+        dev->tx_queue_len    = 8; /* Window size + 1 s-frame */
  
-	memcpy( dev->dev_addr, &self->irlap->saddr, 4);
-	memset( dev->broadcast, 0xff, 4);
+	memset(dev->broadcast, 0xff, 4);
 
 	dev->mtu = 2048;
 	dev->tbusy = 1;
 	
-	dev_init_buffers( dev);
+	dev_init_buffers(dev);
 
-	dev->flags = 0;
+	dev->flags = IFF_NOARP;
 	
 	return 0;
 }
@@ -460,16 +448,15 @@
  * Function irda_device_transmit_finished (void)
  *
  *    Check if there is still some frames in the transmit queue for this
- *    device
+ *    device. Maybe we should use: q->q.qlen == 0.
  *
  */
 int irda_device_txqueue_empty( struct irda_device *self)
 {
-	ASSERT( self != NULL, return -1;);
-	ASSERT( self->magic == IRDA_DEVICE_MAGIC, return -1;);	
+	ASSERT(self != NULL, return -1;);
+	ASSERT(self->magic == IRDA_DEVICE_MAGIC, return -1;);	
 
-	/* FIXME: check if this is the right way of doing it? */
-	if ( skb_queue_len( &self->netdev.qdisc->q))
+	if (skb_queue_len(&self->netdev.qdisc->q))
 		return FALSE;
 
 	return TRUE;
@@ -478,12 +465,21 @@
 /*
  * Function irda_get_mtt (skb)
  *
- *    Utility function for getting the 
- *
+ *    Utility function for getting the minimum turnaround time out of 
+ *    the skb, where it has been hidden in the cb field.
  */
-__inline__ int irda_get_mtt( struct sk_buff *skb)
+inline unsigned short irda_get_mtt(struct sk_buff *skb)
 {
-        return ((struct irlap_skb_cb *)(skb->cb))->mtt;
+	unsigned short mtt;
+
+	if (((struct irlap_skb_cb *)(skb->cb))->magic != LAP_MAGIC)
+		mtt = 10000;
+	else
+		mtt = ((struct irlap_skb_cb *)(skb->cb))->mtt;
+
+	ASSERT(mtt <= 10000, return 10000;);
+	
+	return mtt;
 }
 
 /*
@@ -492,21 +488,20 @@
  *    Setup the DMA channel
  *
  */
-void setup_dma( int channel, char *buffer, int count, int mode)
+void setup_dma(int channel, char *buffer, int count, int mode)
 {
 	unsigned long flags;
+	
+	flags = claim_dma_lock();
+	
+	disable_dma(channel);
+	clear_dma_ff(channel);
+	set_dma_mode(channel, mode);
+	set_dma_addr(channel, virt_to_bus(buffer));
+	set_dma_count(channel, count);
+	enable_dma(channel);
 
-	save_flags(flags);
-	cli();
-
-	disable_dma( channel);
-	clear_dma_ff( channel);
-	set_dma_mode( channel, mode);
-	set_dma_addr( channel, virt_to_bus(buffer));
-	set_dma_count( channel, count);
-	enable_dma( channel);
-
-	restore_flags(flags);
+	release_dma_lock(flags);
 }
 
 #ifdef CONFIG_PROC_FS
@@ -532,6 +527,8 @@
 		len += sprintf( buf+len, "PIO ");
 	if (idev->flags & IFF_DMA)
 		len += sprintf( buf+len, "DMA ");
+	if (idev->flags & IFF_SHM)
+		len += sprintf( buf+len, "SHM ");
 	if (idev->flags & IFF_DONGLE)
 		len += sprintf( buf+len, "DONGLE ");
 
diff -urN linux-2.2.6-pre2/net/irda/iriap.c linux-2.2.6-pre3/net/irda/iriap.c
--- linux-2.2.6-pre2/net/irda/iriap.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/iriap.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Aug 21 00:02:07 1997
- * Modified at:   Thu Feb 11 01:22:44 1999
+ * Modified at:   Tue Mar 23 19:38:46 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -28,6 +28,7 @@
 #include <linux/skbuff.h>
 #include <linux/string.h>
 #include <linux/init.h>
+#include <linux/irda.h>
 
 #include <asm/byteorder.h>
 
@@ -54,7 +55,8 @@
 	"CS_UNICODE"
 };
 
-hashbin_t *iriap = NULL;
+static hashbin_t *iriap = NULL;
+static __u32 service_handle; 
 
 extern char *lmp_reasons[];
 
@@ -62,6 +64,11 @@
 static void __iriap_close( struct iriap_cb *self);
 static void iriap_disconnect_indication(void *instance, void *sap, 
 					LM_REASON reason, struct sk_buff *skb);
+static void iriap_connect_indication(void *instance, void *sap, 
+				     struct qos_info *qos, __u32 max_sdu_size,
+				     struct sk_buff *skb);
+static int iriap_data_indication(void *instance, void *sap, 
+				 struct sk_buff *skb);
 
 /*
  * Function iriap_init (void)
@@ -71,16 +78,15 @@
  */
 __initfunc(int iriap_init(void))
 {
+	__u16 hints;
 	struct ias_object *obj;
 
 	DEBUG( 4, __FUNCTION__ "()\n");
 	
 	/* Allocate master array */
 	iriap = hashbin_new( HB_LOCAL);
-	if ( iriap == NULL) {
-		printk( KERN_WARNING "IrIAP: Can't allocate iriap hashbin!\n");
+	if ( iriap == NULL)
 		return -ENOMEM;
-	}
 
 	objects = hashbin_new( HB_LOCAL);
 	if ( objects == NULL) {
@@ -92,8 +98,9 @@
 	/* 
 	 *  Register some default services for IrLMP 
 	 */
-	irlmp_register_layer( S_COMPUTER, SERVER | CLIENT, FALSE, NULL);
-	irlmp_register_layer( S_PNP, SERVER, FALSE, NULL);
+	hints  = irlmp_service_to_hint(S_COMPUTER);
+	hints |= irlmp_service_to_hint(S_PNP);
+	service_handle = irlmp_register_service(hints);
 
 	/* 
 	 *  Register the Device object with LM-IAS
@@ -119,11 +126,10 @@
  */
 void iriap_cleanup(void) 
 {
-	irlmp_unregister_layer( S_COMPUTER, SERVER | CLIENT);
-	irlmp_unregister_layer( S_PNP, SERVER);
+	irlmp_unregister_service(service_handle);
 	
-	hashbin_delete( iriap, (FREE_FUNC) __iriap_close);
-	hashbin_delete( objects, (FREE_FUNC) __irias_delete_object);	
+	hashbin_delete(iriap, (FREE_FUNC) __iriap_close);
+	hashbin_delete(objects, (FREE_FUNC) __irias_delete_object);	
 }
 
 /*
@@ -237,8 +243,9 @@
  *    Got disconnect, so clean up everything assosiated with this connection
  *
  */
-void iriap_disconnect_indication( void *instance, void *sap, LM_REASON reason, 
-				  struct sk_buff *userdata)
+static void iriap_disconnect_indication( void *instance, void *sap, 
+					 LM_REASON reason, 
+					 struct sk_buff *userdata)
 {
 	struct iriap_cb *self;
 
@@ -385,7 +392,7 @@
 	frame = skb->data;
 
 	/* Build frame */
-	frame[0] = LST | GET_VALUE_BY_CLASS;
+	frame[0] = IAP_LST | GET_VALUE_BY_CLASS;
 	frame[1] = name_len;                       /* Insert length of name */
 	memcpy( frame+2, name, name_len);          /* Insert name */
 	frame[2+name_len] = attr_len;              /* Insert length of attr */
@@ -404,39 +411,44 @@
 void iriap_getvaluebyclass_confirm(struct iriap_cb *self, struct sk_buff *skb) 
 {
 	struct ias_value *value;
+	int n;
+	int charset;
+	__u32 value_len;
+	__u32 tmp_cpu32;
+	__u16 tmp_cpu16;
 	__u16 obj_id;
-	int   len;
+	__u16 len;
 	__u8  type;
-	int   value_len;
 	__u8 *fp;
-	int n;
-	int charset;
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IAS_MAGIC, return;);
-	ASSERT( skb != NULL, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == IAS_MAGIC, return;);
+	ASSERT(skb != NULL, return;);
 
 	/* Initialize variables */
 	fp = skb->data;
 	n = 2;
 
 	/* Get length, MSB first */
-	len = ntohs( *(__u16 *)( fp+n)); n += 2;
+	memcpy(&len, fp+n, 2); n += 2;
+	be16_to_cpus(&len); 
 
-	DEBUG( 4, __FUNCTION__ "(), len=%d\n", len);
+	DEBUG(4, __FUNCTION__ "(), len=%d\n", len);
 
 	/* Get object ID, MSB first */
-	obj_id = ntohs( *(__u16 *)( fp+n)); n += 2;
+	memcpy(&obj_id, fp+n, 2); n += 2;
+	be16_to_cpus(&obj_id);
 
 	type = fp[n++];
 	DEBUG( 4, __FUNCTION__ "(), Value type = %d\n", type);
 
 	switch( type) {
 	case IAS_INTEGER:
-		value = irias_new_integer_value( ntohl(*(__u32 *)(fp+n)));
-		/* 
-		 *  Legal values restricted to 0x01-0x6f, page 15 irttp 
-		 */
+		memcpy(&tmp_cpu32, fp+n, 4); n += 4;
+		be32_to_cpus(&tmp_cpu32);
+		value = irias_new_integer_value(tmp_cpu32);
+
+		/*  Legal values restricted to 0x01-0x6f, page 15 irttp */
 		DEBUG( 4, __FUNCTION__ "(), lsap=%d\n", value->t.integer); 
 		break;
 	case IAS_STRING:
@@ -469,29 +481,29 @@
 		fp[n+value_len] = 0x00;
 		
 		DEBUG(4, "Got string %s\n", fp+n);
-		value = irias_new_string_value( fp+n);
+		value = irias_new_string_value(fp+n);
 		break;
 	case IAS_OCT_SEQ:
-		value_len = ntohs( *(__u16 *)( fp+n)); n += 2;
+		memcpy(&tmp_cpu16, fp+n, 2);  n += 2;
+		be16_to_cpus(&tmp_cpu16);
+		value_len = tmp_cpu16;
 		
 		/* FIXME:should be 1024, but.... */
 		DEBUG(0, __FUNCTION__ "():octet sequence:len=%d\n", value_len);
 		ASSERT(value_len <= 55, return;);      
 		
-		value = irias_new_octseq_value( fp+n, value_len);
+		value = irias_new_octseq_value(fp+n, value_len);
 		break;
 	default:
 		value = &missing;
 		break;
 	}
 	
-	if ( self->confirm)
+	if (self->confirm)
 		self->confirm(obj_id, value, self->priv);
 	
-	/*
-	 * Finished, close connection!
-	 */
-	iriap_disconnect_request( self);
+	/* Finished, close connection! */
+	iriap_disconnect_request(self);
 }
 
 /*
@@ -504,8 +516,9 @@
 				    __u8 ret_code, struct ias_value *value)
 {
 	struct sk_buff *skb;
-	__u8 *fp;
 	int n;
+	__u32 tmp_be32, tmp_be16;
+	__u8 *fp;
 
 	DEBUG( 4, __FUNCTION__ "()\n");
 
@@ -533,35 +546,39 @@
 	fp = skb->data;
 
 	/* Build frame */
-	fp[n++] = GET_VALUE_BY_CLASS | LST;
+	fp[n++] = GET_VALUE_BY_CLASS | IAP_LST;
 	fp[n++] = ret_code;
 
 	/* Insert list length (MSB first) */
-	*((__u16 *) (fp+n)) = __constant_htons( 0x0001); n += 2; 
+	tmp_be16 = __constant_htons( 0x0001);
+	memcpy(fp+n, &tmp_be16, 2);  n += 2; 
 
 	/* Insert object identifier ( MSB first) */
-	*((__u16 *) (fp+n)) = htons( obj_id); n += 2;
+	tmp_be16 = cpu_to_be16(obj_id);
+	memcpy(fp+n, &tmp_be16, 2); n += 2;
 
-	switch( value->type) {
+	switch(value->type) {
 	case IAS_STRING:
-		skb_put( skb, 3 + value->len);
+		skb_put(skb, 3 + value->len);
 		fp[n++] = value->type;
 		fp[n++] = 0; /* ASCII */
 		fp[n++] = (__u8) value->len;
-		memcpy( fp+n, value->t.string, value->len); n+=value->len;
+		memcpy(fp+n, value->t.string, value->len); n+=value->len;
 		break;
 	case IAS_INTEGER:
-		skb_put( skb, 5);
+		skb_put(skb, 5);
 		fp[n++] = value->type;
 		
-		*((__u32 *)(fp+n)) = htonl(value->t.integer); n+=4;
+		tmp_be32 = cpu_to_be32(value->t.integer);
+		memcpy(fp+n, &tmp_be32, 4); n += 4;
 		break;
 	case IAS_OCT_SEQ:
-		skb_put( skb, 3 + value->len);
+		skb_put(skb, 3 + value->len);
 		fp[n++] = value->type;
-		*((__u16 *)(fp+n)) = htons(value->len); n+=2;
+
+		tmp_be16 = cpu_to_be16(value->len);
+		memcpy(fp+n, &tmp_be16, 2); n += 2;
 		memcpy(fp+n, value->t.oct_seq, value->len); n+=value->len;
-		
 		break;
 	case IAS_MISSING:
 		DEBUG( 3, __FUNCTION__ ": sending IAS_MISSING\n");
@@ -573,7 +590,7 @@
 		DEBUG(0, __FUNCTION__ "(), type not implemented!\n");
 		break;
 	}
-	iriap_do_r_connect_event( self, IAP_CALL_RESPONSE, skb);
+	iriap_do_r_connect_event(self, IAP_CALL_RESPONSE, skb);
 }
 
 /*
@@ -672,7 +689,7 @@
 	frame = skb->data;
 
 	/* Build frame */
-	frame[0] = LST | self->operation;
+	frame[0] = IAP_LST | self->operation;
 }
 
 /*
@@ -681,8 +698,8 @@
  *    LSAP connection confirmed!
  *
  */
-void iriap_connect_confirm( void *instance, void *sap, struct qos_info *qos, 
-			    int max_sdu_size, struct sk_buff *userdata)
+void iriap_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
+			   __u32 max_sdu_size, struct sk_buff *userdata)
 {
 	struct iriap_cb *self;
 	
@@ -705,8 +722,9 @@
  *    Remote LM-IAS is requesting connection
  *
  */
-void iriap_connect_indication(void *instance, void *sap, struct qos_info *qos,
-			      int max_sdu_size, struct sk_buff *userdata)
+static void iriap_connect_indication(void *instance, void *sap, 
+				     struct qos_info *qos, __u32 max_sdu_size,
+				     struct sk_buff *userdata)
 {
 	struct iriap_cb *self;
 
@@ -727,7 +745,8 @@
  *    Receives data from connection identified by handle from IrLMP
  *
  */
-void iriap_data_indication( void *instance, void *sap, struct sk_buff *skb) 
+static int iriap_data_indication(void *instance, void *sap, 
+				 struct sk_buff *skb) 
 {
 	struct iriap_cb *self;
 	__u8  *frame;
@@ -735,50 +754,53 @@
 	
 	DEBUG( 4, __FUNCTION__ "()\n"); 
 	
-	self = ( struct iriap_cb *) instance;
+	self = (struct iriap_cb *) instance;
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IAS_MAGIC, return;);
+	ASSERT(self != NULL, return 0;);
+	ASSERT(self->magic == IAS_MAGIC, return 0;);
 
-	ASSERT( skb != NULL, return;);
+	ASSERT(skb != NULL, return 0;);
 
 	frame = skb->data;
 	
-	if ( self->mode == IAS_SERVER) {
+	if (self->mode == IAS_SERVER) {
 		/* Call server */
-		DEBUG( 4, __FUNCTION__ "(), Calling server!\n");
+		DEBUG(4, __FUNCTION__ "(), Calling server!\n");
 		iriap_do_r_connect_event( self, IAP_RECV_F_LST, skb);
 
-		return;
+		return 0;
 	}
 	opcode = frame[0];
 	if ( ~opcode & 0x80) {
 		printk( KERN_ERR "IrIAS multiframe commands or results is "
 			"not implemented yet!\n");
-		return;
+		return 0;
 	}
 
-	if ( ~opcode &0x40) {
-		DEBUG( 4, "Got ack frame!\n");
+	if (~opcode & IAP_ACK) {
+		DEBUG(0, __FUNCTION__ "() Got ack frame!\n");
 	/* 	return; */
 	}
 
-	opcode &= 0x7f; /* Mask away LST bit */
+	opcode &= ~IAP_LST; /* Mask away LST bit */
 	
-	switch( opcode) {
+	switch(opcode) {
 	case GET_INFO_BASE:
 		DEBUG( 0, "IrLMP GetInfoBaseDetails not implemented!\n");
 		break;
 	case GET_VALUE_BY_CLASS:
 		DEBUG( 4,"IrLMP GetValueByClass\n");
 		
-		if ( frame[1] == 0x01) {
-			printk( KERN_WARNING "IrIAP No such class!\n");
-		} else if ( frame[1] == 0x02) {
-			printk( KERN_WARNING 
-				"IrIAP No such attribute!\n");
-		} else {
-			iriap_getvaluebyclass_confirm( self, skb);
+		switch(frame[1]) {
+		case IAS_SUCCESS:
+			iriap_getvaluebyclass_confirm(self, skb);
+			break;
+		case IAS_CLASS_UNKNOWN:
+			printk(KERN_WARNING "IrIAP No such class!\n");
+			break;
+		case IAS_ATTRIB_UNKNOWN:
+			printk(KERN_WARNING "IrIAP No such attribute!\n");
+			break;
 		}
 		iriap_do_call_event( self, IAP_RECV_F_LST, skb);
 
@@ -792,6 +814,7 @@
 		DEBUG(0, __FUNCTION__ "(), Unknown op-code: %02x\n", opcode);
 		break;
 	}
+	return 0;
 }
 
 /*
@@ -912,8 +935,8 @@
 			}
 			len += sprintf( buf+len, "\n");
 			
-			attrib = ( struct ias_attrib *) 
-				hashbin_get_next( obj->attribs);
+			attrib = (struct ias_attrib *) 
+				hashbin_get_next(obj->attribs);
 		}
 	        obj = ( struct ias_object *) hashbin_get_next( objects);
  	} 
diff -urN linux-2.2.6-pre2/net/irda/irias_object.c linux-2.2.6-pre3/net/irda/irias_object.c
--- linux-2.2.6-pre2/net/irda/irias_object.c	1999-01-20 11:05:33.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irias_object.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Oct  1 22:50:04 1998
- * Modified at:   Tue Dec 15 09:19:43 1998
+ * Modified at:   Mon Mar 22 13:22:35 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -23,6 +23,8 @@
  ********************************************************************/
 
 #include <linux/string.h>
+#include <linux/socket.h>
+#include <linux/irda.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irmod.h>
@@ -227,7 +229,6 @@
  *
  *    Change the value of an objects attribute.
  *
- *    TODO: not tested yet!
  */
 int irias_object_change_attribute( char *obj_name, char *attrib_name, 
 				   struct ias_value *new_value) 
diff -urN linux-2.2.6-pre2/net/irda/irlan/irlan_client.c linux-2.2.6-pre3/net/irda/irlan/irlan_client.c
--- linux-2.2.6-pre2/net/irda/irlan/irlan_client.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlan/irlan_client.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Wed Feb 17 23:29:34 1999
+ * Modified at:   Wed Apr  7 16:56:35 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Sources:       skeleton.c by Donald Becker <becker@CESDIS.gsfc.nasa.gov>
  *                slip.c by Laurence Culhane, <loz@holmes.demon.co.uk>
@@ -57,15 +57,12 @@
 static void irlan_client_ctrl_disconnect_indication(void *instance, void *sap, 
 						    LM_REASON reason, 
 						    struct sk_buff *);
-
-static void irlan_client_ctrl_data_indication(void *instance, void *sap, 
-					      struct sk_buff *skb);
-
+static int irlan_client_ctrl_data_indication(void *instance, void *sap, 
+					     struct sk_buff *skb);
 static void irlan_client_ctrl_connect_confirm(void *instance, void *sap, 
 					      struct qos_info *qos, 
-					      int max_sdu_size,
+					      __u32 max_sdu_size,
 					      struct sk_buff *);
-
 static void irlan_check_response_param(struct irlan_cb *self, char *param, 
 				       char *value, int val_len);
 
@@ -99,6 +96,12 @@
 			 irlan_client_kick_timer_expired);
 }
 
+/*
+ * Function irlan_client_wakeup (self, saddr, daddr)
+ *
+ *    Wake up client
+ *
+ */
 void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr)
 {
 	struct irmanager_event mgr_event;
@@ -108,52 +111,44 @@
 	ASSERT(self != NULL, return;);
 	ASSERT(self->magic == IRLAN_MAGIC, return;);
 
-	if (self->client.state == IRLAN_IDLE) {
-		/* saddr may have changed! */
-		self->saddr = saddr;
-		
-		/* Check if network device is up */
-		if (self->dev.start) {
-			/* Open TSAPs */
-			irlan_client_open_ctrl_tsap(self);
-			irlan_provider_open_ctrl_tsap(self);
-			irlan_open_data_tsap(self);
-			
-			irlan_do_client_event(self, IRLAN_DISCOVERY_INDICATION,
-					      NULL);
-		} else if (self->notify_irmanager) {
-			/* 
-			 * Tell irmanager that the device can now be 
-			 * configured but only if the device was not taken
-			 * down by the user
-			 */
-			mgr_event.event = EVENT_IRLAN_START;
-			sprintf(mgr_event.devname, "%s", self->ifname);
-			irmanager_notify(&mgr_event);
-
-			/* 
-			 * We set this so that we only notify once, since if 
-			 * configuration of the network device fails, the user
-			 * will have to sort it out first anyway. No need to 
-			 * try again.
-			 */
-			self->notify_irmanager = FALSE;
-		}
-		/* Restart watchdog timer */
-		irlan_start_watchdog_timer(self, IRLAN_TIMEOUT);
+	/* Check if we are already awake */
+	if (self->client.state != IRLAN_IDLE)
+		return;
 
-		/* Start kick timer */
-		irlan_client_start_kick_timer(self, 200);
-	} else {
-		DEBUG(2, __FUNCTION__ "(), state=%s\n", 
-		      irlan_state[ self->client.state]);
-		/*  
-		 *  If we get here, it's obvious that the last 
-		 *  connection attempt has failed, so its best 
-		 *  to go back to idle!
+	/* saddr may have changed! */
+	self->saddr = saddr;
+	
+	/* Check if network device is up */
+	if (self->dev.start) {
+		/* Open TSAPs */
+		irlan_client_open_ctrl_tsap(self);
+		irlan_provider_open_ctrl_tsap(self);
+		irlan_open_data_tsap(self);
+		
+		irlan_do_client_event(self, IRLAN_DISCOVERY_INDICATION, NULL);
+	} else if (self->notify_irmanager) {
+		/* 
+		 * Tell irmanager that the device can now be 
+		 * configured but only if the device was not taken
+		 * down by the user
 		 */
-		irlan_do_client_event(self, IRLAN_LMP_DISCONNECT, NULL);
+		mgr_event.event = EVENT_IRLAN_START;
+		sprintf(mgr_event.devname, "%s", self->ifname);
+		irmanager_notify(&mgr_event);
+		
+		/* 
+		 * We set this so that we only notify once, since if 
+		 * configuration of the network device fails, the user
+		 * will have to sort it out first anyway. No need to 
+		 * try again.
+		 */
+		self->notify_irmanager = FALSE;
 	}
+	/* Restart watchdog timer */
+	irlan_start_watchdog_timer(self, IRLAN_TIMEOUT);
+	
+	/* Start kick timer */
+	irlan_client_start_kick_timer(self, 2*HZ);
 }
 
 /*
@@ -162,7 +157,7 @@
  *    Remote device with IrLAN server support discovered
  *
  */
-void irlan_client_discovery_indication(DISCOVERY *discovery) 
+void irlan_client_discovery_indication(discovery_t *discovery) 
 {
 	struct irlan_cb *self, *entry;
 	__u32 saddr, daddr;
@@ -200,7 +195,7 @@
 		 * Rehash instance, now we have a client (daddr) to serve.
 		 */
 		entry = hashbin_remove(irlan, self->daddr, NULL);
-		ASSERT( entry == self, return;);
+		ASSERT(entry == self, return;);
 
 		self->daddr = daddr;
 		self->saddr = saddr;
@@ -234,8 +229,8 @@
  *    This function gets the data that is received on the control channel
  *
  */
-static void irlan_client_ctrl_data_indication(void *instance, void *sap, 
-					      struct sk_buff *skb)
+static int irlan_client_ctrl_data_indication(void *instance, void *sap, 
+					     struct sk_buff *skb)
 {
 	struct irlan_cb *self;
 	
@@ -243,11 +238,13 @@
 	
 	self = (struct irlan_cb *) instance;
 	
-	ASSERT(self != NULL, return;);
-	ASSERT(self->magic == IRLAN_MAGIC, return;);
-	ASSERT(skb != NULL, return;);
+	ASSERT(self != NULL, return -1;);
+	ASSERT(self->magic == IRLAN_MAGIC, return -1;);
+	ASSERT(skb != NULL, return -1;);
 	
 	irlan_do_client_event(self, IRLAN_DATA_INDICATION, skb); 
+
+	return 0;
 }
 
 static void irlan_client_ctrl_disconnect_indication(void *instance, void *sap, 
@@ -317,7 +314,7 @@
  */
 static void irlan_client_ctrl_connect_confirm(void *instance, void *sap, 
 					      struct qos_info *qos, 
-					      int max_sdu_size,
+					      __u32 max_sdu_size,
 					      struct sk_buff *skb) 
 {
 	struct irlan_cb *self;
@@ -448,7 +445,10 @@
 static void irlan_check_response_param(struct irlan_cb *self, char *param, 
 				       char *value, int val_len) 
 {
+#ifdef CONFIG_IRLAN_GRATUITOUS_ARP
 	struct in_device *in_dev;
+#endif
+	__u16 tmp_cpu; /* Temporary value in host order */
 	__u8 *bytes;
 	int i;
 
@@ -515,12 +515,16 @@
 		return;
 	}
 	if (strcmp(param, "CON_ARB") == 0) {
-		self->client.recv_arb_val = le16_to_cpup(value);
+		memcpy(&tmp_cpu, value, 2); /* Align value */
+		le16_to_cpus(&tmp_cpu);     /* Convert to host order */
+		self->client.recv_arb_val = tmp_cpu;
 		DEBUG(2, __FUNCTION__ "(), receive arb val=%d\n", 
 		      self->client.recv_arb_val);
 	}
 	if (strcmp(param, "MAX_FRAME") == 0) {
-		self->client.max_frame = le16_to_cpup(value);
+		memcpy(&tmp_cpu, value, 2); /* Align value */
+		le16_to_cpus(&tmp_cpu);     /* Convert to host order */
+		self->client.max_frame = tmp_cpu;
 		DEBUG(4, __FUNCTION__ "(), max frame=%d\n", 
 		      self->client.max_frame);
 	}
diff -urN linux-2.2.6-pre2/net/irda/irlan/irlan_common.c linux-2.2.6-pre3/net/irda/irlan/irlan_common.c
--- linux-2.2.6-pre2/net/irda/irlan/irlan_common.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlan/irlan_common.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Wed Feb 17 23:49:10 1999
+ * Modified at:   Wed Apr  7 17:03:21 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -55,6 +55,7 @@
  *  Master structure
  */
 hashbin_t *irlan = NULL;
+static __u32 ckey, skey;
 
 /* Module parameters */
 static int eth = 0; /* Use "eth" or "irlan" name for devices */
@@ -143,6 +144,12 @@
 			 irlan_watchdog_timer_expired);
 }
 
+/*
+ * Function irlan_eth_open (dev)
+ *
+ *    Network device has been opened by user
+ *
+ */
 static int irlan_eth_open(struct device *dev)
 {
 	struct irlan_cb *self;
@@ -162,6 +169,9 @@
 
 	self->notify_irmanager = TRUE;
 
+	/* We are now open, so time to do some work */
+	irlan_client_wakeup(self, self->saddr, self->daddr);
+
 	MOD_INC_USE_COUNT;
 	
 	return 0;
@@ -196,7 +206,7 @@
 	
 	irlan_start_watchdog_timer(self, IRLAN_TIMEOUT);
 
-	/* Device closed by user */
+	/* Device closed by user! */
 	if (self->notify_irmanager)
 		self->notify_irmanager = FALSE;
 	else
@@ -233,7 +243,7 @@
 	
 	dev->tx_queue_len = TTP_MAX_QUEUE;
 
-#ifdef 0
+#if 0
 	/*  
 	 *  OK, since we are emulating an IrLAN sever we will have to give
 	 *  ourself an ethernet address!
@@ -274,6 +284,7 @@
 __initfunc(int irlan_init(void))
 {
 	struct irlan_cb *new;
+	__u16 hints;
 
 	DEBUG(4, __FUNCTION__"()\n");
 
@@ -289,12 +300,14 @@
 
 	DEBUG(4, __FUNCTION__ "()\n");
 	
-	/* Register with IrLMP as a service user */
-	irlmp_register_layer(S_LAN, CLIENT, TRUE, 
-			     irlan_client_discovery_indication);
+	hints = irlmp_service_to_hint(S_LAN);
+
+	/* Register with IrLMP as a client */
+	ckey = irlmp_register_client(hints, irlan_client_discovery_indication,
+				     NULL);
 	
 	/* Register with IrLMP as a service */
- 	irlmp_register_layer(S_LAN, SERVER, FALSE, NULL);
+ 	skey = irlmp_register_service(hints);
 
 	/* Start the first IrLAN instance */
  	new = irlan_open(DEV_ADDR_ANY, DEV_ADDR_ANY, FALSE);
@@ -309,9 +322,9 @@
 {
 	DEBUG(4, __FUNCTION__ "()\n");
 
-	irlmp_unregister_layer(S_LAN, SERVER);
+	irlmp_unregister_client(ckey);
 
-	irlmp_unregister_layer(S_LAN, CLIENT);
+	irlmp_unregister_service(skey);
 
 #ifdef CONFIG_PROC_FS
 	proc_unregister(&proc_irda, proc_irlan.low_ino);
@@ -344,8 +357,7 @@
 	self->dev.name = self->ifname;
 	
 	if (register_netdev(&self->dev) != 0) {
-		DEBUG(2, __FUNCTION__ 
-		      "(), register_netdev() failed!\n");
+		DEBUG(2, __FUNCTION__ "(), register_netdev() failed!\n");
 		return -1;
 	}
 	self->netdev_registered = TRUE;
@@ -472,7 +484,7 @@
 }
 
 void irlan_connect_indication(void *instance, void *sap, struct qos_info *qos,
-			      int max_sdu_size, struct sk_buff *skb)
+			      __u32 max_sdu_size, struct sk_buff *skb)
 {
 	struct irlan_cb *self;
 	struct tsap_cb *tsap;
@@ -505,7 +517,7 @@
 }
 
 void irlan_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
-			   int max_sdu_size, struct sk_buff *skb) 
+			   __u32 max_sdu_size, struct sk_buff *skb) 
 {
 	struct irlan_cb *self;
 
@@ -1043,6 +1055,7 @@
 {
 	__u8 *frame;
 	__u8 param_len;
+	__u16 tmp_le; /* Temporary value in little endian format */
 	int n=0;
 	
 	if (skb == NULL) {
@@ -1085,7 +1098,8 @@
 	memcpy(frame+n, param, param_len); n += param_len;
 	
 	/* Insert value length (2 byte little endian format, LSB first) */
-	*((__u16 *) (frame+n)) = cpu_to_le16(value_len); n += 2;
+	tmp_le = cpu_to_le16(value_len);
+	memcpy(frame+n, &tmp_le, 2); n += 2; /* To avoid alignment problems */
 
 	/* Insert value */
 	switch (type) {
@@ -1093,7 +1107,8 @@
 		frame[n++] = value_byte;
 		break;
 	case IRLAN_SHORT:
-		*((__u16 *) (frame+n)) = cpu_to_le16(value_short); n += 2;
+		tmp_le = cpu_to_le16(value_short);
+		memcpy(frame+n, &tmp_le, 2); n += 2;
 		break;
 	case IRLAN_ARRAY:
 		memcpy(frame+n, value_array, value_len); n+=value_len;
@@ -1137,7 +1152,8 @@
 	 *  Get length of parameter value (2 bytes in little endian 
 	 *  format) 
 	 */
-	val_len = le16_to_cpup(buf+n); n+=2;
+	memcpy(&val_len, buf+n, 2); /* To avoid alignment problems */
+	le16_to_cpus(&val_len); n+=2;
 	
 	if (val_len > 1016) {
 		DEBUG(2, __FUNCTION__ "(), parameter length to long\n");
@@ -1277,9 +1293,7 @@
  */
 int init_module(void) 
 {
-	irlan_init();
-
-	return 0;
+	return irlan_init();
 }
 
 /*
diff -urN linux-2.2.6-pre2/net/irda/irlan/irlan_eth.c linux-2.2.6-pre3/net/irda/irlan/irlan_eth.c
--- linux-2.2.6-pre2/net/irda/irlan/irlan_eth.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlan/irlan_eth.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Oct 15 08:37:58 1998
- * Modified at:   Wed Feb  3 19:58:28 1999
+ * Modified at:   Mon Mar 22 17:41:59 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Sources:       skeleton.c by Donald Becker <becker@CESDIS.gsfc.nasa.gov>
  *                slip.c by Laurence Culhane,   <loz@holmes.demon.co.uk>
@@ -31,6 +31,7 @@
 #include <net/arp.h>
 
 #include <net/irda/irda.h>
+#include <net/irda/irmod.h>
 #include <net/irda/irlan_common.h>
 #include <net/irda/irlan_eth.h>
 
@@ -123,20 +124,20 @@
  *    This function gets the data that is received on the data channel
  *
  */
-void irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb)
+int irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb)
 {
 	struct irlan_cb *self;
 
 	self = (struct irlan_cb *) instance;
 
-	ASSERT(self != NULL, return;);
-	ASSERT(self->magic == IRLAN_MAGIC, return;);
+	ASSERT(self != NULL, return 0;);
+	ASSERT(self->magic == IRLAN_MAGIC, return 0;);
 
 	if (skb == NULL) {
 		++self->stats.rx_dropped; 
-		return;
+		return 0;
 	}
-	ASSERT(skb->len > 1, return;);
+	ASSERT(skb->len > 1, return 0;);
 		
 	/* 
 	 * Adopt this frame! Important to set all these fields since they 
@@ -151,7 +152,7 @@
 	self->stats.rx_packets++;
 	self->stats.rx_bytes += skb->len; 
 
-/* 	net_bh(); */
+	return 0;
 }
 
 /*
diff -urN linux-2.2.6-pre2/net/irda/irlan/irlan_filter.c linux-2.2.6-pre3/net/irda/irlan/irlan_filter.c
--- linux-2.2.6-pre2/net/irda/irlan/irlan_filter.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlan/irlan_filter.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Fri Jan 29 11:16:38 1999
- * Modified at:   Sun Feb  7 23:48:07 1999
+ * Modified at:   Thu Feb 25 15:10:54 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -138,8 +138,8 @@
  *    Check parameters in request from peer device
  *
  */
-static void irlan_check_command_param(struct irlan_cb *self, char *param, 
-				      char *value)
+void irlan_check_command_param(struct irlan_cb *self, char *param, 
+			       char *value)
 {
 	__u8 *bytes;
 
diff -urN linux-2.2.6-pre2/net/irda/irlan/irlan_provider.c linux-2.2.6-pre3/net/irda/irlan/irlan_provider.c
--- linux-2.2.6-pre2/net/irda/irlan/irlan_provider.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlan/irlan_provider.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Thu Feb  4 16:08:33 1999
+ * Modified at:   Tue Apr  6 19:08:20 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Sources:       skeleton.c by Donald Becker <becker@CESDIS.gsfc.nasa.gov>
  *                slip.c by Laurence Culhane,   <loz@holmes.demon.co.uk>
@@ -56,8 +56,8 @@
  *    This function gets the data that is received on the control channel
  *
  */
-void irlan_provider_data_indication(void *instance, void *sap, 
-				    struct sk_buff *skb) 
+int irlan_provider_data_indication(void *instance, void *sap, 
+				   struct sk_buff *skb) 
 {
 	struct irlan_cb *self;
 	__u8 code;
@@ -66,10 +66,10 @@
 	
 	self = (struct irlan_cb *) instance;
 
-	ASSERT(self != NULL, return;);
-	ASSERT(self->magic == IRLAN_MAGIC, return;);
+	ASSERT(self != NULL, return -1;);
+	ASSERT(self->magic == IRLAN_MAGIC, return -1;);
 
-	ASSERT(skb != NULL, return;);
+	ASSERT(skb != NULL, return -1;);
 
 	code = skb->data[0];
 	switch(code) {
@@ -102,6 +102,7 @@
 		DEBUG(2, __FUNCTION__ "(), Unknown command!\n");
 		break;
 	}
+	return 0;
 }
 
 /*
@@ -111,8 +112,8 @@
  *
  */
 void irlan_provider_connect_indication(void *instance, void *sap, 
-				       struct qos_info *qos, int max_sdu_size,
-				       struct sk_buff *skb)
+				       struct qos_info *qos,
+				       __u32 max_sdu_size, struct sk_buff *skb)
 {
 	struct irlan_cb *self, *entry, *new;
 	struct tsap_cb *tsap;
@@ -248,7 +249,6 @@
 	__u8 *frame;
 	__u8 *ptr;
 	int count;
-	__u8 name_len;
 	__u16 val_len;
 	int i;
 	char *name;
diff -urN linux-2.2.6-pre2/net/irda/irlap.c linux-2.2.6-pre3/net/irda/irlap.c
--- linux-2.2.6-pre2/net/irda/irlap.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlap.c	2003-08-15 15:05:39.000000000 -0700
@@ -3,10 +3,10 @@
  * Filename:      irlap.c
  * Version:       0.9
  * Description:   An IrDA LAP driver for Linux
- * Status:        Experimental.
+ * Status:        Stable.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Aug  4 20:40:53 1997
- * Modified at:   Sat Feb 20 01:39:58 1999
+ * Modified at:   Tue Apr  6 21:07:08 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -30,6 +30,7 @@
 #include <linux/delay.h>
 #include <linux/proc_fs.h>
 #include <linux/init.h>
+#include <linux/random.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irda_device.h>
@@ -127,11 +128,17 @@
 	skb_queue_head_init( &self->tx_list);
 	skb_queue_head_init( &self->wx_list);
 
-	/* My unique IrLAP device address! :-) */
-	self->saddr = jiffies;
+	/* My unique IrLAP device address! */
+	get_random_bytes(&self->saddr, sizeof(self->saddr));
 
-	/*  Generate random connection address for this session */
-	self->caddr = jiffies & 0xfe;
+	/* 
+	 * Generate random connection address for this session, which must
+	 * be 7 bits wide and different from 0x00 and 0xfe 
+	 */
+	while ((self->caddr == 0x00) || (self->caddr == 0xfe)) {
+		get_random_bytes(&self->caddr, sizeof(self->caddr));
+		self->caddr &= 0xfe;
+	}
 
 	init_timer( &self->slot_timer);
 	init_timer( &self->query_timer);
@@ -147,7 +154,7 @@
 
 	hashbin_insert( irlap, (QUEUE *) self, self->saddr, NULL);
 
-	irlmp_register_irlap( self, self->saddr, &self->notify);
+	irlmp_register_link( self, self->saddr, &self->notify);
 	
 	return self;
 }
@@ -181,9 +188,9 @@
 }
 
 /*
- * Function irlap_close ()
+ * Function irlap_close (self)
  *
- *    
+ *    Remove IrLAP instance
  *
  */
 void irlap_close( struct irlap_cb *self) 
@@ -197,7 +204,7 @@
 
 	irlap_disconnect_indication( self, LAP_DISC_INDICATION);
 
-	irlmp_unregister_irlap( self->saddr);
+	irlmp_unregister_link(self->saddr);
 	self->notify.instance = NULL;
 
 	/* Be sure that we manage to remove ourself from the hash */
@@ -210,7 +217,7 @@
 }
 
 /*
- * Function irlap_connect_indication ()
+ * Function irlap_connect_indication (self, skb)
  *
  *    Another device is attempting to make a connection
  *
@@ -229,31 +236,32 @@
 }
 
 /*
- * Function irlap_connect_response (void)
+ * Function irlap_connect_response (self, skb)
  *
  *    Service user has accepted incomming connection
  *
  */
-void irlap_connect_response( struct irlap_cb *self, struct sk_buff *skb) 
+void irlap_connect_response(struct irlap_cb *self, struct sk_buff *skb) 
 {
 	DEBUG( 4, __FUNCTION__ "()\n");
 	
-	irlap_do_event( self, CONNECT_RESPONSE, skb, NULL);
+	irlap_do_event(self, CONNECT_RESPONSE, skb, NULL);
 }
 
 /*
- * Function irlap_connect_request (daddr, qos, sniff)
+ * Function irlap_connect_request (self, daddr, qos_user, sniff)
  *
  *    Request connection with another device, sniffing is not implemented 
  *    yet.
+ *
  */
-void irlap_connect_request( struct irlap_cb *self, __u32 daddr, 
-			    struct qos_info *qos_user, int sniff) 
+void irlap_connect_request(struct irlap_cb *self, __u32 daddr, 
+			   struct qos_info *qos_user, int sniff) 
 {
-	DEBUG( 4, __FUNCTION__ "()\n"); 
+	DEBUG(3, __FUNCTION__ "(), daddr=0x%08x\n", daddr);
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LAP_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LAP_MAGIC, return;);
 
  	self->daddr = daddr;
 	
@@ -261,32 +269,33 @@
 	 *  If the service user specifies QoS values for this connection, 
 	 *  then use them
 	 */
-	irlap_init_qos_capabilities( self, qos_user);
+	irlap_init_qos_capabilities(self, qos_user);
 	
-	if ( self->state == LAP_NDM)
-		irlap_do_event( self, CONNECT_REQUEST, NULL, NULL);
+	if ((self->state == LAP_NDM) && 
+	    !irda_device_is_media_busy(self->irdev))
+		irlap_do_event(self, CONNECT_REQUEST, NULL, NULL);
 	else
 		self->connect_pending = TRUE;
 }
 
 /*
- * Function irlap_connect_confirm (void)
+ * Function irlap_connect_confirm (self, skb)
  *
- *    Connection request is accepted
+ *    Connection request has been accepted
  *
  */
-void irlap_connect_confirm( struct irlap_cb *self, struct sk_buff *skb)
+void irlap_connect_confirm(struct irlap_cb *self, struct sk_buff *skb)
 {
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LAP_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LAP_MAGIC, return;);
 
-	irlmp_link_connect_confirm( self->notify.instance, &self->qos_tx, skb);
+	irlmp_link_connect_confirm(self->notify.instance, &self->qos_tx, skb);
 }
 
 /*
- * Function irlap_data_indication (skb)
+ * Function irlap_data_indication (self, skb)
  *
  *    Received data frames from IR-port, so we just pass them up to 
  *    IrLMP for further processing
@@ -451,7 +460,6 @@
 #ifdef CONFIG_IRDA_COMPRESSION
 	irda_free_compression( self);
 #endif
-
 	/* Flush queues */
 	irlap_flush_all_queues( self);
 	
@@ -479,7 +487,7 @@
  *    Start one single discovery operation.
  *
  */
-void irlap_discovery_request( struct irlap_cb *self, DISCOVERY *discovery) 
+void irlap_discovery_request(struct irlap_cb *self, discovery_t *discovery) 
 {
 	struct irlap_info info;
 	
@@ -568,7 +576,7 @@
  *    Somebody is trying to discover us!
  *
  */
-void irlap_discovery_indication( struct irlap_cb *self, DISCOVERY *discovery) 
+void irlap_discovery_indication(struct irlap_cb *self, discovery_t *discovery) 
 {
 	DEBUG( 4, __FUNCTION__ "()\n");
 
@@ -578,7 +586,7 @@
 
 	ASSERT( self->notify.instance != NULL, return;);
 	
-	irlmp_discovery_indication( self->notify.instance, discovery);
+	irlmp_link_discovery_indication(self->notify.instance, discovery);
 }
 
 /*
@@ -587,7 +595,7 @@
  *    
  *
  */
-void irlap_status_indication( int quality_of_link) 
+void irlap_status_indication(int quality_of_link) 
 {
 	switch( quality_of_link) {
 	case STATUS_NO_ACTIVITY:
@@ -599,7 +607,7 @@
 	default:
 		break;
 	}
-	irlmp_status_indication( quality_of_link, NO_CHANGE);
+	irlmp_status_indication(quality_of_link, LOCK_NO_CHANGE);
 }
 
 /*
@@ -629,7 +637,7 @@
  */
 void irlap_reset_confirm(void)
 {
-	DEBUG( 1, __FUNCTION__ "()\n");
+ 	DEBUG( 1, __FUNCTION__ "()\n");
 }
 
 /*
@@ -795,7 +803,7 @@
  *    frame in order to delay for the specified amount of time. This is
  *    done to avoid using timers, and the forbidden udelay!
  */
-void irlap_wait_min_turn_around( struct irlap_cb *self, struct qos_info *qos) 
+void irlap_wait_min_turn_around(struct irlap_cb *self, struct qos_info *qos) 
 {
 	int usecs;
 	int speed;
diff -urN linux-2.2.6-pre2/net/irda/irlap_event.c linux-2.2.6-pre3/net/irda/irlap_event.c
--- linux-2.2.6-pre2/net/irda/irlap_event.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlap_event.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Aug 16 00:59:29 1997
- * Modified at:   Thu Feb 11 00:38:58 1999
+ * Modified at:   Fri Mar 26 14:24:09 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>,
@@ -84,6 +84,7 @@
 	"RECV_DISCOVERY_XID_RSP",
 	"RECV_SNRM_CMD",
 	"RECV_TEST_CMD",
+	"RECV_TEST_RSP",
 	"RECV_UA_RSP",
 	"RECV_DM_RSP",
 	"RECV_I_CMD",
@@ -206,13 +207,13 @@
 {
 	int ret;
 	
-	if ( !self || self->magic != LAP_MAGIC)
+	if (!self || self->magic != LAP_MAGIC)
 		return;
 	
-  	DEBUG( 4, __FUNCTION__ "(), event = %s, state = %s\n", 
-	       irlap_event[ event], irlap_state[ self->state]); 
+  	DEBUG(4, __FUNCTION__ "(), event = %s, state = %s\n", 
+	      irlap_event[ event], irlap_state[ self->state]); 
 	
-	ret = (*state[ self->state]) ( self, event, skb, info);
+	ret = (*state[ self->state]) (self, event, skb, info);
 	
 	/* 
 	 *  Check if there are any pending events that needs to be executed
@@ -243,7 +244,9 @@
 		break;
 	case LAP_NDM:
 		/* Check if we should try to connect */
-		if (self->connect_pending) {
+		if ((self->connect_pending) && 
+		    !irda_device_is_media_busy(self->irdev)) 
+		{
 			self->connect_pending = FALSE;
 			
 			ret = (*state[self->state])(self, CONNECT_REQUEST, 
@@ -292,7 +295,7 @@
 static int irlap_state_ndm( struct irlap_cb *self, IRLAP_EVENT event, 
 			    struct sk_buff *skb,  struct irlap_info *info) 
 {
-	DISCOVERY *discovery_rsp;
+	discovery_t *discovery_rsp;
 	int ret = 0;
 	
 	DEBUG( 4, __FUNCTION__ "()\n");
@@ -304,7 +307,7 @@
 	case CONNECT_REQUEST:
 		ASSERT( self->irdev != NULL, return -1;);
 
-		if ( irda_device_is_media_busy( self->irdev)) {
+		if (irda_device_is_media_busy(self->irdev)) {
 			DEBUG( 0, __FUNCTION__
 			      "(), CONNECT_REQUEST: media busy!\n");
 			
@@ -354,7 +357,7 @@
 		self->s++;
 
 		irlap_start_slot_timer( self, self->slot_timeout);
-		irlap_next_state( self, LAP_QUERY);
+		irlap_next_state(self, LAP_QUERY);
 		break;
 
 	case RECV_DISCOVERY_XID_CMD:
@@ -362,20 +365,20 @@
 
 		/* Assert that this is not the final slot */
 		if ( info->s <= info->S) {
-			self->daddr = info->daddr; 
-			self->slot = irlap_generate_rand_time_slot( info->S,
-								    info->s);
+			/* self->daddr = info->daddr;  */
+			self->slot = irlap_generate_rand_time_slot(info->S,
+								   info->s);
 			DEBUG( 4, "XID_CMD: S=%d, s=%d, slot %d\n", info->S, 
 			       info->s, self->slot);
 
 			if ( self->slot == info->s) {
 				discovery_rsp = irlmp_get_discovery_response();
-				
-				DEBUG( 4, "Sending XID rsp 1\n");
-				irlap_send_discovery_xid_frame( self, info->S, 
-								self->slot, 
-								FALSE,
-								discovery_rsp);
+				discovery_rsp->daddr = info->daddr;
+
+				irlap_send_discovery_xid_frame(self, info->S, 
+							       self->slot, 
+							       FALSE,
+							       discovery_rsp);
 				self->frame_sent = TRUE;
 			} else
 				self->frame_sent = FALSE;
@@ -384,11 +387,21 @@
 			irlap_next_state( self, LAP_REPLY);
 		}
 
-		dev_kfree_skb( skb);
+		dev_kfree_skb(skb);
+		break;
+
+	case RECV_TEST_CMD:
+		skb_pull(skb, sizeof(struct test_frame));
+		irlap_send_test_frame(self, info->daddr, skb);
+		dev_kfree_skb(skb);
+		break;
+	case RECV_TEST_RSP:
+		DEBUG(0, __FUNCTION__ "() not implemented!\n");
+		dev_kfree_skb(skb);
 		break;
-		
 	default:
-		/* 	DEBUG( 0, "irlap_state_ndm: Unknown event"); */
+		DEBUG(2, __FUNCTION__ "(), Unknown event %s", 
+		      irlap_event[event]);
 		ret = -1;
 		break;
 	}	
@@ -414,14 +427,14 @@
 		ASSERT( info != NULL, return -1;);
 		ASSERT( info->discovery != NULL, return -1;);
 
-		DEBUG( 4, __FUNCTION__ "(), daddr=%08x\n", 
-		       info->discovery->daddr);
+		DEBUG(4, __FUNCTION__ "(), daddr=%08x\n", 
+		      info->discovery->daddr);
 
 		hashbin_insert( self->discovery_log, 
 				(QUEUE *) info->discovery,
 				info->discovery->daddr, NULL);
 
-		dev_kfree_skb( skb);
+		dev_kfree_skb(skb);
 
 		/* Keep state */
 		irlap_next_state( self, LAP_QUERY); 
@@ -453,8 +466,8 @@
 		}
 		break;
 	default:
-		DEBUG( 4, __FUNCTION__ "(), Unknown event %d, %s\n", event, 
-		       irlap_event[event]);
+		DEBUG(2, __FUNCTION__ "(), Unknown event %d, %s\n", event, 
+		      irlap_event[event]);
 
 		if ( skb != NULL) {
 			dev_kfree_skb( skb);
@@ -475,7 +488,7 @@
 static int irlap_state_reply( struct irlap_cb *self, IRLAP_EVENT event, 
 			      struct sk_buff *skb, struct irlap_info *info) 
 {
-	DISCOVERY *discovery_rsp;
+	discovery_t *discovery_rsp;
 	int ret=0;
 
 	DEBUG( 4, __FUNCTION__ "()\n");
@@ -503,19 +516,18 @@
 			irlap_next_state( self, LAP_NDM);
 
 			irlap_discovery_indication( self, info->discovery); 
-		} else if (( info->s >= self->slot) && 
-			   ( !self->frame_sent)) {
-			DEBUG( 4, "Sending XID rsp 2, s=%d\n", info->s); 
+		} else if ((info->s >= self->slot) && (!self->frame_sent)) {
 			discovery_rsp = irlmp_get_discovery_response();
+			discovery_rsp->daddr = info->daddr;
 
-			irlap_send_discovery_xid_frame( self, info->S, 
-							self->slot, FALSE,
-							discovery_rsp);
+			irlap_send_discovery_xid_frame(self, info->S,
+						       self->slot, FALSE,
+						       discovery_rsp);
 
 			self->frame_sent = TRUE;
-			irlap_next_state( self, LAP_REPLY);
+			irlap_next_state(self, LAP_REPLY);
 		}
-		dev_kfree_skb( skb);
+		dev_kfree_skb(skb);
 		break;
 	default:
 		DEBUG(1, __FUNCTION__ "(), Unknown event %d, %s\n", event,
@@ -1823,7 +1835,11 @@
 		irlap_next_state( self, LAP_NRM_S);
 #endif
 		break;
-
+	case RECV_TEST_CMD:
+		skb_pull(skb, sizeof(struct test_frame));
+		irlap_send_test_frame(self, info->daddr, skb);
+		dev_kfree_skb(skb);
+		break;
 	default:
 		DEBUG(1, __FUNCTION__ "(), Unknown event %d, (%s)\n", 
 		      event, irlap_event[event]);
diff -urN linux-2.2.6-pre2/net/irda/irlap_frame.c linux-2.2.6-pre3/net/irda/irlap_frame.c
--- linux-2.2.6-pre2/net/irda/irlap_frame.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlap_frame.c	2003-08-15 15:05:39.000000000 -0700
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irlap_frame.c
- * Version:       0.8
+ * Version:       0.9
  * Description:   Build and transmit IrLAP frames
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Aug 19 10:27:26 1997
- * Modified at:   Sat Feb 20 01:40:14 1999
+ * Modified at:   Tue Apr  6 16:35:21 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Resrved.
@@ -24,12 +24,15 @@
 
 #include <linux/config.h>
 #include <linux/skbuff.h>
-#include <net/sock.h>
-
 #include <linux/if.h>
 #include <linux/if_ether.h>
 #include <linux/netdevice.h>
+#include <linux/irda.h>
+ 
 #include <net/pkt_sched.h>
+#include <net/sock.h>
+ 
+#include <asm/byteorder.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irda_device.h>
@@ -39,8 +42,6 @@
 #include <net/irda/irlap_frame.h>
 #include <net/irda/qos.h>
 
-extern __u8 *irlmp_hint_to_service( __u8 *hint);
-
 /*
  * Function irlap_insert_mtt (self, skb)
  *
@@ -57,6 +58,7 @@
 
 	cb = (struct irlap_skb_cb *) skb->cb;
 	
+	cb->magic = LAP_MAGIC;
 	cb->mtt = self->mtt_required;
 	
 	/* Reset */
@@ -105,16 +107,11 @@
 void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos) 
 {
 	struct sk_buff *skb;
-	__u8 *frame;
+	struct snrm_frame *frame;
 	int len;
-	int n;
-
-	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LAP_MAGIC, return;);
-
-	n = 0;
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LAP_MAGIC, return;);
 
 	/* Allocate frame */
 	skb = dev_alloc_skb(64);
@@ -122,29 +119,28 @@
 		return;
 
 	skb_put(skb, 2); 
-	frame = skb->data;
+	frame = (struct snrm_frame *) skb->data;
 
-	/* Insert address field */
-	frame[n] = CMD_FRAME;
-	frame[n++] |= (qos) ? CBROADCAST : self->caddr;
+	/* Insert connection address field */
+	if (qos)
+		frame->caddr = CMD_FRAME | CBROADCAST;
+	else
+		frame->caddr = CMD_FRAME | self->caddr;
 
 	/* Insert control field */
- 	frame[n++] = SNRM_CMD | PF_BIT;
+ 	frame->control = SNRM_CMD | PF_BIT;
 	
 	/*
 	 *  If we are establishing a connection then insert QoS paramerters 
 	 */
 	if (qos) {
 		skb_put(skb, 9); /* 21 left */
-		*((__u32 *)(frame+n)) = cpu_to_le32(self->saddr); n += 4;
-		*((__u32 *)(frame+n)) = cpu_to_le32(self->daddr); n += 4;
-
-/* 		memcpy(frame+n, &self->saddr, 4); n += 4; */
-/* 		memcpy(frame+n, &self->daddr, 4); n += 4; */
+		frame->saddr = cpu_to_le32(self->saddr);
+		frame->daddr = cpu_to_le32(self->daddr);
 
-		frame[n++] = self->caddr;
+		frame->ncaddr = self->caddr;
 				
-		len = irda_insert_qos_negotiation_params(qos, frame+n);
+		len = irda_insert_qos_negotiation_params(qos, frame->params);
 		/* Should not be dangerous to do this afterwards */
 		skb_put(skb, len);
 	}
@@ -157,26 +153,32 @@
  *    Received SNRM (Set Normal Response Mode) command frame
  *
  */
-static void irlap_recv_snrm_cmd( struct irlap_cb *self, struct sk_buff *skb, 
-				 struct irlap_info *info) 
+static void irlap_recv_snrm_cmd(struct irlap_cb *self, struct sk_buff *skb, 
+				struct irlap_info *info) 
 {
 	struct snrm_frame *frame;
 
-	DEBUG( 4, __FUNCTION__ "() <%ld>\n", jiffies);
+	DEBUG(3, __FUNCTION__ "()\n");
 
-	ASSERT( skb != NULL, return;);
-	ASSERT( info != NULL, return;);
+	ASSERT(skb != NULL, return;);
+	ASSERT(info != NULL, return;);
 
-	frame = ( struct snrm_frame *) skb->data;
+	frame = (struct snrm_frame *) skb->data;
 
 	/* Copy peer device address */
-	/* memcpy( &info->daddr, &frame->saddr, 4); */
 	info->daddr = le32_to_cpu(frame->saddr);
 
 	/* Copy connection address */
 	info->caddr = frame->ncaddr;
 
-	irlap_do_event( self, RECV_SNRM_CMD, skb, info);
+	/* Check if connection address has got a valid value */
+	if ((info->caddr == 0x00) || (info->caddr == 0xfe)) {
+		DEBUG(3, __FUNCTION__ "(), invalid connection address!\n");
+		dev_kfree_skb(skb);
+		return;
+	}
+
+	irlap_do_event(self, RECV_SNRM_CMD, skb, info);
 }
 
 /*
@@ -188,8 +190,7 @@
 void irlap_send_ua_response_frame(struct irlap_cb *self, struct qos_info *qos)
 {
 	struct sk_buff *skb;
-	__u8 *frame;
-	int n;
+	struct ua_frame *frame;
 	int len;
 	
 	DEBUG(2, __FUNCTION__ "() <%ld>\n", jiffies);
@@ -198,29 +199,25 @@
 	ASSERT(self->magic == LAP_MAGIC, return;);
 
 	skb = NULL;
-	n = 0;
 
 	/* Allocate frame */
-	skb =  dev_alloc_skb(64);
+	skb = dev_alloc_skb(64);
 	if (!skb)
 		return;
 
 	skb_put( skb, 10);
-	frame = skb->data;
+	frame = (struct ua_frame *) skb->data;
 	
 	/* Build UA response */
-	frame[n++] = self->caddr;
- 	frame[n++] = UA_RSP | PF_BIT;
+	frame->caddr = self->caddr;
+ 	frame->control = UA_RSP | PF_BIT;
 
-	*((__u32 *)(frame+n)) = cpu_to_le32(self->saddr); n += 4;
-	*((__u32 *)(frame+n)) = cpu_to_le32(self->daddr); n += 4;
+	frame->saddr = cpu_to_le32(self->saddr);
+	frame->daddr = cpu_to_le32(self->daddr);
 
-/* 	memcpy( frame+n, &self->saddr, 4); n += 4; */
-/* 	memcpy( frame+n, &self->daddr, 4); n += 4; */
-	
 	/* Should we send QoS negotiation parameters? */
 	if (qos) {
-		len = irda_insert_qos_negotiation_params(qos, frame+n);
+		len = irda_insert_qos_negotiation_params(qos, frame->params);
 		skb_put(skb, len);
 	}
 
@@ -239,8 +236,8 @@
 	struct sk_buff *skb = NULL;
 	__u8 *frame;
 	
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LAP_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LAP_MAGIC, return;);
 
 	skb = dev_alloc_skb(32);
 	if (!skb)
@@ -249,7 +246,7 @@
 	skb_put( skb, 2);
 	frame = skb->data;
 	
-	if ( self->state == LAP_NDM)
+	if (self->state == LAP_NDM)
 		frame[0] = CBROADCAST;
 	else
 		frame[0] = self->caddr;
@@ -294,8 +291,8 @@
  *    Build and transmit a XID (eXchange station IDentifier) discovery
  *    frame. 
  */
-void irlap_send_discovery_xid_frame( struct irlap_cb *self, int S, __u8 s, 
-				     __u8 command, DISCOVERY *discovery) 
+void irlap_send_discovery_xid_frame(struct irlap_cb *self, int S, __u8 s, 
+				    __u8 command, discovery_t *discovery) 
 {
 	struct sk_buff *skb = NULL;
 	struct xid_frame *frame;
@@ -311,8 +308,8 @@
 	if (!skb)
 		return;
 
-	skb_put( skb, 14);
-	frame = ( struct xid_frame *) skb->data;
+	skb_put(skb, 14);
+	frame = (struct xid_frame *) skb->data;
 
 	if ( command) {
 		frame->caddr = CBROADCAST | CMD_FRAME;
@@ -324,16 +321,13 @@
 	frame->ident = XID_FORMAT;
 
 	frame->saddr = cpu_to_le32(self->saddr);
-/* 	memcpy( &frame->saddr, &self->saddr, 4); */
 
-	if ( command)
-		/* memcpy( &frame->daddr, &bcast, 4); */
+	if (command)
 		frame->daddr = cpu_to_le32(bcast);
 	else
-		/* memcpy( &frame->daddr, &self->daddr, 4); */
-		frame->daddr = cpu_to_le32(self->daddr);
+		frame->daddr = cpu_to_le32(discovery->daddr);
 	
-	switch( S) {
+	switch(S) {
 	case 1:
 		frame->flags = 0x00;
 		break;
@@ -362,15 +356,15 @@
 	if ( !command || ( frame->slotnr == 0xff)) {
 		int i;
 
-		if (discovery->hint[0] & HINT_EXTENSION)
+		if (discovery->hints.byte[0] & HINT_EXTENSION)
 			skb_put( skb, 3+discovery->info_len);
 		else
 			skb_put( skb, 2+discovery->info_len);
 		
 		i = 0;
-		frame->discovery_info[i++] = discovery->hint[0];
-		if( discovery->hint[0] & HINT_EXTENSION)
-			frame->discovery_info[i++] = discovery->hint[1];
+		frame->discovery_info[i++] = discovery->hints.byte[0];
+		if(discovery->hints.byte[0] & HINT_EXTENSION)
+			frame->discovery_info[i++] = discovery->hints.byte[1];
 		
 		frame->discovery_info[i++] = discovery->charset;
 
@@ -391,47 +385,48 @@
  *    Received a XID discovery response
  *
  */
-static void irlap_recv_discovery_xid_rsp( struct irlap_cb *self, 
-					  struct sk_buff *skb, 
-					  struct irlap_info *info) 
+static void irlap_recv_discovery_xid_rsp(struct irlap_cb *self, 
+					 struct sk_buff *skb, 
+					 struct irlap_info *info) 
 {
 	struct xid_frame *xid;
-	DISCOVERY *discovery = NULL;
+	discovery_t *discovery = NULL;
 	char *text;
 
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LAP_MAGIC, return;);
-	ASSERT( skb != NULL, return;);
-	ASSERT( info != NULL, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LAP_MAGIC, return;);
+	ASSERT(skb != NULL, return;);
+	ASSERT(info != NULL, return;);
 
-	if (( discovery = kmalloc( sizeof( DISCOVERY), GFP_ATOMIC)) == NULL) {
-		DEBUG( 0, __FUNCTION__ "(), kmalloc failed!\n");
+	if ((discovery = kmalloc(sizeof(discovery_t), GFP_ATOMIC)) == NULL) {
+		DEBUG(0, __FUNCTION__ "(), kmalloc failed!\n");
 		return;
 	}
-	memset( discovery, 0, sizeof( DISCOVERY));
+	memset(discovery, 0, sizeof(discovery_t));
 
 	xid = (struct xid_frame *) skb->data;
 
 	/* 
 	 *  Copy peer device address and set the source address
 	 */
-	memcpy( &info->daddr, &xid->saddr, 4);
+	info->daddr = le32_to_cpu(xid->saddr);
 	discovery->daddr = info->daddr;
 	discovery->saddr = self->saddr;
+	discovery->timestamp = jiffies;
 
-	DEBUG( 4, __FUNCTION__ "(), daddr=%08x\n", discovery->daddr);
+	DEBUG(4, __FUNCTION__ "(), daddr=%08x\n", discovery->daddr);
 
 	/* Get info returned from peer */
-	discovery->hint[0] = xid->discovery_info[0];
-	if ( xid->discovery_info[0] & HINT_EXTENSION) {
-		DEBUG( 4, "EXTENSION\n");
-		discovery->hint[1] = xid->discovery_info[1];
+	discovery->hints.byte[0] = xid->discovery_info[0];
+	if (xid->discovery_info[0] & HINT_EXTENSION) {
+		DEBUG(4, "EXTENSION\n");
+		discovery->hints.byte[1] = xid->discovery_info[1];
 		discovery->charset = xid->discovery_info[2];
 		text = (char *) &xid->discovery_info[3];
 	} else {
-		discovery->hint[1] = 0;
+		discovery->hints.byte[1] = 0;
 		discovery->charset = xid->discovery_info[1];
 		text = (char *) &xid->discovery_info[2];
 	}
@@ -440,11 +435,11 @@
 	 *  FCS bytes resides.
 	 */
 	skb->data[skb->len] = '\0'; 
-	strcpy( discovery->info, text);
+	strcpy(discovery->info, text);
 
 	info->discovery = discovery;
 
-	irlap_do_event( self, RECV_DISCOVERY_XID_RSP, skb, info);
+	irlap_do_event(self, RECV_DISCOVERY_XID_RSP, skb, info);
 }
 
 /*
@@ -458,7 +453,7 @@
 					  struct irlap_info *info) 
 {
 	struct xid_frame *xid;
-	DISCOVERY *discovery = NULL;
+	discovery_t *discovery = NULL;
 	char *text;
 
 	DEBUG( 4, __FUNCTION__ "()\n");
@@ -471,7 +466,6 @@
 	xid = (struct xid_frame *) skb->data;
 	
 	/* Copy peer device address */
-	/* memcpy( &info->daddr, &xid->saddr, 4); */
 	info->daddr = le32_to_cpu(xid->saddr);
 
 	switch ( xid->flags & 0x03) {
@@ -500,25 +494,24 @@
 		/*
 		 *  We now have some discovery info to deliver!
 		 */
-		discovery = kmalloc( sizeof( DISCOVERY), GFP_ATOMIC);
-		if ( !discovery) {
-			DEBUG( 0, __FUNCTION__ "(), kmalloc failed!\n");
+		discovery = kmalloc( sizeof(discovery_t), GFP_ATOMIC);
+		if (!discovery)
 			return;
-		}
+	      
 		discovery->daddr = info->daddr;
 		discovery->saddr = self->saddr;
+		discovery->timestamp = jiffies;
 
 		DEBUG( 4, __FUNCTION__ "(), daddr=%08x\n", 
 		       discovery->daddr);
 
-		discovery->hint[0] = xid->discovery_info[0];
+		discovery->hints.byte[0] = xid->discovery_info[0];
 		if ( xid->discovery_info[0] & HINT_EXTENSION) {
-			DEBUG( 4, "EXTENSION\n");
-			discovery->hint[1] = xid->discovery_info[1];
+			discovery->hints.byte[1] = xid->discovery_info[1];
 			discovery->charset = xid->discovery_info[2];
 			text = (char *) &xid->discovery_info[3];
 		} else {
-			discovery->hint[1] = 0;
+			discovery->hints.byte[1] = 0;
 			discovery->charset = xid->discovery_info[1];
 			text = (char *) &xid->discovery_info[2];
 		}
@@ -533,9 +526,6 @@
 	} else
 		info->discovery = NULL;
 	
-	DEBUG( 4, __FUNCTION__"(), s=%d, S=%d <%ld>\n", 
-	       info->s, info->S, jiffies); 
-
 	irlap_do_event( self, RECV_DISCOVERY_XID_CMD, skb, info);
 }
 
@@ -553,23 +543,11 @@
 	ASSERT( self != NULL, return;);
 	ASSERT( self->magic == LAP_MAGIC, return;);
 
-#ifdef CONFIG_IRDA_RECYCLE_RR
-	if ( self->recycle_rr_skb) {
-		DEBUG( 4, __FUNCTION__ "(), recycling skb!\n");
-		skb = self->recycle_rr_skb;
-		self->recycle_rr_skb = NULL;
-	}
-#endif      
-	if (!skb) {
-		skb = dev_alloc_skb( 32);
-		if (!skb)
-			return;
-   
-		skb_put( skb, 2);
-	}
-	ASSERT( skb->len == 2, return;);
-
-	frame = skb->data;
+	skb = dev_alloc_skb(32);
+	if (!skb)
+		return;
+	
+	frame = skb_put(skb, 2);
 	
 	frame[0] = self->caddr;
 	frame[0] |= (command) ? CMD_FRAME : 0;
@@ -584,18 +562,16 @@
 /*
  * Function irlap_recv_rr_frame (skb, info)
  *
- *    Received RR (Receive Ready) frame from peer station
- *
- */
-static void irlap_recv_rr_frame( struct irlap_cb *self, struct sk_buff *skb, 
-				 struct irlap_info *info, int command)
+ *    Received RR (Receive Ready) frame from peer station, no harm in
+ *    making it inline since its called only from one single place
+ *    (irlap_input).
+ */
+static inline void irlap_recv_rr_frame(struct irlap_cb *self, 
+				       struct sk_buff *skb, 
+				       struct irlap_info *info, int command)
 {
 	__u8 *frame;
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LAP_MAGIC, return;);
-	ASSERT( skb != NULL, return;);
-
 	frame = skb->data;
 	info->nr = frame[1] >> 5;
 
@@ -609,32 +585,18 @@
 	 *  until it is outside a frame.
 	 */
 #if 0
-	if (( self->state != LAP_NRM_P) && ( self->state != LAP_NRM_S)) {
-		DEBUG( 0, __FUNCTION__ "(), Wrong state, dropping frame!\n");
-		dev_kfree_skb( skb);
+	if ((self->state != LAP_NRM_P) && (self->state != LAP_NRM_S)) {
+		DEBUG(0, __FUNCTION__ "(), Wrong state, dropping frame!\n");
+		dev_kfree_skb(skb);
 		return;
 	}
 #endif
 
-#ifdef CONFIG_IRDA_RECYCLE_RR
-	/* Only recycle one RR frame */
-	if ( self->recycle_rr_skb == NULL) {
-
-		/* Keep this skb, so it can be reused */
-		self->recycle_rr_skb = skb;
-
-		/*  
-		 *  Set skb to NULL, so that the state machine will not 
-		 *  try to deallocate it.
-		 */
-		skb = NULL;  
-	}
-#endif
 	/* Check if this is a command or a response frame */
-	if ( command)
-		irlap_do_event( self, RECV_RR_CMD, skb, info);
+	if (command)
+		irlap_do_event(self, RECV_RR_CMD, skb, info);
 	else
-		irlap_do_event( self, RECV_RR_RSP, skb, info);
+		irlap_do_event(self, RECV_RR_RSP, skb, info);
 }
 
 void irlap_send_frmr_frame( struct irlap_cb *self, int command)
@@ -847,8 +809,8 @@
  *    Send I(nformation) frame as secondary with final bit set
  *
  */
-void irlap_send_data_secondary_final( struct irlap_cb *self, 
-				      struct sk_buff *skb) 
+void irlap_send_data_secondary_final(struct irlap_cb *self, 
+				     struct sk_buff *skb) 
 {
 	struct sk_buff *tx_skb = NULL;
 
@@ -965,8 +927,7 @@
 	ASSERT( self != NULL, return;);
 	ASSERT( self->magic == LAP_MAGIC, return;);
 
-	DEBUG( 4, __FUNCTION__ "(), retry_count=%d\n",
-	       self->retry_count);
+	DEBUG( 4, __FUNCTION__ "(), retry_count=%d\n", self->retry_count);
 
 	/* Initialize variables */
 	skb = tx_skb = NULL;
@@ -1054,8 +1015,8 @@
  *    Contruct and transmit an Unnumbered Information (UI) frame
  *
  */
-void irlap_send_ui_frame( struct irlap_cb *self, struct sk_buff *skb, 
-			  int command) 
+void irlap_send_ui_frame(struct irlap_cb *self, struct sk_buff *skb, 
+			 int command) 
 {
 	__u8  *frame;
 
@@ -1079,8 +1040,8 @@
  *
  *    Contruct and transmit Information (I) frame
  */
-void irlap_send_i_frame( struct irlap_cb *self, struct sk_buff *skb, 
-			 int command) 
+void irlap_send_i_frame(struct irlap_cb *self, struct sk_buff *skb, 
+			int command) 
 {
 	__u8  *frame;
 	
@@ -1096,37 +1057,22 @@
 	
 	/* Insert next to receive (Vr) */
 	frame[1] |= (self->vr << 5);  /* insert nr */
-#if 0
-	{
-		int vr, vs, pf;
-		
-		/* Chech contents of various fields */
-		vr = frame[1] >> 5;
-		vs = (frame[1] >> 1) & 0x07;
-		pf = (frame[1] >> 4) & 0x01;
-		
-		DEBUG(0, __FUNCTION__ "(), vs=%d, vr=%d, p=%d, %ld\n", 
-		      vs, vr, pf, jiffies);
-	}
-#endif	
+
 	irlap_queue_xmit(self, skb);
 }
 
 /*
  * Function irlap_recv_i_frame (skb, frame)
  *
- *    Receive and parse an I (Information) frame
- * 
+ *    Receive and parse an I (Information) frame, no harm in making it inline
+ *    since it's called only from one single place (irlap_input).
  */
-static void irlap_recv_i_frame( struct irlap_cb *self, struct sk_buff *skb, 
-				struct irlap_info *info, int command) 
+static inline void irlap_recv_i_frame(struct irlap_cb *self, 
+				      struct sk_buff *skb, 
+				      struct irlap_info *info, int command) 
 {
 	__u8 *frame;
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LAP_MAGIC, return;);
-	ASSERT( skb != NULL, return;);
-
 	frame = skb->data;
 
 	info->nr = frame[1] >> 5;          /* Next to receive */
@@ -1143,17 +1089,17 @@
 	 *  it is receiving frames until the frame is delivered instead of
 	 *  until it is outside a frame.
 	 */
-	if (( self->state != LAP_NRM_P) && ( self->state != LAP_NRM_S)) {
-		DEBUG( 0, __FUNCTION__ "(), Wrong state, dropping frame!\n");
-		dev_kfree_skb( skb);
+	if ((self->state != LAP_NRM_P) && ( self->state != LAP_NRM_S)) {
+		DEBUG(0, __FUNCTION__ "(), Wrong state, dropping frame!\n");
+		dev_kfree_skb(skb);
 		return;
 	}
 
 	/* Check if this is a command or a response frame */
-	if ( command)
-		irlap_do_event( self, RECV_I_CMD, skb, info);
+	if (command)
+		irlap_do_event(self, RECV_I_CMD, skb, info);
 	else
-		irlap_do_event( self, RECV_I_RSP, skb, info);
+		irlap_do_event(self, RECV_I_RSP, skb, info);
 }
 
 /*
@@ -1227,22 +1173,94 @@
 }
 
 /*
- * Function irlap_input (skb)
+ * Function irlap_send_test_frame (self, daddr)
+ *
+ *    Send a test frame response
+ *
+ */
+void irlap_send_test_frame(struct irlap_cb *self, __u32 daddr, 
+			   struct sk_buff *cmd)
+{
+	struct sk_buff *skb;
+	struct test_frame *frame;
+	
+	skb = dev_alloc_skb(32);
+	if (!skb)
+		return;
+
+	skb_put(skb, sizeof(struct test_frame));
+
+	frame = (struct test_frame *) skb->data;
+
+	/* Build header */
+	if (self->state == LAP_NDM)
+		frame->caddr = CBROADCAST; /* Send response */
+	else
+		frame->caddr = self->caddr;
+
+	frame->control = TEST_RSP;
+
+	/* Insert the swapped addresses */
+	frame->saddr = cpu_to_le32(self->saddr);
+	frame->daddr = cpu_to_le32(daddr);
+
+	/* Copy info */
+	skb_put(skb, cmd->len);
+	memcpy(frame->info, cmd->data, cmd->len);
+
+	/* Return to sender */
+	irlap_wait_min_turn_around(self, &self->qos_tx);
+	irlap_queue_xmit(self, skb);
+}
+
+/*
+ * Function irlap_recv_test_frame (self, skb)
+ *
+ *    Receive a test frame
  *
- *  Called when a frame is received. Dispatches the right receive function 
- *  for processing of the frame.
  */
-int irlap_input( struct sk_buff *skb, struct device *netdev, 
-		 struct packet_type *ptype)
+void irlap_recv_test_frame(struct irlap_cb *self, struct sk_buff *skb, 
+			   struct irlap_info *info, int command)
+{
+	struct test_frame *frame;
+
+	DEBUG(0, __FUNCTION__ "()\n");
+	
+	if (skb->len < sizeof(struct test_frame)) {
+		DEBUG(0, __FUNCTION__ "() test frame to short!\n");
+		return;
+	}
+
+	frame = (struct test_frame *) skb->data;
+
+	/* Read and swap addresses */
+	info->daddr = le32_to_cpu(frame->saddr);
+	info->saddr = le32_to_cpu(frame->daddr);
+
+	if (command)
+		irlap_do_event(self, RECV_TEST_CMD, skb, info);
+	else
+		irlap_do_event(self, RECV_TEST_RSP, skb, info);
+}
+
+/*
+ * Function irlap_driver_rcv (skb, netdev, ptype)
+ *
+ *    Called when a frame is received. Dispatches the right receive function 
+ *    for processing of the frame.
+ *
+ */
+int irlap_driver_rcv(struct sk_buff *skb, struct device *dev, 
+		     struct packet_type *ptype)
 {
 	struct irlap_info info;
 	struct irlap_cb *self;
 	struct irda_device *idev;
 	__u8 *frame;
-	int i, command;
+	int command;
 	__u8 control;
 	
-	idev = ( struct irda_device *) netdev->priv;
+	idev = (struct irda_device *) dev->priv;
 
 	ASSERT( idev != NULL, return -1;);
 	self = idev->irlap;
@@ -1264,24 +1282,18 @@
 	/* 
 	 *  First check if this frame addressed to us 
 	 */
-	if (( info.caddr != self->caddr) && ( info.caddr != CBROADCAST)) {
-
-		DEBUG( 0, __FUNCTION__ "(), Received frame is not for us!\n");
-		for(i=0; i<(skb->len < 15?skb->len:15);i++) {
- 			printk( "%02x ", frame[i]);
-		}
- 		printk("\n"); 
-		
-		dev_kfree_skb( skb);
+	if ((info.caddr != self->caddr) && (info.caddr != CBROADCAST)) {
+		DEBUG(2, __FUNCTION__ "(), Received frame is not for us!\n");
 
+		dev_kfree_skb(skb);
 		return 0;
 	}
 	/*  
 	 *  Optimize for the common case and check if the frame is an
 	 *  I(nformation) frame. Only I-frames have bit 0 set to 0
 	 */
-	if( ~control & 0x01) {
-		irlap_recv_i_frame( self, skb, &info, command);
+	if(~control & 0x01) {
+		irlap_recv_i_frame(self, skb, &info, command);
 		self->stats.rx_packets++;
 		return 0;
 	}
@@ -1289,19 +1301,17 @@
 	 *  We now check is the frame is an S(upervisory) frame. Only 
 	 *  S-frames have bit 0 set to 1 and bit 1 set to 0
 	 */
-	if ( ~control & 0x02) {
+	if (~control & 0x02) {
 		/* 
 		 *  Received S(upervisory) frame, check which frame type it is
 		 *  only the first nibble is of interest
 		 */
-		switch( control & 0x0f) {
+		switch(control & 0x0f) {
 		case RR:
 			irlap_recv_rr_frame( self, skb, &info, command);
 			self->stats.rx_packets++;
 			break;
 		case RNR:
-			DEBUG( 4, "*** RNR frame received! pf = %d ***\n", 
-			       info.pf >> 4);
 			irlap_recv_rnr_frame( self, skb, &info);
 			self->stats.rx_packets++;
 			break;
@@ -1321,37 +1331,32 @@
 	/* 
 	 *  This must be a C(ontrol) frame 
 	 */
-	switch( control) {
+	switch(control) {
 	case XID_RSP:
-		DEBUG( 4, "XID rsp frame received!\n");
-		irlap_recv_discovery_xid_rsp( self, skb, &info);
+		irlap_recv_discovery_xid_rsp(self, skb, &info);
 		break;
 	case XID_CMD:
-		DEBUG( 4, "XID cmd frame received!\n");
-		irlap_recv_discovery_xid_cmd( self, skb, &info);
+		irlap_recv_discovery_xid_cmd(self, skb, &info);
 		break;
 	case SNRM_CMD:
-		DEBUG( 4, "SNRM frame received!\n"); 
-		irlap_recv_snrm_cmd( self, skb, &info);
+		irlap_recv_snrm_cmd(self, skb, &info);
 		break;
 	case DM_RSP:
 		DEBUG( 0, "DM rsp frame received!\n");
-		irlap_next_state( self, LAP_NDM);
+		irlap_next_state(self, LAP_NDM);
 		break;
 	case DISC_CMD:
-		DEBUG( 2, "DISC cmd frame received!\n");
-		irlap_do_event( self, RECV_DISC_FRAME, skb, &info);
+		irlap_do_event(self, RECV_DISC_FRAME, skb, &info);
 		break;
 	case TEST_CMD:
-		DEBUG( 0, "Test frame received!\n");
-		dev_kfree_skb( skb);
+		DEBUG(0,__FUNCTION__ "(), TEST_FRAME\n");
+		irlap_recv_test_frame(self, skb, &info, command);
 		break;
 	case UA_RSP:
 		DEBUG( 4, "UA rsp frame received!\n");
 		irlap_recv_ua_frame( self, skb, &info);
 		break;
 	case FRMR_RSP:
-		DEBUG( 4, "FRMR_RSP recevied!\n");
 		irlap_recv_frmr_frame( self, skb, &info);
 		break;
 	case UI_FRAME:
diff -urN linux-2.2.6-pre2/net/irda/irlmp.c linux-2.2.6-pre3/net/irda/irlmp.c
--- linux-2.2.6-pre2/net/irda/irlmp.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlmp.c	2003-08-15 15:05:39.000000000 -0700
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irlmp.c
- * Version:       0.8
+ * Version:       0.9
  * Description:   IrDA Link Management Protocol (LMP) layer                 
- * Status:        Experimental.
+ * Status:        Stable.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 17 20:54:32 1997
- * Modified at:   Sat Feb 20 01:28:39 1999
+ * Modified at:   Wed Apr  7 17:31:48 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -30,6 +30,9 @@
 #include <linux/types.h>
 #include <linux/proc_fs.h>
 #include <linux/init.h>
+#include <linux/kmod.h>
+#include <linux/random.h>
+#include <linux/irda.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irmod.h>
@@ -39,14 +42,13 @@
 #include <net/irda/iriap.h>
 #include <net/irda/irlmp.h>
 #include <net/irda/irlmp_frame.h>
-#include <linux/kmod.h>
 
 /* Master structure */
 struct irlmp_cb *irlmp = NULL;
 
 /* These can be altered by the sysctl interface */
-int sysctl_discovery = 0;
-int sysctl_discovery_slots = 6;
+int  sysctl_discovery = 0;
+int  sysctl_discovery_slots = 6;
 char sysctl_devname[65];
 
 char *lmp_reasons[] = {
@@ -61,8 +63,7 @@
 
 __u8 *irlmp_hint_to_service( __u8 *hint);
 #ifdef CONFIG_PROC_FS
-int irlmp_proc_read( char *buf, char **start, off_t offset, int len, 
-		     int unused);
+int irlmp_proc_read(char *buf, char **start, off_t offst, int len, int unused);
 #endif
 
 /*
@@ -83,19 +84,21 @@
 	
 	irlmp->magic = LMP_MAGIC;
 
-	irlmp->registry = hashbin_new( HB_LOCAL);
-	irlmp->links = hashbin_new( HB_LOCAL);
-	irlmp->unconnected_lsaps = hashbin_new( HB_GLOBAL);
+	irlmp->clients = hashbin_new(HB_GLOBAL);
+	irlmp->services = hashbin_new(HB_GLOBAL);
+	irlmp->links = hashbin_new(HB_GLOBAL);
+	irlmp->unconnected_lsaps = hashbin_new(HB_GLOBAL);
+	irlmp->cachelog = hashbin_new(HB_GLOBAL);
 	
 	irlmp->free_lsap_sel = 0x10; /* Servers use 0x00-0x0f */
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
 	irlmp->cache.valid = FALSE;
 #endif
-	strcpy( sysctl_devname, "Linux");
+	strcpy(sysctl_devname, "Linux");
 	
 	/* Do discovery every 3 seconds */
-	init_timer( &irlmp->discovery_timer);
-   	irlmp_start_discovery_timer( irlmp, 600); 
+	init_timer(&irlmp->discovery_timer);
+   	irlmp_start_discovery_timer(irlmp, 600); 
 
 	return 0;
 }
@@ -109,18 +112,19 @@
 void irlmp_cleanup(void) 
 {
 	/* Check for main structure */
-	ASSERT( irlmp != NULL, return;);
-	ASSERT( irlmp->magic == LMP_MAGIC, return;);
+	ASSERT(irlmp != NULL, return;);
+	ASSERT(irlmp->magic == LMP_MAGIC, return;);
 
-	del_timer( &irlmp->discovery_timer);
+	del_timer(&irlmp->discovery_timer);
 	
-	/* FIXME, we need a special function to deallocate LAPs */
-	hashbin_delete( irlmp->links, (FREE_FUNC) kfree);
-	hashbin_delete( irlmp->unconnected_lsaps, (FREE_FUNC) kfree);
-	hashbin_delete( irlmp->registry, (FREE_FUNC) kfree);
+	hashbin_delete(irlmp->links, (FREE_FUNC) kfree);
+	hashbin_delete(irlmp->unconnected_lsaps, (FREE_FUNC) kfree);
+	hashbin_delete(irlmp->clients, (FREE_FUNC) kfree);
+	hashbin_delete(irlmp->services, (FREE_FUNC) kfree);
+	hashbin_delete(irlmp->cachelog, (FREE_FUNC) kfree);
 	
 	/* De-allocate main structure */
-	kfree( irlmp);
+	kfree(irlmp);
 	irlmp = NULL;
 }
 
@@ -130,20 +134,20 @@
  *   Register with IrLMP and create a local LSAP,
  *   returns handle to LSAP.
  */
-struct lsap_cb *irlmp_open_lsap( __u8 slsap_sel, struct notify_t *notify)
+struct lsap_cb *irlmp_open_lsap(__u8 slsap_sel, struct notify_t *notify)
 {
 	struct lsap_cb *self;
 
-	ASSERT( notify != NULL, return NULL;);
-	ASSERT( irlmp != NULL, return NULL;);
-	ASSERT( irlmp->magic == LMP_MAGIC, return NULL;);
+	ASSERT(notify != NULL, return NULL;);
+	ASSERT(irlmp != NULL, return NULL;);
+	ASSERT(irlmp->magic == LMP_MAGIC, return NULL;);
 
-	DEBUG( 4, __FUNCTION__ "(), slsap_sel=%02x\n", slsap_sel);
+	DEBUG(4, __FUNCTION__ "(), slsap_sel=%02x\n", slsap_sel);
 
 	/* 
 	 *  Does the client care which Source LSAP selector it gets? 
 	 */
-	if ( slsap_sel == LSAP_ANY) {
+	if (slsap_sel == LSAP_ANY) {
 		/*
 		 *  Find unused LSAP
 		 */
@@ -155,41 +159,39 @@
 		 *  Client wants specific LSAP, so check if it's already
 		 *  in use
 		 */
-		if ( irlmp_slsap_inuse( slsap_sel)) {
+		if (irlmp_slsap_inuse(slsap_sel)) {
 			return NULL;
 		}
-		if ( slsap_sel > irlmp->free_lsap_sel)
-			irlmp->free_lsap_sel = slsap_sel+1;
 	}
 
 	/*
 	 *  Allocate new instance of a LSAP connection
 	 */
-	self = kmalloc( sizeof(struct lsap_cb), GFP_ATOMIC);
-	if ( self == NULL) {
+	self = kmalloc(sizeof(struct lsap_cb), GFP_ATOMIC);
+	if (self == NULL) {
 		printk( KERN_ERR "IrLMP: Can't allocate memory for "
 			"LSAP control block!\n");
 		return NULL;
 	}
-	memset( self, 0, sizeof(struct lsap_cb));
+	memset(self, 0, sizeof(struct lsap_cb));
 	
 	self->magic = LMP_LSAP_MAGIC;
 	self->slsap_sel = slsap_sel;
 	self->dlsap_sel = LSAP_ANY;
 	self->connected = FALSE;
 
-	init_timer( &self->watchdog_timer);
+	init_timer(&self->watchdog_timer);
 
-	ASSERT( notify->instance != NULL, return NULL;);
+	ASSERT(notify->instance != NULL, return NULL;);
 	self->notify = *notify;
 
-	irlmp_next_lsap_state( self, LSAP_DISCONNECTED);
+	irlmp_next_lsap_state(self, LSAP_DISCONNECTED);
 	
 	/*
 	 *  Insert into queue of unconnected LSAPs
 	 */
-	hashbin_insert( irlmp->unconnected_lsaps, (QUEUE *) self, 
-			self->slsap_sel, NULL);
+	hashbin_insert(irlmp->unconnected_lsaps, (QUEUE *) self, (int) self, 
+		       NULL);
 	
 	return self;
 }
@@ -197,65 +199,62 @@
 /*
  * Function irlmp_close_lsap (self)
  *
- *    Remove an instance of a LSAP
+ *    Remove an instance of LSAP
  */
-static void __irlmp_close_lsap( struct lsap_cb *self)
+static void __irlmp_close_lsap(struct lsap_cb *self)
 {
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
 
 	/*
 	 *  Set some of the variables to preset values
 	 */
 	self->magic = ~LMP_LSAP_MAGIC;
-	del_timer( &self->watchdog_timer); /* Important! */
+	del_timer(&self->watchdog_timer); /* Important! */
 
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
-	ASSERT( irlmp != NULL, return;);
+	ASSERT(irlmp != NULL, return;);
 	irlmp->cache.valid = FALSE;
 #endif
-	kfree( self);
+	kfree(self);
 }
 
 /*
  * Function irlmp_close_lsap (self)
  *
- *    
+ *    Close and remove LSAP
  *
  */
-void irlmp_close_lsap( struct lsap_cb *self)
+void irlmp_close_lsap(struct lsap_cb *self)
 {
 	struct lap_cb *lap;
-	struct lsap_cb *lsap;
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
+	struct lsap_cb *lsap = NULL;
 
-	lap = self->lap;
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
 
 	/*
 	 *  Find out if we should remove this LSAP from a link or from the
 	 *  list of unconnected lsaps (not associated with a link)
 	 */
-	if ( lap == NULL) {
-		lsap = hashbin_remove( irlmp->unconnected_lsaps, 
-				       self->slsap_sel, NULL);
-	} else {
-		ASSERT( lap != NULL, return;);
-		ASSERT( lap->magic == LMP_LAP_MAGIC, return;);
-		
-		lsap = hashbin_remove( lap->lsaps, self->slsap_sel, NULL);
+	lap = self->lap;
+	if (lap) {
+		ASSERT(lap->magic == LMP_LAP_MAGIC, return;);
+		lsap = hashbin_remove(lap->lsaps, (int) self, NULL);
+	}
+	/* Check if we found the LSAP! If not then try the unconnected lsaps */
+	if (!lsap) {
+		lsap = hashbin_remove(irlmp->unconnected_lsaps, (int) self, 
+				      NULL);
 	}
-	if ( lsap == NULL) {
-		DEBUG( 1, __FUNCTION__ 
+	if (!lsap) {
+		DEBUG(0, __FUNCTION__ 
 		       "(), Looks like somebody has removed me already!\n");
 		return;
 	}
-	ASSERT( lsap == self, return;);
-
-	__irlmp_close_lsap( self);
+	__irlmp_close_lsap(self);
 }
 
 /*
@@ -265,50 +264,47 @@
  *    instances of the IrLAP layer, each connected to different IrDA ports
  *
  */
-void irlmp_register_irlap( struct irlap_cb *irlap, __u32 saddr, 
-			   struct notify_t *notify)
+void irlmp_register_link(struct irlap_cb *irlap, __u32 saddr, 
+			 struct notify_t *notify)
 {
 	struct lap_cb *lap;
 
-	DEBUG( 4, __FUNCTION__ "(), Registered IrLAP, saddr = %08x\n",
-	       saddr);
+	DEBUG(4, __FUNCTION__ "(), Registered IrLAP, saddr = %08x\n", saddr);
 	
-	ASSERT( irlmp != NULL, return;);
-	ASSERT( irlmp->magic == LMP_MAGIC, return;);
-	ASSERT( notify != NULL, return;);
+	ASSERT(irlmp != NULL, return;);
+	ASSERT(irlmp->magic == LMP_MAGIC, return;);
+	ASSERT(notify != NULL, return;);
 
 	/*
 	 *  Allocate new instance of a LSAP connection
 	 */
-	lap = kmalloc( sizeof(struct lap_cb), GFP_KERNEL);
-	if ( lap == NULL) {
-		printk( KERN_ERR "IrLMP: Can't allocate memory for "
-			"LAP control block!\n");
+	lap = kmalloc(sizeof(struct lap_cb), GFP_KERNEL);
+	if (lap == NULL) {
+		DEBUG(3, __FUNCTION__ "(), unable to kmalloc\n");
 		return;
 	}
-	memset( lap, 0, sizeof(struct lap_cb));
+	memset(lap, 0, sizeof(struct lap_cb));
 	
 	lap->irlap = irlap;
 	lap->magic = LMP_LAP_MAGIC;
 	lap->saddr = saddr;
 	lap->daddr = DEV_ADDR_ANY;
-	lap->lsaps = hashbin_new( HB_GLOBAL);
- 	lap->cachelog = hashbin_new( HB_LOCAL);
+	lap->lsaps = hashbin_new(HB_GLOBAL);
 
-	irlmp_next_lap_state( lap, LAP_STANDBY);
+	irlmp_next_lap_state(lap, LAP_STANDBY);
 	
 	init_timer(&lap->idle_timer);
 
 	/*
 	 *  Insert into queue of unconnected LSAPs
 	 */
-	hashbin_insert( irlmp->links, (QUEUE *) lap, lap->saddr, NULL);
+	hashbin_insert(irlmp->links, (QUEUE *) lap, lap->saddr, NULL);
 
 	/* 
 	 *  We set only this variable so IrLAP can tell us on which link the
 	 *  different events happened on 
 	 */
-	irda_notify_init( notify);
+	irda_notify_init(notify);
 	notify->instance = lap;
 }
 
@@ -318,73 +314,26 @@
  *    IrLAP layer has been removed!
  *
  */
-void irlmp_unregister_irlap(__u32 saddr)
+void irlmp_unregister_link(__u32 saddr)
 {
-	struct lap_cb *self;
+	struct lap_cb *link;
 
 	DEBUG(4, __FUNCTION__ "()\n");
 
-	self = hashbin_remove(irlmp->links, saddr, NULL);
-	if (self) {
-		ASSERT(self->magic == LMP_LAP_MAGIC, return;);
-
-		del_timer(&self->idle_timer);	
-
-		self->magic = 0;
-		kfree(self);
-	} else {
-		DEBUG(1, __FUNCTION__ "(), Didn't find LAP layer!\n");
-	}
-}
-
-void dump_discoveries( hashbin_t *log)
-{
-	DISCOVERY *d;
+	link = hashbin_remove(irlmp->links, saddr, NULL);
+	if (link) {
+		ASSERT(link->magic == LMP_LAP_MAGIC, return;);
 
-	ASSERT( log != NULL, return;);
+		/* Remove all discoveries discovered at this link */
+		irlmp_expire_discoveries(irlmp->cachelog, link->saddr, TRUE);
 
-	d = (DISCOVERY *) hashbin_get_first( log);
-	while( d != NULL) {
-		DEBUG( 1, "Discovery:\n");
-		DEBUG( 1, "  daddr=%08x\n", d->daddr);
-		DEBUG( 1, "  name=%s\n", d->info);
+		del_timer(&link->idle_timer);	
 
-		d = (DISCOVERY *) hashbin_get_next( log);
+		link->magic = 0;
+		kfree(link);
 	}
 }
 
-static struct lap_cb *irlmp_find_link( __u32 daddr)
-{
-	struct lap_cb *lap;
-	unsigned long flags;
-
-	DEBUG( 1, __FUNCTION__ 
-	       "(), client didn't supply saddr, so try to look it up!\n");
-
-	/* 
-	 *  Find out which link to connect on, and make sure nothing strange
-	 *  happens while we traverse the list
-	 */
-	save_flags( flags);
-	cli();
-
-	lap = (struct lap_cb *) hashbin_get_first( irlmp->links);
-	while ( lap != NULL) {
-		ASSERT( lap->magic == LMP_LAP_MAGIC, return NULL;);
-		/* dump_discoveries( lap->cachelog); */
-
-		if ( hashbin_find( lap->cachelog, daddr, NULL)) {
-			DEBUG( 4, __FUNCTION__
-			       "() found link to connect on!\n");
-			return lap;
-		}
-		lap = (struct lap_cb *) hashbin_get_next( irlmp->links);
-	}
-	restore_flags(flags);
-
-	return NULL;
-}
-
 /*
  * Function irlmp_connect_request (handle, dlsap, userdata)
  *
@@ -398,36 +347,35 @@
 	struct sk_buff *skb = NULL;
 	struct lap_cb *lap;
 	struct lsap_cb *lsap;
+	discovery_t *discovery;
 
 	ASSERT( self != NULL, return -1;);
 	ASSERT( self->magic == LMP_LSAP_MAGIC, return -1;);
 	
-	DEBUG( 4, __FUNCTION__ 
-	       "(), slsap_sel=%02x, dlsap_sel=%02x, saddr=%08x, daddr=%08x\n", 
-	       self->slsap_sel, dlsap_sel, saddr, daddr);
+	DEBUG(2, __FUNCTION__ 
+	      "(), slsap_sel=%02x, dlsap_sel=%02x, saddr=%08x, daddr=%08x\n", 
+	      self->slsap_sel, dlsap_sel, saddr, daddr);
 	
-	if ( self->connected) {
-		DEBUG( 1, __FUNCTION__ "(), Error: already connected!!\n");
-		
+	if ( self->connected) 
 		return -EISCONN;
-	}
+
+	/* Client must supply destination device address */
+	if (!daddr)
+		return -EINVAL;
 
 	/* Any userdata? */
-	if ( userdata == NULL) {
-		skb = dev_alloc_skb( 64);
-		if (skb == NULL) {
-			DEBUG( 1, __FUNCTION__ 
-			       "(), Could not allocate sk_buff of length %d\n",
-			       64);
-			return -1;
-		}
-		skb_reserve( skb, LMP_CONTROL_HEADER+LAP_HEADER);
+	if (userdata == NULL) {
+		skb = dev_alloc_skb(64);
+		if (!skb)
+			return -ENOMEM;
+
+		skb_reserve(skb, LMP_CONTROL_HEADER+LAP_HEADER);
 	} else
 		skb = userdata;
 	
 	/* Make room for MUX control header ( 3 bytes) */
-	ASSERT( skb_headroom( skb) >= LMP_CONTROL_HEADER, return -1;);
-	skb_push( skb, LMP_CONTROL_HEADER);
+	ASSERT(skb_headroom(skb) >= LMP_CONTROL_HEADER, return -1;);
+	skb_push(skb, LMP_CONTROL_HEADER);
 
 	self->dlsap_sel = dlsap_sel;
 	self->tmp_skb = skb;
@@ -440,44 +388,48 @@
 	 * discovery log and check if any of the links has discovered a
 	 * device with the given daddr 
 	 */
-	if ( saddr)
-		lap = hashbin_find( irlmp->links, saddr, NULL);
-	else
-		lap = irlmp_find_link( daddr);
-	
-	if ( lap == NULL) {
-		DEBUG( 1, __FUNCTION__ "(), Unable to find a usable link!\n");
-		
+	if (!saddr) {
+		discovery = hashbin_find(irlmp->cachelog, daddr, NULL);
+		if (discovery)
+			saddr = discovery->saddr;
+	}
+	lap = hashbin_find(irlmp->links, saddr, NULL);	
+	if (lap == NULL) {
+		DEBUG(1, __FUNCTION__ "(), Unable to find a usable link!\n");
 		return -EHOSTUNREACH;
 	}
+
+	if (lap->daddr == DEV_ADDR_ANY)
+		lap->daddr = daddr;
+	else if (lap->daddr != daddr) {
+		DEBUG(0, __FUNCTION__ "(), sorry, but link is busy!\n");
+		return -EBUSY;
+	}
+
 	self->lap = lap;
 
 	/* 
 	 *  Remove LSAP from list of unconnected LSAPs and insert it into the 
-	 *  list of connected LSAPs for the particular link */
-	lsap = hashbin_remove( irlmp->unconnected_lsaps, self->slsap_sel, 
-			       NULL);
-
-	ASSERT( lsap != NULL, return -1;);
-	ASSERT( lsap->magic == LMP_LSAP_MAGIC, return -1;);
-	ASSERT( lsap->lap != NULL, return -1;);
-	ASSERT( lsap->lap->magic == LMP_LAP_MAGIC, return -1;);
+	 *  list of connected LSAPs for the particular link 
+	 */
+	lsap = hashbin_remove(irlmp->unconnected_lsaps, (int) self, NULL);
 
-	hashbin_insert( self->lap->lsaps, (QUEUE *) self, self->slsap_sel, 
-			NULL);
+	ASSERT(lsap != NULL, return -1;);
+	ASSERT(lsap->magic == LMP_LSAP_MAGIC, return -1;);
+	ASSERT(lsap->lap != NULL, return -1;);
+	ASSERT(lsap->lap->magic == LMP_LAP_MAGIC, return -1;);
 
-	self->connected = TRUE;
+	hashbin_insert(self->lap->lsaps, (QUEUE *) self, (int) self, NULL);
 
+	self->connected = TRUE;
+	
 	/*
 	 *  User supplied qos specifications?
 	 */
 	if (qos)
 		self->qos = *qos;
 	
-	DEBUG( 4, "*** Connecting SLSAP=%02x, DLSAP= %02x\n",
-	       self->slsap_sel, self->dlsap_sel);
-	
-	irlmp_do_lsap_event( self, LM_CONNECT_REQUEST, skb);
+	irlmp_do_lsap_event(self, LM_CONNECT_REQUEST, skb);
 
 	return 0;
 }
@@ -488,26 +440,26 @@
  *    Incomming connection
  *
  */
-void irlmp_connect_indication( struct lsap_cb *self, struct sk_buff *skb) 
+void irlmp_connect_indication(struct lsap_cb *self, struct sk_buff *skb) 
 {
 	int max_seg_size;
 
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(3, __FUNCTION__ "()\n");
 	
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
-	ASSERT( skb != NULL, return;);
-	ASSERT( self->lap != NULL, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
+	ASSERT(skb != NULL, return;);
+	ASSERT(self->lap != NULL, return;);
 
 	self->qos = *self->lap->qos;
 
 	max_seg_size = self->lap->qos->data_size.value;
-	DEBUG( 4, __FUNCTION__ "(), max_seg_size=%d\n", max_seg_size);
+	DEBUG(4, __FUNCTION__ "(), max_seg_size=%d\n", max_seg_size);
 	
 	/* Hide LMP_CONTROL_HEADER header from layer above */
-	skb_pull( skb, LMP_CONTROL_HEADER);
+	skb_pull(skb, LMP_CONTROL_HEADER);
 
-	if ( self->notify.connect_indication)
+	if (self->notify.connect_indication)
 		self->notify.connect_indication(self->notify.instance, self, 
 						&self->qos, max_seg_size, skb);
 }
@@ -520,7 +472,7 @@
  */
 void irlmp_connect_response( struct lsap_cb *self, struct sk_buff *userdata) 
 {
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(3, __FUNCTION__ "()\n");
 	
 	ASSERT( self != NULL, return;);
 	ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
@@ -543,11 +495,11 @@
  *
  *    LSAP connection confirmed peer device!
  */
-void irlmp_connect_confirm( struct lsap_cb *self, struct sk_buff *skb) 
+void irlmp_connect_confirm(struct lsap_cb *self, struct sk_buff *skb) 
 {
 	int max_seg_size;
 
-	DEBUG( 4, __FUNCTION__ "()\n");
+	DEBUG(3, __FUNCTION__ "()\n");
 	
 	ASSERT( skb != NULL, return;);
 	ASSERT( self != NULL, return;);
@@ -569,12 +521,52 @@
 }
 
 /*
+ * Function irlmp_dup (orig, instance)
+ *
+ *    Duplicate LSAP, can be used by servers to confirm a connection on a
+ *    new LSAP so it can keep listening on the old one.
+ *
+ */
+struct lsap_cb *irlmp_dup(struct lsap_cb *orig, void *instance) 
+{
+	struct lsap_cb *new;
+
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	/* Only allowed to duplicate unconnected LSAP's */
+	if (!hashbin_find(irlmp->unconnected_lsaps, (int) orig, NULL)) {
+		DEBUG(0, __FUNCTION__ "(), unable to find LSAP\n");
+		return NULL;
+	}
+	new = kmalloc(sizeof(struct lsap_cb), GFP_ATOMIC);
+	if (!new)  {
+		DEBUG(0, __FUNCTION__ "(), unable to kmalloc\n");
+		return NULL;
+	}
+	/* Dup */
+	memcpy(new, orig, sizeof(struct lsap_cb));
+	new->notify.instance = instance;
+	
+	init_timer(&new->watchdog_timer);
+	
+	hashbin_insert(irlmp->unconnected_lsaps, (QUEUE *) new, (int) new, 
+		       NULL);
+
+	/* Make sure that we invalidate the cache */
+#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
+	irlmp->cache.valid = FALSE;
+#endif /* CONFIG_IRDA_CACHE_LAST_LSAP */
+
+	return new;
+}
+
+/*
  * Function irlmp_disconnect_request (handle, userdata)
  *
  *    The service user is requesting disconnection, this will not remove the 
  *    LSAP, but only mark it as disconnected
  */
-void irlmp_disconnect_request( struct lsap_cb *self, struct sk_buff *userdata) 
+void irlmp_disconnect_request(struct lsap_cb *self, struct sk_buff *userdata) 
 {
 	struct lsap_cb *lsap;
 
@@ -608,14 +600,14 @@
 	ASSERT( self->lap->magic == LMP_LAP_MAGIC, return;);
 	ASSERT( self->lap->lsaps != NULL, return;);
 
-	lsap = hashbin_remove( self->lap->lsaps, self->slsap_sel, NULL);
+	lsap = hashbin_remove(self->lap->lsaps, (int) self, NULL);
 
 	ASSERT( lsap != NULL, return;);
 	ASSERT( lsap->magic == LMP_LSAP_MAGIC, return;);
 	ASSERT( lsap == self, return;);
 
-	hashbin_insert( irlmp->unconnected_lsaps, (QUEUE *) self, 
-			self->slsap_sel, NULL);
+	hashbin_insert(irlmp->unconnected_lsaps, (QUEUE *) self, (int) self, 
+		       NULL);
 	
 	/* Reset some values */
 	self->connected = FALSE;
@@ -651,12 +643,12 @@
 	ASSERT( self->lap != NULL, return;);
 	ASSERT( self->lap->lsaps != NULL, return;);
 
-	lsap = hashbin_remove( self->lap->lsaps, self->slsap_sel, NULL);
+	lsap = hashbin_remove( self->lap->lsaps, (int) self, NULL);
 
 	ASSERT( lsap != NULL, return;);
 	ASSERT( lsap == self, return;);
-	hashbin_insert( irlmp->unconnected_lsaps, (QUEUE *) lsap, 
-			lsap->slsap_sel, NULL);
+	hashbin_insert(irlmp->unconnected_lsaps, (QUEUE *) lsap, (int) lsap, 
+		       NULL);
 
 	self->lap = NULL;
 	
@@ -670,33 +662,24 @@
 }
 
 /*
- * Function irlmp_discovery_request (nslots)
+ * Function irlmp_do_discovery (nslots)
  *
- *    Do a discovery of devices in front of the computer
+ *    Do some discovery on all links
  *
  */
-void irlmp_discovery_request( int nslots)
+void irlmp_do_discovery(int nslots)
 {
 	struct lap_cb *lap;
 
-	DEBUG( 4, __FUNCTION__ "(), nslots=%d\n", nslots);
-
-	ASSERT( irlmp != NULL, return;);
-
-	if ( !sysctl_discovery)
-		return;
-
-	if ((nslots != 1)&&(nslots != 6)&&(nslots != 8)&&(nslots != 16)) {
-		DEBUG( 1, __FUNCTION__ "(), invalid number of slots value!\n");
+	/* Make sure value is sane */
+	if ((nslots != 1) && (nslots != 6) && (nslots != 8)&&(nslots != 16)) {
+		printk(KERN_WARNING __FUNCTION__ 
+		       "(), invalid value for number of slots!\n");
 		nslots = sysctl_discovery_slots = 8;
 	}
 
-	/*
-	 *  Construct new discovery info to be used by IrLAP,
-	 *  TODO: no need to do this every time!
-	 */
-	irlmp->discovery_cmd.hint[0] = irlmp->hint[0];
-	irlmp->discovery_cmd.hint[1] = irlmp->hint[1];
+	/* Construct new discovery info to be used by IrLAP, */
+	irlmp->discovery_cmd.hints.word = irlmp->hints.word;
 	
 	/* 
 	 *  Set character set for device name (we use ASCII), and 
@@ -704,134 +687,161 @@
 	 *  end
 	 */
 	irlmp->discovery_cmd.charset = CS_ASCII;
-	
-	strncpy( irlmp->discovery_cmd.info, sysctl_devname, 31);
-	irlmp->discovery_cmd.info_len = strlen( irlmp->discovery_cmd.info);
+	strncpy(irlmp->discovery_cmd.info, sysctl_devname, 31);
+	irlmp->discovery_cmd.info_len = strlen(irlmp->discovery_cmd.info);
 	irlmp->discovery_cmd.nslots = nslots;
 	
 	/*
 	 * Try to send discovery packets on all links
 	 */
-	lap = ( struct lap_cb *) hashbin_get_first( irlmp->links);
-	while ( lap != NULL) {
-		ASSERT( lap->magic == LMP_LAP_MAGIC, return;);
-
-		DEBUG( 4, __FUNCTION__ "() sending request!\n");
-		irlmp_do_lap_event( lap, LM_LAP_DISCOVERY_REQUEST, NULL);
+	lap = (struct lap_cb *) hashbin_get_first(irlmp->links);
+	while (lap != NULL) {
+		ASSERT(lap->magic == LMP_LAP_MAGIC, return;);
 		
-		lap = ( struct lap_cb *) hashbin_get_next( irlmp->links);
+		if (lap->lap_state == LAP_STANDBY) {
+			/* Expire discoveries discovered on this link */
+			irlmp_expire_discoveries(irlmp->cachelog, lap->saddr,
+						 FALSE);
+
+			/* Try to discover */
+			irlmp_do_lap_event(lap, LM_LAP_DISCOVERY_REQUEST, 
+					   NULL);
+		}
+		lap = (struct lap_cb *) hashbin_get_next(irlmp->links);
 	}
 }
 
 /*
+ * Function irlmp_discovery_request (nslots)
+ *
+ *    Do a discovery of devices in front of the computer
+ *
+ */
+void irlmp_discovery_request(int nslots)
+{
+
+	DEBUG(4, __FUNCTION__ "(), nslots=%d\n", nslots);
+
+	/* 
+	 * If discovery is already running, then just return the current 
+	 * discovery log
+	 */
+	if (sysctl_discovery) {
+		DEBUG(2, __FUNCTION__ "() discovery already running, so we"
+		      " just return the old discovery log!\n");
+		irlmp_discovery_confirm(irlmp->cachelog);
+	} else
+		irlmp_do_discovery(nslots);
+}
+
+#if 0
+/*
  * Function irlmp_check_services (discovery)
  *
  *    
  *
  */
-void irlmp_check_services( DISCOVERY *discovery) 
+void irlmp_check_services(discovery_t *discovery)
 {
-	struct irlmp_registration *entry;
+	struct irlmp_client *client;
 	struct irmanager_event event;
-	__u8 *service;
+	__u8 *service_log;
+	__u8 service;
 	int i = 0;
 
 	DEBUG(1, "IrDA Discovered: %s\n", discovery->info);
 	DEBUG(1, "    Services: ");
 
-	service = irlmp_hint_to_service( discovery->hint);
-	if (service != NULL) {
-		/*
-		 *  Check all services on the device
-		 */
-		while ( service[i] != S_END) {
-			DEBUG( 4, "service=%02x\n", service[i]);
-			entry = hashbin_find( irlmp->registry, 
-					      service[i], NULL);
-			if ( entry && entry->discovery_callback) {
-				DEBUG( 4, "discovery_callback!\n");
-				entry->discovery_callback( discovery);
-			} else {
-				/* 
-				 * Found no clients for dealing with this
-				 * service, so ask the user space irmanager
-				 * to try to load the right module for us
-				 */
-
-				event.event = EVENT_DEVICE_DISCOVERED;
-				event.service = service[i];
-				event.daddr = discovery->daddr;
-				sprintf( event.info, "%s", 
-					 discovery->info);
-				irmanager_notify( &event);
-			}
-			i++; /* Next service */
+	service_log = irlmp_hint_to_service(discovery->hints.byte);
+	if (!service_log)
+		return;
+
+	/*
+	 *  Check all services on the device
+	 */
+	while ((service = service_log[i++]) != S_END) {
+		DEBUG( 4, "service=%02x\n", service);
+		client = hashbin_find(irlmp->registry, service, NULL);
+		if (entry && entry->discovery_callback) {
+			DEBUG( 4, "discovery_callback!\n");
+
+			entry->discovery_callback(discovery);
+		} else {
+			/* Don't notify about the ANY service */
+			if (service == S_ANY)
+				continue;
+			/*  
+			 * Found no clients for dealing with this service,
+			 * so ask the user space irmanager to try to load
+			 * the right module for us 
+			 */
+			event.event = EVENT_DEVICE_DISCOVERED;
+			event.service = service;
+			event.daddr = discovery->daddr;
+			sprintf(event.info, "%s", discovery->info);
+			irmanager_notify(&event);
 		}
-		kfree( service);
 	}
+	kfree(service_log);
 }
-
+#endif
 /*
- * Function irlmp_discovery_confirm ( self, log)
+ * Function irlmp_notify_client (log)
+ *
+ *    Notify all about discovered devices
  *
- *    Some device(s) answered to our discovery request! Check to see which
- *    device it is, and give indication to the client(s)
- * 
  */
-void irlmp_discovery_confirm( struct lap_cb *self, hashbin_t *log) 
+void irlmp_notify_client(irlmp_client_t *client, hashbin_t *log)
 {
-	DISCOVERY *discovery;
+	discovery_t *discovery;
+
+	DEBUG(3, __FUNCTION__ "()\n");
 	
-	DEBUG( 4, __FUNCTION__ "()\n");
+	/* Check if client wants the whole log */
+	if (client->callback2)
+		client->callback2(log);
 	
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LMP_LAP_MAGIC, return;);
-
-	/*
-	 *  Now, check all discovered devices (if any)
+	/* 
+	 * Now, check all discovered devices (if any), and notify client 
+	 * only about the services that the client is interested in 
 	 */
-	discovery = ( DISCOVERY *) hashbin_get_first( log);
-	while ( discovery != NULL) {
-		self->daddr = discovery->daddr;
-
-		DEBUG( 4, "discovery->daddr = 0x%08x\n", discovery->daddr); 
+	discovery = (discovery_t *) hashbin_get_first(log);
+	while (discovery != NULL) {
+		DEBUG(3, "discovery->daddr = 0x%08x\n", discovery->daddr); 
 		
-		irlmp_check_services( discovery);
-
-		discovery = ( DISCOVERY *) hashbin_get_next( log);
+		if (client->hint_mask & discovery->hints.word) {
+			if (client->callback1)
+				client->callback1(discovery);
+		}
+		discovery = (discovery_t *) hashbin_get_next(log);
 	}
 }
 
 /*
- * Function irlmp_discovery_indication (discovery)
- *
- *    A remote device is discovering us!
+ * Function irlmp_discovery_confirm ( self, log)
  *
+ *    Some device(s) answered to our discovery request! Check to see which
+ *    device it is, and give indication to the client(s)
+ * 
  */
-void irlmp_discovery_indication( struct lap_cb *self, DISCOVERY *discovery)
+void irlmp_discovery_confirm(hashbin_t *log) 
 {
-	/* struct irda_event event; */
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LMP_LAP_MAGIC, return;);
-	ASSERT( discovery != NULL, return;);
-
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	DEBUG( 4, "discovery->daddr = 0x%08x\n", discovery->daddr); 
-	self->daddr = discovery->daddr;
-
-	ASSERT( self->cachelog != NULL, return;);
-
-	/*
-	 *  Insert this discovery device into the discovery_log if its
-	 *  not there already
-	 */
-	if ( !hashbin_find( self->cachelog, discovery->daddr, NULL))
-		hashbin_insert( self->cachelog, (QUEUE *) discovery,
-				discovery->daddr, NULL);
-
-	irlmp_check_services( discovery);
+	irlmp_client_t *client;
+	
+	DEBUG(3, __FUNCTION__ "()\n");
+	
+	ASSERT(log != NULL, return;);
+	
+	if (!hashbin_get_size(log))
+		return;
+	
+	client = (irlmp_client_t *) hashbin_get_first(irlmp->clients);
+	while (client != NULL) {
+		/* Check if we should notify client */
+		irlmp_notify_client(client, log);
+			
+		client = (irlmp_client_t *) hashbin_get_next(irlmp->clients);
+	}
 }
 
 /*
@@ -840,14 +850,13 @@
  *    Used by IrLAP to get the disocvery info it needs when answering
  *    discovery requests by other devices.
  */
-DISCOVERY *irlmp_get_discovery_response()
+discovery_t *irlmp_get_discovery_response()
 {
-	DEBUG( 4, "irlmp_get_discovery_response()\n");
+	DEBUG(4, __FUNCTION__ "()\n");
 
-	ASSERT( irlmp != NULL, return NULL;);
+	ASSERT(irlmp != NULL, return NULL;);
 
-	irlmp->discovery_rsp.hint[0] = irlmp->hint[0];
-	irlmp->discovery_rsp.hint[1] = irlmp->hint[1];
+	irlmp->discovery_rsp.hints.word = irlmp->hints.word;
 
 	/* 
 	 *  Set character set for device name (we use ASCII), and 
@@ -856,8 +865,8 @@
 	 */
 	irlmp->discovery_rsp.charset = CS_ASCII;
 
-	strncpy( irlmp->discovery_rsp.info, sysctl_devname, 31);
-	irlmp->discovery_rsp.info_len = strlen( irlmp->discovery_rsp.info) + 2;
+	strncpy(irlmp->discovery_rsp.info, sysctl_devname, 31);
+	irlmp->discovery_rsp.info_len = strlen(irlmp->discovery_rsp.info) + 2;
 
 	return &irlmp->discovery_rsp;
 }
@@ -870,17 +879,17 @@
  */
 void irlmp_data_request( struct lsap_cb *self, struct sk_buff *skb) 
 {
- 	DEBUG( 4, __FUNCTION__ "()\n"); 
+ 	DEBUG(4, __FUNCTION__ "()\n"); 
 
-	ASSERT( skb != NULL, return;);
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
+	ASSERT(skb != NULL, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
 	
 	/* Make room for MUX header */
-	ASSERT( skb_headroom( skb) >= LMP_HEADER, return;);
-	skb_push( skb, LMP_HEADER);
+	ASSERT(skb_headroom( skb) >= LMP_HEADER, return;);
+	skb_push(skb, LMP_HEADER);
 
-	irlmp_do_lsap_event( self, LM_DATA_REQUEST, skb);
+	irlmp_do_lsap_event(self, LM_DATA_REQUEST, skb);
 }
 
 /*
@@ -889,18 +898,18 @@
  *    Got data from LAP layer so pass it up to upper layer
  *
  */
-void irlmp_data_indication( struct lsap_cb *self, struct sk_buff *skb) 
+void irlmp_data_indication(struct lsap_cb *self, struct sk_buff *skb) 
 {
- 	DEBUG( 4, __FUNCTION__ "()\n"); 
+ 	DEBUG(4, __FUNCTION__ "()\n"); 
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
-	ASSERT( skb != NULL, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
+	ASSERT(skb != NULL, return;);
 
 	/* Hide LMP header from layer above */
-	skb_pull( skb, LMP_HEADER);
+	skb_pull(skb, LMP_HEADER);
 
-	if ( self->notify.data_indication)
+	if (self->notify.data_indication)
 		self->notify.data_indication(self->notify.instance, self, skb);
 }
 
@@ -940,9 +949,8 @@
 	/* Hide LMP header from layer above */
 	skb_pull( skb, LMP_HEADER);
 
-	if ( self->notify.udata_indication)
-		self->notify.udata_indication( self->notify.instance, self, 
-					      skb);
+	if (self->notify.udata_indication)
+		self->notify.udata_indication(self->notify.instance, self, skb);
 }
 
 /*
@@ -1043,145 +1051,228 @@
 	}
 	DEBUG(1, "\n");
 
+	/* So that client can be notified about any discovery */
+	service[i++] = S_ANY;
+
 	service[i] = S_END;
 	
 	return service;
 }
 
 /*
- * Function irlmp_service_to_hint (service, hint)
+ * Function irlmp_service_to_hint (service)
  *
- *    
+ *    Converts a service type, to a hint bit
  *
+ *    Returns: a 16 bit hint value, with the service bit set
  */
-void irlmp_service_to_hint( int service, __u8 *hint)
+__u16 irlmp_service_to_hint(int service)
 {
+	__u16_host_order hint;
+
+	hint.word = 0;
+
 	switch (service) {
 	case S_PNP:
-		hint[0] |= HINT_PNP;
+		hint.byte[0] |= HINT_PNP;
 		break;
 	case S_PDA:
-		hint[0] |= HINT_PDA;
+		hint.byte[0] |= HINT_PDA;
 		break;
 	case S_COMPUTER:
-		hint[0] |= HINT_COMPUTER;
+		hint.byte[0] |= HINT_COMPUTER;
 		break;
 	case S_PRINTER:
-		hint[0] |= HINT_PRINTER;
+		hint.byte[0] |= HINT_PRINTER;
 		break;
 	case S_MODEM:
-		hint[0] |= HINT_PRINTER;
+		hint.byte[0] |= HINT_PRINTER;
 		break;
 	case S_LAN:
-		hint[0] |= HINT_LAN;
+		hint.byte[0] |= HINT_LAN;
 		break;
 	case S_COMM:
-		hint[0] |= HINT_EXTENSION;
-		hint[1] |= HINT_COMM;
+		hint.byte[0] |= HINT_EXTENSION;
+		hint.byte[1] |= HINT_COMM;
 		break;
 	case S_OBEX:
-		hint[0] |= HINT_EXTENSION;
-		hint[1] |= HINT_OBEX;
+		hint.byte[0] |= HINT_EXTENSION;
+		hint.byte[1] |= HINT_OBEX;
+		break;
+	case S_ANY:
+		hint.word = 0xffff;
 		break;
 	default:
 		DEBUG( 1, __FUNCTION__ "(), Unknown service!\n");
 		break;
 	}
+	return hint.word;
 }
 
 /*
- * Function irlmp_register (service, type, callback)
+ * Function irlmp_register_service (service)
  *
- *    Register a local client or server with IrLMP
+ *    Register local service with IrLMP
  *
  */
-void irlmp_register_layer( int service, int type, int do_discovery, 
-			   DISCOVERY_CALLBACK callback)
+__u32 irlmp_register_service(__u16 hints)
 {
-	struct irlmp_registration *entry;
+	irlmp_service_t *service;
+	__u32 handle;
 
-	sysctl_discovery |= do_discovery;
+	DEBUG(4, __FUNCTION__ "(), hints = %04x\n", hints);
 
-	if ( type & SERVER)
-		irlmp_service_to_hint( service, irlmp->hint);
+	/* Get a unique handle for this service */
+	get_random_bytes(&handle, sizeof(handle));
+	while (hashbin_find(irlmp->services, handle, NULL) || !handle)
+		get_random_bytes(&handle, sizeof(handle));
 
-	/* Check if this service has been registred before */
-	entry = hashbin_find( irlmp->registry, service, NULL);
-	if ( entry != NULL) {
-		/* Update type in entry */
-		entry->type |= type;
+	irlmp->hints.word |= hints;
 
-		/*  Update callback only if client, since servers don't 
-		 *  use callbacks, and we don't want to overwrite a 
-		 *  previous registred client callback
-		 */
-		if ( type & CLIENT)
-			entry->discovery_callback = callback;
-		return;
+	/* Make a new registration */
+ 	service = kmalloc(sizeof(irlmp_service_t), GFP_ATOMIC);
+	if (!service) {
+		DEBUG(1, __FUNCTION__ "(), Unable to kmalloc!\n");
+		return 0;
+	}
+	service->hints = hints;
+	hashbin_insert(irlmp->services, (QUEUE*) service, handle, NULL);
+
+	return handle;
+}
+
+/*
+ * Function irlmp_unregister_service (handle)
+ *
+ *    Unregister service with IrLMP. 
+ *
+ *    Returns: 0 on success, -1 on error
+ */
+int irlmp_unregister_service(__u32 handle)
+{
+	irlmp_service_t *service;
+		
+ 	DEBUG(4, __FUNCTION__ "()\n");
+
+	if (!handle)
+		return -1;
+ 
+	service = hashbin_find(irlmp->services, handle, NULL);
+	if (!service) {
+		DEBUG(1, __FUNCTION__ "(), Unknown service!\n");
+		return -1;
 	}
 
+	service = hashbin_remove(irlmp->services, handle, NULL);
+	if (service)
+		kfree(service);
+
+	/* Remove old hint bits */
+	irlmp->hints.word = 0;
+
+	/* Refresh current hint bits */
+        service = (irlmp_service_t *) hashbin_get_first(irlmp->services);
+        while (service) {
+		irlmp->hints.word |= service->hints;
+
+                service = (irlmp_service_t *)hashbin_get_next(irlmp->services);
+        }
+	return 0;
+}
+
+/*
+ * Function irlmp_register_client (hint_mask, callback1, callback2)
+ *
+ *    Register a local client with IrLMP
+ *
+ *    Returns: handle > 0 on success, 0 on error
+ */
+__u32 irlmp_register_client(__u16 hint_mask, DISCOVERY_CALLBACK1 callback1,
+			    DISCOVERY_CALLBACK2 callback2)
+{
+	irlmp_client_t *client;
+	__u32 handle;
+
+	/* Get a unique handle for this client */
+	get_random_bytes(&handle, sizeof(handle));
+	while (hashbin_find(irlmp->clients, handle, NULL) || !handle)
+		get_random_bytes(&handle, sizeof(handle));
+
 	/* Make a new registration */
- 	entry = kmalloc( sizeof( struct irlmp_registration), GFP_ATOMIC);
-	if ( !entry) {
+ 	client = kmalloc(sizeof(irlmp_client_t), GFP_ATOMIC);
+	if (!client) {
 		DEBUG( 1, __FUNCTION__ "(), Unable to kmalloc!\n");
-		return;
+
+		return 0;
 	}
 
-	entry->service = service;
-	entry->type = type;
-	entry->discovery_callback = callback;
+	/* Register the details */
+	client->hint_mask = hint_mask;
+	client->callback1 = callback1;
+	client->callback2 = callback2;
+
+ 	hashbin_insert(irlmp->clients, (QUEUE *) client, handle, NULL);
 
- 	hashbin_insert( irlmp->registry, (QUEUE*) entry, entry->service, NULL);
+	return handle;
 }
 
 /*
- * Function irlmp_unregister (serivice)
+ * Function irlmp_update_client (handle, hint_mask, callback1, callback2)
  *
- *    
+ *    Updates specified client (handle) with possibly new hint_mask and
+ *    callback
  *
+ *    Returns: 0 on success, -1 on error
  */
-void irlmp_unregister_layer( int service, int type)
+int irlmp_update_client(__u32 handle, __u16 hint_mask, 
+			DISCOVERY_CALLBACK1 callback1, 
+			DISCOVERY_CALLBACK2 callback2)
 {
- 	struct irlmp_registration *entry;
- 
- 	DEBUG( 4, __FUNCTION__ "()\n");
- 
-	entry = hashbin_find( irlmp->registry, service, NULL);
-	if ( entry != NULL) {
-		DEBUG( 4, "Found entry to change or remove!\n");
-		/* Remove this type from the service registration */
-		entry->type &= ~type;
-	}
+	irlmp_client_t *client;
 
-	if ( !entry) {
-		DEBUG( 1, __FUNCTION__ "Unable to find entry to unregister!\n");
-		return;
-	}
+	if (!handle)
+		return -1;
 
-	/* 
-	 *  Remove entry if there is no more client and server support 
-	 *  left in entry
-	 */
-	if ( !entry->type) {
-		DEBUG( 4, __FUNCTION__ "(), removing entry!\n");
-		entry = hashbin_remove( irlmp->registry, service, NULL);
-		if ( entry != NULL)
-			kfree( entry);
+	client = hashbin_find(irlmp->clients, handle, NULL);
+	if (!client) {
+		DEBUG(1, __FUNCTION__ "(), Unknown client!\n");
+		return -1;
 	}
 
-	/* Remove old hint bits */
-	irlmp->hint[0] = 0;
-	irlmp->hint[1] = 0;
+	client->hint_mask = hint_mask;
+	client->callback1 = callback1;
+	client->callback2 = callback2;
+	
+	return 0;
+}
 
-	/* Refresh current hint bits */
-        entry = (struct irlmp_registration *) hashbin_get_first( irlmp->registry);
-        while( entry != NULL) {
-		if ( entry->type & SERVER)
-			irlmp_service_to_hint( entry->service, 
-					       irlmp->hint);
-                entry = (struct irlmp_registration *) 
-			hashbin_get_next( irlmp->registry);
-        }
+/*
+ * Function irlmp_unregister_client (handle)
+ *
+ *    Returns: 0 on success, -1 on error
+ *
+ */
+int irlmp_unregister_client(__u32 handle)
+{
+ 	struct irlmp_client *client;
+ 
+ 	DEBUG(4, __FUNCTION__ "()\n");
+
+	if (!handle)
+		return -1;
+ 
+	client = hashbin_find(irlmp->clients, handle, NULL);
+	if (!client) {
+		DEBUG(1, __FUNCTION__ "(), Unknown client!\n");
+		return -1;
+	}
+
+	DEBUG( 4, __FUNCTION__ "(), removing client!\n");
+	client = hashbin_remove( irlmp->clients, handle, NULL);
+	if (client)
+		kfree(client);
+	
+	return 0;
 }
 
 /*
@@ -1200,20 +1291,24 @@
 
 	DEBUG( 4, __FUNCTION__ "()\n");
 
+	/* Valid values are between 0 and 127 */
+	if (slsap_sel > 127)
+		return TRUE;
+
 	/*
 	 *  Check if slsap is already in use. To do this we have to loop over
 	 *  every IrLAP connection and check every LSAP assosiated with each
 	 *  the connection.
 	 */
-	lap = ( struct lap_cb *) hashbin_get_first( irlmp->links);
-	while ( lap != NULL) {
-		ASSERT( lap->magic == LMP_LAP_MAGIC, return TRUE;);
+	lap = (struct lap_cb *) hashbin_get_first(irlmp->links);
+	while (lap != NULL) {
+		ASSERT(lap->magic == LMP_LAP_MAGIC, return TRUE;);
+
+		self = (struct lsap_cb *) hashbin_get_first(lap->lsaps);
+		while (self != NULL) {
+			ASSERT(self->magic == LMP_LSAP_MAGIC, return TRUE;);
 
-		self = (struct lsap_cb *) hashbin_get_first( lap->lsaps);
-		while ( self != NULL) {
-			ASSERT( self->magic == LMP_LSAP_MAGIC, return TRUE;);
-
-			if (( self->slsap_sel == slsap_sel))/*  &&  */
+			if ((self->slsap_sel == slsap_sel))/*  &&  */
 /* 			    ( self->dlsap_sel == LSAP_ANY)) */
 			{
 				DEBUG( 4, "Source LSAP selector=%02x in use\n",
@@ -1236,14 +1331,28 @@
 __u8 irlmp_find_free_slsap(void) 
 {
 	__u8 lsap_sel;
+	int wrapped = 0;
 
-	ASSERT( irlmp != NULL, return -1;);
-	ASSERT( irlmp->magic == LMP_MAGIC, return -1;);
+	ASSERT(irlmp != NULL, return -1;);
+	ASSERT(irlmp->magic == LMP_MAGIC, return -1;);
       
 	lsap_sel = irlmp->free_lsap_sel++;
-
-	DEBUG( 4, __FUNCTION__ "(), next free lsap_sel=%02x\n", lsap_sel);
-
+	
+	/* Check if the new free lsap is really free */
+	while (irlmp_slsap_inuse(irlmp->free_lsap_sel)) {
+		irlmp->free_lsap_sel++;
+
+		/* Check if we need to wraparound */
+		if (irlmp->free_lsap_sel > 127) {
+			irlmp->free_lsap_sel = 10;
+
+			/* Make sure we terminate the loop */
+			if (wrapped++)
+				return 0;
+		}
+	}
+	DEBUG(4, __FUNCTION__ "(), next free lsap_sel=%02x\n", lsap_sel);
+	
 	return lsap_sel;
 }
 
@@ -1289,7 +1398,7 @@
 
 __u32 irlmp_get_saddr(struct lsap_cb *self)
 {
-	DEBUG(0, __FUNCTION__ "()\n");
+	DEBUG(3, __FUNCTION__ "()\n");
 
 	ASSERT(self != NULL, return 0;);
 	ASSERT(self->lap != NULL, return 0;);
@@ -1299,7 +1408,7 @@
 
 __u32 irlmp_get_daddr(struct lsap_cb *self)
 {
-	DEBUG(0, __FUNCTION__ "()\n");
+	DEBUG(3, __FUNCTION__ "()\n");
 
 	ASSERT(self != NULL, return 0;);
 	ASSERT(self->lap != NULL, return 0;);
diff -urN linux-2.2.6-pre2/net/irda/irlmp_event.c linux-2.2.6-pre3/net/irda/irlmp_event.c
--- linux-2.2.6-pre2/net/irda/irlmp_event.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlmp_event.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Aug  4 20:40:53 1997
- * Modified at:   Thu Feb 11 01:24:21 1999
+ * Modified at:   Thu Apr  8 16:26:41 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -149,36 +149,37 @@
 {
 /* 	struct irlmp_cb *self = ( struct irlmp_cb *) data; */
 	
-	DEBUG( 4, "IrLMP, discovery timer expired!\n");
+	DEBUG(4, "IrLMP, discovery timer expired!\n");
 	
-	irlmp_discovery_request( sysctl_discovery_slots);
+	if (sysctl_discovery)
+		irlmp_do_discovery(sysctl_discovery_slots);
 
 	/* Restart timer */
-	irlmp_start_discovery_timer( irlmp, 300);
+	irlmp_start_discovery_timer(irlmp, 300);
 }
 
 void irlmp_watchdog_timer_expired( unsigned long data)
 {
 	struct lsap_cb *self = ( struct lsap_cb *) data;
 	
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(2, __FUNCTION__ "()\n");
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
 
-	irlmp_do_lsap_event( self, LM_WATCHDOG_TIMEOUT, NULL);
+	irlmp_do_lsap_event(self, LM_WATCHDOG_TIMEOUT, NULL);
 }
 
 void irlmp_idle_timer_expired(unsigned long data)
 {
 	struct lap_cb *self = (struct lap_cb *) data;
 	
-	DEBUG( 0, __FUNCTION__ "()\n");
+	DEBUG(2, __FUNCTION__ "()\n");
 
 	ASSERT(self != NULL, return;);
 	ASSERT(self->magic == LMP_LAP_MAGIC, return;);
 
-	irlmp_do_lap_event( self, LM_LAP_IDLE_TIMEOUT, NULL);
+	irlmp_do_lap_event(self, LM_LAP_IDLE_TIMEOUT, NULL);
 }
 
 /*********************************************************************
@@ -193,8 +194,8 @@
  *    STANDBY, The IrLAP connection does not exist.
  *
  */
-static void irlmp_state_standby( struct lap_cb *self, IRLMP_EVENT event, 
-				 struct sk_buff *skb)
+static void irlmp_state_standby(struct lap_cb *self, IRLMP_EVENT event, 
+				struct sk_buff *skb)
 {	
 	DEBUG( 4, __FUNCTION__ "()\n"); 
 	ASSERT( self->irlap != NULL, return;);
@@ -203,11 +204,11 @@
 	case LM_LAP_DISCOVERY_REQUEST:
 		/* irlmp_next_station_state( LMP_DISCOVER); */
 		
-		irlap_discovery_request( self->irlap, &irlmp->discovery_cmd);
+		irlap_discovery_request(self->irlap, &irlmp->discovery_cmd);
 		break;
 	case LM_LAP_DISCOVERY_CONFIRM:
  		/* irlmp_next_station_state( LMP_READY); */
-		irlmp_discovery_confirm( self, self->cachelog);
+		irlmp_discovery_confirm(irlmp->cachelog);
  		break;
 	case LM_LAP_CONNECT_INDICATION:
 		/*  It's important to switch state first, to avoid IrLMP to 
@@ -323,11 +324,22 @@
 		 *  notify all LSAPs using this LAP, but that should be safe to
 		 *  do anyway.
 		 */
-		lsap = ( struct lsap_cb *) hashbin_get_first( self->lsaps);
-		while ( lsap != NULL) {
+		lsap = (struct lsap_cb *) hashbin_get_first(self->lsaps);
+		while (lsap != NULL) {
 			irlmp_do_lsap_event(lsap, LM_LAP_CONNECT_CONFIRM, skb);
  			lsap = (struct lsap_cb*) hashbin_get_next(self->lsaps);
 		}
+		
+		/* Needed by connect indication */
+		lsap = (struct lsap_cb *) hashbin_get_first(irlmp->unconnected_lsaps);
+		while (lsap != NULL) {
+			lsap_current = lsap;
+			
+			/* Be sure to stay one item ahead */
+ 			lsap = (struct lsap_cb*) hashbin_get_next(irlmp->unconnected_lsaps);
+			irlmp_do_lsap_event(lsap_current, 
+					    LM_LAP_CONNECT_CONFIRM, skb);
+		}
 		/* Keep state */
 		break;
 	case LM_LAP_DISCONNECT_REQUEST:
@@ -394,8 +406,6 @@
 static void irlmp_state_disconnected( struct lsap_cb *self, IRLMP_EVENT event,
 				      struct sk_buff *skb) 
 {
-	struct lsap_cb *lsap;
-
 	DEBUG( 4, __FUNCTION__ "()\n");
 
 	ASSERT( self != NULL, return;);
@@ -406,31 +416,15 @@
 		DEBUG( 4, __FUNCTION__ "(), LM_CONNECT_REQUEST\n");
 		irlmp_next_lsap_state( self, LSAP_SETUP_PEND);
 
-		irlmp_do_lap_event( self->lap, LM_LAP_CONNECT_REQUEST, NULL);
+		irlmp_do_lap_event(self->lap, LM_LAP_CONNECT_REQUEST, NULL);
 
 		/* Start watchdog timer ( 5 secs for now) */
-		irlmp_start_watchdog_timer( self, 500);
+		irlmp_start_watchdog_timer(self, 500);
 		break;
 	case LM_CONNECT_INDICATION:
-		irlmp_next_lsap_state( self, LSAP_CONNECT_PEND);
-
-		/* 
-		 *  Bind this LSAP to the IrLAP link where the connect was
-		 *  received 
-		 *  FIXME: this should be done in the LAP state machine
-		 */
-		lsap = hashbin_remove( irlmp->unconnected_lsaps, 
-				       self->slsap_sel, NULL);
+		irlmp_next_lsap_state(self, LSAP_CONNECT_PEND);
 
-		ASSERT( lsap == self, return;);
-		
-		ASSERT( self->lap != NULL, return;);
-		ASSERT( self->lap->lsaps != NULL, return;);
-		
-		hashbin_insert( self->lap->lsaps, (QUEUE *) self, 
-				self->slsap_sel, NULL);
-
-		irlmp_do_lap_event( self->lap, LM_LAP_CONNECT_REQUEST, skb);
+		irlmp_do_lap_event(self->lap, LM_LAP_CONNECT_REQUEST, skb);
 		break;
 	default:
 		DEBUG( 4, __FUNCTION__ "(), Unknown event %d\n", event);
@@ -447,6 +441,7 @@
 static void irlmp_state_connect( struct lsap_cb *self, IRLMP_EVENT event, 
 				 struct sk_buff *skb) 
 {
+	struct lsap_cb *lsap;
 
 	DEBUG( 4, __FUNCTION__ "()\n");
 	
@@ -457,12 +452,27 @@
 	case LM_CONNECT_RESPONSE:
 		ASSERT( skb != NULL, return;);
 
-		irlmp_send_lcf_pdu( self->lap, self->dlsap_sel, 
-				    self->slsap_sel, CONNECT_CNF, skb);
+		/* 
+		 *  Bind this LSAP to the IrLAP link where the connect was
+		 *  received 
+		 */
+		lsap = hashbin_remove(irlmp->unconnected_lsaps, (int) self, 
+				      NULL);
 
-		del_timer( &self->watchdog_timer);
+		ASSERT(lsap == self, return;);
+		
+		ASSERT(self->lap != NULL, return;);
+		ASSERT(self->lap->lsaps != NULL, return;);
+		
+		hashbin_insert(self->lap->lsaps, (QUEUE *) self, (int) self, 
+			       NULL);
 
-		irlmp_next_lsap_state( self, LSAP_DATA_TRANSFER_READY);
+		irlmp_send_lcf_pdu(self->lap, self->dlsap_sel, 
+				   self->slsap_sel, CONNECT_CNF, skb);
+
+		del_timer(&self->watchdog_timer);
+
+		irlmp_next_lsap_state(self, LSAP_DATA_TRANSFER_READY);
 		break;
 	default:
 		DEBUG( 4, __FUNCTION__ "(), Unknown event\n");
@@ -476,8 +486,8 @@
  *    CONNECT_PEND
  *
  */
-static void irlmp_state_connect_pend( struct lsap_cb *self, IRLMP_EVENT event,
-				      struct sk_buff *skb) 
+static void irlmp_state_connect_pend(struct lsap_cb *self, IRLMP_EVENT event,
+				     struct sk_buff *skb) 
 {
 	DEBUG( 4, __FUNCTION__ "()\n");
 
@@ -489,22 +499,20 @@
 		/* Keep state */
 		break;
 	case LM_CONNECT_RESPONSE:
-		printk( KERN_WARNING 
-			"IrLMP CONNECT-PEND, No indication issued yet\n");
+		DEBUG(0, __FUNCTION__ "(), LM_CONNECT_RESPONSE, "
+		      "no indication issued yet\n");
 		/* Keep state */
 		break;
 	case LM_DISCONNECT_REQUEST:
-		printk( KERN_WARNING
-			"IrLMP CONNECT-PEND, "
-			"Not yet bound to IrLAP connection\n");
+		DEBUG(0, __FUNCTION__ "(), LM_DISCONNECT_REQUEST, "
+		      "not yet bound to IrLAP connection\n");
 		/* Keep state */
 		break;
 	case LM_LAP_CONNECT_CONFIRM:
-		DEBUG( 4, "irlmp_state_connect_pend: LS_CONNECT_CONFIRM\n");
-		irlmp_next_lsap_state( self, LSAP_CONNECT);
-		irlmp_connect_indication( self, skb);
+		DEBUG(4, __FUNCTION__ "(), LS_CONNECT_CONFIRM\n");
+		irlmp_next_lsap_state(self, LSAP_CONNECT);
+		irlmp_connect_indication(self, skb);
 		break;
-		
 	default:
 		DEBUG( 4, __FUNCTION__ "Unknown event %d\n", event);
 		break;	
@@ -530,13 +538,13 @@
 
 	switch( event) {
 	case LM_CONNECT_REQUEST:
-		printk( KERN_WARNING 
-			"IrLMP DTR:  Error, LSAP allready connected\n");
+		DEBUG(0, __FUNCTION__ "(), LM_CONNECT_REQUEST, "
+		      "error, LSAP already connected\n");
 		/* Keep state */
 		break;
 	case LM_CONNECT_RESPONSE:
-		printk( KERN_WARNING 
-			"IrLMP DTR:  Error, LSAP allready connected\n");
+		DEBUG(0, __FUNCTION__ "(), LM_CONNECT_RESPONSE, " 
+		      "error, LSAP allready connected\n");
 		/* Keep state */
 		break;
 	case LM_DISCONNECT_REQUEST:
@@ -596,7 +604,6 @@
 		irlmp_do_lap_event(self->lap, LM_LAP_DISCONNECT_REQUEST, NULL);
 
 		irlmp_disconnect_indication( self, reason, skb);
-
 		break;
 	default:
 		DEBUG( 4, __FUNCTION__ "(), Unknown event %d\n", event);
@@ -632,18 +639,19 @@
 		irlmp_connect_confirm( self, skb);
 		break;
 	case LM_DISCONNECT_INDICATION:
-		irlmp_next_lsap_state( self, LSAP_DISCONNECTED);
+		DEBUG(0, __FUNCTION__ "(), this should never happen!!\n");
+		break;
+	case LM_LAP_DISCONNECT_INDICATION:
+		irlmp_next_lsap_state(self, LSAP_DISCONNECTED);
 
-		del_timer( &self->watchdog_timer);
+		del_timer(&self->watchdog_timer);
 
-		ASSERT( self->lap != NULL, return;);
-		ASSERT( self->lap->magic == LMP_LAP_MAGIC, return;);
+		ASSERT(self->lap != NULL, return;);
+		ASSERT(self->lap->magic == LMP_LAP_MAGIC, return;);
 		
-		ASSERT(skb != NULL, return;);
-		ASSERT(skb->len > 3, return;);
-		reason = skb->data[3];
+		reason = irlmp_convert_lap_reason(self->lap->reason);
 
-		irlmp_disconnect_indication( self, reason, skb);
+		irlmp_disconnect_indication(self, reason, skb);
 		break;
 	case LM_WATCHDOG_TIMEOUT:
 		DEBUG( 0, __FUNCTION__ "() WATCHDOG_TIMEOUT!\n");
diff -urN linux-2.2.6-pre2/net/irda/irlmp_frame.c linux-2.2.6-pre3/net/irda/irlmp_frame.c
--- linux-2.2.6-pre2/net/irda/irlmp_frame.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlmp_frame.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Aug 19 02:09:59 1997
- * Modified at:   Thu Feb 18 08:48:28 1999
+ * Modified at:   Tue Apr  6 18:31:11 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>
@@ -32,6 +32,7 @@
 #include <net/irda/timer.h>
 #include <net/irda/irlmp.h>
 #include <net/irda/irlmp_frame.h>
+#include <net/irda/discovery.h>
 
 static struct lsap_cb *irlmp_find_lsap( struct lap_cb *self, __u8 dlsap, 
 					__u8 slsap, int status, hashbin_t *);
@@ -123,32 +124,32 @@
 	 *  Check if this is an incoming connection, since we must deal with
 	 *  it in a different way than other established connections.
 	 */
-	if (( fp[0] & CONTROL_BIT) && ( fp[2] == CONNECT_CMD)) {
-		DEBUG( 4,"Incoming connection, source LSAP=%d, dest LSAP=%d\n",
-		       slsap_sel, dlsap_sel);
+	if ((fp[0] & CONTROL_BIT) && ( fp[2] == CONNECT_CMD)) {
+		DEBUG(3,"Incoming connection, source LSAP=%d, dest LSAP=%d\n",
+		      slsap_sel, dlsap_sel);
 		
 		/* Try to find LSAP among the unconnected LSAPs */
-		lsap = irlmp_find_lsap( self, dlsap_sel, slsap_sel, 
-					CONNECT_CMD, irlmp->unconnected_lsaps);
+		lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, CONNECT_CMD,
+				       irlmp->unconnected_lsaps);
 		
 		/* Maybe LSAP was already connected, so try one more time */
-		if ( !lsap)
-		     lsap = irlmp_find_lsap( self, dlsap_sel, slsap_sel, 0,
-					     self->lsaps);
+		if (!lsap)
+			lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, 0,
+					       self->lsaps);
 	} else
-		lsap = irlmp_find_lsap( self, dlsap_sel, slsap_sel, 0, 
-					self->lsaps);
+		lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, 0, 
+				       self->lsaps);
 	
-	if ( lsap == NULL) {
-		DEBUG( 0, "IrLMP, Sorry, no LSAP for received frame!\n");
-		DEBUG( 0, __FUNCTION__ 
-		       "(), slsap_sel = %02x, dlsap_sel = %02x\n", slsap_sel, 
-		       dlsap_sel);
-		if ( fp[0] & CONTROL_BIT) {
-			DEBUG( 0, __FUNCTION__ 
-			       "(), received control frame %02x\n", fp[2]);
+	if (lsap == NULL) {
+		DEBUG(0, "IrLMP, Sorry, no LSAP for received frame!\n");
+		DEBUG(0, __FUNCTION__ 
+		      "(), slsap_sel = %02x, dlsap_sel = %02x\n", slsap_sel, 
+		      dlsap_sel);
+		if (fp[0] & CONTROL_BIT) {
+			DEBUG(0, __FUNCTION__ 
+			      "(), received control frame %02x\n", fp[2]);
 		} else {
-			DEBUG( 0, __FUNCTION__ "(), received data frame\n");
+			DEBUG(0, __FUNCTION__ "(), received data frame\n");
 		}
 		dev_kfree_skb( skb);
 		return;
@@ -157,19 +158,19 @@
 	/* 
 	 *  Check if we received a control frame? 
 	 */
-	if ( fp[0] & CONTROL_BIT) {
-		switch( fp[2]) {
+	if (fp[0] & CONTROL_BIT) {
+		switch(fp[2]) {
 		case CONNECT_CMD:
 			lsap->lap = self;
-			irlmp_do_lsap_event( lsap, LM_CONNECT_INDICATION, skb);
+			irlmp_do_lsap_event(lsap, LM_CONNECT_INDICATION, skb);
 			break;
 		case CONNECT_CNF:
-			irlmp_do_lsap_event( lsap, LM_CONNECT_CONFIRM, skb);
+			irlmp_do_lsap_event(lsap, LM_CONNECT_CONFIRM, skb);
 			break;
 		case DISCONNECT:
 			DEBUG( 4, __FUNCTION__ "(), Disconnect indication!\n");
-			irlmp_do_lsap_event( lsap, LM_DISCONNECT_INDICATION, 
-					     skb);
+			irlmp_do_lsap_event(lsap, LM_DISCONNECT_INDICATION, 
+					    skb);
 			break;
 		case ACCESSMODE_CMD:
 			DEBUG( 0, "Access mode cmd not implemented!\n");
@@ -182,10 +183,10 @@
 			       "(), Unknown control frame %02x\n", fp[2]);
 			break;
 		}
-	} else if ( reliable == LAP_RELIABLE) {
+	} else if (reliable == LAP_RELIABLE) {
 		/* Must be pure data */
 		irlmp_do_lsap_event( lsap, LM_DATA_INDICATION, skb);
-	} else if ( reliable == LAP_UNRELIABLE) {
+	} else if (reliable == LAP_UNRELIABLE) {
 		irlmp_do_lsap_event( lsap, LM_UDATA_INDICATION, skb);
 	}
 }
@@ -207,6 +208,7 @@
 	ASSERT(lap->magic == LMP_LAP_MAGIC, return;);
 
 	lap->reason = reason;
+	lap->daddr = DEV_ADDR_ANY;
 
         /* FIXME: must do something with the userdata if any */
 
@@ -260,6 +262,24 @@
 }
 
 /*
+ * Function irlmp_link_discovery_indication (self, log)
+ *
+ *    Device is discovering us
+ *
+ */
+void irlmp_link_discovery_indication(struct lap_cb *self, 
+				     discovery_t *discovery)
+{
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LMP_LAP_MAGIC, return;);
+
+	irlmp_add_discovery(irlmp->cachelog, discovery);
+
+	/* Just handle it the same way as a discovery confirm */
+	irlmp_do_lap_event(self, LM_LAP_DISCOVERY_CONFIRM, NULL);
+}
+
+/*
  * Function irlmp_link_discovery_confirm (self, log)
  *
  *    Called by IrLAP with a list of discoveries after the discovery
@@ -267,54 +287,22 @@
  *    was unable to carry out the discovery request
  *
  */
-void irlmp_link_discovery_confirm( struct lap_cb *self, hashbin_t *log)
+void irlmp_link_discovery_confirm(struct lap_cb *self, hashbin_t *log)
 {
-/* 	DISCOVERY *discovery; */
-	hashbin_t *old_log;
-
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == LMP_LAP_MAGIC, return;);
-
-	ASSERT( self->cachelog != NULL, return;);
-
-	/*
-	 *  If log is missing this means that IrLAP was unable to perform the
-	 *  discovery, so restart discovery again with just the half timeout
-	 *  of the normal one.
-	 */
-	if ( !log) {
-		irlmp_start_discovery_timer( irlmp, 150);
-		return;
-	}
+	DEBUG(4, __FUNCTION__ "()\n");
 
-#if 0
-	discovery = hashbin_remove_first( log);
-	while ( discovery) {
-		DEBUG( 0, __FUNCTION__ "(), found %s\n", discovery->info);
-
-		/* Remove any old discovery of this device */
-		hashbin_remove( self->cachelog, discovery->daddr, NULL);
-
-		/* Insert the new one */
-		hashbin_insert( self->cachelog, (QUEUE *) discovery, 
-				discovery->daddr, NULL);
-
-		discovery = hashbin_remove_first( log);
-	}
-#endif
-	old_log = self->cachelog;
-	self->cachelog = log;
-	hashbin_delete( old_log, (FREE_FUNC) kfree);
+	ASSERT(self != NULL, return;);
+	ASSERT(self->magic == LMP_LAP_MAGIC, return;);
+	
+	irlmp_add_discovery_log(irlmp->cachelog, log);
       
-	irlmp_do_lap_event( self, LM_LAP_DISCOVERY_CONFIRM, NULL);
+	irlmp_do_lap_event(self, LM_LAP_DISCOVERY_CONFIRM, NULL);
 
 	DEBUG( 4, __FUNCTION__ "() -->\n");
 }
 
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
-__inline__ void irlmp_update_cache( struct lsap_cb *self)
+inline void irlmp_update_cache(struct lsap_cb *self)
 {
 	/* Update cache entry */
 	irlmp->cache.dlsap_sel = self->dlsap_sel;
@@ -330,9 +318,9 @@
  *    Find handle assosiated with destination and source LSAP
  *
  */
-static struct lsap_cb *irlmp_find_lsap( struct lap_cb *self, __u8 dlsap_sel,
-					__u8 slsap_sel, int status,
-					hashbin_t *queue) 
+static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap_sel,
+				       __u8 slsap_sel, int status,
+				       hashbin_t *queue) 
 {
 	struct lsap_cb *lsap;
 	
@@ -345,17 +333,14 @@
 	 *  cache first to avoid the linear search
 	 */
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
-	ASSERT( irlmp != NULL, return NULL;);
-
 	if (( irlmp->cache.valid) && 
 	    ( irlmp->cache.slsap_sel == slsap_sel) && 
 	    ( irlmp->cache.dlsap_sel == dlsap_sel)) 
 	{
-		DEBUG( 4, __FUNCTION__ "(), Using cached LSAP\n");
-		return ( irlmp->cache.lsap);
-	}	
+		return (irlmp->cache.lsap);
+	}
 #endif
-	lsap = ( struct lsap_cb *) hashbin_get_first( queue);
+	lsap = ( struct lsap_cb *) hashbin_get_first(queue);
 	while ( lsap != NULL) {
 		/* 
 		 *  If this is an incomming connection, then the destination 
@@ -372,7 +357,7 @@
 			lsap->dlsap_sel = dlsap_sel;
 			
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
-			irlmp_update_cache( lsap);
+			irlmp_update_cache(lsap);
 #endif
 			return lsap;
 		}
diff -urN linux-2.2.6-pre2/net/irda/irlpt/irlpt_cli.c linux-2.2.6-pre3/net/irda/irlpt/irlpt_cli.c
--- linux-2.2.6-pre2/net/irda/irlpt/irlpt_cli.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlpt/irlpt_cli.c	2003-08-15 15:05:39.000000000 -0700
@@ -43,19 +43,16 @@
 #include <linux/miscdevice.h>
 #include <linux/proc_fs.h>
 
-int  irlpt_client_init(void);
-static void irlpt_client_cleanup(void);
+int irlpt_client_init(void);
 static void irlpt_client_close(struct irlpt_cb *self);
 
-static void irlpt_client_discovery_indication( DISCOVERY *);
+static void irlpt_client_discovery_indication(discovery_t *);
 
-static void irlpt_client_connect_confirm( void *instance, 
-					  void *sap, 
-					  struct qos_info *qos, 
-					  int max_seg_size, 
-					  struct sk_buff *skb);
-static void irlpt_client_disconnect_indication( void *instance, 
-						void *sap, 
+static void irlpt_client_connect_confirm(void *instance, void *sap, 
+					 struct qos_info *qos, 
+					 __u32 max_seg_size, 
+					 struct sk_buff *skb);
+static void irlpt_client_disconnect_indication( void *instance, void *sap, 
 						LM_REASON reason,
 						struct sk_buff *userdata);
 static void irlpt_client_expired(unsigned long data);
@@ -65,6 +62,8 @@
 #endif
 static char *version = "IrLPT client, v2 (Thomas Davis)";
 
+static __u32 ckey; /* IrLMP client handle */
+
 struct file_operations client_fops = {
 	irlpt_seek,    /* seek */
 	NULL,          /* read_irlpt (server) */
@@ -177,6 +176,8 @@
  */
 __initfunc(int irlpt_client_init(void))
 {
+	__u16 hints;
+	
 	DEBUG( irlpt_client_debug, "--> "__FUNCTION__ "\n");
 
 	printk( KERN_INFO "%s\n", version);
@@ -187,9 +188,9 @@
 			"IrLPT client: Can't allocate hashbin!\n");
 		return -ENOMEM;
 	}
-
-	irlmp_register_layer( S_PRINTER, CLIENT, TRUE, 
-			      irlpt_client_discovery_indication);
+	hints = irlmp_service_to_hint(S_PRINTER);
+	ckey = irlmp_register_client(hints, irlpt_client_discovery_indication,
+				     NULL);
 
 #ifdef CONFIG_PROC_FS
 	proc_register( &proc_irda, &proc_irlpt_client);
@@ -210,7 +211,7 @@
 {
 	DEBUG( irlpt_client_debug, "--> "__FUNCTION__ "\n");
 
-	irlmp_unregister_layer( S_PRINTER, CLIENT);
+	irlmp_unregister_client(ckey);
 
 	/*
 	 *  Delete hashbin and close all irlpt client instances in it
@@ -232,6 +233,7 @@
  */
 static struct irlpt_cb *irlpt_client_open( __u32 daddr)
 {
+	struct irmanager_event mgr_event;
 	struct irlpt_cb *self;
 
 	DEBUG( irlpt_client_debug, "--> "__FUNCTION__ "\n");
@@ -251,7 +253,6 @@
 			hashbin_get_size(irlpt_clients));
 
 		hashbin_insert( irlpt_clients, (QUEUE *) self, daddr, NULL);
-
 	}
 
 	self->ir_dev.minor = MISC_DYNAMIC_MINOR;
@@ -270,6 +271,11 @@
 
 	irlpt_client_next_state( self, IRLPT_CLIENT_IDLE);
 
+	/* Tell irmanager to create /dev/irlpt<X> */
+	mgr_event.event = EVENT_IRLPT_START;
+	sprintf(mgr_event.devname, "%s", self->ifname);
+	irmanager_notify(&mgr_event);
+
 	MOD_INC_USE_COUNT;
 
 	DEBUG( irlpt_client_debug, __FUNCTION__ " -->\n");
@@ -284,6 +290,7 @@
  */
 static void irlpt_client_close( struct irlpt_cb *self)
 {
+	struct irmanager_event mgr_event;
 	struct sk_buff *skb;
 
 	DEBUG( irlpt_client_debug, "--> " __FUNCTION__ "\n");
@@ -291,6 +298,11 @@
 	ASSERT( self != NULL, return;);
 	ASSERT( self->magic == IRLPT_MAGIC, return;);
 
+	/* Tell irmanager to remove /dev/irlpt<X> */
+	mgr_event.event = EVENT_IRLPT_STOP;
+ 	sprintf(mgr_event.devname, "%s", self->ifname);
+ 	irmanager_notify(&mgr_event);
+
 	while (( skb = skb_dequeue(&self->rx_queue)) != NULL) {
 		DEBUG(irlpt_client_debug, 
 		      __FUNCTION__ ": freeing SKB\n");
@@ -312,7 +324,7 @@
  *    device it is, and which services it has.
  *
  */
-static void irlpt_client_discovery_indication( DISCOVERY *discovery)
+static void irlpt_client_discovery_indication(discovery_t *discovery)
 {
 	struct irlpt_info info;
 	struct irlpt_cb *self;
@@ -409,10 +421,10 @@
  *
  *    LSAP connection confirmed!
  */
-static void irlpt_client_connect_confirm( void *instance, void *sap, 
-					  struct qos_info *qos, 
-					  int max_sdu_size,
-					  struct sk_buff *skb)
+static void irlpt_client_connect_confirm(void *instance, void *sap, 
+					 struct qos_info *qos, 
+					 __u32 max_sdu_size,
+					 struct sk_buff *skb)
 {
 	struct irlpt_info info;
 	struct irlpt_cb *self;
@@ -455,20 +467,20 @@
  *    This function gets the data that is received on the data channel
  *
  */
-static void irlpt_client_data_indication( void *instance, void *sap, 
-					  struct sk_buff *skb) 
+static int irlpt_client_data_indication(void *instance, void *sap, 
+					struct sk_buff *skb) 
 {
 	struct irlpt_cb *self;
 
 	DEBUG( irlpt_client_debug, "--> " __FUNCTION__ "\n");
 
-	ASSERT( skb != NULL, return;);
+	ASSERT( skb != NULL, return -1;);
 	DEBUG( irlpt_client_debug, __FUNCTION__ ": len=%d\n", (int) skb->len);
 
 	self = ( struct irlpt_cb *) instance;
 
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRLPT_MAGIC, return;);
+	ASSERT( self != NULL, return -1;);
+	ASSERT( self->magic == IRLPT_MAGIC, return -1;);
 #if 1
 	{
 		int i;
@@ -496,6 +508,8 @@
 /* 	} */
 
 	DEBUG( irlpt_client_debug, __FUNCTION__ " -->\n");
+
+	return 0;
 }
 
 /*
diff -urN linux-2.2.6-pre2/net/irda/irlpt/irlpt_srvr.c linux-2.2.6-pre3/net/irda/irlpt/irlpt_srvr.c
--- linux-2.2.6-pre2/net/irda/irlpt/irlpt_srvr.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irlpt/irlpt_srvr.c	2003-08-15 15:05:39.000000000 -0700
@@ -48,27 +48,25 @@
 #endif /* CONFIG_PROC_FS */
 
 int irlpt_server_init(void);
-static void irlpt_server_cleanup(void);
-static void irlpt_server_disconnect_indication( void *instance, 
-						void *sap, 
+static void irlpt_server_disconnect_indication(void *instance, void *sap, 
 						LM_REASON reason,
 						struct sk_buff *skb);
-static void irlpt_server_connect_confirm( void *instance, 
-					  void *sap, 
-					  struct qos_info *qos,  
-					  int max_seg_size,
-					  struct sk_buff *skb);
-static void irlpt_server_connect_indication( void *instance, 
-					     void *sap, 
-					     struct qos_info *qos, 
-					     int max_seg_size,
-					     struct sk_buff *skb);
-static void irlpt_server_data_indication( void *instance, 
-					  void *sap, 
-					  struct sk_buff *skb);
+static void irlpt_server_connect_confirm(void *instance, void *sap, 
+					 struct qos_info *qos,  
+					 __u32 max_seg_size,
+					 struct sk_buff *skb);
+static void irlpt_server_connect_indication(void *instance, 
+					    void *sap, 
+					    struct qos_info *qos, 
+					    __u32 max_seg_size,
+					    struct sk_buff *skb);
+static int irlpt_server_data_indication(void *instance, void *sap, 
+					struct sk_buff *skb);
 static void register_irlpt_server(void);
 static void deregister_irlpt_server(void);
 
+static __u32 skey; /* IrLMP service handle */
+
 int irlpt_server_lsap = LSAP_IRLPT;
 int irlpt_server_debug = 4;
 
@@ -183,6 +181,8 @@
 /*int irlpt_init( struct device *dev) {*/
 __initfunc(int irlpt_server_init(void))
 {
+	__u16 hints;
+
 	DEBUG( irlpt_server_debug, "--> " __FUNCTION__ "\n");
 
 	printk( KERN_INFO "%s\n", version);
@@ -195,7 +195,6 @@
 			" irlpt_server control block!\n");
 		return -ENOMEM;
 	}
-
 	memset( irlpt_server, 0, sizeof(struct irlpt_cb));
 
 	sprintf(irlpt_server->ifname, "irlpt_server");
@@ -210,7 +209,8 @@
 
 	skb_queue_head_init(&irlpt_server->rx_queue);
 
-	irlmp_register_layer( S_PRINTER, SERVER, FALSE, NULL);
+	hints = irlmp_service_to_hint(S_PRINTER);
+	skey = irlmp_register_service(hints);
 	
 	register_irlpt_server();
 
@@ -235,12 +235,11 @@
 
 	DEBUG( irlpt_server_debug, "--> " __FUNCTION__ "\n");
 
+	irlmp_unregister_service(skey);
 	deregister_irlpt_server();
 
 	while (( skb = skb_dequeue(&irlpt_server->rx_queue)) != NULL) {
 		DEBUG(irlpt_server_debug, __FUNCTION__ ": freeing SKB\n");
-                IS_SKB( skb, return;);
-                FREE_SKB_MAGIC( skb);
                 dev_kfree_skb( skb);
 	}
 
@@ -307,11 +306,11 @@
  *
  *    LSAP connection confirmed!
  */
-static void irlpt_server_connect_confirm( void *instance, 
-					  void *sap, 
-					  struct qos_info *qos,
-					  int max_seg_size,
-					  struct sk_buff *skb)
+static void irlpt_server_connect_confirm(void *instance, 
+					 void *sap, 
+					 struct qos_info *qos,
+					 __u32 max_seg_size,
+					 struct sk_buff *skb)
 {
 	struct irlpt_cb *self;
 
@@ -332,11 +331,11 @@
  * Function irlpt_connect_indication (handle)
  *
  */
-static void irlpt_server_connect_indication( void *instance, 
-					     void *sap, 
-					     struct qos_info *qos, 
-					     int max_seg_size,
-					     struct sk_buff *skb)
+static void irlpt_server_connect_indication(void *instance, 
+					    void *sap, 
+					    struct qos_info *qos, 
+					    __u32 max_seg_size,
+					    struct sk_buff *skb)
 {
 	struct irlpt_cb *self;
 	struct irlpt_info info;
@@ -368,21 +367,19 @@
  *    This function gets the data that is received on the data channel
  *
  */
-static void irlpt_server_data_indication( void *instance, 
-					  void *sap, 
-					  struct sk_buff *skb) 
+static int irlpt_server_data_indication(void *instance, void *sap, 
+					struct sk_buff *skb) 
 {
-
 	struct irlpt_cb *self;
 
 	DEBUG( irlpt_server_debug, "--> " __FUNCTION__ "\n");
 
 	self = ( struct irlpt_cb *) instance;
 	     
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IRLPT_MAGIC, return;);
+	ASSERT( self != NULL, return -1;);
+	ASSERT( self->magic == IRLPT_MAGIC, return -1;);
 
-	ASSERT( skb != NULL, return;);
+	ASSERT( skb != NULL, return -1;);
 
 	DEBUG( irlpt_server_debug, __FUNCTION__ ": len=%d\n", (int) skb->len);
 
@@ -394,6 +391,8 @@
         wake_up_interruptible(&self->read_wait);
 
 	DEBUG( irlpt_server_debug, __FUNCTION__ " -->\n");
+	
+	return 0;
 }
 
 /*
@@ -484,14 +483,15 @@
  */
 int init_module(void)
 {
+	int ret;
 
         DEBUG( irlpt_server_debug, "--> IrLPT server: init_module\n");
 
-        irlpt_server_init();
+        ret = irlpt_server_init();
 
         DEBUG( irlpt_server_debug, "IrLPT server: init_module -->\n");
 
-        return 0;
+        return ret;
 }
 
 /*
diff -urN linux-2.2.6-pre2/net/irda/irmod.c linux-2.2.6-pre3/net/irda/irmod.c
--- linux-2.2.6-pre2/net/irda/irmod.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irmod.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Dec 15 13:55:39 1997
- * Modified at:   Thu Feb 18 08:51:50 1999
+ * Modified at:   Mon Mar 29 09:06:52 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997 Dag Brattli, All Rights Reserved.
@@ -62,7 +62,6 @@
 extern void irda_proto_cleanup(void);
 
 extern int irda_device_init(void);
-extern int irobex_init(void);
 extern int irlan_init(void);
 extern int irlan_client_init(void);
 extern int irlan_server_init(void);
@@ -71,6 +70,12 @@
 extern int irlpt_client_init(void);
 extern int irlpt_server_init(void);
 
+#ifdef CONFIG_IRDA_COMPRESSION
+#ifdef CONFIG_IRDA_DEFLATE
+extern irda_deflate_init();
+#endif /* CONFIG_IRDA_DEFLATE */
+#endif /* CONFIG_IRDA_COMPRESSION */
+
 static int irda_open(struct inode * inode, struct file *file);
 static int irda_ioctl(struct inode *inode, struct file *filp, 
 		      unsigned int cmd, unsigned long arg);
@@ -132,8 +137,12 @@
 
 /* IrLMP */
 EXPORT_SYMBOL(irlmp_discovery_request);
-EXPORT_SYMBOL(irlmp_register_layer);
-EXPORT_SYMBOL(irlmp_unregister_layer);
+EXPORT_SYMBOL(irlmp_register_client);
+EXPORT_SYMBOL(irlmp_unregister_client);
+EXPORT_SYMBOL(irlmp_update_client);
+EXPORT_SYMBOL(irlmp_register_service);
+EXPORT_SYMBOL(irlmp_unregister_service);
+EXPORT_SYMBOL(irlmp_service_to_hint);
 EXPORT_SYMBOL(irlmp_data_request);
 EXPORT_SYMBOL(irlmp_open_lsap);
 EXPORT_SYMBOL(irlmp_close_lsap);
@@ -179,7 +188,7 @@
 
 __initfunc(int irda_init(void))
 {
-        printk(KERN_INFO "Linux-2.2 Support for the IrDA (tm) Protocols (Dag Brattli)\n");
+        printk(KERN_INFO "IrDA (tm) Protocols for Linux-2.2 (Dag Brattli)\n");
 
  	irlmp_init();
 	irlap_init();
@@ -209,9 +218,6 @@
 #ifdef CONFIG_IRLAN
 	irlan_init();
 #endif
-#ifdef CONFIG_IROBEX
-	irobex_init();
-#endif
 #ifdef CONFIG_IRCOMM
 	ircomm_init();
 	irvtd_init();
@@ -234,12 +240,7 @@
 	return 0;
 }
 
-/* 
- * FIXME:
- * This function should have been wrapped with #ifdef MODULE, but then
- * irda_proto_cleanup() must be moved from af_irda.c to this file since
- * that function must also be wrapped if this one is.
- */
+#ifdef MODULE
 void irda_cleanup(void)
 {
 	misc_deregister( &irda.dev);
@@ -263,6 +264,7 @@
 	/* Remove middle layer */
 	irlmp_cleanup();
 }
+#endif /* MODULE */
 
 /*
  * Function irda_lock (lock)
@@ -505,6 +507,20 @@
 	return 0;
 }
 
+void irda_mod_inc_use_count(void)
+{
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+}
+
+void irda_mod_dec_use_count(void)
+{
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+}
+
 #ifdef MODULE
 #ifdef CONFIG_PROC_FS
 void irda_proc_modcount(struct inode *inode, int fill)
@@ -543,5 +559,4 @@
 {
 	irda_proto_cleanup();
 }
-
-#endif
+#endif /* MODULE */
diff -urN linux-2.2.6-pre2/net/irda/irobex/Config.in linux-2.2.6-pre3/net/irda/irobex/Config.in
--- linux-2.2.6-pre2/net/irda/irobex/Config.in	1998-12-17 09:01:03.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irobex/Config.in	1969-12-31 16:00:00.000000000 -0800
@@ -1,3 +0,0 @@
-
-dep_tristate 'IrOBEX protocol' CONFIG_IROBEX $CONFIG_IRDA
-
diff -urN linux-2.2.6-pre2/net/irda/irobex/irobex.c linux-2.2.6-pre3/net/irda/irobex/irobex.c
--- linux-2.2.6-pre2/net/irda/irobex/irobex.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irobex/irobex.c	1969-12-31 16:00:00.000000000 -0800
@@ -1,1170 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      irobex.c
- * Version:       0.4
- * Description:   Kernel side of the IrOBEX layer
- * Status:        Experimental.
- * Author:        Dag Brattli <dagb@cs.uit.no>
- * Created at:    Thu Jun 25 21:21:07 1998
- * Modified at:   Mon Feb  8 09:05:01 1999
- * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
- *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
- *      
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version.
- *  
- *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
- *     provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/miscdevice.h>
-#include <linux/fs.h>
-#include <linux/proc_fs.h>
-#include <linux/ioctl.h>
-#include <linux/init.h>
-
-#include <asm/byteorder.h>
-#include <asm/segment.h>
-#include <asm/uaccess.h>
-#include <linux/poll.h>
-
-#include <net/irda/irttp.h>
-#include <net/irda/irias_object.h>
-#include <net/irda/iriap.h>
-
-#include <net/irda/irobex.h>
-
-/*
- *  Master structure, only one instance for now!!
- */
-struct irobex_cb *irobex;
-
-extern char *lmp_reasons[];
-
-char *irobex_state[] = {
-	"OBEX_IDLE",
-	"OBEX_DISCOVER",
-	"OBEX_QUERY",
-	"OBEX_CONN",
-	"OBEX_DATA",
-};
-
-static void   irobex_cleanup(void);
-/* static struct irobex_cb *irobex_open(void); */
-/* static void   irobex_close( struct irobex_cb *self); */
-
-static void irobex_data_indication( void *instance, void *sap, 
-				    struct sk_buff *skb);
-static void irobex_disconnect_indication( void *instance, void *sap, 
-					  LM_REASON reason, 
-					  struct sk_buff *skb);
-static void irobex_disconnect_request( struct irobex_cb *self);
-static int irobex_connect_request(struct irobex_cb *self);
-static void irobex_connect_confirm( void *instance, void *sap, 
-				    struct qos_info *qos,
-				    int max_sdu_size, struct sk_buff *skb);
-static void irobex_discovery_indication( DISCOVERY *discovery);
-static void irobex_flow_indication( void *instance, void *sap, 
-				    LOCAL_FLOW flow);
-static void irobex_get_value_confirm(__u16 obj_id, struct ias_value *value, 
-				     void *priv);
-static void irobex_register_server( struct irobex_cb *self);
-static int irobex_ioctl( struct inode *inode, struct file *filp, 
-			 unsigned int cmd, unsigned long arg);
-static int irobex_dev_open( struct inode * inode, struct file *file);
-static int irobex_dev_close( struct inode *inode, struct file *file);
-static ssize_t irobex_read( struct file *file, char *buffer, size_t count, 
-			    loff_t *noidea);
-static ssize_t irobex_write( struct file *file, const char *buffer,
-			     size_t count, loff_t *noidea);
-static loff_t irobex_seek( struct file *, loff_t, int);
-static u_int irobex_poll( struct file *file, poll_table *wait);
-static int irobex_fasync( int, struct file *, int);
-
-static struct file_operations irobex_fops = {
-	irobex_seek,	/* seek */
-	irobex_read,
-	irobex_write,
-	NULL,		/* readdir */
-	irobex_poll,    /* poll */
-	irobex_ioctl,	/* ioctl */
-	NULL,		/* mmap */
-	irobex_dev_open,
-	NULL,
-	irobex_dev_close,
-	NULL,
-	irobex_fasync,
-};
-
-#ifdef CONFIG_PROC_FS
-static int irobex_proc_read( char *buf, char **start, off_t offset, 
-			     int len, int unused);
-
-extern struct proc_dir_entry proc_irda;
-
-struct proc_dir_entry proc_irobex = {
-	0, 6, "irobex",
-	S_IFREG | S_IRUGO, 1, 0, 0,
-	0, NULL,
-	&irobex_proc_read,
-};
-#endif
-
-/*
- * Function irobex_init (dev)
- *
- *   Initializes the irobex control structure, and registers as a misc
- *   device
- *
- */
-__initfunc(int irobex_init(void))
-{
-	struct irmanager_event mgr_event;
-	struct irobex_cb *self;
-
-	self = kmalloc(sizeof(struct irobex_cb), GFP_ATOMIC);
-	if ( self == NULL)
-		return -ENOMEM;
-	
-	memset( self, 0, sizeof(struct irobex_cb));
- 	sprintf( self->devname, "irobex%d", 0); /* Just one instance for now */
-	
-	self->magic = IROBEX_MAGIC;
-	self->rx_flow = self->tx_flow = FLOW_START;
-	
-	self->dev.minor = MISC_DYNAMIC_MINOR;
-	self->dev.name = "irobex";
-	self->dev.fops = &irobex_fops;
-	
-	skb_queue_head_init( &self->rx_queue);
-	init_timer( &self->watchdog_timer);
-
-	irobex = self;
-	
-	misc_register( &self->dev);
-
-#ifdef CONFIG_PROC_FS
-	proc_register( &proc_irda, &proc_irobex);
-#endif /* CONFIG_PROC_FS */
-		
-	irlmp_register_layer( S_OBEX, CLIENT | SERVER, TRUE, 
-			      irobex_discovery_indication);
-
-/* 	mgr_event.event = EVENT_IROBEX_INIT; */
-/* 	sprintf( mgr_event.devname, "%s", self->devname); */
-/* 	irmanager_notify( &mgr_event); */
-	
-	return 0;
-}
-
-/*
- * Function irobex_cleanup (void)
- *
- *     Removes the IrOBEX layer
- *
- */
-#ifdef MODULE
-static void irobex_cleanup(void)
-{
-	struct sk_buff *skb;
-	struct irobex_cb *self;
-	
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	self = irobex;
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);	
-
-	/*
-	 *  Deregister client and server
-	 */
-	irlmp_unregister_layer( S_OBEX, CLIENT | SERVER);
-
-	if ( self->tsap) {
-		irttp_disconnect_request(self->tsap, NULL, P_NORMAL);
-		irttp_close_tsap( self->tsap);
-		self->tsap = NULL;
-	}
-
-	/* Stop timers */
-	del_timer( &self->watchdog_timer);
-
-	/*
-	 *  Deallocate buffers
-	 */
-	while (( skb = skb_dequeue( &self->rx_queue)) != NULL)
-		dev_kfree_skb( skb);
-
-#ifdef CONFIG_PROC_FS
-	proc_unregister( &proc_irda, proc_irobex.low_ino);
-#endif
-	
-	misc_deregister( &self->dev);
-	
-	kfree( self);	
-}
-#endif /* MODULE */
-
-/*
- * Function irobex_read (inode, file, buffer, count)
- *
- *    User process wants to read some data
- *
- */
-static ssize_t irobex_read( struct file *file, char *buffer, size_t count, 
-			    loff_t *noidea)
-{
-	int len=0;
-	struct irobex_cb *self;
-	struct sk_buff *skb = NULL;
-	int ret;
-	
-	self = irobex;
-
-	ASSERT( self != NULL, return -EIO;);
-	ASSERT( self->magic == IROBEX_MAGIC, return -EIO;);
-  
-	DEBUG( 4, __FUNCTION__ ": count=%d, skb_len=%d, state=%s, eof=%d\n", 
-	       count, skb_queue_len( &self->rx_queue), 
-	       irobex_state[self->state], self->eof);
-
-	if ( self->state != OBEX_DATA) {
-		DEBUG( 0, __FUNCTION__ "(), link not connected yet!\n");
-		return -EIO;
-	}
-
-	/*
-	 *  If there is data to return, then we return it. If not, then we 
-	 *  must check if we are still connected
-	 */
-	if ( skb_queue_len( &self->rx_queue) == 0) {
-
-		/* Still connected?  */
-		if ( self->state != OBEX_DATA) {
-			switch ( self->eof) {
-			case LM_USER_REQUEST:
-				self->eof = FALSE;
-				DEBUG(3, "read_irobex: returning 0\n");
-				ret = 0;
-				break;
-			case LM_LAP_DISCONNECT:
-				self->eof = FALSE;
-				ret = -EIO;
-				break;
-			case LM_LAP_RESET:
-				self->eof = FALSE;
-				ret = -ECONNRESET;
-				break;
-			default:
-				self->eof = FALSE;
-				ret = -EIO;
-				break;
-			}
-			return ret;
-		}
-
-		/* Return if user does not want to block */
-		if ( file->f_flags & O_NONBLOCK)
-			return -EAGAIN;
-
-		/* Go to sleep and wait for data!  */
-		interruptible_sleep_on( &self->read_wait);
-
-		/*
-		 *  Ensure proper reaction to signals, and screen out 
-		 *  blocked signals (page 112. linux device drivers)
-		 */
-		if ( signal_pending( current))
-			return -ERESTARTSYS;
-	}
-	
-	while ( count && skb_queue_len( &self->rx_queue)) {
-
-		skb = skb_dequeue( &self->rx_queue);
-		
-		/*
-		 *  Check if we have previously stopped IrTTP and we know
-		 *  have more free space in our rx_queue. If so tell IrTTP
-		 *  to start delivering frames again before our rx_queue gets
-		 *  empty
-		 */
-		if ( self->rx_flow == FLOW_STOP) {
-			if ( skb_queue_len( &self->rx_queue) < LOW_THRESHOLD) {
-				DEBUG( 4, __FUNCTION__ "(), Starting IrTTP\n");
-				self->rx_flow = FLOW_START;
-				irttp_flow_request( self->tsap, FLOW_START);
-			}
-		}
-
-		/*  
-		 *  Is the request from the user less that the amount in the 
-		 *  current packet?  
-		 */
-		if ( count <  skb->len) {
-			copy_to_user( buffer+len, skb->data, count);
-			len += count;
-			
-			/*
-			 *  Remove copied data from skb and queue
-			 *  it for next read
-			 */
-			skb_pull( skb, count);
-			skb_queue_head( &self->rx_queue, skb);
-			
-			return len;
-		} else {
-			copy_to_user( buffer+len, skb->data, skb->len);
-			count -= skb->len;
-			len += skb->len;
-			
-			dev_kfree_skb( skb);
-		}
-	}
-	return len;
-}
-
-/*
- * Function irobex_write (inode, file, buffer, count)
- *
- *    User process wants to write to device
- *
- */
-static ssize_t irobex_write( struct file *file, const char *buffer, 
-			     size_t count, loff_t *noidea)
-{
-	struct irobex_cb *self;
-	struct sk_buff *skb;
-	int data_len = 0;
-	int len = 0;
-	
-	self = irobex;
-	
-	ASSERT( self != NULL, return -EIO;);
-	ASSERT( self->magic == IROBEX_MAGIC, return -EIO;);
-
-	DEBUG( 4, __FUNCTION__ ": count = %d\n", count);
-	
-	/*
-	 *  If we are not connected then we just give up!
-	 */
-	if ( self->state != OBEX_DATA) {
-		DEBUG( 0, __FUNCTION__ "(): Not connected!\n");
-		
-		return -ENOLINK;
-	} 
-	
-	/* Check if IrTTP is wants us to slow down */
-	if ( self->tx_flow == FLOW_STOP) {
-		DEBUG( 4, __FUNCTION__ 
-		       "(), IrTTP wants us to slow down, going to sleep\n");
-		interruptible_sleep_on( &self->write_wait);
-	}
-	
-	/* Send data to TTP layer possibly as muliple packets */
-	while ( count) {
-		
-		/*
-		 *  Check if request is larger than what fits inside a TTP
-		 *  frame. In that case we must fragment the frame into 
-		 *  multiple TTP frames. IrOBEX should not care about message
-		 *  boundaries.
-		 */
-		if ( count < (self->irlap_data_size - IROBEX_MAX_HEADER))
-			data_len = count;
-		else 
-		        data_len = self->irlap_data_size - IROBEX_MAX_HEADER;
-		
-		DEBUG( 4, __FUNCTION__ "(), data_len=%d, header_len = %d\n", 
-		       data_len, IROBEX_MAX_HEADER);
-		
-		skb = dev_alloc_skb( data_len + IROBEX_MAX_HEADER);
-		if ( skb == NULL) {
-			DEBUG( 0, "irobex - couldn't allocate skbuff!\n");
-			return 0;
-		}
-		
-		skb_reserve( skb, IROBEX_MAX_HEADER);
-		skb_put( skb, data_len);
-		
-		copy_from_user( skb->data, buffer+len, data_len);
-		len += data_len;
-		count -= data_len;
-		
-		DEBUG( 4, __FUNCTION__ "(), skb->len=%d\n", (int) skb->len);
-		ASSERT( skb->len <= (self->irlap_data_size-IROBEX_MAX_HEADER),
-			return len;);
-		
-		irttp_data_request( self->tsap, skb);
-	}
-	return (len);
-}
-
-/*
- * Function irobex_poll (file, wait)
- *
- *    
- *
- */
-static u_int irobex_poll(struct file *file, poll_table *wait)
-{
-	DEBUG( 0, __FUNCTION__ "(), Sorry not implemented yet!\n");
-
-	/* check out /usr/src/pcmcia/modules/ds.c for an example */
-	return 0;
-}
-
-/*
- * Function irobex_fasync (inode, filp, mode)
- *
- *    Implementation for SIGIO
- *
- */
-static int irobex_fasync( int fd, struct file *filp, int on)
-{
-	struct irobex_cb *self;
-
-	DEBUG( 4, __FUNCTION__ "()\n");
-	
-	self = irobex;
-
-	ASSERT( self != NULL, return -1;);
-	ASSERT( self->magic == IROBEX_MAGIC, return -1;);
-
-	return fasync_helper( fd, filp, on, &self->async);
-}
-
-/*
- * Function irobex_seek (inode, file, buffer, count)
- *
- *    Not implemented yet!
- *
- */
-static loff_t irobex_seek( struct file *file, loff_t off, int whence)
-{
-	DEBUG( 0, __FUNCTION__ "(), Not implemented yet!\n");
-
-	return -ESPIPE;
-}
-
-/*
- * Function irobex_ioctl (inode, filp, cmd, arg)
- *
- *    Drivers IOCTL handler, used for connecting and disconnecting
- *    irobex connections
- *
- */
-static int irobex_ioctl( struct inode *inode, struct file *filp, 
-			 unsigned int cmd, unsigned long arg)
-{
-	struct irobex_cb *self;
-	int err = 0;
-	int size = _IOC_SIZE(cmd);
-	
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	self = irobex;
-	
-	ASSERT(self != NULL, return -ENOTTY;);
-	ASSERT(self->magic == IROBEX_MAGIC, return -ENOTTY;);
-	
-	if ( _IOC_TYPE(cmd) != IROBEX_IOC_MAGIC) 
-		return -EINVAL;
-	if ( _IOC_NR(cmd) > IROBEX_IOC_MAXNR)
-		return -EINVAL;
-
-	if ( _IOC_DIR(cmd) & _IOC_READ)
-		err = verify_area( VERIFY_WRITE, (void *) arg, size);
-	else if ( _IOC_DIR(cmd) & _IOC_WRITE)
-		err = verify_area( VERIFY_READ, (void *) arg, size);
-	if ( err)
-		return err;
-
-	switch ( cmd) {
-	case IROBEX_IOCSCONNECT:
-		DEBUG( 4, __FUNCTION__ "(): IROBEX_IOCSCONNECT!\n");
-		return irobex_connect_request( self);		
-		break;
-	case IROBEX_IOCSDISCONNECT:
-		DEBUG( 4, __FUNCTION__ "(): IROBEX_IOCSDISCONNECT!\n");
-		irobex_disconnect_request( self);
-		break;
-	default:
-		return -EINVAL;
-	}
-	return 0;
-}
-
-/*
- * Function irobex_dev_open (inode, file)
- *
- *    Device opened by user process
- *
- */
-static int irobex_dev_open( struct inode * inode, struct file *file)
-{
-	struct irobex_cb *self;
-	
-	DEBUG( 4, __FUNCTION__ "()\n");
-	
-	self = irobex;
-
-	ASSERT( self != NULL, return -1;);
-	ASSERT( self->magic == IROBEX_MAGIC, return -1;);
-
-	if ( self->count++) {
-		DEBUG( 3, "open_irobex: count not zero; actual = %d\n",
-		       self->count);
-		self->count--;
-		return -EBUSY;
-	}
-
-	irobex_register_server( self);
-
-	/* Reset values for this instance */
-	self->state = OBEX_IDLE;
-	self->eof = FALSE;
-	self->daddr = 0;
-	self->dtsap_sel = 0;
-	self->rx_flow = FLOW_START;
-	self->tx_flow = FLOW_START;
-
-	MOD_INC_USE_COUNT;
-	
-	return 0;
-}
-
-static int irobex_dev_close( struct inode *inode, struct file *file)
-{
-	struct irobex_cb *self;
-	struct sk_buff *skb;
-	
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	self = irobex;
-
-	ASSERT( self != NULL, return -ENODEV;);
-	ASSERT( self->magic == IROBEX_MAGIC, return -EBADR;);
-
-	/* Deallocate buffers */
-	while (( skb = skb_dequeue( &self->rx_queue)) != NULL) {
-		DEBUG( 3, "irobex_close: freeing SKB\n");
-		dev_kfree_skb( skb);
-	}
-
-	/* Close TSAP is its still there */
-	if ( self->tsap) {
-		irttp_disconnect_request(self->tsap, NULL, P_NORMAL);
-		irttp_close_tsap( self->tsap);
-		self->tsap = NULL;
-	}
-	self->state = OBEX_IDLE;
-	self->eof = FALSE;
-	self->daddr = 0;
-	self->dtsap_sel = 0;
-	self->rx_flow = FLOW_START;
-	self->tx_flow = FLOW_START;
-
-	/* Remove this filp from the asynchronously notified filp's */
-	irobex_fasync( -1, file, 0);
-
-	self->count--;
-	
-	MOD_DEC_USE_COUNT;
-
-	return 0;
-}
-
-/*
- * Function irobex_discovery_inication (daddr)
- *
- *    Remote device discovered, try query the remote IAS to see which
- *    device it is, and which services it has.
- *
- */
-static void irobex_discovery_indication( DISCOVERY *discovery)
-{
- 	struct irobex_cb *self;
-	
-	DEBUG( 0, __FUNCTION__ "()\n");
-	
-	self = irobex;
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);
-
-	/* Remember address and time if was discovered */
-	self->daddr = discovery->daddr;
-	self->saddr = discovery->saddr;
-	self->time_discovered = jiffies;
-	
-	/* Wake up process if its waiting for device to be discovered */
-	if ( self->state == OBEX_DISCOVER)
-		wake_up_interruptible( &self->write_wait);
-}
-
-static void irobex_disconnect_request( struct irobex_cb *self)
-{
-	if ( self->state != OBEX_DATA)
-		return;
-	
-	irttp_disconnect_request( self->tsap, NULL, P_NORMAL);
-	
-	/* Reset values for this instance */
-	self->state = OBEX_IDLE;
-	self->eof = LM_USER_REQUEST;
-	self->daddr = 0;
-	self->dtsap_sel = 0;
-	self->rx_flow = FLOW_START;
-	self->tx_flow = FLOW_START;
-		
-	wake_up_interruptible( &self->read_wait);
-}
-
-/*
- * Function irobex_disconnect_indication (handle, reason, priv)
- *
- *    Link has been disconnected
- *
- */
-static void irobex_disconnect_indication( void *instance, void *sap, 
-					  LM_REASON reason, 
-					  struct sk_buff *userdata)
-{
-	struct irobex_cb *self;
-	
-	DEBUG( 0, __FUNCTION__ "(), reason=%s\n", lmp_reasons[reason]);
-	
-	self = ( struct irobex_cb *) instance;
-	
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);
-	
-	self->state = OBEX_IDLE;
-	self->eof = reason;
-	self->daddr = 0;
-	self->dtsap_sel = 0;
-	self->rx_flow = self->tx_flow = FLOW_START;
-
-	wake_up_interruptible( &self->read_wait);
-	wake_up_interruptible( &self->write_wait);
-	
-	DEBUG( 4, __FUNCTION__ "(), skb_queue_len=%d\n",
-	       skb_queue_len( &irobex->rx_queue));
-	
-	if ( userdata)
-	        dev_kfree_skb( userdata);
-}
-
-int irobex_connect_request(struct irobex_cb *self)
-{
-	int count = 0;
-
-	/* Already connected? */
-	if ( self->state == OBEX_DATA) {
-		DEBUG( 0, __FUNCTION__ "(), already connected!\n");
-		return 0;
-	}
-	
-	/* Timeout after 15 secs. */
-	irobex_start_watchdog_timer( self, 1000);
-	
-	/*
-	 * If we have discovered a remote device we
-	 * check if the discovery is still fresh. If not, we don't
-	 * trust the address.
-	 */
-	if ( self->daddr && ((jiffies - self->time_discovered) > 1000)) {
-		DEBUG( 0, __FUNCTION__ "(), daddr is old <%d>!\n",
-		       jiffies - self->time_discovered);
-		self->daddr = 0;
-	}
-	
-	/* 
-	 * Try to discover remote remote device if it has not been 
-	 * discovered yet. 
-	 */
-	if ( !self->daddr) {
-		self->state = OBEX_DISCOVER;
-		
-		irlmp_discovery_request( 8);
-		
-		/* Wait for discovery to complete */
-		interruptible_sleep_on( &self->write_wait);
-		del_timer( &self->watchdog_timer);
-	}
-	
-	/* Give up if we are unable to discover any remote devices */
-	if ( !self->daddr) {
-		DEBUG( 0, __FUNCTION__ 
-		       "(), Unable to discover any devices!\n");
-		return -EHOSTUNREACH;
-	}
-	
-	/* Need to find remote destination TSAP selector? */
-	while ( !self->dtsap_sel) {
-		DEBUG( 0, __FUNCTION__ "() : Quering remote IAS!\n");
-		
-		self->state = OBEX_QUERY;
-		
-		/* Timeout after 5 secs. */
-		irobex_start_watchdog_timer( self, 500);
-		iriap_getvaluebyclass_request( 
-			"OBEX", "IrDA:TinyTP:LsapSel",
-			self->saddr, self->daddr,
-			irobex_get_value_confirm,
-			self);
-		
-		interruptible_sleep_on( &self->write_wait);
-		del_timer( &self->watchdog_timer);
-		
-		/* Give up after a few tries */
-		if (( count++ > 2) && !self->dtsap_sel) {
-			DEBUG( 0, __FUNCTION__ 
-			       "(), Unable to query remote LM-IAS!\n");
-			return -ETIMEDOUT;
-		}
-	}
-	self->state = OBEX_CONN;
-	
-	/* Timeout after 5 secs. */
-	irobex_start_watchdog_timer( self, 500);
-	
-	irttp_connect_request( self->tsap, self->dtsap_sel, 
-			       self->saddr, self->daddr, NULL, SAR_DISABLE, 
-			       NULL);
-	
-	/* Go to sleep and wait for connection!  */
-	interruptible_sleep_on( &self->write_wait);
-	del_timer( &self->watchdog_timer);
-	
-	if ( self->state != OBEX_DATA) {
-		DEBUG( 0, __FUNCTION__ 
-		       "(), Unable to connect to remote device!\n");
-		return -ETIMEDOUT;
-	}
-	return 0;
-}
-
-/*
- * Function irobex_connect_confirm (instance, sap, qos, userdata)
- *
- *    Connection to peer IrOBEX layer established
- *
- */
-static void irobex_connect_confirm( void *instance, void *sap, 
-				    struct qos_info *qos,
-				    int max_sdu_size, struct sk_buff *userdata)
-{
-	struct irobex_cb *self;
-	
-	DEBUG( 4, __FUNCTION__ "()\n");
-	
-	self = ( struct irobex_cb *) instance;
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);
-	ASSERT( qos != NULL, return;);
-
-	DEBUG( 4, __FUNCTION__ "(), IrLAP data size=%d\n", 
-	       qos->data_size.value);
-
-	self->irlap_data_size = qos->data_size.value;
-
-	/*
-	 *  Wake up any blocked process wanting to write. Finally this process
-	 *  can start writing since the connection is now open :-)
-	 */
-	if (self->state == OBEX_CONN) {
-		self->state = OBEX_DATA;
-		wake_up_interruptible( &self->write_wait);
-	}
-	
-	if ( userdata) {
-	        dev_kfree_skb( userdata);
-
-	}
-}
-
-/*
- * Function irobex_connect_response (handle)
- *
- *    Accept incomming connection
- *
- */
-void irobex_connect_response( struct irobex_cb *self)
-{
-	struct sk_buff *skb;
-/* 	__u8 *frame; */
-
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);	
-
-	self->state = OBEX_DATA;
-
-	skb = dev_alloc_skb( 64);
-	if (skb == NULL) {
-		DEBUG( 0, __FUNCTION__ "() Could not allocate sk_buff!\n");
-		return;
-	}
-
-	/* Reserve space for MUX_CONTROL and LAP header */
-	skb_reserve( skb, TTP_HEADER+LMP_CONTROL_HEADER+LAP_HEADER);
-
-	irttp_connect_response( self->tsap, SAR_DISABLE, skb);
-}
-
-/*
- * Function irobex_connect_indication (handle, skb, priv)
- *
- *    Connection request from a remote device
- *
- */
-void irobex_connect_indication( void *instance, void *sap, 
-				struct qos_info *qos, int max_sdu_size,
-				struct sk_buff *userdata)
-{
-	struct irmanager_event mgr_event;
-	struct irobex_cb *self;
-	
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	self = ( struct irobex_cb *) instance;
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);	
-	ASSERT( userdata != NULL, return;);
-
-	self->eof = FALSE;
-
-	DEBUG( 4, __FUNCTION__ "(), skb_len = %d\n", 
-	       (int) userdata->len);
-
-	DEBUG( 4, __FUNCTION__ "(), IrLAP data size=%d\n", 
-	       qos->data_size.value);
-
-	ASSERT( qos->data_size.value >= 64, return;);
-
-	self->irlap_data_size = qos->data_size.value;
-
-	/* We just accept the connection */
-	irobex_connect_response( self);
-#if 1
-	mgr_event.event = EVENT_IROBEX_START;
-	sprintf( mgr_event.devname, "%s", self->devname);
-	irmanager_notify( &mgr_event);
-#endif
-	wake_up_interruptible( &self->read_wait);
-
-	if ( userdata) {
-	        dev_kfree_skb( userdata);
-	}
-}
-
-/*
- * Function irobex_data_indication (instance, sap, skb)
- *
- *    This function gets the data that is received on the data channel
- *
- */
-static void irobex_data_indication( void *instance, void *sap, 
-				    struct sk_buff *skb) 
-{
-
-	struct irobex_cb *self;
-	
-	self = ( struct irobex_cb *) instance;
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);
-	ASSERT( skb != NULL, return;);
-	
-	DEBUG( 4, __FUNCTION__ "(), len=%d\n", (int) skb->len);
-	
-	skb_queue_tail( &self->rx_queue, skb);
-	
-	/*
-	 *  Check if queues are beginning to get filled, and inform 
-	 *  IrTTP to slow down if that is the case
-	 */
-	if ( skb_queue_len( &self->rx_queue) > HIGH_THRESHOLD) {
-		DEBUG( 0, __FUNCTION__ 
-		       "(), rx_queue is full, telling IrTTP to slow down\n");
-		self->rx_flow = FLOW_STOP;
-		irttp_flow_request( self->tsap, FLOW_STOP);
-	}
-
-	/*
-	 *  Wake up process blocked on read or select
-	 */
-	wake_up_interruptible( &self->read_wait);
-
-	/* Send signal to asynchronous readers */
-	if ( self->async)
-		kill_fasync( self->async, SIGIO);
-}
-
-/*
- * Function irobex_flow_indication (instance, sap, cmd)
- *
- *    
- *
- */
-static void irobex_flow_indication( void *instance, void *sap, 
-				    LOCAL_FLOW flow) 
-{
-	struct irobex_cb *self;
-
-	DEBUG( 4, __FUNCTION__ "()\n");
-	
-	self = ( struct irobex_cb *) instance;
-	
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);
-	
-	switch ( flow) {
-	case FLOW_STOP:
-		DEBUG( 0, __FUNCTION__ "(), IrTTP wants us to slow down\n");
-		self->tx_flow = flow;
-		break;
-	case FLOW_START:
-		self->tx_flow = flow;
-		DEBUG( 0, __FUNCTION__ "(), IrTTP wants us to start again\n");
-		wake_up_interruptible( &self->write_wait);
-		break;
-	default:
-		DEBUG( 0, __FUNCTION__ "(), Unknown flow command!\n");
-	}
-}
-
-/*
- * Function irobex_get_value_confirm (obj_id, value)
- *
- *    Got results from previous GetValueByClass request
- *
- */
-static void irobex_get_value_confirm( __u16 obj_id, struct ias_value *value, 
-				      void *priv)
-{
-	struct irobex_cb *self;
-	
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	ASSERT( priv != NULL, return;);
-	self = ( struct irobex_cb *) priv;
-	
-	if ( !self || self->magic != IROBEX_MAGIC) {
-		DEBUG( 0, __FUNCTION__ "(), bad magic!\n");
-		return;
-	}
-
-	/* Check if request succeeded */
-	if ( !value) {
-		DEBUG( 0, __FUNCTION__ "(), got NULL value!\n");
-
-		return;
-	}
-
-	switch ( value->type) {
-	case IAS_INTEGER:
-		DEBUG( 4, __FUNCTION__ "() int=%d\n", value->t.integer);
-		
-		if ( value->t.integer != -1) {
-			self->dtsap_sel = value->t.integer;
-
-			/*
-			 *  Got the remote TSAP, so wake up any processes
-			 *  blocking on write. We don't do the connect 
-			 *  ourselves since we must make sure there is a 
-			 *  process that wants to make a connection, so we
-			 *  just let that process do the connect itself
-			 */
-			if ( self->state == OBEX_QUERY)
-				wake_up_interruptible( &self->write_wait);
-		} else 
-			self->dtsap_sel = 0;
-		break;
-	case IAS_STRING:
-		DEBUG( 0, __FUNCTION__ "(), got string %s\n", value->t.string);
-		break;
-	case IAS_OCT_SEQ:
-		DEBUG( 0, __FUNCTION__ "(), OCT_SEQ not implemented\n");
-		break;
-	case IAS_MISSING:
-		DEBUG( 0, __FUNCTION__ "(), MISSING not implemented\n");
-		break;
-	default:
-		DEBUG( 0, __FUNCTION__ "(), unknown type!\n");
-		break;
-	}
-}
-
-/*
- * Function irobex_provider_confirm (dlsap)
- *
- *    IrOBEX provider is discovered. We can now establish connections
- *    TODO: This function is currently not used!
- */
-void irobex_provider_confirm( struct irobex_cb *self, __u8 dlsap) 
-{
-	/* struct irobex_cb *self = irobex; */
-	struct notify_t notify;
-	
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);
-
-	notify.data_indication = irobex_data_indication;
-	notify.connect_confirm = irobex_connect_confirm;
-	notify.connect_indication = irobex_connect_indication;
-	notify.flow_indication = irobex_flow_indication;
-	notify.disconnect_indication = irobex_disconnect_indication;
-	notify.instance = self;
-	
-	/* Create TSAP's */
-	self->tsap = irttp_open_tsap( LSAP_ANY, DEFAULT_INITIAL_CREDIT,
-				      &notify);
-	
-/* 	DEBUG( 0, "OBEX allocated TSAP%d for data\n", self->handle); */
-	
-	/* irlan_do_event( IAS_PROVIDER_AVAIL, NULL, &frame); */
-}
-
-/*
- * Function irobex_register_server(void)
- *
- *    Register server support so we can accept incomming connections. We
- *    must register both a TSAP for control and data
- * 
- */
-static void irobex_register_server( struct irobex_cb *self)
-{
-	struct notify_t notify;
-	struct ias_object *obj;
-
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);
-
-	irda_notify_init( &notify);
-
-	notify.connect_confirm       = irobex_connect_confirm;
-	notify.connect_indication    = irobex_connect_indication;
-	notify.disconnect_indication = irobex_disconnect_indication;
-	notify.data_indication       = irobex_data_indication;
-	notify.flow_indication       = irobex_flow_indication;
-	notify.instance = self;
-	strcpy( notify.name, "IrOBEX");
-
-	self->tsap = irttp_open_tsap( TSAP_IROBEX, DEFAULT_INITIAL_CREDIT,
-				      &notify);	
-	if ( self->tsap == NULL) {
-		DEBUG( 0, __FUNCTION__ "(), Unable to allocate TSAP!\n");
-		return;
-	}
-
-	/* 
-	 *  Register with LM-IAS
-	 */
-	obj = irias_new_object( "OBEX", 0x42343);
-	irias_add_integer_attrib( obj, "IrDA:TinyTP:LsapSel", TSAP_IROBEX);
-	irias_insert_object( obj);
-}
-
-void irobex_watchdog_timer_expired( unsigned long data)
-{
-	struct irobex_cb *self = ( struct irobex_cb *) data;
-	
-	DEBUG( 4, __FUNCTION__ "()\n");
-
-	ASSERT( self != NULL, return;);
-	ASSERT( self->magic == IROBEX_MAGIC, return;);
-
-	switch (self->state) {
-	case OBEX_CONN:      /* FALLTROUGH */
-	case OBEX_DISCOVER:  /* FALLTROUGH */
-	case OBEX_QUERY:     /* FALLTROUGH */
-		wake_up_interruptible( &self->write_wait);
-		break;
-	default:
-		break;
-	}
-}
-
-#ifdef CONFIG_PROC_FS
-/*
- * Function irobex_proc_read (buf, start, offset, len, unused)
- *
- *    Give some info to the /proc file system
- */
-static int irobex_proc_read( char *buf, char **start, off_t offset, 
-			     int len, int unused)
-{
- 	struct irobex_cb *self;
-
-	self = irobex;
-
-	ASSERT( self != NULL, return -1;);
-	ASSERT( self->magic == IROBEX_MAGIC, return -1;);
-
-	len = 0;
-	
-	len += sprintf( buf+len, "ifname: %s ",self->devname);
-	len += sprintf( buf+len, "state: %s ", irobex_state[ self->state]);
-	len += sprintf( buf+len, "EOF: %s\n", self->eof ? "TRUE": "FALSE");
-	
-	return len;
-}
-
-#endif /* CONFIG_PROC_FS */
-
-#ifdef MODULE
-
-MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");
-MODULE_DESCRIPTION("The Linux IrOBEX module"); 
-
-/*
- * Function init_module (void)
- *
- *    Initialize the IrOBEX module, this function is called by the
- *    modprobe(1) program.
- */
-int init_module(void) 
-{
-	irobex_init();
-	
-	return 0;
-}
-
-/*
- * Function cleanup_module (void)
- *
- *    Remove the IrOBEX module, this function is called by the rmmod(1)
- *    program
- */
-void cleanup_module(void) 
-{
-	/* 
-	 *  No need to check MOD_IN_USE, as sys_delete_module() checks. 
-	 */
-	
-	/* Free some memory */
-	irobex_cleanup();	
-}
-
-#endif /* MODULE */
-
-
-
-
diff -urN linux-2.2.6-pre2/net/irda/irobex/Makefile linux-2.2.6-pre3/net/irda/irobex/Makefile
--- linux-2.2.6-pre2/net/irda/irobex/Makefile	1998-12-17 09:01:03.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irobex/Makefile	1969-12-31 16:00:00.000000000 -0800
@@ -1,19 +0,0 @@
-#
-# Makefile for the Linux IrDA IrOBEX protocol layer.
-#
-# Note! Dependencies are done automagically by 'make dep', which also
-# removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
-#
-# Note 2! The CFLAGS definition is now in the main makefile...
-
-#O_TARGET :=
-O_OBJS	 := irobex.o
-M_OBJS   := irobex.o
-
-OX_OBJS  += 
-
-include $(TOPDIR)/Rules.make
-
-tar:
-		tar -cvf /dev/f1 .
diff -urN linux-2.2.6-pre2/net/irda/irproc.c linux-2.2.6-pre3/net/irda/irproc.c
--- linux-2.2.6-pre2/net/irda/irproc.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irproc.c	2003-08-15 15:05:39.000000000 -0700
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irproc.c
- * Version:       
+ * Version:       1.0
  * Description:   Various entries in the /proc file system
  * Status:        Experimental.
  * Author:        Thomas Davis, <ratbert@radiks.net>
  * Created at:    Sat Feb 21 21:33:24 1998
- * Modified at:   Thu Feb 11 15:23:23 1999
+ * Modified at:   Tue Apr  6 19:07:06 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998, Thomas Davis, <ratbert@radiks.net>, 
@@ -27,6 +27,7 @@
 #include <linux/miscdevice.h>
 #include <linux/proc_fs.h>
 
+#include <net/irda/irda.h>
 #include <net/irda/irmod.h>
 #include <net/irda/irlap.h>
 #include <net/irda/irlmp.h>
@@ -46,6 +47,8 @@
 			   int unused);
 extern int irias_proc_read(char *buf, char **start, off_t offset, int len,
 			   int unused);
+extern int discovery_proc_read(char *buf, char **start, off_t offset, int len, 
+			       int unused);
 
 static int proc_discovery_read(char *buf, char **start, off_t offset, int len,
 			       int unused);
@@ -118,7 +121,7 @@
 	0, 9, "discovery",
 	S_IFREG | S_IRUGO, 1, 0, 0,
 	0, NULL /* ops -- default to array */,
-	&proc_discovery_read /* get_info */,
+	&discovery_proc_read /* get_info */,
 };
 
 struct proc_dir_entry proc_irda_device = {
@@ -184,7 +187,9 @@
  */
 void irda_proc_register(void) {
 	proc_net_register(&proc_irda);
+#ifdef MODULE
 	proc_irda.fill_inode = &irda_proc_modcount;
+#endif /* MODULE */
 	proc_register(&proc_irda, &proc_lap);
 	proc_register(&proc_irda, &proc_lmp);
 	proc_register(&proc_irda, &proc_ttp);
@@ -311,73 +316,5 @@
 	return 1;
 }
 
-/*
- * Function proc_discovery_read (buf, start, offset, len, unused)
- *
- *    Print discovery information in /proc file system
- *
- */
-int proc_discovery_read(char *buf, char **start, off_t offset, int len, 
-			int unused)
-{
-	DISCOVERY *discovery;
-	struct lap_cb *lap;
-	unsigned long flags;
-
-	if ( !irlmp)
-		return len;
 
-	len = sprintf(buf, "IrLMP: Discovery log:\n\n");	
-
-	save_flags(flags);
-	cli();
-
-	lap = ( struct lap_cb *) hashbin_get_first( irlmp->links);
-	while( lap != NULL) {
-		ASSERT( lap->magic == LMP_LAP_MAGIC, return 0;);
-		
-		len += sprintf( buf+len, "Link saddr=0x%08x\n", lap->saddr);
-		discovery = ( DISCOVERY *) hashbin_get_first( lap->cachelog);
-		while ( discovery != NULL) {
-			len += sprintf( buf+len, "  name: %s,", 
-					discovery->info);
-			
-			len += sprintf( buf+len, " hint: ");
-			if ( discovery->hint[0] & HINT_PNP)
-				len += sprintf( buf+len, "PnP Compatible ");
-			if ( discovery->hint[0] & HINT_PDA)
-				len += sprintf( buf+len, "PDA/Palmtop ");
-			if ( discovery->hint[0] & HINT_COMPUTER)
-				len += sprintf( buf+len, "Computer ");
-			if ( discovery->hint[0] & HINT_PRINTER)
-				len += sprintf( buf+len, "Printer ");
-			if ( discovery->hint[0] & HINT_MODEM)
-				len += sprintf( buf+len, "Modem ");
-			if ( discovery->hint[0] & HINT_FAX)
-				len += sprintf( buf+len, "Fax ");
-			if ( discovery->hint[0] & HINT_LAN)
-				len += sprintf( buf+len, "LAN Access");
-			
-			if ( discovery->hint[1] & HINT_TELEPHONY)
-				len += sprintf( buf+len, "Telephony ");
-			if ( discovery->hint[1] & HINT_FILE_SERVER)
-				len += sprintf( buf+len, "File Server ");       
-			if ( discovery->hint[1] & HINT_COMM)
-				len += sprintf( buf+len, "IrCOMM ");
-			if ( discovery->hint[1] & HINT_OBEX)
-				len += sprintf( buf+len, "IrOBEX ");
-			
-			len += sprintf( buf+len, ", daddr: 0x%08x\n", 
-					discovery->daddr);
-			
-			len += sprintf( buf+len, "\n");
-			
-			discovery = ( DISCOVERY *) hashbin_get_next( lap->cachelog);
-		}
-		lap = ( struct lap_cb *) hashbin_get_next( irlmp->links);
-	}
-	restore_flags(flags);
-
-	return len;
-}
 
diff -urN linux-2.2.6-pre2/net/irda/irqueue.c linux-2.2.6-pre3/net/irda/irqueue.c
--- linux-2.2.6-pre2/net/irda/irqueue.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irqueue.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Jun  9 13:29:31 1998
- * Modified at:   Mon Feb  8 09:05:51 1999
+ * Modified at:   Thu Mar 11 13:27:04 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (C) 1998, Aage Kvalnes <aage@cs.uit.no>
@@ -45,9 +45,10 @@
  *    Create hashbin!
  *
  */
-hashbin_t *hashbin_new( int type)
+hashbin_t *hashbin_new(int type)
 {
 	hashbin_t* hashbin;
+	int i;
 	
 	DEBUG( 4, __FUNCTION__ "()\n");
 	
@@ -61,9 +62,13 @@
 	/*
 	 * Initialize structure
 	 */
-	memset( hashbin, 0, sizeof(hashbin_t));
+	memset(hashbin, 0, sizeof(hashbin_t));
 	hashbin->hb_type = type;
 	hashbin->magic = HB_MAGIC;
+
+	/* Make sure all spinlock's are unlocked */
+	for (i=0;i<HASHBIN_SIZE;i++)
+		hashbin->hb_mutex[i] = SPIN_LOCK_UNLOCKED;
 	
 	return hashbin;
 }
@@ -161,10 +166,9 @@
 	bin = GET_HASHBIN( hashv);
 	
 	/* Synchronize */
-	if ( hashbin->hb_type & HB_GLOBAL ) {
-
+	if ( hashbin->hb_type & HB_GLOBAL )
 		spin_lock_irqsave( &hashbin->hb_mutex[ bin], flags);
-	} else {
+	else {
 		save_flags( flags);
 		cli();
 	}
@@ -176,27 +180,27 @@
  *    Unlock the hashbin
  *
  */
-void hashbin_unlock( hashbin_t* hashbin, __u32 hashv, char* name, 
-		     unsigned long flags)
+void hashbin_unlock(hashbin_t* hashbin, __u32 hashv, char* name, 
+		    unsigned long flags)
 {
 	int bin;
 
-	DEBUG( 0, "hashbin_unlock()\n");
+	DEBUG(0, "hashbin_unlock()\n");
 
-	ASSERT( hashbin != NULL, return;);
-	ASSERT( hashbin->magic == HB_MAGIC, return;);
+	ASSERT(hashbin != NULL, return;);
+	ASSERT(hashbin->magic == HB_MAGIC, return;);
 	
 	/*
 	 * Locate hashbin
 	 */
-	if ( name )
-		hashv = hash( name );
-	bin = GET_HASHBIN( hashv );
+	if (name )
+		hashv = hash(name);
+	bin = GET_HASHBIN(hashv);
 	
 	/* Release lock */
-	if ( hashbin->hb_type & HB_GLOBAL) {
+	if ( hashbin->hb_type & HB_GLOBAL)
 		spin_unlock_irq( &hashbin->hb_mutex[ bin]);
-	} else if ( hashbin->hb_type & HB_LOCAL) {
+	else if (hashbin->hb_type & HB_LOCAL) {
 		restore_flags( flags);
 	}
 }
diff -urN linux-2.2.6-pre2/net/irda/irttp.c linux-2.2.6-pre3/net/irda/irttp.c
--- linux-2.2.6-pre2/net/irda/irttp.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/irttp.c	2003-08-15 15:05:39.000000000 -0700
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irttp.c
- * Version:       1.0
+ * Version:       1.2
  * Description:   Tiny Transport Protocol (TTP) implementation
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:31 1997
- * Modified at:   Sat Feb 20 01:30:39 1999
+ * Modified at:   Thu Mar 25 10:27:08 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -30,6 +30,7 @@
 #include <asm/byteorder.h>
 
 #include <net/irda/irda.h>
+#include <net/irda/irmod.h>
 #include <net/irda/irlmp.h>
 #include <net/irda/irttp.h>
 
@@ -37,15 +38,15 @@
 
 static void __irttp_close_tsap(struct tsap_cb *self);
 
-static void irttp_data_indication(void *instance, void *sap, 
+static int irttp_data_indication(void *instance, void *sap, 
+				 struct sk_buff *skb);
+static int irttp_udata_indication(void *instance, void *sap, 
 				  struct sk_buff *skb);
-static void irttp_udata_indication(void *instance, void *sap, 
-				   struct sk_buff *skb);
 static void irttp_disconnect_indication(void *instance, void *sap,  
 					LM_REASON reason,
 					struct sk_buff *);
 static void irttp_connect_indication(void *instance, void *sap, 
-				     struct qos_info *qos, int max_sdu_size,
+				     struct qos_info *qos, __u32 max_sdu_size,
 				     struct sk_buff *skb);
 
 static void irttp_run_tx_queue(struct tsap_cb *self);
@@ -127,8 +128,7 @@
 
 	self = kmalloc(sizeof(struct tsap_cb), GFP_ATOMIC);
 	if (self == NULL) {
-		printk(KERN_ERR "IrTTP: Can't allocate memory for "
-			"TSAP control block!\n");
+		DEBUG(0, __FUNCTION__ "(), unable to kmalloc!\n");
 		return NULL;
 	}
 	memset(self, 0, sizeof(struct tsap_cb));
@@ -136,7 +136,6 @@
 	init_timer(&self->todo_timer);
 
 	/* Initialize callbacks for IrLMP to use */
-
 	irda_notify_init(&ttp_notify);
 	ttp_notify.connect_confirm = irttp_connect_confirm;
 	ttp_notify.connect_indication = irttp_connect_indication;
@@ -146,6 +145,12 @@
 	ttp_notify.instance = self;
 	strncpy(ttp_notify.name, notify->name, NOTIFY_MAX_NAME);
 
+	self->magic = TTP_TSAP_MAGIC;
+	self->connected = FALSE;
+
+	skb_queue_head_init(&self->rx_queue);
+	skb_queue_head_init(&self->tx_queue);
+	skb_queue_head_init(&self->rx_fragments);
 	/*
 	 *  Create LSAP at IrLMP layer
 	 */
@@ -165,24 +170,15 @@
 
 	self->notify = *notify;
 	self->lsap = lsap;
-	self->magic = TTP_TSAP_MAGIC;
-	self->connected = FALSE;
-
-	skb_queue_head_init(&self->rx_queue);
-	skb_queue_head_init(&self->tx_queue);
-	skb_queue_head_init(&self->rx_fragments);
 
-	/*
-	 *  Insert ourself into the hashbin
-	 */
-	hashbin_insert(irttp->tsaps, (QUEUE *) self, self->stsap_sel, NULL);
+	hashbin_insert(irttp->tsaps, (QUEUE *) self, (int) self, NULL);
 
 	if (credit > TTP_MAX_QUEUE)
 		self->initial_credit = TTP_MAX_QUEUE;
 	else
 		self->initial_credit = credit;
-	
-	return self;
+
+	return self;	
 }
 
 /*
@@ -194,8 +190,6 @@
  */
 static void __irttp_close_tsap(struct tsap_cb *self)
 {
-	DEBUG(4, __FUNCTION__ "()\n");
-
 	/* First make sure we're connected. */
 	ASSERT(self != NULL, return;);
 	ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
@@ -239,7 +233,7 @@
 		return 0; /* Will be back! */
 	}
 	
-	tsap = hashbin_remove(irttp->tsaps, self->stsap_sel, NULL);
+	tsap = hashbin_remove(irttp->tsaps, (int) self, NULL);
 
 	ASSERT(tsap == self, return -1;);
 
@@ -295,8 +289,6 @@
 {
 	__u8 *frame;
 
-	DEBUG(4, __FUNCTION__ "()\n");
-
 	ASSERT(self != NULL, return -1;);
 	ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;);
 	ASSERT(skb != NULL, return -1;);
@@ -304,7 +296,7 @@
 	/* Check that nothing bad happens */
 	if ((skb->len == 0) || (!self->connected)) {
 		DEBUG(4, __FUNCTION__ "(), No data, or not connected\n");
-		return -1;
+		return -ENOTCONN;
 	}
 
 	/*  
@@ -314,7 +306,7 @@
 	if ((self->tx_max_sdu_size == 0) && (skb->len > self->max_seg_size)) {
 		DEBUG(1, __FUNCTION__ 
 		       "(), SAR disabled, and data is to large for IrLAP!\n");
-		return -1;
+		return -EMSGSIZE;
 	}
 
 	/* 
@@ -322,11 +314,12 @@
 	 *  TxMaxSduSize 
 	 */
 	if ((self->tx_max_sdu_size != 0) && 
+	    (self->tx_max_sdu_size != SAR_UNBOUND) && 
 	    (skb->len > self->tx_max_sdu_size))
 	{
 		DEBUG(1, __FUNCTION__ "(), SAR enabled, "
 		       "but data is larger than TxMaxSduSize!\n");
-		return -1;
+		return -EMSGSIZE;
 	}
 	/* 
 	 *  Check if transmit queue is full
@@ -337,7 +330,7 @@
 		 */
 		irttp_run_tx_queue(self);
 		
-		return -1;
+		return -ENOBUFS;
 	}
        
 	/* Queue frame, or queue frame segments */
@@ -378,7 +371,7 @@
 }
 
 /*
- * Function irttp_xmit (self)
+ * Function irttp_run_tx_queue (self)
  *
  *    If possible, transmit a frame queued for transmission.
  *
@@ -396,8 +389,7 @@
 	if (irda_lock(&self->tx_queue_lock) == FALSE)
 		return;
 
-	while ((self->send_credit > 0) && !skb_queue_empty(&self->tx_queue)){
-
+	while ((self->send_credit > 0) && !skb_queue_empty(&self->tx_queue)) {
 		skb = skb_dequeue(&self->tx_queue);
 		ASSERT(skb != NULL, return;);
 		
@@ -409,13 +401,12 @@
 		 *  the code below is a critical region and we must assure that
 		 *  nobody messes with the credits while we update them.
 		 */
-		save_flags(flags); 
-		cli();
+		spin_lock_irqsave(&self->lock, flags);
 
 		n = self->avail_credit;
 		self->avail_credit = 0;
 		
-		/* Only space for 127 credits in frame */
+		/* Only room for 127 credits in frame */
 		if (n > 127) {
 			self->avail_credit = n-127;
 			n = 127;
@@ -423,10 +414,8 @@
 		self->remote_credit += n;
 		self->send_credit--;
 
-		restore_flags(flags);
+		spin_unlock_irqrestore(&self->lock, flags);
 
-		DEBUG(4, "irttp_xmit: Giving away %d credits\n", n);
-		
 		/* 
 		 *  More bit must be set by the data_request() or fragment() 
 		 *  functions
@@ -443,12 +432,14 @@
 
 		/* Check if we can accept more frames from client */
 		if ((self->tx_sdu_busy) && 
-		    (skb_queue_len(&self->tx_queue) < LOW_THRESHOLD)) { 
+		    (skb_queue_len(&self->tx_queue) < LOW_THRESHOLD)) 
+		{ 
 			self->tx_sdu_busy = FALSE;
 			
 			if (self->notify.flow_indication)
 				self->notify.flow_indication(
-				      self->notify.instance, self, FLOW_START);
+					self->notify.instance, self, 
+					FLOW_START);
 		}
 	}
 	
@@ -487,8 +478,7 @@
 	 *  the code below is a critical region and we must assure that
 	 *  nobody messes with the credits while we update them.
 	 */
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&self->lock, flags);
 
 	n = self->avail_credit;
 	self->avail_credit = 0;
@@ -500,7 +490,7 @@
 	}
 	self->remote_credit += n;
 
-	restore_flags(flags);
+	spin_unlock_irqrestore(&self->lock, flags);
 
 	skb_put(tx_skb, 1);
 	tx_skb->data[0] = (__u8) (n & 0x7f);
@@ -512,10 +502,11 @@
 /*
  * Function irttp_udata_indication (instance, sap, skb)
  *
- *    
+ *    Received some unit-data (unreliable)
  *
  */
-void irttp_udata_indication(void *instance, void *sap, struct sk_buff *skb) 
+static int irttp_udata_indication(void *instance, void *sap, 
+				  struct sk_buff *skb) 
 {
 	struct tsap_cb *self;
 
@@ -523,15 +514,17 @@
 
 	self = (struct tsap_cb *) instance;
 
-	ASSERT(self != NULL, return;);
-	ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
-	ASSERT(skb != NULL, return;);
+	ASSERT(self != NULL, return -1;);
+	ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;);
+	ASSERT(skb != NULL, return -1;);
 
 	/* Just pass data to layer above */
 	if (self->notify.udata_indication) {
 		self->notify.udata_indication(self->notify.instance, self, skb);
 	}
 	self->stats.rx_packets++;
+
+	return 0;
 }
 
 /*
@@ -540,7 +533,8 @@
  *    Receive segment from IrLMP. 
  *
  */
-void irttp_data_indication(void *instance, void *sap, struct sk_buff *skb)
+static int irttp_data_indication(void *instance, void *sap, 
+				 struct sk_buff *skb)
 {
 	struct tsap_cb *self;
 	int more;
@@ -549,17 +543,17 @@
 	
 	self = (struct tsap_cb *) instance;
 
-	ASSERT(self != NULL, return;);
-	ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
-	ASSERT(skb != NULL, return;);
+	ASSERT(self != NULL, return -1;);
+	ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;);
+	ASSERT(skb != NULL, return -1;);
 
 	frame = skb->data;
 	
 	n = frame[0] & 0x7f;     /* Extract the credits */
 	more = frame[0] & 0x80;
 
- 	DEBUG(4, __FUNCTION__"(), got %d credits, TSAP sel=%02x\n", 
-	       n, self->stsap_sel);
+ 	DEBUG(3, __FUNCTION__"(), got %d credits, TSAP sel=%02x\n", 
+	      n, self->stsap_sel);
 
 	self->stats.rx_packets++;
 
@@ -600,6 +594,7 @@
 	 */
 	if (self->send_credit == n)
 		irttp_start_todo_timer(self, 0);
+	return 0;
 }
 
 /*
@@ -638,25 +633,26 @@
  *    Try to connect to remote destination TSAP selector
  *
  */
-void irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel, 
-			   __u32 saddr, __u32 daddr,
-			   struct qos_info *qos, int max_sdu_size, 
-			   struct sk_buff *userdata) 
+int irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel, 
+			  __u32 saddr, __u32 daddr,
+			  struct qos_info *qos, __u32 max_sdu_size, 
+			  struct sk_buff *userdata) 
 {
 	struct sk_buff *skb;
+	__u16 tmp_be;
 	__u8 *frame;
 	__u8 n;
 	
 	DEBUG(4, __FUNCTION__ "(), max_sdu_size=%d\n", max_sdu_size); 
 	
-	ASSERT(self != NULL, return;);
-	ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
+	ASSERT(self != NULL, return -1;);
+	ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;);
 
 	/* Any userdata supplied? */
 	if (userdata == NULL) {
 		skb = dev_alloc_skb(64);
 		if (!skb) 
-			return;
+			return -ENOMEM;
 		
 		/* Reserve space for MUX_CONTROL and LAP header */
 		skb_reserve(skb, (TTP_HEADER+LMP_CONTROL_HEADER+LAP_HEADER));
@@ -667,7 +663,7 @@
 		 *  headers
 		 */
 		ASSERT(skb_headroom(userdata) >= 
-			(TTP_HEADER+LMP_CONTROL_HEADER+LAP_HEADER), return;);
+		       (TTP_HEADER+LMP_CONTROL_HEADER+LAP_HEADER), return -1;);
 	}
 
 	/* Initialize connection parameters */
@@ -697,7 +693,7 @@
 	if (max_sdu_size > 0) {
 		ASSERT(skb_headroom(skb) >= 
 			(TTP_HEADER_WITH_SAR+LMP_CONTROL_HEADER+LAP_HEADER), 
-			return;);
+			return -1;);
 
 		/* Insert SAR parameters */
 		frame = skb_push(skb, TTP_HEADER_WITH_SAR);
@@ -706,7 +702,9 @@
 		frame[1] = 0x04; /* Length */
 		frame[2] = 0x01; /* MaxSduSize */
 		frame[3] = 0x02; /* Value length */
-		*((__u16 *) (frame+4))= htons(max_sdu_size); /* Big endian! */
+
+		tmp_be = cpu_to_be16((__u16) max_sdu_size);
+		memcpy(frame+4, &tmp_be, 2);
 	} else {
 		/* Insert plain TTP header */
 		frame = skb_push(skb, TTP_HEADER);
@@ -716,7 +714,8 @@
 	}
 
 	/* Connect with IrLMP. No QoS parameters for now */
-	irlmp_connect_request(self->lsap, dtsap_sel, saddr, daddr, qos, skb);
+	return irlmp_connect_request(self->lsap, dtsap_sel, saddr, daddr, qos, 
+				     skb);
 }
 
 /*
@@ -726,12 +725,14 @@
  *
  */
 void irttp_connect_confirm(void *instance, void *sap, struct qos_info *qos,
-			   int max_seg_size, struct sk_buff *skb) 
+			   __u32 max_seg_size, struct sk_buff *skb) 
 {
 	struct tsap_cb *self;
+	__u16 tmp_cpu;
 	__u8 *frame;
 	__u8 n;
 	int parameters;
+	__u8 plen, pi, pl;
 
 	DEBUG(4, __FUNCTION__ "()\n");
 	
@@ -765,9 +766,16 @@
 
 	parameters = frame[0] & 0x80;	
 	if (parameters) {
-		DEBUG(4, __FUNCTION__ "(), Contains parameters!\n");
-		
-		self->tx_max_sdu_size = ntohs(*(__u16 *)(frame+4));
+		plen = frame[1];
+		pi   = frame[2];
+		pl   = frame[3];
+
+		ASSERT(pl == 2, return;);
+
+		memcpy(&tmp_cpu, frame+4, 2); /* Align value */
+		be16_to_cpus(&tmp_cpu);       /* Convert to host order */
+		self->tx_max_sdu_size = tmp_cpu;
+
 		DEBUG(4, __FUNCTION__ "(), RxMaxSduSize=%d\n", 
 		       self->tx_max_sdu_size);
 	}
@@ -791,14 +799,16 @@
  *
  */
 void irttp_connect_indication(void *instance, void *sap, 
-			      struct qos_info *qos, int max_seg_size, 
+			      struct qos_info *qos, __u32 max_seg_size, 
 			      struct sk_buff *skb) 
 {
 	struct tsap_cb *self;
 	struct lsap_cb *lsap;
+	__u16 tmp_cpu;
 	__u8 *frame;
 	int parameters;
 	int n;
+	__u8 plen, pi, pl;
 
 	self = (struct tsap_cb *) instance;
 
@@ -827,15 +837,23 @@
 	parameters = frame[0] & 0x80;	
 	if (parameters) {
 		DEBUG(4, __FUNCTION__ "(), Contains parameters!\n");
-		
-		self->tx_max_sdu_size = ntohs(*(__u16 *)(frame+4));
+		plen = frame[1];
+		pi   = frame[2];
+		pl   = frame[3];
+
+		ASSERT(pl == 2, return;);
+
+		memcpy(&tmp_cpu, frame+4, 2); /* Align value */
+		be16_to_cpus(&tmp_cpu);       /* Convert to host order */
+
+		self->tx_max_sdu_size = tmp_cpu;
 		DEBUG(4, __FUNCTION__ "(), MaxSduSize=%d\n", 
 		      self->tx_max_sdu_size);
 	}
 
 	DEBUG(4, __FUNCTION__ "(), initial send_credit=%d\n", n);
 
-	skb_pull(skb, 1);
+	skb_pull(skb, 1); /* Remove TTP header */
 
 	if (self->notify.connect_indication) {
 		self->notify.connect_indication(self->notify.instance, self, 
@@ -851,10 +869,11 @@
  *    IrLMP!
  * 
  */
-void irttp_connect_response(struct tsap_cb *self, int max_sdu_size, 
+void irttp_connect_response(struct tsap_cb *self, __u32 max_sdu_size, 
 			    struct sk_buff *userdata)
 {
 	struct sk_buff *skb;
+	__u32 tmp_be;
 	__u8 *frame;
 	__u8 n;
 
@@ -912,7 +931,9 @@
 		frame[1] = 0x04; /* Length */
 		frame[2] = 0x01; /* MaxSduSize */
 		frame[3] = 0x02; /* Value length */
-		*((__u16 *) (frame+4))= htons(max_sdu_size);
+
+		tmp_be = cpu_to_be16((__u16)max_sdu_size);
+		memcpy(frame+4, &tmp_be, 2);
 	} else {
 		/* Insert TTP header */
 		frame = skb_push(skb, TTP_HEADER);
@@ -924,6 +945,44 @@
 }
 
 /*
+ * Function irttp_dup (self, instance)
+ *
+ *    Duplicate TSAP, can be used by servers to confirm a connection on a
+ *    new TSAP so it can keep listening on the old one.
+ */
+struct tsap_cb *irttp_dup(struct tsap_cb *orig, void *instance) 
+{
+	struct tsap_cb *new;
+
+	DEBUG(1, __FUNCTION__ "()\n");
+
+	if (!hashbin_find(irttp->tsaps, (int) orig, NULL)) {
+		DEBUG(0, __FUNCTION__ "(), unable to find TSAP\n");
+		return NULL;
+	}
+	new = kmalloc(sizeof(struct tsap_cb), GFP_ATOMIC);
+	if (!new) {
+		DEBUG(0, __FUNCTION__ "(), unable to kmalloc\n");
+		return NULL;
+	}
+	/* Dup */
+	memcpy(new, orig, sizeof(struct tsap_cb));
+	new->notify.instance = instance;
+	new->lsap = irlmp_dup(orig->lsap, new);
+
+	/* Not everything should be copied */
+	init_timer(&new->todo_timer);
+
+	skb_queue_head_init(&new->rx_queue);
+	skb_queue_head_init(&new->tx_queue);
+	skb_queue_head_init(&new->rx_fragments);
+
+	hashbin_insert(irttp->tsaps, (QUEUE *) new, (int) new, NULL);
+
+	return new;
+}
+
+/*
  * Function irttp_disconnect_request (self)
  *
  *    Close this connection please! If priority is high, the queued data 
@@ -1028,12 +1087,44 @@
 	
 	self->connected = FALSE;
 	
-	/* 
-	 *  Use callback to notify layer above 
+	if (!self->notify.disconnect_indication)
+		return;
+
+	self->notify.disconnect_indication(self->notify.instance, self, reason,
+					   userdata);
+}
+
+/*
+ * Function irttp_do_data_indication (self, skb)
+ *
+ *    Try to deliver reassebled skb to layer above, and requeue it if that
+ *    for some reason should fail. We mark rx sdu as busy to apply back
+ *    pressure is necessary.
+ */
+void irttp_do_data_indication(struct tsap_cb *self, struct sk_buff *skb)
+{
+	int err;
+
+	err = self->notify.data_indication(self->notify.instance, self, skb);
+
+	/* Usually the layer above will notify that it's input queue is
+	 * starting to get filled by using the flow request, but this may
+	 * be difficult, so it can instead just refuse to eat it and just
+	 * give an error back 
 	 */
-	if (self->notify.disconnect_indication)
-		self->notify.disconnect_indication(self->notify.instance, 
-						   self, reason, userdata);
+	if (err == -ENOMEM) {
+		DEBUG(0, __FUNCTION__ "() requeueing skb!\n");
+
+		/* Make sure we take a break */
+		self->rx_sdu_busy = TRUE;
+		
+		/* Need to push the header in again */
+		skb_push(skb, TTP_HEADER);
+		skb->data[0] = 0x00; /* Make sure MORE bit is cleared */
+		
+		/* Put skb back on queue */
+		skb_queue_head(&self->rx_queue, skb);
+	}
 }
 
 /*
@@ -1045,15 +1136,7 @@
 void irttp_run_rx_queue(struct tsap_cb *self) 
 {
 	struct sk_buff *skb;
-	__u8 *frame;
 	int more = 0;
-	void *instance;
-
-	ASSERT(self != NULL, return;);
-	ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
-
-	instance = self->notify.instance;
-	ASSERT(instance != NULL, return;);
 
 	DEBUG(4, __FUNCTION__ "() send=%d,avail=%d,remote=%d\n", 
 	       self->send_credit, self->avail_credit, self->remote_credit);
@@ -1062,20 +1145,12 @@
 		return;
 	
 	/*
-	 *  Process receive queue
+	 *  Reassemble all frames in receive queue and deliver them
 	 */
-	while ((!skb_queue_empty(&self->rx_queue)) &&  !self->rx_sdu_busy) {
-
-		skb = skb_dequeue(&self->rx_queue);
-		if (!skb)
-			break; /* Should not happend, but ...  */
-		
+	while (!self->rx_sdu_busy && (skb = skb_dequeue(&self->rx_queue))) {
 		self->avail_credit++;
 
-		frame = skb->data;
-		more = frame[0] & 0x80;
-		DEBUG(4, __FUNCTION__ "(), More=%s\n", more ? "TRUE" : 
-		       "FALSE");
+		more = skb->data[0] & 0x80;
 
 		/* Remove TTP header */
 		skb_pull(skb, TTP_HEADER);
@@ -1089,10 +1164,10 @@
 		 * immediately. This can be requested by clients that
 		 * implements byte streams without any message boundaries
 		 */
-		if ((self->no_defrag) || (self->rx_max_sdu_size == 0)) {
-			self->notify.data_indication(instance, self, skb);
+		if (self->rx_max_sdu_size == SAR_DISABLE) {
+			irttp_do_data_indication(self, skb);
 			self->rx_sdu_size = 0;
-			
+
 			continue;
 		}
 
@@ -1103,43 +1178,47 @@
 			 *  limits of the maximum size of the rx_sdu
 			 */
 			if (self->rx_sdu_size <= self->rx_max_sdu_size) {
-				DEBUG(4, __FUNCTION__ 
-				       "(), queueing fragment\n");
-
+				DEBUG(4, __FUNCTION__ "(), queueing frag\n");
 				skb_queue_tail(&self->rx_fragments, skb);
 			} else {
-				DEBUG(1, __FUNCTION__ "(), Error!\n");
+				/* Free the part of the SDU that is too big */
+				dev_kfree_skb(skb);
 			}
-		} else {
-			/*
-			 *  This is the last fragment, so time to reassemble!
+			continue;
+		}
+		/*
+		 *  This is the last fragment, so time to reassemble!
+		 */
+		if ((self->rx_sdu_size <= self->rx_max_sdu_size) ||
+		    (self->rx_max_sdu_size == SAR_UNBOUND)) 
+		{
+			/* 
+			 * A little optimizing. Only queue the fragment if
+			 * there are other fragments. Since if this is the
+			 * last and only fragment, there is no need to
+			 * reassemble :-) 
 			 */
-			if (self->rx_sdu_size <= self->rx_max_sdu_size) {
-
-				/* A little optimizing. Only queue the 
-				 * fragment if there is other fragments. Since
-				 * if this is the last and only fragment, 
-				 * there is no need to reassemble 
-				 */
-				if (!skb_queue_empty(&self->rx_fragments)) {
-
-					DEBUG(4, __FUNCTION__ 
-					       "(), queueing fragment\n");
-					skb_queue_tail(&self->rx_fragments, 
-							skb);
-
-					skb = irttp_reassemble_skb(self);
-				}
-				self->notify.data_indication(instance, self, 
-							     skb);
-			} else {
-				DEBUG(1, __FUNCTION__ 
-				       "(), Truncated frame\n");
-				self->notify.data_indication(
-					self->notify.instance, self, skb);
+			if (!skb_queue_empty(&self->rx_fragments)) {
+				skb_queue_tail(&self->rx_fragments, 
+					       skb);
+				
+				skb = irttp_reassemble_skb(self);
 			}
-			self->rx_sdu_size = 0;
+			
+			/* Now we can deliver the reassembled skb */
+			irttp_do_data_indication(self, skb);
+		} else {
+			DEBUG(1, __FUNCTION__ "(), Truncated frame\n");
+			
+			/* Free the part of the SDU that is too big */
+			dev_kfree_skb(skb);
+
+			/* Deliver only the valid but truncated part of SDU */
+			skb = irttp_reassemble_skb(self);
+			
+			irttp_do_data_indication(self, skb);
 		}
+		self->rx_sdu_size = 0;
 	}
 	/* Reset lock */
 	self->rx_queue_lock = 0;
@@ -1194,6 +1273,11 @@
 	if (!skb)
 		return NULL;
 
+	/* 
+	 * Need to reserve space for TTP header in case this skb needs to 
+	 * be requeued in case delivery failes
+	 */
+	skb_reserve(skb, TTP_HEADER);
 	skb_put(skb, self->rx_sdu_size);
 
 	/*
@@ -1310,6 +1394,9 @@
 	if (self->disconnect_pend) {
 		/* Check if it's possible to disconnect yet */
 		if (skb_queue_empty(&self->tx_queue)) {
+			
+			/* Make sure disconnect is not pending anymore */
+			self->disconnect_pend = FALSE;
 			if (self->disconnect_skb) {
 				irttp_disconnect_request(
 					self, self->disconnect_skb, P_NORMAL);
diff -urN linux-2.2.6-pre2/net/irda/Makefile linux-2.2.6-pre3/net/irda/Makefile
--- linux-2.2.6-pre2/net/irda/Makefile	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/Makefile	2003-08-15 15:05:39.000000000 -0700
@@ -15,7 +15,8 @@
 O_TARGET := irda.o
 O_OBJS	 := iriap.o iriap_event.o irlmp.o irlmp_event.o irlmp_frame.o \
             irlap.o irlap_event.o irlap_frame.o timer.o qos.o irqueue.o \
-            irttp.o irda_device.o irias_object.o crc.o wrapper.o af_irda.o
+            irttp.o irda_device.o irias_object.o crc.o wrapper.o af_irda.o \
+	    discovery.o
 OX_OBJS := irmod.o
 
 MOD_LIST_NAME := IRDA_MODULES
@@ -54,15 +55,6 @@
   endif
 endif
 
-ifeq ($(CONFIG_IROBEX),y)
-SUB_DIRS += irobex
-O_OBJS += irobex/irobex.o
-else
-  ifeq ($(CONFIG_IROBEX),m)
-  MOD_SUB_DIRS += irobex
-  endif
-endif
-
 ifeq ($(CONFIG_IRDA_COMPRESSION),y)
 SUB_DIRS += compressors
 MOD_IN_SUB_DIRS += compressors
diff -urN linux-2.2.6-pre2/net/irda/wrapper.c linux-2.2.6-pre3/net/irda/wrapper.c
--- linux-2.2.6-pre2/net/irda/wrapper.c	1999-03-07 15:26:44.000000000 -0800
+++ linux-2.2.6-pre3/net/irda/wrapper.c	2003-08-15 15:05:39.000000000 -0700
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Aug  4 20:40:53 1997
- * Modified at:   Tue Feb 16 17:27:23 1999
+ * Modified at:   Fri Mar 26 21:52:53 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -60,10 +60,9 @@
 	fcs.value = INIT_FCS;
 	n = 0;
 
-	if ( skb->len > 2048) {
-		DEBUG( 0, __FUNCTION__ "Warning size=%d of sk_buff to big!\n", 
-		       (int) skb->len);
-
+	if (skb->len > 2048) {
+		DEBUG(0, __FUNCTION__ "Warning size=%d of sk_buff to big!\n", 
+		      (int) skb->len);
 		return 0;
 	}
 	
@@ -71,8 +70,13 @@
 	 *  Send  XBOF's for required min. turn time and for the negotiated
 	 *  additional XBOFS
 	 */
- 	xbofs = ((struct irlap_skb_cb *)(skb->cb))->xbofs;
-	for ( i=0; i<xbofs; i++) {
+	if (((struct irlap_skb_cb *)(skb->cb))->magic != LAP_MAGIC) {
+		DEBUG(1, __FUNCTION__ "(), wrong magic in skb!\n");
+		xbofs = 11;
+	} else
+		xbofs = ((struct irlap_skb_cb *)(skb->cb))->xbofs;
+
+	for (i=0; i<xbofs; i++) {
  		tx_buff[n++] = XBOF; 
  	}
 
@@ -80,7 +84,7 @@
 	tx_buff[n++] = BOF;
 
 	/* Insert frame and calc CRC */
-	for( i=0; i < skb->len; i++) {
+	for (i=0; i < skb->len; i++) {
 		byte = skb->data[i];
 		
 		/*
@@ -100,11 +104,11 @@
 	/* Insert CRC in little endian format (LSB first) */
 	fcs.value = ~fcs.value;
 #ifdef __LITTLE_ENDIAN
-	n += stuff_byte( fcs.bytes[0], tx_buff+n);
-	n += stuff_byte( fcs.bytes[1], tx_buff+n);
+	n += stuff_byte(fcs.bytes[0], tx_buff+n);
+	n += stuff_byte(fcs.bytes[1], tx_buff+n);
 #else ifdef __BIG_ENDIAN
-	n += stuff_byte( fcs.bytes[1], tx_buff+n);
-	n += stuff_byte( fcs.bytes[0], tx_buff+n);
+	n += stuff_byte(fcs.bytes[1], tx_buff+n);
+	n += stuff_byte(fcs.bytes[0], tx_buff+n);
 #endif
 	tx_buff[n++] = EOF;
 	
@@ -127,7 +131,7 @@
 		return;
 	}
 
-	/*  Align to 20 bytes */
+	/*  Align IP header to 20 bytes */
 	skb_reserve( skb, 1);
 	
 	ASSERT( len-2 > 0, return;);
diff -urN linux-2.2.6-pre2/net/netlink/af_netlink.c linux-2.2.6-pre3/net/netlink/af_netlink.c
--- linux-2.2.6-pre2/net/netlink/af_netlink.c	1999-03-25 09:23:34.000000000 -0800
+++ linux-2.2.6-pre3/net/netlink/af_netlink.c	2003-08-15 15:05:39.000000000 -0700
@@ -25,7 +25,6 @@
 #include <linux/un.h>
 #include <linux/fcntl.h>
 #include <linux/termios.h>
-#include <linux/socket.h>
 #include <linux/sockios.h>
 #include <linux/net.h>
 #include <linux/fs.h>
