diff -u --recursive --new-file v2.3.21/linux/Documentation/Changes linux/Documentation/Changes
--- v2.3.21/linux/Documentation/Changes	Mon Oct 11 15:38:14 1999
+++ linux/Documentation/Changes	Tue Oct 12 12:58:12 1999
@@ -2,15 +2,15 @@
 =====
 
 This document is designed to provide a list of the minimum levels of
-software necessary to run the 2.2 kernels, as well as provide brief
+software necessary to run the 2.3 kernels, as well as provide brief
 instructions regarding any other "Gotchas" users may encounter when
-trying life on the Bleeding Edge.  If upgrading from a pre-2.0.x
-kernel, please consult the Changes file included with 2.0.x kernels for
+trying life on the Bleeding Edge.  If upgrading from a pre-2.2.x
+kernel, please consult the Changes file included with 2.2.x kernels for
 additional information; most of that information will not be repeated
 here.  Basically, this document assumes that your system is already
-functional and running at least 2.0.x kernels.
+functional and running at least 2.2.x kernels.
 
-   It is originally based on my "Changes" file for 2.0.x kernels and
+   It is originally based on my "Changes" file for 2.2.x kernels and
 therefore owes credit to the same people as that file (Jared Mauch,
 Axel Boldt, Alessandro Sigala, and countless other users all over the
 'net).  Please feel free to submit changes, corrections, gripes,
@@ -43,7 +43,7 @@
 encountered a bug!  If you're unsure what version you're currently
 running, the suggested command should tell you.
 
-- Kernel modutils	 2.1.121                 ; insmod -V
+- Kernel modutils	 2.3.5                   ; insmod -V
 - Gnu C 		 2.7.2.3                 ; gcc --version
 - Binutils		 2.8.1.0.23              ; ld -v
 - Linux libc5 C Library	 5.4.46                  ; ls -l /lib/libc*
@@ -168,7 +168,7 @@
 =======
 
    You need to upgrade to the latest version of modutils for the Linux
-2.2 kernel.  This version will also work with your 2.0 kernel.
+2.3 kernel.  This version will also work with your 2.0 kernel.
 
    As of 2.1.90-pre1, kerneld has been replaced by a kernel thread,
 kmod.  See Documentation/kmod.txt for more information.  The main
@@ -567,8 +567,8 @@
 Modules utilities
 =================
 
-The 2.1.121 release:
-ftp://ftp.kernel.org/pub/linux/kernel/v2.1/modutils-2.1.121.tar.gz
+The 2.3.5 release:
+ftp://ftp.ocs.com.au/pub/modutils/v2.3/modutils-2.3.5.tar.gz
 
 Procps utilities
 ================
diff -u --recursive --new-file v2.3.21/linux/Documentation/Configure.help linux/Documentation/Configure.help
--- v2.3.21/linux/Documentation/Configure.help	Mon Oct 11 15:38:14 1999
+++ linux/Documentation/Configure.help	Fri Oct 15 11:49:37 1999
@@ -80,9 +80,13 @@
   MAINTAINERS, REPORTING_BUGS, Documentation/BUG-HUNTING, and
   Documentation/oops-tracing.txt in the kernel source). 
 
+  This option will also make obsoleted drivers available. These are
+  drivers that have been replaced by something else, and/or are
+  scheduled to be removed in a future kernel release.
+
   Unless you intend to help test and develop a feature or driver that
   falls into this category, or you have a situation that requires
-  using these features you should probably say N here, which will
+  using these features, you should probably say N here, which will
   cause this configure script to present you with fewer choices. If
   you say Y here, you will be offered the choice of using features or
   drivers that are currently considered to be in the alpha-test phase.
@@ -137,7 +141,7 @@
   More information about the internals of the Linux math coprocessor
   emulation can be found in arch/i386/math-emu/README.
 
-  If you are not sure, say Y; apart from resulting in a 45 KB bigger
+  If you are not sure, say Y; apart from resulting in a 66 KB bigger
   kernel, it won't hurt.
 
 Timer and CPU usage LEDs
@@ -165,7 +169,7 @@
   time indication of CPU usage, by lighting whenever the idle task
   is not currently executing.
 
-Kernel FP software completion
+Kernel FP software completion (EXPERIMENTAL)
 CONFIG_MATHEMU
   This option is required for IEEE compliant floating point arithmetic
   on the Alpha. The only time you would ever not say Y is to say M in
@@ -1321,7 +1325,7 @@
   the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
   http://lena.fnet.fr/ .
 
-Support for Algorithmics P4032
+Support for Algorithmics P4032 (EXPERIMENTAL)
 CONFIG_ALGOR_P4032
   This is an evaluation board of the British company Algorithmics. The
   board uses the R4300 and a R5230 CPUs. For more information about
@@ -1641,7 +1645,7 @@
   If you want to use your SGI's built-in serial ports under Linux,
   answer Y.
 
-SGI Newport Graphics support
+SGI Newport Graphics support (EXPERIMENTAL)
 CONFIG_SGI_NEWPORT_GFX
   If you have an SGI machine and you want to compile the graphics
   drivers, say Y here. This will include the code for the
@@ -1835,7 +1839,7 @@
   section 6.4 of the Linux Programmer's Guide, available from
   http://metalab.unc.edu/mdw/linux.html#guide .
 
-  Saying Y here enlarges your kernel by about 7 KB. Just say Y.
+  Saying Y here enlarges your kernel by about 18 KB. Just say Y.
 
 BSD Process Accounting
 CONFIG_BSD_PROCESS_ACCT
@@ -1869,7 +1873,7 @@
   ELF (Executable and Linkable Format) is a format for libraries and
   executables used across different architectures and operating
   systems. Saying Y here will enable your kernel to run ELF binaries
-  and enlarge it by about 2 KB. ELF support under Linux has now all
+  and enlarge it by about 13 KB. ELF support under Linux has now all
   but replaced the traditional Linux a.out formats (QMAGIC and ZMAGIC)
   because it is portable (this does *not* mean that you will be able
   to run executables from different architectures or operating systems
@@ -1950,7 +1954,7 @@
   you have use for it; the module is called binfmt_misc.o. If you
   don't know what to answer at this point, say Y.
 
-Solaris binary emulation
+Solaris binary emulation (EXPERIMENTAL)
 CONFIG_SOLARIS_EMUL
   This is experimental code which will enable you to run (many)
   Solaris binaries on your SPARC Linux machine. 
@@ -2108,7 +2112,7 @@
   you have a Retina Z3 or plan to get one before you next recompile
   the kernel.
 
-Cirrus Logic support (EXPERIMENTAL)
+Cirrus Logic generic driver (EXPERIMENTAL)
 CONFIG_FB_CLGEN
   This enables support for Cirrus Logic GD542x/543x based boards on
   Amiga: SD64, Piccolo, Picasso II/II+, Picasso IV, or EGS Spectrum.
@@ -2579,7 +2583,7 @@
 CONFIG_INET
   These are the protocols used on the Internet and on most local
   Ethernets. It is highly recommended to say Y here (this will enlarge
-  your kernel by about 35 KB), since some programs (e.g. the X window
+  your kernel by about 144 KB), since some programs (e.g. the X window
   system) use TCP/IP even if your machine is not connected to any
   other computer. You will get the so-called loopback device which
   allows you to ping yourself (great fun, that!).
@@ -2934,7 +2938,7 @@
 
   Say Y unless you know what you are doing.
 
-The IPv6 protocol
+The IPv6 protocol (EXPERIMENTAL)
 CONFIG_IPV6
   This is experimental support for the next version of the Internet
   Protocol: IP version 6 (also called IPng "IP next generation").
@@ -3006,7 +3010,7 @@
   General information about how to connect Linux, Windows machines and
   Macs is on the WWW at http://www.eats.com/linux_mac_win.html .
 
-  The IPX driver would enlarge your kernel by about 5 kB. This driver
+  The IPX driver would enlarge your kernel by about 16 KB. This driver
   is also available as a module ( = code which can be inserted in and
   removed from the running kernel whenever you want). The module will
   be called ipx.o. If you want to compile it as a module, say M here
@@ -4211,6 +4215,15 @@
   does not work correctly without modification please contact the
   author by email at ipslinux@us.ibm.com.
 
+IBM ServeRAID Support
+CONFIG_SCSI_IPS
+  This is support for the IBM ServeRAID hardware RAID controllers.
+  Consult the SCSI-HOWTO, available via anonymous FTP from
+  ftp://metalab.unc.edu/pub/Linux/docs/HOWTO, and the file
+  README.ips in drivers/scsi for more information.  If this driver
+  does not work correctly without modification please contact the
+  author by email at ipslinux@us.ibm.com.
+
 BusLogic SCSI support
 CONFIG_SCSI_BUSLOGIC
   This is support for BusLogic MultiMaster and FlashPoint SCSI Host
@@ -5970,6 +5983,18 @@
   whenever you want). If you want to compile it as a module, say M
   here and read Documentation/modules.txt.
   
+SBNI Leased Line Adapters
+CONFIG_SBNI
+  This is a driver for ISA SBNI12-xx cards that is a low cost
+  alternative to leased line modems. Say Y if you want to insert
+  driver into kernel or say M to compile driver as a module. 
+  
+  You can find more information and last versions of drivers and 
+  utilities at http://www.granch.ru. If you have any question you
+  can mail to sbni@granch.ru.
+  
+  Say N if unsure.
+  
 WAN Drivers
 CONFIG_WAN_DRIVERS
   Say Y to this option if your Linux box contains a WAN card and you
@@ -6203,6 +6228,18 @@
   module, say M here and read Documentation/modules.txt as well as
   Documentation/networking/net-modules.txt.
 
+PCI DM9102 support
+CONFIG_DM9102
+  This driver is for DM9102 compatible PCI cards from Davicom 
+  (http://www.davicom.com.tw) 
+  If you have a PCI DM9102 network (Ethernet) card, say Y.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called dmfe.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt as well as
+  Documentation/networking/net-modules.txt.
+
 Racal-Interlan (Micom) NI cards
 CONFIG_NET_VENDOR_RACAL
   If you have a network (Ethernet) card belonging to this class, such
@@ -6398,7 +6435,7 @@
   Documentation/networking/net-modules.txt. The module will be called
   3c505.o.
 
-3c507 support
+3c507 support (EXPERIMENTAL)
 CONFIG_EL16
   If you have a network (Ethernet) card of this type, say Y and read
   the Ethernet-HOWTO, available from
@@ -7111,19 +7148,21 @@
   Linux Token Ring Project site for the latest information at
   http://www.linuxtr.net
 
-SysKonnect adapter support
-CONFIG_SKTR
-  This is support for all SysKonnect Token Ring cards, specifically
-  SysKonnect TR4/16(+) ISA (SK-4190), SysKonnect TR4/16(+) PCI
-  (SK-4590), SysKonnect TR4/16 PCI (SK-4591) adapters.
+Generic TMS380 Token Ring ISA/PCI adapter support
+CONFIG_TMS380TR
+  This driver provides generic support for token ring adapters
+  based on the Texas Instruments TMS380 series chipsets.  This
+  includes the SysKonnect TR4/16(+) ISA (SK-4190), SysKonnect
+  TR4/16(+) PCI (SK-4590), SysKonnect TR4/16 PCI (SK-4591),
+  Compaq 4/16 PCI, Thomas-Conrad TC4048 4/16 PCI, and Intel 
+  TokenExpress 4/16 and PRO ISA adapters.
 
   If you have such an adapter and would like to use it, say Y or M and
   read the Token-Ring mini-HOWTO, available from
   http://metalab.unc.edu/mdw/linux.html#howto .
 
   Also read the file linux/Documentation/networking/sktr.txt or check
-  the Linux-SNA WWW site for the latest information at
-  http://www.linux-sna.org .
+  http://www.auk.cx/tms380tr/
 
 Traffic Shaper (EXPERIMENTAL)
 CONFIG_SHAPER
@@ -7795,7 +7834,7 @@
   listen to audio CDs and watch its LEDs, say Y (and read
   Documentation/filesystems/isofs.txt and the CDROM-HOWTO, available
   from http://metalab.unc.edu/mdw/linux.html#howto ), thereby
-  enlarging your kernel by about 27 kB; otherwise say N.
+  enlarging your kernel by about 27 KB; otherwise say N.
 
   If you want to compile this as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want),
@@ -7854,7 +7893,7 @@
   It is now also becoming possible to read and write compressed FAT
   filesystems; read Documentation/filesystems/fat_cvf.txt for details.
   
-  The FAT support will enlarge your kernel by about 24 kB. If unsure,
+  The FAT support will enlarge your kernel by about 37 KB. If unsure,
   say Y.
 
   If you want to compile this as a module however ( = code which can
@@ -7889,7 +7928,7 @@
   support" below), or you will not be able to see the long filenames
   generated by Windows 95 / Windows NT.
 
-  This option will enlarge your kernel by about 7 kB. If unsure,
+  This option will enlarge your kernel by about 7 KB. If unsure,
   answer Y. This will only work if you said Y to "fat fs support" as
   well. If you want to compile this as a module however ( = code which
   can be inserted in and removed from the running kernel whenever you
@@ -7907,7 +7946,7 @@
   want to run Linux from within a DOS partition (i.e. say Y to
   "umsdos: Unix like fs on top of std MSDOS fs", below).
 
-  The VFAT support enlarges your kernel by about 10 kB and it only
+  The VFAT support enlarges your kernel by about 10 KB and it only
   works if you said Y to the "fat fs support" above. Please read the
   file Documentation/filesystems/vfat.txt for details. If unsure, 
   say Y.
@@ -7931,7 +7970,7 @@
   MSDOS floppies. You will need a program called umssync in order to
   make use of umsdos; read Documentation/filesystems/umsdos.txt. 
 
-  This option enlarges your kernel by about 25 kB and it only works if
+  This option enlarges your kernel by about 28 KB and it only works if
   you said Y to both "fat fs support" and "msdos fs support" above. If
   you want to compile this as a module ( = code which can be inserted
   in and removed from the running kernel whenever you want), say M
@@ -7980,7 +8019,7 @@
   the Coda filesystem; see "Coda filesystem support" below.
 
   If you say Y here, you should have said Y to TCP/IP networking also.
-  This option would enlarge your kernel by about 27 kB. 
+  This option would enlarge your kernel by about 27 KB. 
 
   This filesystem is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -12581,8 +12620,7 @@
   Saying Y to this adds support for /dev/parport device nodes.  This
   is needed for programs that want portable access to the parallel
   port, for instance deviceid (which displays Plug-and-Play device
-  IDs) and vlp (which makes a Linux computer act as though it's a
-  printer).
+  IDs).
 
   This is the parallel port equivalent of SCSI generic support (sg).
   It is safe to say N to this -- it is not needed for normal printing
diff -u --recursive --new-file v2.3.21/linux/Documentation/SMP.txt linux/Documentation/SMP.txt
--- v2.3.21/linux/Documentation/SMP.txt	Thu Jul  1 10:45:57 1999
+++ linux/Documentation/SMP.txt	Wed Dec 31 16:00:00 1969
@@ -1,20 +0,0 @@
-SMP on x86/Linux is now an official feature and is not experimental.
-Experimental SMP support for other architectures is underway.
-
-Please view linux/Documentation/smp.txt for more information about enabling SMP.
-
-SMP support for Linux with up to 16 processors using the Intel MP
-specification. 
-
-To fix:
-
-o	Clean up processor specific/independent split.
-o	Document it all.	[PARTLY DONE]
-o	Halting other CPUs on reset or panic doesn't always work.
-o	Don't waste page at 4 K--don't need it now (watch the GDT code).
-o	Dump bootup pages once booted somehow.
-o	Clean up warnings/volatiles.
-o	486 startup code.
-o	How to handle mixed FPU/non FPU processors.
-o	Test IO-APIC on various hardware.
-o	Separate IO-APIC from SMP.
diff -u --recursive --new-file v2.3.21/linux/Documentation/filesystems/proc.txt linux/Documentation/filesystems/proc.txt
--- v2.3.21/linux/Documentation/filesystems/proc.txt	Mon Oct  4 15:49:29 1999
+++ linux/Documentation/filesystems/proc.txt	Thu Oct 14 14:22:08 1999
@@ -1,1379 +1,1714 @@
+------------------------------------------------------------------------------
+                       T H E  /proc   F I L E S Y S T E M
+------------------------------------------------------------------------------
+/proc/sys         Terrehon Bowden <terrehon@pacbell.net>        October 7 1999
+                  Bodo Bauer <bb@ricochet.net>
+------------------------------------------------------------------------------
+Version 1.2                                              Kernel version 2.2.12
+------------------------------------------------------------------------------
+
+Table of Contents
+-----------------
+
+  0     Preface
+  0.1	Introduction/Credits
+  0.2	Legal Stuff
+
+  1	Collecting System Information
+  1.1	Process-Specific Subdirectories
+  1.2	Kernel data
+  1.3	IDE devices in /proc/ide
+  1.4	Networking info in /proc/net
+  1.5	SCSI info
+  1.6	Parallel port info in /proc/parport
+  1.7	TTY info in /proc/tty
+
+  2	Modifying System Parameters
+  2.1	/proc/sys/fs - File system data
+  2.2	/proc/sys/fs/binfmt_misc - Miscellaneous binary formats
+  2.3	/proc/sys/kernel - general kernel parameters
+  2.4	/proc/sys/vm - The virtual memory subsystem
+  2.5	/proc/sys/dev - Device specific parameters
+  2.6	/proc/sys/sunrpc - Remote procedure calls
+  2.7	/proc/sys/net - Networking stuff
+  2.8	/proc/sys/net/ipv4 - IPV4 settings
+  2.9	Appletalk
+  2.10	IPX
+
+------------------------------------------------------------------------------
+Preface
+------------------------------------------------------------------------------
+
+0.1 Introduction/Credits
+------------------------
+
+This documentation  is  part  of a soon (or so we hope) to be released book on
+the SuSE  Linux  distribution.  As  there is no complete documentation for the
+/proc file  system and we've used many freely available sources to write these
+chapters, it  seems  only  fair  to give the work back to the Linux community.
+This work is based on the 2.2.* kernel version. I'm afraid it's still far from
+complete, but  we  hope  it will be useful. As far as we know, it is the first
+'all-in-one' document  about the /proc file system. It is focused on the Intel
+x86 hardware,  so if you are looking for PPC, ARM, SPARC, APX, etc., features,
+you probably  won't  find  what  you are looking for. It also only covers IPv4
+networking, not  IPv6  nor  other protocols - sorry. But additions and patches
+are welcome and will be added to this document if you mail them to Bodo.
+
+We'd like  to  thank Alan Cox, Rik van Riel, and Alexey Kuznetsov and a lot of
+other people for help compiling this documentation. We'd also like to extend a
+special thank  you to Andi Kleen for documentation, which we relied on heavily
+to create  this  document,  as well as the additional information he provided.
+Thanks to  everybody  else  who contributed source or docs to the Linux kernel
+and helped create a great piece of software... :)
+
+If you  have  any comments, corrections or additions, please don't hesitate to
+contact Bodo  Bauer  at  bb@ricochet.net.  We'll  be happy to add them to this
+document.
+
+The latest  version  of  this  document  is  available  online  at
+http://skaro.nightcrawler.com/~bb/Docs/Proc as HTML version.
+
+0.2 Legal Stuff
+---------------
+
+We don't  guarantee  the  correctness  of this document, and if you come to us
+complaining about  how  you  screwed  up  your  system  because  of  incorrect
+documentation, we won't feel responsible...
+
+------------------------------------------------------------------------------
+CHAPTER 1: COLLECTING SYSTEM INFORMATION
+------------------------------------------------------------------------------
+
+------------------------------------------------------------------------------
+In This Chapter
+------------------------------------------------------------------------------
+* Investigating  the  properties  of  the  pseudo  file  system  /proc and its
+  ability to provide information on the running Linux system
+* Examining /proc's structure
+* Uncovering  various  information  about the kernel and the processes running
+  on the system
+------------------------------------------------------------------------------
+
+
+The proc  file  system acts as an interface to internal data structures in the
+kernel. It  can  be  used to obtain information about the system and to change
+certain kernel parameters at runtime.
+
+First, we'll  take  a  look  at the read-only parts of /proc. In Chapter 2, we
+show you how you can use /proc/sys to change settings.
+
+1.1 Process-Specific Subdirectories
+-----------------------------------
+
+The directory  /proc  contains  (among other things) one subdirectory for each
+process running on the system, which is named after the process ID (PID).
+
+The link  self  points  to  the  process reading the file system. Each process
+subdirectory has the entries listed in Table 1-1.
+
+
+Table 1-1: Process specific entries in /proc 
+..............................................................................
+ File    Content                                        
+ cmdline Command line arguments                         
+ environ Values of environment variables                
+ fd      Directory, which contains all file descriptors 
+ mem     Memory held by this process                    
+ stat    Process status                                 
+ status  Process status in human readable form          
+ cwd     Link to the current working directory          
+ exe     Link to the executable of this process         
+ maps    Memory maps                                    
+ root    Link to the root directory of this process     
+ statm   Process memory status information              
+..............................................................................
+
+For example, to get the status information of a process, all you have to do is
+read the file /proc/PID/status:
+
+  >cat /proc/self/status 
+  Name:   cat 
+  State:  R (running) 
+  Pid:    5452 
+  PPid:   743 
+  Uid:    501     501     501     501 
+  Gid:    100     100     100     100 
+  Groups: 100 14 16 
+  VmSize:     1112 kB 
+  VmLck:         0 kB 
+  VmRSS:       348 kB 
+  VmData:       24 kB 
+  VmStk:        12 kB 
+  VmExe:         8 kB 
+  VmLib:      1044 kB 
+  SigPnd: 0000000000000000 
+  SigBlk: 0000000000000000 
+  SigIgn: 0000000000000000 
+  SigCgt: 0000000000000000 
+  CapInh: 00000000fffffeff 
+  CapPrm: 0000000000000000 
+  CapEff: 0000000000000000 
+
+
+This shows you nearly the same information you would get if you viewed it with
+the ps  command.  In  fact,  ps  uses  the  proc  file  system  to  obtain its
+information. The  statm  file  contains  more  detailed  information about the
+process memory usage. Its seven fields are explained in Table 1-2.
+
+
+Table 1-2: Contents of the statm files 
+..............................................................................
+ File     Content                         
+ size     total program size              
+ resident size of memory portions         
+ shared   number of pages that are shared 
+ trs      number of pages that are 'code' 
+ drs      number of pages of data/stack   
+ lrs      number of pages of library      
+ dt       number of dirty pages           
+..............................................................................
+
+1.2 Kernel data
+---------------
+
+Similar to  the  process entries, the kernel data files give information about
+the running kernel. The files used to obtain this information are contained in
+/proc and  are  listed  in Table 1-3. Not all of these will be present in your
+system. It  depends  on the kernel configuration and the loaded modules, which
+files are there, and which are missing.
+
+Table 1-3: Kernel info in /proc 
+..............................................................................
+ File        Content                                           
+ apm         Advanced power management info                    
+ bus         Directory containing bus specific information     
+ cmdline     Kernel command line                               
+ cpuinfo     Info about the CPU                                
+ devices     Available devices (block and character)           
+ dma         Used DMS channels                                 
+ filesystems Supported filesystems                             
+ ide         Directory containing info about the IDE subsystem 
+ interrupts  Interrupt usage                                   
+ ioports     I/O port usage                                    
+ kcore       Kernel core image                                 
+ kmsg        Kernel messages                                   
+ ksyms       Kernel symbol table                               
+ loadavg     Load average                                      
+ locks       Kernel locks                                      
+ meminfo     Memory info                                       
+ misc        Miscellaneous                                     
+ modules     List of loaded modules                            
+ mounts      Mounted filesystems                               
+ net         Networking info (see text)                        
+ partitions  Table of partitions known to the system           
+ rtc         Real time clock                                   
+ scsi        SCSI info (see text)                              
+ slabinfo    Slab pool info                                    
+ stat        Overall statistics                                
+ swaps       Swap space utilization                            
+ sys         See chapter 2                                     
+ uptime      System uptime                                     
+ version     Kernel version                                    
+..............................................................................
+
+You can,  for  example,  check  which interrupts are currently in use and what
+they are used for by looking in the file /proc/interrupts:
+
+  > cat /proc/interrupts 
+             CPU0        
+    0:    8728810          XT-PIC  timer 
+    1:        895          XT-PIC  keyboard 
+    2:          0          XT-PIC  cascade 
+    3:     531695          XT-PIC  aha152x 
+    4:    2014133          XT-PIC  serial 
+    5:      44401          XT-PIC  pcnet_cs 
+    8:          2          XT-PIC  rtc 
+   11:          8          XT-PIC  i82365 
+   12:     182918          XT-PIC  PS/2 Mouse 
+   13:          1          XT-PIC  fpu 
+   14:    1232265          XT-PIC  ide0 
+   15:          7          XT-PIC  ide1 
+  NMI:          0 
+
+
+There are  three  more  important subdirectories in /proc: net, scsi, and sys.
+The general  rule  is  that  the  contents,  or  even  the  existence of these
+directories, depend  on your kernel configuration. If SCSI is not enabled, the
+directory scsi  may  not  exist. The same is true with the net, which is there
+only when networking support is present in the running kernel.
+
+The slabinfo  file  gives  information  about  memory usage at the slab level.
+Linux uses  slab  pools for memory management above page level in version 2.2.
+Commonly used  objects  have  their  own  slab  pool (such as network buffers,
+directory cache, and so on).
+
+1.3 IDE devices in /proc/ide
+----------------------------
+
+The subdirectory /proc/ide contains information about all IDE devices of which
+the kernel  is  aware.  There is one subdirectory for each IDE controller, the
+file drivers  and a link for each IDE device, pointing to the device directory
+in the controller specific subtree.
+
+The file  drivers  contains general information about the drivers used for the
+IDE devices:
+
+  > cat /proc/ide/drivers 
+  ide-cdrom version 4.53 
+  ide-disk version 1.08 
+
+
+More detailed  information  can  be  found  in  the  controller  specific
+subdirectories. These  are  named  ide0,  ide1  and  so  on.  Each  of  these
+directories contains the files shown in table 1-4.
+
+
+Table 1-4: IDE controller info in  /proc/ide/ide? 
+..............................................................................
+ File    Content                                 
+ channel IDE channel (0 or 1)                    
+ config  Configuration (only for PCI/IDE bridge) 
+ mate    Mate name                               
+ model   Type/Chipset of IDE controller          
+..............................................................................
+
+Each device  connected  to  a  controller  has  a separate subdirectory in the
+controllers directory.  The  files  listed in table 1-5 are contained in these
+directories.
+
+
+Table 1-5: IDE device information 
+..............................................................................
+ File             Content                                    
+ cache            The cache                                  
+ capacity         Capacity of the medium (in 512Byte blocks) 
+ driver           driver and version                         
+ geometry         physical and logical geometry              
+ identify         device identify block                      
+ media            media type                                 
+ model            device identifier                          
+ settings         device setup                               
+ smart_thresholds IDE disk management thresholds             
+ smart_values     IDE disk management values                 
+..............................................................................
+
+The most  interesting  file is settings. This file contains a nice overview of
+the drive parameters:
+
+  # cat /proc/ide/ide0/hda/settings 
+  name                    value           min             max             mode 
+  ----                    -----           ---             ---             ---- 
+  bios_cyl                526             0               65535           rw 
+  bios_head               255             0               255             rw 
+  bios_sect               63              0               63              rw 
+  breada_readahead        4               0               127             rw 
+  bswap                   0               0               1               r 
+  file_readahead          72              0               2097151         rw 
+  io_32bit                0               0               3               rw 
+  keepsettings            0               0               1               rw 
+  max_kb_per_request      122             1               127             rw 
+  multcount               0               0               8               rw 
+  nice1                   1               0               1               rw 
+  nowerr                  0               0               1               rw 
+  pio_mode                write-only      0               255             w 
+  slow                    0               0               1               rw 
+  unmaskirq               0               0               1               rw 
+  using_dma               0               0               1               rw 
+
+
+1.4 Networking info in /proc/net
+--------------------------------
+
+The subdirectory  /proc/net  follows  the  usual  pattern. Table 1-6 shows the
+additional values  you  get  for  IP  version 6 if you configure the kernel to
+support this. Table 1-7 lists the files and their meaning.
+
+
+Table 1-6: IPv6 info in /proc/net 
+..............................................................................
+ File       Content                                               
+ udp6       UDP sockets (IPv6)                                    
+ tcp6       TCP sockets (IPv6)                                    
+ raw6       Raw device statistics (IPv6)                          
+ igmp6      IP multicast addresses, which this host joined (IPv6) 
+ if_inet6   List of IPv6 interface addresses                      
+ ipv6_route Kernel routing table for IPv6                         
+ rt6_stats  Global IPv6 routing tables statistics                 
+ sockstat6  Socket statistics (IPv6)                              
+ snmp6      Snmp data (IPv6)                                      
+..............................................................................
+
+
+Table 1-7: Network info in /proc/net 
+..............................................................................
+ File          Content                                                         
+ arp           Kernel  ARP table                                               
+ dev           network devices with statistics                                 
+ dev_mcast     the Layer2 multicast groups a device is listening too
+               (interface index, label, number of references, number of bound
+               addresses). 
+ dev_stat      network device status                                           
+ ip_fwchains   Firewall chain linkage                                          
+ ip_fwnames    Firewall chain names                                            
+ ip_masq       Directory containing the masquerading tables                    
+ ip_masquerade Major masquerading table                                        
+ netstat       Network statistics                                              
+ raw           raw device statistics                                           
+ route         Kernel routing table                                            
+ rpc           Directory containing rpc info                                   
+ rt_cache      Routing cache                                                   
+ snmp          SNMP data                                                       
+ sockstat      Socket statistics                                               
+ tcp           TCP  sockets                                                    
+ tr_rif        Token ring RIF routing table                                    
+ udp           UDP sockets                                                     
+ unix          UNIX domain sockets                                             
+ wireless      Wireless interface data (Wavelan etc)                           
+ igmp          IP multicast addresses, which this host joined                  
+ psched        Global packet scheduler parameters.                             
+ netlink       List of PF_NETLINK sockets                                      
+ ip_mr_vifs    List of multicast virtual interfaces                            
+ ip_mr_cache   List of multicast routing cache                                 
+..............................................................................
+
+You can  use  this  information  to see which network devices are available in
+your system and how much traffic was routed over those devices:
+
+  > cat /proc/net/dev 
+  Inter-|Receive                                                   |[... 
+   face |bytes    packets errs drop fifo frame compressed multicast|[... 
+      lo:  908188   5596     0    0    0     0          0         0 [...         
+    ppp0:15475140  20721   410    0    0   410          0         0 [...  
+    eth0:  614530   7085     0    0    0     0          0         1 [... 
+   
+  ...] Transmit 
+  ...] bytes    packets errs drop fifo colls carrier compressed 
+  ...]  908188     5596    0    0    0     0       0          0 
+  ...] 1375103    17405    0    0    0     0       0          0 
+  ...] 1703981     5535    0    0    0     3       0          0 
+
+
+1.5 SCSI info
+-------------
+
+If you  have  a  SCSI  host adapter in your system, you'll find a subdirectory
+named after  the driver for this adapter in /proc/scsi. You'll also see a list
+of all recognized SCSI devices in /proc/scsi:
+
+  >cat /proc/scsi/scsi 
+  Attached devices: 
+  Host: scsi0 Channel: 00 Id: 00 Lun: 00 
+    Vendor: IBM      Model: DGHS09U          Rev: 03E0 
+    Type:   Direct-Access                    ANSI SCSI revision: 03 
+  Host: scsi0 Channel: 00 Id: 06 Lun: 00 
+    Vendor: PIONEER  Model: CD-ROM DR-U06S   Rev: 1.04 
+    Type:   CD-ROM                           ANSI SCSI revision: 02 
+
+
+The directory  named  after  the driver has one file for each adapter found in
+the system.  These  files  contain information about the controller, including
+the used  IRQ  and  the  IO  address range. The amount of information shown is
+dependent on  the adapter you use. The example shows the output for an Adaptec
+AHA-2940 SCSI adapter:
+
+  > cat /proc/scsi/aic7xxx/0 
+   
+  Adaptec AIC7xxx driver version: 5.1.19/3.2.4 
+  Compile Options: 
+    TCQ Enabled By Default : Disabled 
+    AIC7XXX_PROC_STATS     : Disabled 
+    AIC7XXX_RESET_DELAY    : 5 
+  Adapter Configuration: 
+             SCSI Adapter: Adaptec AHA-294X Ultra SCSI host adapter 
+                             Ultra Wide Controller 
+      PCI MMAPed I/O Base: 0xeb001000 
+   Adapter SEEPROM Config: SEEPROM found and used. 
+        Adaptec SCSI BIOS: Enabled 
+                      IRQ: 10 
+                     SCBs: Active 0, Max Active 2, 
+                           Allocated 15, HW 16, Page 255 
+               Interrupts: 160328 
+        BIOS Control Word: 0x18b6 
+     Adapter Control Word: 0x005b 
+     Extended Translation: Enabled 
+  Disconnect Enable Flags: 0xffff 
+       Ultra Enable Flags: 0x0001 
+   Tag Queue Enable Flags: 0x0000 
+  Ordered Queue Tag Flags: 0x0000 
+  Default Tag Queue Depth: 8 
+      Tagged Queue By Device array for aic7xxx host instance 0: 
+        {255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255} 
+      Actual queue depth per device for aic7xxx host instance 0: 
+        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} 
+  Statistics: 
+  (scsi0:0:0:0) 
+    Device using Wide/Sync transfers at 40.0 MByte/sec, offset 8 
+    Transinfo settings: current(12/8/1/0), goal(12/8/1/0), user(12/15/1/0) 
+    Total transfers 160151 (74577 reads and 85574 writes) 
+  (scsi0:0:6:0) 
+    Device using Narrow/Sync transfers at 5.0 MByte/sec, offset 15 
+    Transinfo settings: current(50/15/0/0), goal(50/15/0/0), user(50/15/0/0) 
+    Total transfers 0 (0 reads and 0 writes) 
+
+
+1.6 Parallel port info in /proc/parport
+---------------------------------------
+
+The directory  /proc/parport  contains information about the parallel ports of
+your system.  It  has  one  subdirectory  for  each port, named after the port
+number (0,1,2,...).
+
+These directories contain the four files shown in Table 1-8.
+
+
+Table 1-8: Files in /proc/parport 
+..............................................................................
+ File      Content                                                             
+ autoprobe Any IEEE-1284 device ID information that has been acquired.         
+ devices   list of the device drivers using that port. A + will appear by the
+           name of the device currently using the port (it might not appear
+           against any). 
+ hardware  Parallel port's base address, IRQ line and DMA channel.             
+ irq       IRQ that parport is using for that port. This is in a separate
+           file to allow you to alter it by writing a new value in (IRQ
+           number or none). 
+..............................................................................
+
+1.7 TTY info in /proc/tty
+-------------------------
+
+Information about  the  available  and actually used tty's can be found in the
+directory /proc/tty.You'll  find  entries  for drivers and line disciplines in
+this directory, as shown in Table 1-9.
+
+
+Table 1-9: Files in /proc/tty 
+..............................................................................
+ File          Content                                        
+ drivers       list of drivers and their usage                
+ ldiscs        registered line disciplines                    
+ driver/serial usage statistic and status of single tty lines 
+..............................................................................
+
+To see  which  tty's  are  currently in use, you can simply look into the file
+/proc/tty/drivers:
+
+  > cat /proc/tty/drivers 
+  pty_slave            /dev/pts      136   0-255 pty:slave 
+  pty_master           /dev/ptm      128   0-255 pty:master 
+  pty_slave            /dev/ttyp       3   0-255 pty:slave 
+  pty_master           /dev/pty        2   0-255 pty:master 
+  serial               /dev/cua        5   64-67 serial:callout 
+  serial               /dev/ttyS       4   64-67 serial 
+  /dev/tty0            /dev/tty0       4       0 system:vtmaster 
+  /dev/ptmx            /dev/ptmx       5       2 system 
+  /dev/console         /dev/console    5       1 system:console 
+  /dev/tty             /dev/tty        5       0 system:/dev/tty 
+  unknown              /dev/tty        4    1-63 console 
+
+
+------------------------------------------------------------------------------
+Summary
+------------------------------------------------------------------------------
+The /proc file system serves information about the running system. It not only
+allows access to process data but also allows you to request the kernel status
+by reading files in the hierarchy.
+
+The directory  structure  of /proc reflects the types of information and makes
+it easy, if not obvious, where to look for specific data.
+------------------------------------------------------------------------------
+
+------------------------------------------------------------------------------
+CHAPTER 2: MODIFYING SYSTEM PARAMETERS
+------------------------------------------------------------------------------
+
+------------------------------------------------------------------------------
+In This Chapter
+------------------------------------------------------------------------------
+* Modifying kernel parameters by writing into files found in /proc/sys
+* Exploring the files which modify certain parameters
+* Review of the /proc/sys file tree
+------------------------------------------------------------------------------
+
+
+A very  interesting part of /proc is the directory /proc/sys. This is not only
+a source  of  information,  it also allows you to change parameters within the
+kernel. Be  very  careful  when attempting this. You can optimize your system,
+but you  can  also  cause  it  to  crash.  Never  alter kernel parameters on a
+production system.  Set  up  a  development machine and test to make sure that
+everything works  the  way  you want it to. You may have no alternative but to
+reboot the machine once an error has been made.
+
+To change  a  value,  simply  echo  the new value into the file. An example is
+given below  in the section on the file system data. You need to be root to do
+this. You  can  create  your  own  boot script to perform this every time your
+system boots.
+
+The files  in /proc/sys can be used to fine tune and monitor miscellaneous and
+general things  in  the operation of the Linux kernel. Since some of the files
+can inadvertently  disrupt  your  system,  it  is  advisable  to  read  both
+documentation and  source  before actually making adjustments. In any case, be
+very careful  when  writing  to  any  of these files. The entries in /proc may
+change slightly between the 2.1.* and the 2.2 kernel, so if there is any doubt
+review the kernel documentation in the directory /usr/src/linux/Documentation.
+This chapter  is  heavily  based  on the documentation included in the pre 2.2
+kernels, and became part of it in version 2.2.1 of the Linux kernel.
 
------------------------------------------------------------------------
+2.1 /proc/sys/fs - File system data
+-----------------------------------
 
-                T H E  /proc   F I L E S Y S T E M
-
------------------------------------------------------------------------
-/proc/sys      Terrehon Bowden <terrehon@wpi.com>       January 27 1999
-               Bodo Bauer <bb@ricochet.net>                
------------------------------------------------------------------------
-Version 1.1                                         Kernel version 2.2
------------------------------------------------------------------------
-Contents
-
-1   Introduction/Credits
-
-1.1  Legal Issues
-
-2   The /proc file system
-
-2.1  Process specific subdirectories
-2.2  Kernel data
-2.3  IDE devices in /proc/ide
-2.4  Networking info in /proc/net
-2.5  SCSI info
-2.6  Parallel port info in /proc/parport
-2.7  TTY info in /proc/tty
-
-3   Reading and modifying kernel parameters
-
-3.1  /proc/sys/debug and /proc/sys/proc
-3.2  /proc/fs - File system data
-3.3  /proc/fs/binfmt_misc - Miscellaneous binary formats
-3.4  /proc/sys/kernel - General kernel parameters
-3.5  /proc/sys/vm - The virtual memory subsystem
-3.6  /proc/sys/dev - Device specific parameters
-3.7  /proc/sys/sunrpc - Remote procedure calls
-3.8  /proc/sys/net - Networking stuff
-3.9  /proc/sys/net/ipv4 - IPV4 settings=20
-3.10 Appletalk
-3.11 IPX
-
------------------------------------------------------------------------
-
-1   Introduction/Credits
-
-This documentation is part of a soon to be released book published by
-IDG Books on the SuSE Linux distribution. As there is no complete
-documentation for the /proc file system and we've used many freely
-available sources to write this chapter, it seems only fair to give
-the work back to the Linux community. This work is based on the
-2.1.132 and 2.2.0-pre-kernel versions. I'm afraid it's still far from
-complete, but we hope it will be useful. As far as we know, it is the
-first 'all-in-one' document about the /proc file system. It is
-focused on the Intel x86 hardware, so if you are looking for PPC, ARM,
-SPARC, APX, etc., features, you probably won't find what you are
-looking for. It also only covers IPv4 networking, not IPv6 nor other
-protocols - sorry.
-
-We'd like to thank Alan Cox, Rik van Riel, and Alexey Kuznetsov.  We'd
-also like to extend a special thank you to Andi Kleen for
-documentation, which we relied on heavily to create this document, as
-well as the additional information he provided. Thanks to everybody
-else who contributed source or docs to the Linux kernel and helped
-create a great piece of software... :)
-
-If you have any comments, corrections or additions, please don't
-hesitate to contact Bodo Bauer at bb@ricochet.net. We'll be happy to
-add them to this document.
-
-The latest version of this document is available online at
-http://www.suse.com/~bb/Docs/proc.html in HTML, ASCII, and as 
-Postscript file. 
-
-1.1  Legal Stuff
-
-We don't guarantee the correctness of this document, and if you come
-to us complaining about how you screwed up your system because of
-incorrect documentation, we won't feel responsible...
-
------------------------------------------------------------------------
-
-2   The /proc file system
-
-The proc file system acts as an interface to internal data structures
-in the kernel. It can be used to obtain information about the system
-and to change certain kernel parameters at runtime.  It contains
-(among other things) one subdirectory for each process running on the
-system which is named after the process id (PID) of the process. The
-link self points to the process reading the file system.
-
-2.1  Process specific subdirectories
-
-Each process subdirectory has the in table 1.1 listed entries.
-
-      _________________________________________________
-      cmdline Command line arguments
-      environ Values of environment variables
-      fd    Directory, which contains all file descriptors
-      mem   Memory held by this process
-      stat   Process status
-      status  Process status in human readable form
-      cwd   Link to the current working directory
-      exe   Link to the executable of this process
-      maps   Memory maps
-      root   Link to the root directory of this process
-      statm  Process memory status information
-     _________________________________________________
-      Table 1.1: Process specific entries in /proc
-
-For example, to get the status information of a process, all you have
-to do is read the file /proc/PID/status:
-
-> cat /proc/self/status
-Name:   cat
-State:  R (running)
-Pid:    5633
-PPid:   5609
-Uid:    501     501     501     501
-Gid:    100     100     100     100
-Groups: 100 16 
-VmSize:      804 kB
-VmLck:         0 kB
-VmRSS:       344 kB
-VmData:       68 kB
-VmStk:        20 kB
-VmExe:        12 kB
-VmLib:       660 kB
-SigPnd: 0000000000000000
-SigBlk: 0000000000000000
-SigIgn: 0000000000000000
-SigCgt: 0000000000000000
-CapInh: 00000000fffffeff
-CapPrm: 0000000000000000
-CapEff: 0000000000000000
-
-This shows you almost the same information as you would get if you
-viewed it with the ps command. In fact, ps uses the proc file system
-to obtain its information.
-
-The statm file contains more detailed information about the process
-memory usage. It contains seven values with the following meanings:
-
-size       total program size
-resident   size of in memory portions
-shared     number of the pages that are shared
-trs        number of pages that are 'code'
-drs        number of pages of data/stack
-lrs        number of pages of library
-dt	   number of dirty pages
-
-The ratio text/data/library is approximate only by heuristics.
-
-2.2  Kernel data
-
-Similar to the process entries, these are files which give information
-about the running kernel. The files used to obtain this information
-are contained in /proc and are listed in table 1.2. Not all of these
-will be present in your system. It depends on the kernel configuration
-and the loaded modules, which files are there, and which are missing.
-
-      ________________________________________________
-      apm           Advanced power management info
-      cmdline       Kernel command line
-      cpuinfo       Info about the CPU
-      devices       Available devices (block and character)
-      dma           Used DMS channels
-      filesystems   Supported filesystems
-      interrupts    Interrupt usage
-      ioports       I/O port usage
-      kcore         Kernel core image
-      kmsg          Kernel messages
-      ksyms         Kernel symbol table
-      loadavg       Load average
-      locks         Kernel locks
-      meminfo       Memory info
-      misc          Miscellaneous
-      modules       List of loaded modules
-      mounts        Mounted filesystems
-      partitions    Table of partitions known to the system
-      rtc           Real time clock
-      slabinfo      Slab pool info
-      stat          Overall statistics
-      swaps         Swap space utilization
-      uptime        System uptime
-      version       Kernel version
-      ________________________________________________
-           Table 1.2: Kernel info in /proc
-
-You can, for example, check which interrupts are currently in use and
-what they are used for by looking in the file /proc/interrupts:
-
-> cat /proc/interrupts
-           CPU0       
-  0:    8728810          XT-PIC  timer
-  1:        895          XT-PIC  keyboard
-  2:          0          XT-PIC  cascade
-  3:     531695          XT-PIC  aha152x
-  4:    2014133          XT-PIC  serial
-  5:      44401          XT-PIC  pcnet_cs
-  8:          2          XT-PIC  rtc
- 11:          8          XT-PIC  i82365
- 12:     182918          XT-PIC  PS/2 Mouse
- 13:          1          XT-PIC  fpu
- 14:    1232265          XT-PIC  ide0
- 15:          7          XT-PIC  ide1
-NMI:          0
-
-There three more important subdirectories in /proc: net, scsi and
-sys. The general rule is that the contents, or even the existence of
-these directories, depends on your kernel configuration. If SCSI is
-not enabled, the directory scsi may not exist. The same is true with
-the net, which is only there when networking support is present in the
-running kernel.
-
-The slabinfo file gives information about memory usage on the slab
-level.  Linux uses slab pools for memory management above page level
-in version 2.2. Commonly used objects have their own slab pool (like
-network buffers, directory cache, etc.).
-
-2.3  IDE devices in /proc/ide
-
-This subdirectory contains information about all IDE devices that the
-kernel is aware of.  There is one subdirectory for each device
-(i.e. hard disk) containing the following files:
-
-       cache             The cache
-       capacity          Capacity of the medium
-       driver            Driver and version
-       geometry          Physical and logical geometry
-       identify          Device identify block
-       media             Media type
-       model             Device identifier
-       settings          Device setup
-       smart_thresholds  IDE disk management thresholds
-       smart_values      IDE disk management values
-
-2.4  Networking info in /proc/net
-
-This directory follows the usual pattern. Table 1.3 lists the files
-and their meaning.
-
-     ____________________________________________________
-     arp             Kernel ARP table
-     dev             network devices with statistics
-     dev_mcast       Lists the Layer2 multicast groups a
-                     device is listening to (interface index,
-                     label, number of references, number of
-                     bound addresses).
-     dev_stat        network device status
-     ip_fwchains     Firewall chain linkage
-     ip_fwnames      Firewall chains
-     ip_masq         Directory containing the masquerading
-                     tables.
-     ip_masquerade   Major masquerading table
-     netstat         Network statistics
-     raw             Raw device statistics
-     route           Kernel routing table
-     rpc             Directory containing rpc info
-     rt_cache        Routing cache
-     snmp            SNMP data
-     sockstat        Socket statistics
-     tcp             TCP sockets
-     tr_rif          Token ring RIF routing table
-     udp             UDP sockets
-     unix            UNIX domain sockets
-     wireless        Wireless interface data (Wavelan etc)
-     igmp            IP multicast addresses, which this host joined
-     psched          Global packet scheduler parameters.
-     netlink         List of PF_NETLINK sockets.
-     ip_mr_vifs      List of multicast virtual interfaces.
-     ip_mr_cache     List of multicast routing cache.
-     udp6            UDP sockets (IPv6)
-     tcp6            TCP sockets (IPv6)
-     raw6            Raw device statistics (IPv6)
-     igmp6	     IP multicast addresses, which this host joineed (IPv6)
-     if_inet6        List of IPv6 interface addresses.
-     ipv6_route      Kernel routing table for IPv6
-     rt6_stats       global IPv6 routing tables statistics.
-     sockstat6       Socket statistics (IPv6)
-     snmp6           Snmp data (IPv6)
-     ____________________________________________________
-         Table 1.3: Network info in /proc/net
-
-You can use this information to see which network devices are
-available in your system and how much traffic was routed over those
-devices:
-
-> cat /proc/net/dev
-Inter-|Receive                                                   |[...
- face |bytes    packets errs drop fifo frame compressed multicast|[...
-    lo:  908188   5596     0    0    0     0          0         0 [...        
-  ppp0:15475140  20721   410    0    0   410          0         0 [... 
-  eth0:  614530   7085     0    0    0     0          0         1 [...
-
-...] Transmit
-...] bytes    packets errs drop fifo colls carrier compressed
-...]  908188     5596    0    0    0     0       0          0
-...] 1375103    17405    0    0    0     0       0          0
-...] 1703981     5535    0    0    0     3       0          0
-
-2.5  SCSI info
-
-If you have a SCSI host adapter in your system, you'll find a
-subdirectory named after the driver for this adapter in /proc/scsi. 
-You'll also see a list of all recognized SCSI devices in /proc/scsi:
-
->cat /proc/scsi/scsi
-Attached devices: 
-Host: scsi0 Channel: 00 Id: 00 Lun: 00
-  Vendor: QUANTUM  Model: XP34550W         Rev: LXY4
-  Type:   Direct-Access                    ANSI SCSI revision: 02
-Host: scsi0 Channel: 00 Id: 01 Lun: 00
-  Vendor: SEAGATE  Model: ST34501W         Rev: 0018
-  Type:   Direct-Access                    ANSI SCSI revision: 02
-Host: scsi0 Channel: 00 Id: 02 Lun: 00
-  Vendor: SEAGATE  Model: ST34501W         Rev: 0017
-  Type:   Direct-Access                    ANSI SCSI revision: 02
-Host: scsi0 Channel: 00 Id: 04 Lun: 00
-  Vendor: ARCHIVE  Model: Python 04106-XXX Rev: 703b
-  Type:   Sequential-Access                ANSI SCSI revision: 02
-
-The directory named after the driver has one file for each adapter
-found in the system. These files contain information about
-the controller, including the used IRQ and the IO address range:
-
->cat /proc/scsi/ncr53c8xx/0
-General information:
- Chip NCR53C875, device id 0xf, revision id 0x4
- IO port address 0xec00, IRQ number 11
- Synchronous period factor 12, max commands per lun 4
-
-2.6  Parallel port info in /proc/parport
-
-The directory /proc/parport contains information about the parallel
-ports of your system. It has one subdirectory for each port, named
-after the port number (0,1,2,...).
-
-This directory contains four files:
-
-    autoprobe   Autoprobe results of this port
-    devices     Connected device modules
-    hardware    Hardware info (port type, io-port, DMA, IRQ, etc.)
-    irq         Used interrupt, if any
-
-2.7  TTY info in /proc/tty
-
-Information about the available and the actually used tty's can be
-found in /proc/tty. You'll find entries for drivers and line
-disciplines in this directory, as shown in the table below:
-
-     drivers       List of drivers and their usage
-     ldiscs        Registered line disciplines
-     driver/serial Usage statistic and status of single tty lines
-
-To see which tty's are currently in use, you can simply look into the
-file /proc/tty/drivers:
-
->cat /proc/tty/drivers
-pty_slave            /dev/pts      136   0-255 pty:slave
-pty_master           /dev/ptm      128   0-255 pty:master
-pty_slave            /dev/ttyp       3   0-255 pty:slave
-pty_master           /dev/pty        2   0-255 pty:master
-serial               /dev/cua        5   64-67 serial:callout
-serial               /dev/ttyS       4   64-67 serial
-/dev/tty0            /dev/tty0       4       0 system:vtmaster
-/dev/ptmx            /dev/ptmx       5       2 system
-/dev/console         /dev/console    5       1 system:console
-/dev/tty             /dev/tty        5       0 system:/dev/tty
-unknown              /dev/tty        4    1-63 console
-
------------------------------------------------------------------------
-
-3   Reading and modifying kernel parameters
-
-A very interesting part of /proc is the directory /proc/sys. This not
-only provides information, it also allows you to change parameters
-within the kernel. Be very careful when trying this. You can optimize
-your system, but you also can crash it. Never play around with kernel
-parameters on a production system. Set up a development machine and
-test to make sure that everything works the way you want it to.  You
-may have no alternative but to reboot the machine once an error has
-been made.
-
-To change a value, simply echo the new value into the file. An example
-is given below in the section on the file system data. You need to be
-root to do this. You can create your own boot script to get this done
-every time your system boots. 
-
-The files in /proc/sys can be used to tune and monitor miscellaneous
-and general things in the operation of the Linux kernel.  Since some
-of the files can inadvertently disrupt your system, it is advisable to
-read both documentation and source before actually making
-adjustments. In any case, be very careful when writing to any of these
-files. The entries in /proc may change slightly between the 2.1.* and
-the 2.2 kernel, so review the kernel documentation if there is any
-doubt. You'll find the documentation in the directory
-/usr/src/linux/Documentation/sys. This chapter is heavily based on the
-documentation included in the pre 2.2 kernels. Thanks to Rick van Riel
-for providing this information.
-
-3.1  /proc/sys/debug and /proc/sys/proc
-
-These two subdirectories are empty.
-
-3.2  /proc/fs - File system data
-
-This subdirectory contains specific file system, file handle, inode,
-dentry and quota information.
+This subdirectory  contains  specific  file system, file handle, inode, dentry
+and quota information.
 
 Currently, these files are in /proc/sys/fs:
 
 dentry-state
-   Status of the directory cache. Since directory entries are
-   dynamically allocated and deallocated, this file gives information
-   about the current status. It holds six values, in which the last
-   two are not used and are always zero. The other four mean:
-
-       nr_dentry   Seems to be zero all the time
-       nr_unused   Number of unused cache entries
-       age_limit   Age in seconds after the entry may be
-                   reclaimed, when memory is short
-       want_pages  internal
+------------
+
+Status of  the  directory  cache.  Since  directory  entries  are  dynamically
+allocated and  deallocated,  this  file indicates the current status. It holds
+six values, in which the last two are not used and are always zero. The others
+are listed in table 2-1.
+
+
+Table 2-1: Status files of the directory cache 
+..............................................................................
+ File       Content                                                            
+ nr_dentry  Almost always zero                                                 
+ nr_unused  Number of unused cache entries                                     
+ age_limit  
+            in seconds after the entry may be reclaimed, when memory is short 
+ want_pages internally                                                         
+..............................................................................
 
 dquot-nr and dquot-max
-   The file dquot-max shows the maximum number of cached disk quota
-   entries.
+----------------------
+
+The file dquot-max shows the maximum number of cached disk quota entries.
 
-   The file dquot-nr shows the number of allocated disk quota
-   entries and the number of free disk quota entries.
+The file  dquot-nr  shows  the  number of allocated disk quota entries and the
+number of free disk quota entries.
 
-   If the number of free cached disk quotas is very low and you have
-   a large number of simultaneous system users, you might want
-   to raise the limit.
+If the number of available cached disk quotas is very low and you have a large
+number of simultaneous system users, you might want to raise the limit.
 
 file-nr and file-max
-   The kernel allocates file handles dynamically, but as yet
-   doesn't free them again.
+--------------------
 
-   The value in file-max denotes the maximum number of file handles
-   that the Linux kernel will allocate. When you get a lot of error
-   messages about running out of file handles, you might want to raise
-   this limit. The default value is 4096. To change it, just write the
-   new number into the file:
-
-   # cat /proc/sys/fs/file-max
-   4096
-   # echo 8192 > /proc/sys/fs/file-max
-   # cat /proc/sys/fs/file-max
-   8192
-
-   This method of revision is useful for all customizable parameters
-   of the kernel - simply echo the new value to the corresponding
-   file.
-  
-   The three values in file-nr denote the number of allocated file
-   handles, the number of used file handles, and the maximum number of
-   file handles. When the allocated file handles come close to the
-   maximum, but the number of actually used ones is far behind, you've
-   encountered a peak in your usage of file handles and you don't need
-   to increase the maximum.
-
-   However, there is still a per process limit of open files, which
-   unfortunatly can't be changed that easily. It is set to 1024 by
-   default. To change this you have to edit the files limits.h and
-   fs.h in the directory /usr/src/linux/include/linux. Change the
-   definition of NR_OPEN and recompile the kernel.
+The kernel  allocates file handles dynamically, but doesn't free them again at
+this time.
+
+The value  in  file-max  denotes  the  maximum number of file handles that the
+Linux kernel will allocate. When you get a lot of error messages about running
+out of  file handles, you might want to raise this limit. The default value is
+4096. To change it, just write the new number into the file:
+
+  # cat /proc/sys/fs/file-max 
+  4096 
+  # echo 8192 > /proc/sys/fs/file-max 
+  # cat /proc/sys/fs/file-max 
+  8192 
+
+
+This method  of  revision  is  useful  for  all customizable parameters of the
+kernel - simply echo the new value to the corresponding file.
+
+The three  values  in file-nr denote the number of allocated file handles, the
+number of  used file handles, and the maximum number of file handles. When the
+allocated file  handles  come close to the maximum, but the number of actually
+used ones  is  far  behind,  you've  encountered  a peak in your usage of file
+handles and you don't need to increase the maximum.
+
+However, there is still a per process limit of open files, which unfortunately
+can't be changed that easily. It is set to 1024 by default. To change this you
+have to  edit  the files limits.h and fs.h in the kernel source tree. Finally,
+change the definition of NR_OPEN and recompile the kernel.
 
 inode-state, inode-nr and inode-max
-   As with file handles, the kernel allocates the inode structures
-   dynamically, but can't free them yet.
+-----------------------------------
+
+As with  file  handles, the kernel allocates the inode structures dynamically,
+but can't free them yet.
+
+The value  in  inode-max  denotes  the  maximum number of inode handlers. This
+value should  be  3 to 4 times larger than the value in file-max, since stdin,
+stdout, and  network  sockets also need an inode struct to handle them. If you
+regularly run out of inodes, you should increase this value.
+
+The file inode-nr contains the first two items from inode-state, so we'll skip
+to that file...
+
+inode-state contains  three  actual numbers and four dummy values. The numbers
+are nr_inodes, nr_free_inodes, and preshrink (in order of appearance).
+
+nr_inodes
+~~~~~~~~~
+
+Denotes the  number  of  inodes the system has allocated. This can be slightly
+more than inode-max because Linux allocates them one pageful at a time.
+
+nr_free_inodes
+--------------
+
+Represents the  number  of free inodes and preshrink is nonzero when nr_inodes
+is greater than inode-max and the system needs to prune the inode list instead
+of allocating more.
 
-   The value in inode-max denotes the maximum number of inode
-   handlers. This value should be 3 to 4 times larger than the value
-   in file-max, since stdin, stdout, and network sockets also need an
-   inode struct to handle them. If you regularly run out of inodes,
-   you should increase this value.
-
-   The file inode-nr contains the first two items from inode-state, so
-   we'll skip to that file...
-
-   inode-state contains three actual numbers and four dummy values. The 
-   actual numbers are (in order of appearance) nr_inodes, nr_free_inodes,
-   and preshrink.
-
-   nr_inodes 
-     Denotes the number of inodes the system has allocated. This can
-     be slightly more than inode-max because Linux allocates them one
-     pageful at a time.
-
-   nr_free_inodes 
-     Represents the number of free inodes and pre shrink is nonzero
-     when the nr_inodes > inode-max and the system needs to prune the
-     inode list instead of allocating more.
 
 super-nr and super-max
-   Again, super block structures are allocated by the kernel,
-   but not freed. The file super-max contains the maximum number of
-   super block handlers, where super-nr shows the number of
-   currently allocated ones.
-
-   Every mounted file system needs a super block, so if you plan to
-   mount lots of file systems, you may want to increase these
-   numbers.
-
-3.3  /proc/fs/binfmt_misc - Miscellaneous binary formats
-
-Besides these files, there is the subdirectory
-/proc/sys/fs/binfmt_misc. This handles the kernel support for
-miscellaneous binary formats.
-
-Binfmt_misc provides the ability to register additional binary formats
-to the Kernel without compiling an additional module/kernel. Therefore
-binfmt_misc needs to know magic numbers at the beginning or the
-filename extension of the binary.
-
-It works by maintaining a linked list of structs, that contain a
-description of a binary format, including a magic with size (or the
-filename extension), offset and mask, and the interpreter name. On
-request it invokes the given interpreter with the original program as
-argument, as binfmt_java and binfmt_em86 and binfmt_mz do.
-Since binfmt_misc does not define any default binary-formats, you have to
-register an additional binary-format.
+----------------------
+
+Again, super  block structures are allocated by the kernel, but not freed. The
+file super-max  contains  the  maximum  number  of super block handlers, where
+super-nr shows the number of currently allocated ones.
+
+Every mounted file system needs a super block, so if you plan to mount lots of
+file systems, you may want to increase these numbers.
+
+2.2 /proc/sys/fs/binfmt_misc - Miscellaneous binary formats
+-----------------------------------------------------------
+
+Besides these  files, there is the subdirectory /proc/sys/fs/binfmt_misc. This
+handles the kernel support for miscellaneous binary formats.
+
+Binfmt_misc provides  the ability to register additional binary formats to the
+Kernel without  compiling  an additional module/kernel. Therefore, binfmt_misc
+needs to  know magic numbers at the beginning or the filename extension of the
+binary.
+
+It works by maintaining a linked list of structs that contain a description of
+a binary  format,  including  a  magic  with size (or the filename extension),
+offset and  mask,  and  the  interpreter name. On request it invokes the given
+interpreter with  the  original  program  as  argument,  as  binfmt_java  and
+binfmt_em86 and  binfmt_mz  do.  Since binfmt_misc does not define any default
+binary-formats, you have to register an additional binary-format.
 
-There are two general files in binfmt_misc and one file per registered
-format. The two general files are register and status.
+There are two general files in binfmt_misc and one file per registered format.
+The two general files are register and status.
 
 Registering a new binary format
+-------------------------------
 
-echo :name:type:offset:magic:mask:interpreter: > /proc/sys/fs/binfmt_misc/register 
+To register a new binary format you have to issue the command
 
-with appropriate name (the name for the /proc-dir entry), offset
-(defaults to 0, if omitted), magic and mask (which can be omitted,
-defaults to all 0xff) and last but not least, the interpreter that is
-to be invoked (for example and testing '/bin/echo'). Type can be M for
-usual magic matching or E for filename extension matching (give
-extension in place of magic).
-
-To check or reset the status of the binary format handler:
-
-If you do a cat on the file /proc/sys/fs/binfmt_misc/status, you will
-get the current status (enabled/disabled) of binfmt_misc. Change the
-status by echoing 0 (disables) or 1 (enables) or -1 (caution: this
-clears all previously registered binary formats) to status. For
-example echo 0 > status to disable binfmt_misc (temporarily).
+  echo :name:type:offset:magic:mask:interpreter: > /proc/sys/fs/binfmt_misc/register 
+
+
+
+with appropriate  name (the name for the /proc-dir entry), offset (defaults to
+0, if  omitted),  magic, mask (which can be omitted, defaults to all 0xff) and
+last but  not  least,  the  interpreter that is to be invoked (for example and
+testing /bin/echo).  Type  can be M for usual magic matching or E for filename
+extension matching (give extension in place of magic).
+
+Check or reset the status of the binary format handler
+------------------------------------------------------
+
+If you  do a cat on the file /proc/sys/fs/binfmt_misc/status, you will get the
+current status (enabled/disabled) of binfmt_misc. Change the status by echoing
+0 (disables)  or  1  (enables)  or  -1  (caution:  this  clears all previously
+registered binary  formats)  to status. For example echo 0 > status to disable
+binfmt_misc (temporarily).
 
 Status of a single handler
+--------------------------
 
-Each registered handler has an entry in /proc/sys/fs/binfmt_misc.
-These files perform the same function as status, but their scope is
-limited to the actual binary format. By cating this file, you also
-receive all related information about the interpreter/magic of the
-binfmt.
+Each registered  handler has an entry in /proc/sys/fs/binfmt_misc. These files
+perform the  same function as status, but their scope is limited to the actual
+binary format.  By  cating this file, you also receive all related information
+about the interpreter/magic of the binfmt.
 
 Example usage of binfmt_misc (emulate binfmt_java)
+--------------------------------------------------
 
-cd /proc/sys/fs/binfmt_misc
-echo ':Java:M::\xca\xfe\xba\xbe::/usr/local/java/bin/javawrapper:' > register
-echo ':HTML:E::html::/usr/local/java/bin/appletviewer:' > register
-echo ':Applet:M::<!--applet::/usr/local/java/bin/appletviewer:' > register
-echo ':DEXE:M::\x0eDEX::/usr/bin/dosexec:' > register
-
-These three lines add support for Java executables and Java applets
-(like binfmt_java, additionally recognizing the .html extension with
-no need to put <!--applet> to every applet file). You have to install
-the JDK and the shell-script /usr/local/java/bin/javawrapper too. It
-works around the brokenness of the Java filename handling. To add a
-Java binary, just create a link to the class-file somewhere in the
-path.
-
-3.4  /proc/sys/kernel - general kernel parameters
-
-This directory reflects general kernel behaviors. As I've said before,
-the contents are depend on your configuration. I'll list the most
-important files, along with descriptions of what they mean and how to
-use them.
+  cd /proc/sys/fs/binfmt_misc  
+  echo ':Java:M::\xca\xfe\xba\xbe::/usr/local/java/bin/javawrapper:' > register  
+  echo ':HTML:E::html::/usr/local/java/bin/appletviewer:' > register  
+  echo ':Applet:M::<!--applet::/usr/local/java/bin/appletviewer:' > register 
+  echo ':DEXE:M::\x0eDEX::/usr/bin/dosexec:' > register 
+
+
+These four  lines  add  support  for  Java  executables and Java applets (like
+binfmt_java, additionally  recognizing the .html extension with no need to put
+<!--applet> to  every  applet  file).  You  have  to  install  the JDK and the
+shell-script /usr/local/java/bin/javawrapper  too.  It  works  around  the
+brokenness of  the Java filename handling. To add a Java binary, just create a
+link to the class-file somewhere in the path.
+
+2.3 /proc/sys/kernel - general kernel parameters
+------------------------------------------------
+
+This directory  reflects  general  kernel  behaviors. As I've said before, the
+contents depend  on  your  configuration.  Here you'll find the most important
+files, along with descriptions of what they mean and how to use them.
 
 acct
-   The file contains three values; highwater, lowwater, and
-   frequency.
+----
 
-   It exists only when BSD-style process accounting is enabled. These
-   values control its behavior. If the free space on the file system
-   where the log lives goes below lowwater%, accounting suspends. If
-   it goes above highwater%, accounting resumes. Frequency determines
-   how often you check the amount of free space (value is in
-   seconds). Default settings are: 4, 2, and 30. That is, suspend
-   accounting if there left <= 2% free; resume it if we have a value
-   >=3%; consider information about the amount of free space valid
-   for 30 seconds
+The file contains three values; highwater, lowwater, and frequency.
+
+It exists  only  when  BSD-style  process  accounting is enabled. These values
+control its behavior. If the free space on the file system where the log lives
+goes below  lowwater  percentage,  accounting  suspends.  If  it  goes  above
+highwater percentage,  accounting  resumes. Frequency determines how often you
+check the amount of free space (value is in seconds). Default settings are: 4,
+2, and  30.  That is, suspend accounting if there is less than 2 percent free;
+resume it  if we have a value of 3 or more percent; consider information about
+the amount of free space valid for 30 seconds
 
 ctrl-alt-del
-   When the value in this file is 0, ctrl-alt-del is trapped and sent
-   to the init(1) program to handle a graceful restart. However, when
-   the value is > 0, Linux's reaction to this key combination will be
-   an immediate reboot, without syncing its dirty buffers.
-
-   Note: when a program (like dosemu) has the keyboard in raw mode,
-   the ctrl-alt-del is intercepted by the program before it ever
-   reaches the kernel tty layer, and it is up to the program to decide
-   what to do with it.
+------------
+
+When the value in this file is 0, ctrl-alt-del is trapped and sent to the init
+program to  handle a graceful restart. However, when the value is greater that
+zero, Linux's  reaction  to  this key combination will be an immediate reboot,
+without syncing its dirty buffers.
+
+[NOTE]
+    When a  program  (like  dosemu)  has  the  keyboard  in  raw  mode,  the
+    ctrl-alt-del is  intercepted  by  the  program  before it ever reaches the
+    kernel tty  layer,  and  it is up to the program to decide what to do with
+    it.
 
 domainname and hostname
-   These files can be controlled to set the NIS domainname and
-   hostname of your box. For the classic darkstar.frop.org a simple:
+-----------------------
+
+These files  can  be controlled to set the NIS domainname and hostname of your
+box. For the classic darkstar.frop.org a simple:
+
+  # echo "darkstar" > /proc/sys/kernel/hostname 
+  # echo "frop.org" > /proc/sys/kernel/domainname 
 
-   # echo "darkstar" > /proc/sys/kernel/hostname
-   # echo "frop.org" > /proc/sys/kernel/domainname
 
-   would suffice to set your hostname and NIS domainname.
+would suffice to set your hostname and NIS domainname.
 
 osrelease, ostype and version
+-----------------------------
 
-   The names make it pretty obvious what these fields contain:
+The names make it pretty obvious what these fields contain:
 
-   >cat /proc/sys/kernel/osrelease
-   2.1.131
-   >cat /proc/sys/kernel/ostype
-   Linux
-   >cat /proc/sys/kernel/version
-   #8 Mon Jan 25 19:45:02 PST 1999
- 
-   The files osrelease and ostype should be clear enough. Version
-   needs a little more clarification however. The #8 means that this
-   is the 8th kernel built from this source base and the date behind
-   it indicates the time the kernel was built. The only way to tune
-   these values is to rebuild the kernel.
-
-panic 
-   The value in this file represents the number of seconds the kernel
-   waits before rebooting on a panic. When you use the software
-   watchdog, the recommended setting is 60. If set to 0, the auto
-   reboot after a kernel panic is disabled, this is the default
-   setting.
+  > cat /proc/sys/kernel/osrelease 
+  2.2.12 
+   
+  > cat /proc/sys/kernel/ostype 
+  Linux 
+   
+  > cat /proc/sys/kernel/version 
+  #4 Fri Oct 1 12:41:14 PDT 1999 
+
+
+The files  osrelease and ostype should be clear enough. Version needs a little
+more clarification.  The  #4 means that this is the 4th kernel built from this
+source base and the date after it indicates the time the kernel was built. The
+only way to tune these values is to rebuild the kernel.
+
+panic
+-----
+
+The value  in  this  file  represents  the  number of seconds the kernel waits
+before rebooting  on  a  panic.  When  you  use  the  software  watchdog,  the
+recommended setting  is  60. If set to 0, the auto reboot after a kernel panic
+is disabled, which is the default setting.
 
 printk
-   The four values in printk denote console_loglevel,
-   default_message_loglevel, minimum_console_level, and
-   default_console_loglevel respectively.
-
-   These values influence printk() behavior when printing or logging
-   error messages, which come from inside the kernel. See syslog(2)
-   for more information on the different log levels.
-
-   console_loglevel
-     Messages with a higher priority than this will be printed to
-     the console.
-
-   default_message_level
-     Messages without an explicit priority will be printed with
-     this priority.
+------
+
+The four values in printk denote
+* console_loglevel,
+* default_message_loglevel,
+* minimum_console_level and
+* default_console_loglevel
+respectively.
+
+These values  influence  printk()  behavior  when  printing  or  logging error
+messages, which  come  from  inside  the  kernel.  See  syslog(2)  for  more
+information on the different log levels.
+
+console_loglevel
+----------------
+
+Messages with a higher priority than this will be printed to the console.
+
+default_message_level
+---------------------
+
+Messages without an explicit priority will be printed with this priority.
+
+minimum_console_loglevel
+------------------------
+
+Minimum (highest) value to which the console_loglevel can be set.
 
-   minimum_console_loglevel
-     Minimum (highest) value to which the console_loglevel can be set.
+default_console_loglevel
+------------------------
 
-   default_console_loglevel
-     Default value for console_loglevel.
+Default value for console_loglevel.
 
 sg-big-buff
-   This file shows the size of the generic SCSI (sg) buffer. At this
-   point, you can't tune it yet, but you can change it at compile time
-   by editing include/scsi/sg.h and changing the value of
-   SG_BIG_BUFF.
-
-   If you use a scanner with SANE (Scanner Access now easy) you
-   might want to set this to a higher value. Look into the SANE
-   documentation on this issue.
+-----------
+
+This file  shows  the size of the generic SCSI (sg) buffer. At this point, you
+can't tune  it  yet,  but  you  can  change  it  at  compile  time  by editing
+include/scsi/sg.h and changing the value of SG_BIG_BUFF.
+
+If you use a scanner with SANE (Scanner Access Now Easy) you might want to set
+this to a higher value. Refer to the SANE documentation on this issue.
 
 modprobe
-   The location where the modprobe binary is located. The kernel
-   uses this program to load modules on demand.
+--------
+
+The location  where  the  modprobe  binary  is  located.  The kernel uses this
+program to load modules on demand.
 
-3.5  /proc/sys/vm - The virtual memory subsystem
+2.4 /proc/sys/vm - The virtual memory subsystem
+-----------------------------------------------
 
-The files in this directory can be used to tune the operation of the
-virtual memory (VM) subsystem of the Linux kernel. In addition, one of
-the files (bdflush) has a little influence on disk usage.
+The files  in  this directory can be used to tune the operation of the virtual
+memory (VM)  subsystem  of  the  Linux  kernel.  In addition, one of the files
+(bdflush) has some influence on disk usage.
 
 bdflush
-   This file controls the operation of the bdflush kernel daemon. It
-   currently contains 9 integer values, 6 of which are actually used
-   by the kernel:
-
-    nfract      Percentage of buffer cache dirty to
-                activate bdflush
-    ndirty      Maximum number of dirty blocks to
-                write out per-wake-cycle
-    nrefill     Number of clean buffers to try to obtain
-                each time we call refill
-    nref_dirt   Dirty buffer threshold for activating bdflush
-                when trying to refill buffers.
-    dummy       unused
-    age_buffer  Time for normal buffer to age before you flush it
-    age_super   Time for superblock to age before you flush it
-    dummy       unused
-    dummy       unused
-
-   nfract
-     This parameter governs the maximum number of dirty buffers
-     in the buffer cache. Dirty means that the contents of the
-     buffer still have to be written to disk (as opposed to a
-     clean buffer, which can just be forgotten about). Setting
-     this to a high value means that Linux can delay disk writes
-     for a long time, but it also means that it will have to do a
-     lot of I/O at once when memory becomes short. A low value
-     will spread out disk I/O more evenly.
-
-   ndirty
-     Ndirty gives the maximum number of dirty buffers that
-     bdflush can write to the disk at one time. A high value will
-     mean delayed, bursty I/O, while a small value can lead to
-     memory shortage when bdflush isn't woken up often enough.
-
-   nrefill
-     This the number of buffers that bdflush will add to the list
-     of free buffers when refill_freelist() is called. It is
-     necessary to allocate free buffers beforehand, since the
-     buffers are often different sizes than the memory pages
-     and some bookkeeping needs to be done beforehand. The
-     higher the number, the more memory will be wasted and the
-     less often refill_freelist() will need to run.
-
-   nref_dirt
-     When refill_freelist() comes across more than nref_dirt
-     dirty buffers, it will wake up bdflush.
-
-   age_buffer and age_super
-     Finally, the age_buffer and age_super parameters govern the
-     maximum time Linux waits before writing out a dirty buffer
-     to disk. The value is expressed in jiffies (clockticks), the
-     number of jiffies per second is 100. Age_buffer is the
-     maximum age for data blocks, while age_super is for
-     filesystems meta data.
+-------
+
+This file  controls  the  operation of the bdflush kernel daemon. It currently
+contains nine  integer  values,  six of which are actually used by the kernel.
+They are listed in table 2-2.
+
+
+Table 2-2: Parameters in /proc/sys/vm/bdflush 
+..............................................................................
+ Value      Meaning                                                            
+ nfract     Percentage of buffer cache dirty to  activate bdflush              
+ ndirty     Maximum number of dirty blocks to  write out per wake-cycle        
+ nrefill    Number of clean buffers to try to obtain  each time we call refill 
+ nref_dirt  buffer threshold for activating bdflush when trying to refill
+            buffers. 
+ dummy      Unused                                                             
+ age_buffer Time for normal buffer to age before we flush it                   
+ age_super  Time for superblock to age before we flush it                      
+ dummy      Unused                                                             
+ dummy      Unused                                                             
+..............................................................................
+
+nfract
+------
+
+This parameter  governs  the  maximum  number  of  dirty buffers in the buffer
+cache. Dirty means that the contents of the buffer still have to be written to
+disk (as  opposed  to  a  clean  buffer,  which  can just be forgotten about).
+Setting this  to  a  higher value means that Linux can delay disk writes for a
+long time, but it also means that it will have to do a lot of I/O at once when
+memory becomes short. A lower value will spread out disk I/O more evenly.
+
+ndirty
+------
+
+Ndirty gives the maximum number of dirty buffers that bdflush can write to the
+disk at  one  time.  A high value will mean delayed, bursty I/O, while a small
+value can lead to memory shortage when bdflush isn't woken up often enough.
+
+nrefill
+-------
+
+This is  the  number  of  buffers  that  bdflush  will add to the list of free
+buffers when  refill_freelist()  is  called.  It is necessary to allocate free
+buffers beforehand,  since  the  buffers  are  often  different sizes than the
+memory pages  and some bookkeeping needs to be done beforehand. The higher the
+number, the  more  memory  will be wasted and the less often refill_freelist()
+will need to run.
+
+nref_dirt
+---------
+
+When refill_freelist() comes across more than nref_dirt dirty buffers, it will
+wake up bdflush.
+
+age_buffer and age_super
+------------------------
+
+Finally, the age_buffer and age_super parameters govern the maximum time Linux
+waits before  writing  out  a  dirty buffer to disk. The value is expressed in
+jiffies (clockticks),  the  number of jiffies per second is 100. Age_buffer is
+the maximum age for data blocks, while age_super is for filesystems meta data.
 
 buffermem
-   The three values in this file control how much memory should be
-   used for buffer memory. The percentage is calculated as a
-   percentage of total system memory.
-
-   The values are:
-
-   min_percent
-     This is the minimum percentage of memory that should be
-     spent on buffer memory.
-
-   borrow_percent
-     When Linux is short on memory, and the buffer cache uses more
-     than it has been allotted, the memory mangement (MM) subsystem
-     will prune the buffer cache more heavily than other memory to
-     compensate.
-
-   max_percent
-     This is the maximum amount of memory that can be used for
-     buffer memory.
+---------
+
+The three  values  in  this  file  control  how much memory should be used for
+buffer memory.  The  percentage  is calculated as a percentage of total system
+memory.
+
+The values are:
+
+min_percent
+-----------
+
+This is  the  minimum  percentage  of  memory  that  should be spent on buffer
+memory.
+
+borrow_percent
+--------------
+
+When Linux is short on memory, and the buffer cache uses more than it has been
+allotted, the  memory  management  (MM)  subsystem will prune the buffer cache
+more heavily than other memory to compensate.
+
+max_percent
+-----------
+
+This is the maximum amount of memory that can be used for buffer memory.
 
 freepages
-   This file contains three values: min, low and high:
+---------
+
+This file contains three values: min, low and high:
 
-   min
-     When the number of free pages in the system reaches this number,
-     only the kernel can allocate more memory.
-
-   low
-     If the number of free pages gets below this point, the kernel
-     starts swapping aggressively.
-
-   high
-     The kernel tries to keep up to this amount of memory free; if
-     memory comes below this point, the kernel gently starts swapping
-     in the hopes that it never has to do really aggressive swapping.
+min
+---
+When the  number  of  free  pages  in the system reaches this number, only the
+kernel can allocate more memory.
+
+low
+---
+If the number of free pages falls below this point, the kernel starts swapping
+aggressively.
+
+high
+----
+The kernel  tries  to  keep  up to this amount of memory free; if memory falls
+below this point, the kernel starts gently swapping in the hopes that it never
+has to do really aggressive swapping.
 
 kswapd
-   Kswapd is the kernel swap out daemon. That is, kswapd is that piece
-   of the kernel that frees memory when it gets fragmented or
-   full. Since every system is different, you'll probably want some
-   control over this piece of the system.
-
-   The file contains three numbers:
-
-   tries_base
-     The maximum number of pages kswapd tries to free in one round is
-     calculated from this number. Usually this number will be divided
-     by 4 or 8 (see mm/vmscan.c), so it isn't as big as it looks.
-
-     When you need to increase the bandwidth to/from swap, you'll want
-     to increase this number.
-
-   tries_min
-     This is the minimum number of times kswapd tries to free a page
-     each time it is called. Basically it's just there to make sure
-     that kswapd frees some pages even when it's being called with
-     minimum priority.
-
-
-  swap_cluster
-     This is probably the greatest influence on system
-     performance. swap_cluster is the number of pages kswapd writes in
-     one turn. You'll want this value to be large so that kswapd does
-     its I/O in large chunks and the disk doesn't have to seek as
-     often., but you don't want it to be too large since that would
-     flood the request queue.
+------
+
+Kswapd is  the  kernel  swap  out daemon. That is, kswapd is that piece of the
+kernel that  frees  memory when it gets fragmented or full. Since every system
+is different, you'll probably want some control over this piece of the system.
+
+The file contains three numbers:
+
+tries_base
+----------
+
+The maximum  number  of  pages kswapd tries to free in one round is calculated
+from this  number.  Usually  this  number  will  be  divided  by  4  or 8 (see
+mm/vmscan.c), so it isn't as big as it looks.
+
+When you  need to increase the bandwidth to/from swap, you'll want to increase
+this number.
+
+tries_min
+---------
+
+This is  the  minimum number of times kswapd tries to free a page each time it
+is called. Basically it's just there to make sure that kswapd frees some pages
+even when it's being called with minimum priority.
+
+swap_cluster
+------------
+
+This is probably the greatest influence on system performance.
+
+swap_cluster is  the  number  of  pages kswapd writes in one turn. You'll want
+this value  to  be  large  so that kswapd does its I/O in large chunks and the
+disk doesn't  have  to  seek  as  often, but you don't want it to be too large
+since that would flood the request queue.
 
 overcommit_memory
-   This file contains one value. The following algorithm is used to
-   decide if there's enough memory: if the value of overcommit_memory
-   is positive, then there's always enough memory. This is a useful
-   feature, since programs often malloc() huge amounts of memory 'just
-   in case', while they only use a small part of it. Leaving this
-   value at 0 will lead to the failure of such a huge malloc(), when
-   in fact the system has enough memory for the program to run.
-
-   On the other hand, enabling this feature can cause you to run out
-   of memory and thrash the system to death, so large and/or important
-   servers will want to set this value to 0.
+-----------------
+
+This file  contains  one  value.  The following algorithm is used to decide if
+there's enough  memory:  if  the  value of overcommit_memory is positive, then
+there's always  enough  memory. This is a useful feature, since programs often
+malloc() huge  amounts  of  memory 'just in case', while they only use a small
+part of  it.  Leaving  this value at 0 will lead to the failure of such a huge
+malloc(), when in fact the system has enough memory for the program to run.
+
+On the  other  hand,  enabling this feature can cause you to run out of memory
+and thrash the system to death, so large and/or important servers will want to
+set this value to 0.
 
 pagecache
-   This file does exactly the same as buffermem, only this file
-   controls the amount of memory allowed for memory mapping and
-   generic caching of files.
-
-   You don't want the minimum level to be too low, otherwise your
-   system might thrash when memory is tight or fragmentation is
-   high.
+---------
+
+This file  does exactly the same job as buffermem, only this file controls the
+amount of memory allowed for memory mapping and generic caching of files.
+
+You don't  want  the  minimum level to be too low, otherwise your system might
+thrash when memory is tight or fragmentation is high.
 
 pagetable_cache
-   The kernel keeps a number of page tables in a per-processor cache
-   (this helps a lot on SMP systems). The cache size for each
-   processor will be between the low and the high value.
-
-   On a low-memory, single CPU system, you can safely set these values
-   to 0 so you don't waste memory. It is used on SMP systems so that
-   the system can perform fast pagetable allocations without having to
-   aquire the kernel memory lock.
-
-   For large systems, the settings are probably fine. For normal
-   systems they won't hurt a bit. For small systems (<16MB ram) it
-   might be advantageous to set both values to 0.
+---------------
+
+The kernel  keeps a number of page tables in a per-processor cache (this helps
+a lot  on  SMP systems). The cache size for each processor will be between the
+low and the high value.
+
+On a  low-memory,  single  CPU system, you can safely set these values to 0 so
+you don't  waste  memory.  It  is  used  on SMP systems so that the system can
+perform fast  pagetable allocations without having to aquire the kernel memory
+lock.
+
+For large  systems,  the  settings  are probably fine. For normal systems they
+won't hurt  a  bit.  For  small  systems  (  less  than  16MB ram) it might be
+advantageous to set both values to 0.
 
 swapctl
-   This file contains no less than 8 variables. All of these values
-   are used by kswapd.
+-------
+
+This file  contains  no less than 8 variables. All of these values are used by
+kswapd.
 
-   The first four variables sc_max_page_age, sc_page_advance,
-   sc_page_decline and sc_page_initial_age are used to keep track of
-   Linux's page aging. Page aging is a bookkeeping method to track
-   which pages of memory are often used, and which pages can be
-   swapped out without consequences.
-
-   When a page is swapped in, it starts at sc_page_initial_age
-   (default 3) and when the page is scanned by kswapd, its age is
-   adjusted according to the following scheme:
-
-    o If the page was used since the last time we scanned, its age
-      is increased by sc_page_advance (default 3) up to a
-      maximum of sc_max_page_age (default 20).
-
-    o Else (meaning it wasn't used) its age is decreased by
-      sc_page_decline (default 1).
-
-   When a page reaches age 0, it's ready to be swapped out.
-
-   The next four variables sc_age_cluster_fract, sc_age_cluster_min,
-   sc_pageout_weight and sc_bufferout_weight, can be used to control
-   kswapd's aggressiveness in swapping out pages.
-
-   Sc_age_cluster_fract is used to calculate how many pages from a
-   process are to be scanned by kswapd. The formula used is
-
-           sc_age_cluster_fract
-           -------------------- * resident set size
-              1024   =20
-
-   So if you want kswapd to scan the whole process,
-   sc_age_cluster_fract needs to have a value of 1024. The minimum
-   number of pages kswapd will scan is represented by
-   sc_age_cluster_min, this is done so kswapd will also scan small
-   processes.
-
-   The values of sc_pageout_weight and sc_bufferout_weight are used
-   to control how many tries kswapd will make in order to swap out
-   one page/buffer. These values can be used to fine-tune the ratio
-   between user pages and buffer/cache memory. When you find that
-   your Linux system is swapping out too many process pages in order
-   to satisfy buffer memory demands, you might want to either
-   increase sc_bufferout_weight, or decrease the value of
-   sc_pageout_weight.
-
-3.6  /proc/sys/dev - Device specific parameters
-
-Currently there is only support for CDROM drives, but other drivers may
-wish to register themselves in here in the future. The cdrom/ directory
-contains several files that either control or supply information about
-the CDROM subsystem. 
-
->cat /proc/sys/dev/cdrom/info
-CD-ROM information, Id: cdrom.c 3.04 1999/09/12
-
-drive name:		hdd	hdc	hdb	hda
-drive speed:		32	24	10	0
-drive # of slots:	1	1	1	1
-Can close tray:		1	1	1	1
-Can open tray:		1	1	1	1
-Can lock tray:		1	1	1	1
-Can change speed:	1	1	1	1
-Can select disk:	0	0	0	0
-Can read multisession:	1	1	1	1
-Can read MCN:		1	1	1	1
-Reports media changed:	1	1	1	1
-Can play audio:		1	1	1	1
-Can write CD-R:		0	1	0	0
-Can write CD-RW:	0	1	0	0
-Can read DVD:		0	0	0	1
-Can write DVD-R:	0	0	0	0
-Can write DVD-RAM:	0	0	0	0
-
-You see four drives and their lists of features. These are all ATAPI
-drives - SCSI drives will be numbered sr0, sr1, and so forth.
-
-The remaining files all set options in the driver.
-
-autoclose
-    Close the drive tray when the drive is accessed.
-
-autoeject
-    Eject the tray when the drive is umounted.
-
-check_media
-    Verify the media type when opening the device. This is generally
-    meant for audio CD's.
-
-debug
-    Print debugging messages.
-
-lock
-    Lock the tray when the drive is in use.
-
-
-3.7  /proc/sys/sunrpc - Remote procedure calls
-
-This directory contains four files, which enable or disable debugging
-for the RPC functions NFS, NFS-daemon, RPC and NLM. The default values
-are 0. They can be set to one, to turn debugging on.  (The default
-value is 0 for each)
-
-3.8  /proc/sys/net - Networking stuff
-
-The interface to the networking parts of the kernel is located in
-/proc/sys/net. The table below shows all possible subdirectories. You
-may see only some of them, depending on the configuration of your
-kernel:
-
-+-------------------------------------------------------------+
-| core     General parameter   |appletalk  Appletalk protocol |
-| unix     Unix domain sockets |netrom     NET/ROM            |
-| 802      E802 protocol       |ax25       AX25               |
-| ethernet Ethernet protocol   |rose       X.25 PLP layer     |
-| ipv4     IP version 4        |x25        X.25 protocol      |
-| ipx      IPX                 |token-ring IBM token ring     |
-| bridge   Bridging            |decnet     DEC net            |
-| ipv6     IP version 6        |                              |
-+-------------------------------------------------------------+
-
-We will concentrate on IP networking here. As AX15, X.25, and DEC Net
-are only minor players in the Linux world, we'll skip them in this
-chapter. You'll find some short info to Appletalk and IPX further down
-in section 3.10 and 3.11. Please look in the online documentation and
-the kernel source to get a detailed view of the parameters for those
-protocols. In this section we'll discuss the subdirectories printed in
-bold letters in the table above. As default values are suitable for
-most needs, there is no need to change these values.
+The first four variables
+* sc_max_page_age,
+* sc_page_advance,
+* sc_page_decline and
+* sc_page_initial_age
+are used  to  keep  track  of  Linux's page aging. Page aging is a bookkeeping
+method to  track  which pages of memory are often used, and which pages can be
+swapped out without consequences.
+
+When a  page  is  swapped in, it starts at sc_page_initial_age (default 3) and
+when the  page  is  scanned  by  kswapd,  its age is adjusted according to the
+following scheme:
+
+* If  the  page  was used since the last time we scanned, its age is increased
+  by sc_page_advance  (default  3).  Where  the  maximum  value  is  given  by
+  sc_max_page_age (default 20).
+* Otherwise  (meaning  it wasn't used) its age is decreased by sc_page_decline
+  (default 1).
+
+When a page reaches age 0, it's ready to be swapped out.
+
+The variables  sc_age_cluster_fract, sc_age_cluster_min, sc_pageout_weight and
+sc_bufferout_weight, can  be  used  to  control  kswapd's  aggressiveness  in
+swapping out pages.
+
+Sc_age_cluster_fract is used to calculate how many pages from a process are to
+be scanned by kswapd. The formula used is
+
+(sc_age_cluster_fract divided by 1024) times resident set size
+
+So if you want kswapd to scan the whole process, sc_age_cluster_fract needs to
+have a  value  of  1024.  The  minimum  number  of  pages  kswapd will scan is
+represented by sc_age_cluster_min, which is done so that kswapd will also scan
+small processes.
+
+The values  of  sc_pageout_weight  and sc_bufferout_weight are used to control
+how many  tries  kswapd  will make in order to swap out one page/buffer. These
+values can  be used to fine-tune the ratio between user pages and buffer/cache
+memory. When  you find that your Linux system is swapping out too many process
+pages in  order  to  satisfy  buffer  memory  demands,  you may want to either
+increase sc_bufferout_weight, or decrease the value of sc_pageout_weight.
+
+2.5 /proc/sys/dev - Device specific parameters
+----------------------------------------------
+
+Currently there is only support for CDROM drives, and for those, there is only
+one read-only  file containing information about the CD-ROM drives attached to
+the system:
+
+  >cat /proc/sys/dev/cdrom/info 
+  CD-ROM information, Id: cdrom.c 2.55 1999/04/25 
+   
+  drive name:             sr0     hdb 
+  drive speed:            32      40 
+  drive # of slots:       1       0 
+  Can close tray:         1       1 
+  Can open tray:          1       1 
+  Can lock tray:          1       1 
+  Can change speed:       1       1 
+  Can select disk:        0       1 
+  Can read multisession:  1       1 
+  Can read MCN:           1       1 
+  Reports media changed:  1       1 
+  Can play audio:         1       1 
+
+
+You see two drives, sr0 and hdb, along with a list of their features.
+
+2.6 /proc/sys/sunrpc - Remote procedure calls
+---------------------------------------------
+
+This directory  contains four files, which enable or disable debugging for the
+RPC functions NFS, NFS-daemon, RPC and NLM. The default values are 0. They can
+be set to one to turn debugging on. (The default value is 0 for each)
+
+2.7 /proc/sys/net - Networking stuff
+------------------------------------
+
+The interface  to  the  networking  parts  of  the  kernel  is  located  in
+/proc/sys/net. Table  2-3  shows all possible subdirectories. You may see only
+some of them, depending on your kernel's configuration.
+
+
+Table 2-3: Subdirectories in /proc/sys/net 
+..............................................................................
+ Directory Content             Directory  Content            
+ core      General parameter   appletalk  Appletalk protocol 
+ unix      Unix domain sockets netrom     NET/ROM            
+ 802       E802 protocol       ax25       AX25               
+ ethernet  Ethernet protocol   rose       X.25 PLP layer     
+ ipv4      IP version 4        x25        X.25 protocol      
+ ipx       IPX                 token-ring IBM token ring     
+ bridge    Bridging            decnet     DEC net            
+ ipv6      IP version 6                   
+..............................................................................
+
+We will  concentrate  on IP networking here. Since AX15, X.25, and DEC Net are
+only minor players in the Linux world, we'll skip them in this chapter. You'll
+find some  short  info on Appletalk and IPX further on in this chapter. Review
+the online  documentation  and the kernel source to get a detailed view of the
+parameters for  those  protocols.  In  this  section  we'll  discuss  the
+subdirectories printed  in  bold letters in the table above. As default values
+are suitable for most needs, there is no need to change these values.
 
 /proc/sys/net/core - Network core options
+-----------------------------------------
 
 rmem_default
-   The default setting of the socket receive buffer in bytes.
+------------
+
+The default setting of the socket receive buffer in bytes.
 
 rmem_max
-   The maximum receive socket buffer size in bytes.
+--------
+
+The maximum receive socket buffer size in bytes.
 
 wmem_default
-   The default setting (in bytes) of the socket send buffer.
+------------
+
+The default setting (in bytes) of the socket send buffer.
 
 wmem_max
-   The maximum send socket buffer size in bytes.
+--------
+
+The maximum send socket buffer size in bytes.
 
 message_burst and message_cost
-   These parameters are used to limit the warning messages written to
-   the kernel log from the networking code. They enforce a rate limit
-   to make a denial-of-service attack impossible. The higher the
-   message_cost factor is, the less messages will be
-   written. Message_burst controls when messages will be dropped. The
-   default settings limit warning messages to one every five seconds.
+------------------------------
+
+These parameters  are used to limit the warning messages written to the kernel
+log from  the  networking  code.  They  enforce  a  rate  limit  to  make  a
+denial-of-service attack  impossible. A higher message_cost factor, results in
+fewer messages that will be written. Message_burst controls when messages will
+be dropped.  The  default  settings  limit  warning messages to one every five
+seconds.
 
 netdev_max_backlog
-   Maximal number of packets, queued on INPUT side, when the interface
-   receives packets faster than kernel can process them.
+------------------
+
+Maximum number  of  packets,  queued  on  the  INPUT  side, when the interface
+receives packets faster than kernel can process them.
 
 optmem_max
-   Maximum ancillary buffer size allowed per socket. Ancillary data is
-   a sequence of struct cmsghdr structures with appended data.
+----------
 
-/proc/sys/net/unix - Parameters for UNIX domain sockets
+Maximum ancillary buffer size allowed per socket. Ancillary data is a sequence
+of struct cmsghdr structures with appended data.
 
-There are only two files in this subdirectory. They control the delays
-for deleting and destroying socket descriptors.
+/proc/sys/net/unix - Parameters for Unix domain sockets
+-------------------------------------------------------
 
-3.9  /proc/sys/net/ipv4 - IPV4 settings
+There are  only  two  files  in this subdirectory. They control the delays for
+deleting and destroying socket descriptors.
 
-IP version 4 is still the most used protocol in Unix networking. It
-will be replaced by IP version 6 in the next couple of years, but for
-the moment it's the de facto standard for the internet and is used in
-most networking environments around the world. Because of the
-importance of this protocol, we'll have a deeper look into the subtree
-controlling the behavior of the IPv4 subsystem of the Linux kernel.
+2.8 /proc/sys/net/ipv4 - IPV4 settings
+--------------------------------------
 
-Let's start with the entries in /proc/sys/net/ipv4 itself.
+IP version  4  is  still the most used protocol in Unix networking. It will be
+replaced by  IP version 6 in the next couple of years, but for the moment it's
+the de  facto  standard  for  the  internet  and  is  used  in most networking
+environments around  the  world.  Because  of the importance of this protocol,
+we'll have a deeper look into the subtree controlling the behavior of the IPv4
+subsystem of the Linux kernel.
+
+Let's start with the entries in /proc/sys/net/ipv4.
 
 ICMP settings
+-------------
 
 icmp_echo_ignore_all and icmp_echo_ignore_broadcasts
-   Turn on (1) or off (0), if the kernel should ignore all ICMP ECHO
-   requests, or just those to broadcast and multicast addresses.
+----------------------------------------------------
+
+Turn on (1) or off (0), if the kernel should ignore all ICMP ECHO requests, or
+just those to broadcast and multicast addresses.
+
+Please note that if you accept ICMP echo requests with a broadcast/multi\-cast
+destination address  your  network  may  be  used as an exploder for denial of
+service packet flooding attacks to other hosts.
 
-   Please note that if you accept ICMP echo requests with a
-   broadcast/multicast destination address your network may be used
-   as an exploder for denial of service packet flooding attacks to
-   other hosts.
-
-icmp_destunreach_rate, icmp_echoreply_rate,
-icmp_paramprob_rate and icmp_timeexeed_rate
-   Sets limits for sending ICMP packets to specific targets. A value of
-   zero disables all limiting. Any positive value sets the maximum
-   package rate in hundredths of a second (on Intel systems).
+icmp_destunreach_rate, icmp_echoreply_rate, icmp_paramprob_rate and icmp_timeexeed_rate
+---------------------------------------------------------------------------------------
+
+Sets limits  for  sending  ICMP  packets  to specific targets. A value of zero
+disables all  limiting.  Any  positive  value sets the maximum package rate in
+hundredth of a second (on Intel systems).
 
 IP settings
+-----------
 
 ip_autoconfig
-   This file contains one, if the host got its IP configuration by
-   RARP, BOOTP, DHCP or a similar mechanism. Otherwise it is zero.
+-------------
+
+This file contains the number one if the host received its IP configuration by
+RARP, BOOTP, DHCP or a similar mechanism. Otherwise it is zero.
 
 ip_default_ttl
-   TTL (Time To Live) for IPv4 interfaces. This is simply the
-   maximum number of hops a packet may travel.
+--------------
+
+TTL (Time  To  Live) for IPv4 interfaces. This is simply the maximum number of
+hops a packet may travel.
 
 ip_dynaddr
-   Enable dynamic socket address rewriting on interface address change. This
-   is useful for dialup interface with changing IP addresses.
+----------
+
+Enable dynamic  socket  address rewriting on interface address change. This is
+useful for dialup interface with changing IP addresses.
 
 ip_forward
-   Enable or disable forwarding of IP packages between interfaces. A
-   change of this value resets all other parameters to their default
-   values. They differ if the kernel is configured as host or router.
+----------
+
+Enable or  disable forwarding of IP packages between interfaces. Changing this
+value resets  all other parameters to their default values. They differ if the
+kernel is configured as host or router.
 
 ip_local_port_range
-   Range of ports used by TCP and UDP to choose the local
-   port. Contains two numbers, the first number is the lowest port,
-   the second number the highest local port. Default is 1024-4999.
-   Should be changed to 32768-61000 for high-usage systems.
+-------------------
+
+Range of  ports  used  by  TCP  and UDP to choose the local port. Contains two
+numbers, the  first  number  is the lowest port, the second number the highest
+local port.  Default  is  1024-4999.  Should  be  changed  to  32768-61000 for
+high-usage systems.
 
 ip_no_pmtu_disc
-   Global switch to turn path MTU discovery off. It can also be set
-   on a per socket basis by the applications or on a per route
-   basis.
+---------------
+
+Global switch  to  turn  path  MTU  discovery off. It can also be set on a per
+socket basis by the applications or on a per route basis.
 
 ip_masq_debug
-   Enable/disable debugging of IP masquerading.
+-------------
 
+Enable/disable debugging of IP masquerading.
 
 IP fragmentation settings
+-------------------------
 
 ipfrag_high_trash and ipfrag_low_trash
-   Maximum memory used to reassemble IP fragments. When
-   ipfrag_high_thresh bytes of memory is allocated for this purpose,
-   the fragment handler will toss packets until ipfrag_low_thresh is
-   reached.
+--------------------------------------
 
+Maximum memory  used to reassemble IP fragments. When ipfrag_high_thresh bytes
+of memory  is  allocated  for  this  purpose,  the  fragment handler will toss
+packets until ipfrag_low_thresh is reached.
 
 ipfrag_time
-   Time in seconds to keep an IP fragment in memory.
+-----------
+
+Time in seconds to keep an IP fragment in memory.
 
 TCP settings
+------------
 
 tcp_retrans_collapse
-   Bug-to-bug compatibility with some broken printers. On retransmit
-   try to send bigger packets to work around bugs in certain TCP
-   stacks. Can be turned off by setting it to zero.
+--------------------
+
+Bug-to-bug compatibility with some broken printers. On retransmit, try to send
+larger packets to work around bugs in certain TCP stacks. Can be turned off by
+setting it to zero.
 
 tcp_keepalive_probes
-   Number of keep alive probes TCP sends out, until it decides that the
-   connection is broken.
+--------------------
+
+Number of  keep  alive  probes  TCP  sends  out,  until  it  decides  that the
+connection is broken.
 
 tcp_keepalive_time
-   How often TCP sends out keep alive messages, when keep alive is
-   enabled. The default is 2 hours.
+------------------
+
+How often  TCP  sends out keep alive messages, when keep alive is enabled. The
+default is 2 hours.
 
 tcp_syn_retries
-   Number of times initial SYNs for a TCP connection attempt will be
-   retransmitted. Should not be higher than 255. This is only the
-   timeout for outgoing connections, for incoming connections the
-   number of retransmits is defined by tcp_retries1.
+---------------
+
+Number of  times  initial  SYNs  for  a  TCP  connection  attempt  will  be
+retransmitted. Should  not  be  higher  than 255. This is only the timeout for
+outgoing connections,  for  incoming  connections the number of retransmits is
+defined by tcp_retries1.
 
 tcp_sack
-   Enable select acknowledgments after RFC2018.
+--------
+
+Enable select acknowledgments after RFC2018.
 
 tcp_timestamps
-   Enable timestamps as defined in RFC1323.
+--------------
+
+Enable timestamps as defined in RFC1323.
 
 tcp_stdurg
-   Enable the strict RFC793 interpretation of the TCP urgent pointer
-   field. The default is to use the BSD compatible interpretation
-   of the urgent pointer pointing to the first byte after the urgent
-   data. The RFC793 interpretation is to have it point to the last
-   byte of urgent data. Enabling this option may lead to
-   interoperatibility problems. Disabled by default.
+----------
+
+Enable the  strict  RFC793 interpretation of the TCP urgent pointer field. The
+default is  to  use  the  BSD  compatible interpretation of the urgent pointer
+pointing to the first byte after the urgent data. The RFC793 interpretation is
+to have  it  point  to  the last byte of urgent data. Enabling this option may
+lead to interoperatibility problems. Disabled by default.
 
 tcp_syncookies
-   Only valid when the kernel was compiled with
-   CONFIG_SYNCOOKIES. Send out syncookies when the syn backlog queue
-   of a socket overflows. This is to prevent against the common 'syn
-   flood attack'. Disabled by default.
-
-   Note that the concept of a socket backlog is abandoned, this
-   means the peer may not receive reliable error messages from an
-   over loaded server with syncookies enabled.
+--------------
+
+Only valid  when  the  kernel  was  compiled  with CONFIG_SYNCOOKIES. Send out
+syncookies when  the  syn backlog queue of a socket overflows. This is to ward
+off the common 'syn flood attack'. Disabled by default.
+
+Note that  the  concept  of a socket backlog is abandoned. This means the peer
+may not  receive  reliable  error  messages  from  an  over loaded server with
+syncookies enabled.
 
 tcp_window_scaling
-   Enable window scaling as defined in RFC1323.
+------------------
+
+Enable window scaling as defined in RFC1323.
 
 tcp_fin_timeout
-   How many seconds to wait for a final FIN before the socket is
-   always closed. This is strictly a violation of the TCP
-   specification, but required to prevent denial-of-service attacks.
+---------------
+
+The length  of  time  in  seconds  it  takes to receive a final FIN before the
+socket is  always  closed.  This  is  strictly  a  violation  of  the  TCP
+specification, but required to prevent denial-of-service attacks.
 
 tcp_max_ka_probes
-   How many keepalive probes are sent per slow timer run. Shouldn't be
-   set too high to prevent bursts.
+-----------------
+
+Indicates how  many  keep alive probes are sent per slow timer run. Should not
+be set too high to prevent bursts.
 
 tcp_max_syn_backlog
-   Length of the per socket backlog queue. Since Linux 2.2 the backlog
-   specified in listen(2) only specifies the length of the backlog
-   queue of already established sockets. When more connection requests
-   arrive Linux starts to drop packets. When syncookies are enabled
-   the packets are still answered and the maximum queue is effectively
-   ignored.
+-------------------
+
+Length of  the per socket backlog queue. Since Linux 2.2 the backlog specified
+in listen(2)  only  specifies  the  length  of  the  backlog  queue of already
+established sockets. When more connection requests arrive Linux starts to drop
+packets. When  syncookies  are  enabled the packets are still answered and the
+maximum queue is effectively ignored.
 
 tcp_retries1
-   Defines how often an answer to a TCP connection request is
-   retransmitted before giving up.
+------------
+
+Defines how  often  an  answer  to  a  TCP connection request is retransmitted
+before giving up.
 
 tcp_retries2
-   Defines how often a TCP packet is retransmitted before giving up.
+------------
 
-Interface specific settings
+Defines how often a TCP packet is retransmitted before giving up.
 
-In the directory /proc/sys/net/ipv4/conf you'll find one subdirectory
-for each interface the system knows about and one directory calls
-all. Changes in the all subdirectory affect all interfaces, where
-changes in the other subdirectories affect only one interface.
+Interface specific settings
+---------------------------
 
-All directories have the same entries:
+In the directory /proc/sys/net/ipv4/conf you'll find one subdirectory for each
+interface the  system  knows about and one directory calls all. Changes in the
+all subdirectory  affect  all  interfaces,  whereas  changes  in  the  other
+subdirectories affect  only  one  interface.  All  directories  have  the same
+entries:
 
 accept_redirects
-   This switch decides if the kernel accepts ICMP redirect messages
-   or not. The default is 'yes', if the kernel is configured for a
-   regular host; and 'no' for a router configuration.
+----------------
+
+This switch  decides  if the kernel accepts ICMP redirect messages or not. The
+default is 'yes' if the kernel is configured for a regular host and 'no' for a
+router configuration.
 
 accept_source_route
-   Should source routed packages be accepted or declined. The
-   default is dependent on the kernel configuration. It's 'yes' for
-   routers and 'no' for hosts.
+-------------------
+
+Should source  routed  packages  be  accepted  or  declined.  The  default  is
+dependent on  the  kernel  configuration.  It's 'yes' for routers and 'no' for
+hosts.
 
 bootp_relay
-   Accept packets with source address 0.b.c.d destined not to this
-   host as local ones. It is supposed that BOOTP relay daemon will
-   catch and forward such packets.
+~~~~~~~~~~~
 
-   The default is 'no', as this feature is not implemented yet
-   (kernel version 2.2.0-pre?).
+Accept packets  with source address 0.b.c.d with destinations not to this host
+as local ones. It is supposed that a BOOTP relay daemon will catch and forward
+such packets.
+
+The default  is  0,  since this feature is not implemented yet (kernel version
+2.2.12).
 
 forwarding
-   Enable or disable IP forwarding on this interface.
+----------
+
+Enable or disable IP forwarding on this interface.
 
 log_martians
-   Log packets with source addresses with no known route to kernel log.
+------------
+
+Log packets with source addresses with no known route to kernel log.
 
 mc_forwarding
-   Do multicast routing. The kernel needs to be compiled with
-   CONFIG_MROUTE and a multicast routing daemon is required.
+-------------
+
+Do multicast routing. The kernel needs to be compiled with CONFIG_MROUTE and a
+multicast routing daemon is required.
 
 proxy_arp
-   Do (1) or don't (0) do proxy ARP.
+---------
+
+Does (1) or does not (0) perform proxy ARP.
 
 rp_filter
-   Integer value deciding if source validation should be made. 
-   1 means yes, 0 means no. Disabled by default, but 
-   local/broadcast address spoofing is always on.
-
-   If you set this to 1 on a router that is the only connection
-   for a network to the net , it evidently prevents spoofing attacks
-   against your internal networks (external addresses can still be
-   spoofed), without the need for additional firewall rules.
+---------
+
+Integer value determines if a source validation should be made. 1 means yes, 0
+means no.  Disabled by default, but local/broadcast address spoofing is always
+on.
+
+If you  set this to 1 on a router that is the only connection for a network to
+the net,  it  will  prevent  spoofing  attacks  against your internal networks
+(external addresses  can  still  be  spoofed), without the need for additional
+firewall rules.
 
 secure_redirects
-   Accept ICMP redirect messages only for gateways, listed in
-   default gateway list. Enabled by default.
+----------------
+
+Accept ICMP  redirect  messages  only  for gateways, listed in default gateway
+list. Enabled by default.
 
 shared_media
-   If it is not set the kernel does not assume that different subnets
-   on this device can communicate directly. Default setting is 'yes'.  
+------------
+
+If it  is  not  set  the kernel does not assume that different subnets on this
+device can communicate directly. Default setting is 'yes'.
 
 send_redirects
-   Determines if or if not to send ICMP redirects to other hosts.
+--------------
 
+Determines whether to send ICMP redirects to other hosts.
 
 Routing settings
+----------------
 
-The directory /proc/sys/net/ipv4/route contains several file to
-control routing issues.
+The directory  /proc/sys/net/ipv4/route  contains  several  file  to  control
+routing issues.
 
 error_burst and error_cost
-   These parameters are used to limit the warning messages written to
-   the kernel log from the routing code. The higher the error_cost
-   factor is, the fewer messages will be written. Error_burst controls
-   when messages will be dropped. The default settings limit warning
-   messages to one every five seconds.
+--------------------------
+
+These parameters  are used to limit the warning messages written to the kernel
+log from  the  routing  code.  The  higher the error_cost factor is, the fewer
+messages will  be written. Error_burst controls when messages will be dropped.
+The default settings limit warning messages to one every five seconds.
 
 flush
-   Writing to this file results in a flush of the routing cache.
+-----
+
+Writing to this file results in a flush of the routing cache.
 
 gc_elastic, gc_interval, gc_min_interval, gc_tresh, gc_timeout
-   Values to control the frequency and behavior of the garbage
-   collection algorithm for the routing cache.
+--------------------------------------------------------------
+
+Values to  control  the  frequency  and  behavior  of  the  garbage collection
+algorithm for the routing cache.
 
 max_size
-   Maximum size of the routing cache. Old entries will be purged
-   once the cache has this size.
+--------
+
+Maximum size  of  the routing cache. Old entries will be purged once the cache
+reached has this size.
 
 max_delay, min_delay
-   Delays for flushing the routing cache.
+--------------------
+
+Delays for flushing the routing cache.
 
 redirect_load, redirect_number
-   Factors which determine if more ICPM redirects should be sent to
-   a specific host. No redirects will be sent once the load limit or
-   the maximum number of redirects has been reached.
+------------------------------
+
+Factors which  determine  if  more ICPM redirects should be sent to a specific
+host. No  redirects  will be sent once the load limit or the maximum number of
+redirects has been reached.
 
 redirect_silence
+----------------
 
-   Timeout for redirects. After this period redirects will be sent
-   again, even if this has been stopped, because the load or number
-   limit has been reached.
+Timeout for redirects. After this period redirects will be sent again, even if
+this has been stopped, because the load or number limit has been reached.
 
 Network Neighbor handling
+-------------------------
+
+Settings about how to handle connections with direct neighbors (nodes attached
+to the same link) can be found in the directory /proc/sys/net/ipv4/neigh.
 
-Settings about how to handle connections with direct neighbors (nodes
-attached to the same link) can be found in the directory
-/proc/sys/net/ipv4/neigh.
-
-As we saw it in the conf directory, there is a default subdirectory
-which holds the default values, and one directory for each
-interface. The contents of the directories are identical, with the
-single exception that the default settings contain additional options
-to set garbage collection parameters.
+As we  saw  it  in  the  conf directory, there is a default subdirectory which
+holds the  default  values, and one directory for each interface. The contents
+of the  directories  are identical, with the single exception that the default
+settings contain additional options to set garbage collection parameters.
 
 In the interface directories you'll find the following entries:
 
 base_reachable_time
-   A base value used for computing the random reachable time value
-   as specified in RFC2461.
+-------------------
+
+A base  value  used for computing the random reachable time value as specified
+in RFC2461.
 
 retrans_time
-   The time, expressed in jiffies (1/100 sec), between retransmitted
-   Neighbor Solicitation messages. Used for address resolution and to
-   determine if a neighbor is unreachable.
+------------
+
+The time,  expressed  in  jiffies  (1/100 sec), between retransmitted Neighbor
+Solicitation messages.  Used  for  address  resolution  and  to determine if a
+neighbor is unreachable.
 
 unres_qlen
-   Maximum queue length for a pending arp request - how many packets
-   are accepted from other layers while the arp address is still
-   resolved.
+----------
+
+Maximum queue  length  for a pending arp request - the number of packets which
+are accepted from other layers while the ARP address is still resolved.
 
 anycast_delay
-   Maximum for random delay of answers to neighbor solicitation
-   messages in jiffies (1/100 sec). Not yet implemented (Linux does
-   not have anycast support yet).
+-------------
+
+Maximum for  random  delay  of  answers  to  neighbor solicitation messages in
+jiffies (1/100  sec). Not yet implemented (Linux does not have anycast support
+yet).
 
 ucast_solicit
-   Maximum number of retries for unicast solicitation.
+-------------
+
+Maximum number of retries for unicast solicitation.
 
 mcast_solicit
-   Maximum number of retries for multicast solicitation.
+-------------
+
+Maximum number of retries for multicast solicitation.
 
 delay_first_probe_time
-   Delay for the first time probe if the neighbor is reachable. (see
-   gc_stale_time).
+----------------------
+
+Delay for  the  first  time  probe  if  the  neighbor  is  reachable.  (see
+gc_stale_time)
 
 locktime
-   An ARP/neighbor entry is only replaced with a new one if the old
-   is at least locktime old. This prevents ARP cache thrashing.
+--------
+
+An ARP/neighbor  entry  is only replaced with a new one if the old is at least
+locktime old. This prevents ARP cache thrashing.
 
 proxy_delay
-   Maximum time (real time is random [0..proxytime]) before
-   answering to an arp request for which we have an proxy arp entry.
-   In some cases, this is used to prevent network flooding.
+-----------
+
+Maximum time  (real  time is random [0..proxytime]) before answering to an ARP
+request for  which  we have an proxy ARP entry. In some cases, this is used to
+prevent network flooding.
 
 proxy_qlen
-   Maximum queue length of the delayed proxy arp timer (see
-   proxy_delay).
+----------
+
+Maximum queue length of the delayed proxy arp timer. (see proxy_delay).
 
 app_solcit
-   Determines the number of requests to send to the user level arp
-   daemon. 0 to turn off.
+----------
+
+Determines the  number of requests to send to the user level ARP daemon. Use 0
+to turn off.
 
 gc_stale_time
-   Determines how often to check for stale ARP entries. After an ARP
-   entry is stale it will be resolved again (useful when an IP address
-   migrates to another machine). When ucast_solicit is > 0 it first
-   tries to send an ARP packet directly to the known host, when that
-   fails and mcast_solicit is > 0, an ARP request is broadcasted.
-
-3.10  Appletalk
-
-The /proc/sys/net/appletalk directory holds the Appletalk
-configuration data when Appletalk is loaded. The configurable
-parameters are:
+-------------
+
+Determines how  often  to  check  for stale ARP entries. After an ARP entry is
+stale it  will  be resolved again (which is useful when an IP address migrates
+to another  machine).  When  ucast_solicit is greater than 0 it first tries to
+send an  ARP  packet  directly  to  the  known  host  When  that  fails  and
+mcast_solicit is greater than 0, an ARP request is broadcasted.
+
+2.9 Appletalk
+-------------
+
+The /proc/sys/net/appletalk  directory  holds the Appletalk configuration data
+when Appletalk is loaded. The configurable parameters are:
 
 aarp-expiry-time
-   The amount of time we keep an AARP entry before expiring
-   it. Used to age out old hosts.
+----------------
+
+The amount  of  time  we keep an ARP entry before expiring it. Used to age out
+old hosts.
 
 aarp-resolve-time
-   The amount of time we will spend trying to resolve an Appletalk
-   address.
+-----------------
+
+The amount of time we will spend trying to resolve an Appletalk address.
 
 aarp-retransmit-limit
-   The number of times we will retransmit a query before giving up.
+---------------------
+
+The number of times we will retransmit a query before giving up.
 
 aarp-tick-time
-   Controls the rate at which expiries are checked.
+--------------
+
+Controls the rate at which expires are checked.
+
+The directory  /proc/net/appletalk  holds the list of active Appletalk sockets
+on a machine.
+
+The fields  indicate  the DDP type, the local address (in network:node format)
+the remote  address,  the  size of the transmit pending queue, the size of the
+received queue  (bytes waiting for applications to read) the state and the uid
+owning the socket.
+
+/proc/net/atalk_iface lists  all  the  interfaces  configured for appletalk.It
+shows the  name  of the interface, its Appletalk address, the network range on
+that address  (or  network number for phase 1 networks), and the status of the
+interface.
+
+/proc/net/atalk_route lists  each  known  network  route.  It lists the target
+(network) that the route leads to, the router (may be directly connected), the
+route flags, and the device the route is using.
+
+2.10 IPX
+--------
+
+The IPX protocol has no tunable values in proc/sys/net.
+
+The IPX  protocol  does,  however,  provide  proc/net/ipx. This lists each IPX
+socket giving  the  local  and  remote  addresses  in  Novell  format (that is
+network:node:port). In  accordance  with  the  strange  Novell  tradition,
+everything but the port is in hex. Not_Connected is displayed for sockets that
+are not  tied to a specific remote address. The Tx and Rx queue sizes indicate
+the number  of  bytes  pending  for  transmission  and  reception.  The  state
+indicates the  state  the  socket  is  in and the uid is the owning uid of the
+socket.
+
+The /proc/net/ipx_interface  file lists all IPX interfaces. For each interface
+it gives  the network number, the node number, and indicates if the network is
+the primary  network.  It  also  indicates  which  device  it  is bound to (or
+Internal for  internal  networks)  and  the  Frame  Type if appropriate. Linux
+supports 802.3,  802.2,  802.2  SNAP  and DIX (Blue Book) ethernet framing for
+IPX.
+
+The /proc/net/ipx_route  table  holds  a list of IPX routes. For each route it
+gives the  destination  network, the router node (or Directly) and the network
+address of the router (or Connected) for internal networks.
+
+------------------------------------------------------------------------------
+Summary
+------------------------------------------------------------------------------
+Certain aspects  of  kernel  behavior  can be modified at runtime, without the
+need to  recompile  the kernel, or even to reboot the system. The files in the
+/proc/sys tree  can  not only be read, but also modified. You can use the echo
+command to write value into these files, thereby changing the default settings
+of the kernel.
+------------------------------------------------------------------------------
+
+
+
+
 
 
-The directory /proc/net/appletalk holds the list of active appletalk
-sockets on a machine.
 
-The fields indicate the DDP type, the local address (in network:node
-format) the remote address, the size of the transmit pending queue,
-the size of the received queue (bytes waiting for applications to
-read) the state and the uid owning the socket.
-
-/proc/net/atalk_iface lists all the interfaces configured for
-appletalk.It shows the name of the interface, its appletalk address,
-the network range on that ad- dress (or network number for phase 1
-networks), and the status of the interface.
-
-/proc/net/atalk_route lists each known network route. It lists the
-target (network) that the route leads to, the router (may be directly
-connected), the route flags, and the device the route is via.
-
-3.11  IPX
-
-The IPX protocol has no tunable values in /proc/sys/net.
-
-The IPX protocol does, however, provide /proc/net/ipx. This lists each
-IPX socket giving the local and remote addresses in Novell format
-(that is network:node:port). In accordance with the strange Novell
-tradition, everything but the port is in hex. Not_Connected is
-displayed for sockets that are not tied to a specific remote
-address. The Tx and Rx queue sizes indicate the number of bytes
-pending for transmit and receive. The state indicates the state the
-socket is in and the uid is the owning uid of the socket.
-
-The /proc/net/ipx_interface file lists all IPX interfaces. For each
-interface it gives the network number, the node number, and indicates
-if the network is the primary network. It also indicates which device it is bound to (or
-Internal for internal networks) and the Frame Type if
-appropriate. Linux supports 802.3, 802.2, 802.2 SNAP and DIX (Blue
-Book) ethernet framing for IPX.
-
-The /proc/net/ipx_route table holds a list of IPX routes. For each
-route it gives the destination network, the router node (or Directly)
-and the network address of the router (or Connected) for internal
-networks.
diff -u --recursive --new-file v2.3.21/linux/Documentation/filesystems/smbfs.txt linux/Documentation/filesystems/smbfs.txt
--- v2.3.21/linux/Documentation/filesystems/smbfs.txt	Thu Apr 29 11:53:41 1999
+++ linux/Documentation/filesystems/smbfs.txt	Tue Oct 12 22:56:16 1999
@@ -2,47 +2,7 @@
 protocol used by Windows for Workgroups, Windows 95 and Windows NT.
 Smbfs was inspired by Samba, the program written by Andrew Tridgell
 that turns any Unix host into a file server for DOS or Windows clients.
-See ftp://nimbus.anu.edu.au/pub/tridge/samba/ for this interesting
-program suite and much more information on SMB, NetBIOS over TCP/IP,
-and explanations for concepts like netbios name or share.
 
-To use smbfs, you must first install the Samba package (Samba-1.9.18p1 or
-later). This package includes the special smbmount utility needed to mount
-smbfs volumes. Refer to the smbmount(8) and smbmnt(8) manpages for the
-details regarding smbfs mounts.
-
-The smbmount utility reads the Samba smb.conf config file for some of its
-options, and at least one of these is important for smbfs operation. You
-should enable the TCP_NODELAY socket option, or else directory listings
-will be dramatically slower (under Win NT at least).
-
-Mount-Time Options
-Windows 95 has several bugs that affect SMB operations, and smbfs includes
-work-arounds for all of the bugs found (so far, at least.) These can be
-enabled at compile-time with the CONFIG_SMB_WIN95 kernel option.
-
-Unfortunately, some of the Win 95 work-arounds interact with Win NT bugs,
-so if you're using several different types of servers on your network you
-probably want to enable the work-arounds at mount time. To do this, answer
-`N' to the CONFIG_SMB_WIN95 option, and add the needed options listed below
-to the file mode argument of the mount command for the Win 95 servers.
-
-Option                  Value  Effect
-Identify Win 95 Server    1    Enables bug fixes
-Use Core Attributes       2    Speeds up directory scans, only mtime
-Use Dir Attributes        4    Alternate way to get file attributes
-
-To apply the options, sum the values and prepend it to the file mode. For
-example, to use options 1 and 2 with file mode 755, you would specify 3755:
-
-	mount /mnt/tmp -f 3755
-
-Smbfs will print a message at mount time confirming the selected options.
-Note that _only_ Windows 95 servers require special treatment; using the
-"core attributes" option with Win NT will give trash timestamp values.
-
-To summarize, if your network includes both Win 95 and NT servers:
-(1) Do _not_ enable the CONFIG_SMB_WIN95 kernel option
-
-(2) Add the desired work-around options to the mount command for your
-    Win 95 server(s).
+Smbfs is a SMB client, but uses parts of samba for it's operation. For
+more info on samba, including documentation, please go to
+http://www.samba.org/ and then on to your nearest mirror.
diff -u --recursive --new-file v2.3.21/linux/Documentation/video4linux/bttv/CARDS linux/Documentation/video4linux/bttv/CARDS
--- v2.3.21/linux/Documentation/video4linux/bttv/CARDS	Wed Dec 16 12:53:13 1998
+++ linux/Documentation/video4linux/bttv/CARDS	Thu Oct 14 14:22:08 1999
@@ -101,3 +101,14 @@
 Maxi TV Video PCI 2 card
 ------------------------
 ...
+
+
+Image World ConferenceTV
+------------------------
+Doesn't work:
+	- autodetect. Use card=3D20
+	- sound mute. Use the line-in volume of your soundcard
+	- radio tuner.  Since the card doesn't have an antenna, it is quite
+          understandable ;)  However, you can hear some stations if you
+	  ``ln -s /dev/bttv0 /dev/radio''
+	 =20
diff -u --recursive --new-file v2.3.21/linux/Documentation/video4linux/bttv/CONTRIBUTORS linux/Documentation/video4linux/bttv/CONTRIBUTORS
--- v2.3.21/linux/Documentation/video4linux/bttv/CONTRIBUTORS	Wed Jun  2 11:29:13 1999
+++ linux/Documentation/video4linux/bttv/CONTRIBUTORS	Thu Oct 14 14:22:08 1999
@@ -12,6 +12,11 @@
 Gerd Knorr <kraxel@cs.tu-berlin.de> 
   Radio card (ITT sound processor)
 
+bigfoot <bigfoot@net-way.net>
+Ragnar Hojland Espinosa <ragnar@lightside.dhis.org>
+  ConferenceTV card
+
+
 + many more (please mail me if you are missing in this list and would
              like to be mentioned)
 
diff -u --recursive --new-file v2.3.21/linux/MAINTAINERS linux/MAINTAINERS
--- v2.3.21/linux/MAINTAINERS	Sat Oct  9 11:47:50 1999
+++ linux/MAINTAINERS	Thu Oct 14 14:22:08 1999
@@ -852,7 +852,14 @@
 P:	Paul Norton
 M:	pnorton@ieee.org
 L:	linux-net@vger.rutgers.edu
-L:	linux-tr@emissary.aus-etc.com
+L:	linux-tr@linuxtr.net
+S:	Maintained
+
+TMS380 TOKEN-RING NETWORK DRIVER
+P:	Adam Fritzler
+M:	mid@auk.cx
+L:	linux-tr@linuxtr.net
+W:	http://www.auk.cx/tms380tr/
 S:	Maintained
 
 U14-34F SCSI DRIVER
diff -u --recursive --new-file v2.3.21/linux/Makefile linux/Makefile
--- v2.3.21/linux/Makefile	Mon Oct 11 15:38:14 1999
+++ linux/Makefile	Tue Oct 12 10:05:53 1999
@@ -1,6 +1,6 @@
 VERSION = 2
 PATCHLEVEL = 3
-SUBLEVEL = 21
+SUBLEVEL = 22
 EXTRAVERSION =
 
 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
diff -u --recursive --new-file v2.3.21/linux/arch/i386/Makefile linux/arch/i386/Makefile
--- v2.3.21/linux/arch/i386/Makefile	Thu Aug 12 11:53:22 1999
+++ linux/arch/i386/Makefile	Thu Oct 14 14:22:09 1999
@@ -17,7 +17,6 @@
 #
 
 LD=$(CROSS_COMPILE)ld -m elf_i386
-CPP=$(CC) -E
 OBJCOPY=$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S
 LDFLAGS=-e stext
 LINKFLAGS =-T $(TOPDIR)/arch/i386/vmlinux.lds $(LDFLAGS)
@@ -58,6 +57,12 @@
 AFLAGS := $(AFLAGS) -DCPU=686
 endif
 
+ifdef CONFIG_MK7
+CFLAGS := $(CFLAGS) -DCPU=686 -march=pentiumpro -mpentiumpro -malign-functions=4 -fschedule-insns2 -mwide-multiply -fexpensive-optimizations
+CFLAGS += $(shell if $(CC) -march=i686 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=i686"; fi)
+AFLAGS := $(AFLAGS) -DCPU=686
+endif
+
 HEAD := arch/i386/kernel/head.o arch/i386/kernel/init_task.o
 
 SUBDIRS := $(SUBDIRS) arch/i386/kernel arch/i386/mm arch/i386/lib
@@ -80,9 +85,12 @@
 vmlinux: arch/i386/vmlinux.lds
 
 arch/i386/vmlinux.lds: arch/i386/vmlinux.lds.S FORCE
-	gcc -E -C -P -I$(HPATH) -imacros $(HPATH)/asm-i386/page_offset.h -Ui386 arch/i386/vmlinux.lds.S >arch/i386/vmlinux.lds
+	$(CPP) -C -P -imacros $(HPATH)/asm-i386/page_offset.h -Ui386 arch/i386/vmlinux.lds.S >arch/i386/vmlinux.lds
 
 FORCE: ;
+
+.PHONY: zImage bzImage compressed zlilo bzlilo zdisk bzdisk install \
+		clean archclean archmrproper archdep
 
 zImage: vmlinux
 	@$(MAKEBOOT) zImage
diff -u --recursive --new-file v2.3.21/linux/arch/i386/boot/bootsect.S linux/arch/i386/boot/bootsect.S
--- v2.3.21/linux/arch/i386/boot/bootsect.S	Mon Oct 11 15:38:14 1999
+++ linux/arch/i386/boot/bootsect.S	Tue Oct 12 09:59:44 1999
@@ -247,7 +247,7 @@
 	xorw	%bx, %bx		# bx is starting address within segment
 rp_read:
 #ifdef __BIG_KERNEL__
-	lcall	bootsect_kludge		# in setup.S
+	.word 0x1eff, 0x0220		# lcall *bootsect_kludge in setup.S
 #else
 	movw	%es, %ax
 	subw	$SYSSEG, %ax
@@ -401,7 +401,7 @@
 	pushw	%dx
 	movw	$0x3f2, %dx
 	xorb	%al, %al
-	outw	%al, %dx
+	outb	%al, %dx
 	popw	%dx
 	ret
 
diff -u --recursive --new-file v2.3.21/linux/arch/i386/boot/setup.S linux/arch/i386/boot/setup.S
--- v2.3.21/linux/arch/i386/boot/setup.S	Mon Oct 11 15:38:14 1999
+++ linux/arch/i386/boot/setup.S	Fri Oct 15 11:44:13 1999
@@ -145,7 +145,7 @@
 #ifdef SAFE_RESET_DISK_CONTROLLER
 # Reset the disk controller.
 	movw	$0x0000, %ax
-	movb	$0x80, $dl
+	movb	$0x80, %dl
 	int	$0x13
 #endif
 
@@ -400,7 +400,7 @@
 	subw	$DELTA_INITSEG, %ax		# aka INITSEG
 	movw	%ax, %ds
 	xorw	%ax, %ax
-	movw	%ax, 0xa0			# set table length to 0
+	movw	%ax, (0xa0)			# set table length to 0
 	movb	$0xc0, %ah
 	stc
 	int	$0x15				# moves feature table to es:bx
@@ -496,7 +496,7 @@
 	cmpw	$0, %cs:realmode_swtch
 	jz	rmodeswtch_normal
 
-	call	*%cs:realmode_swtch
+	lcall	%cs:realmode_swtch
 
 	jmp	rmodeswtch_end
 
diff -u --recursive --new-file v2.3.21/linux/arch/i386/config.in linux/arch/i386/config.in
--- v2.3.21/linux/arch/i386/config.in	Mon Oct 11 15:38:14 1999
+++ linux/arch/i386/config.in	Thu Oct 14 14:22:09 1999
@@ -19,21 +19,27 @@
 	 486/Cx486		CONFIG_M486	\
 	 586/K5/5x86/6x86	CONFIG_M586	\
 	 Pentium/K6/TSC		CONFIG_M586TSC	\
-	 PPro/6x86MX		CONFIG_M686" PPro
+	 PPro/6x86MX		CONFIG_M686 \
+	 Athlon                 CONFIG_MK7" PPro
 #
 # Define implied options from the CPU selection here
 #
 if [ "$CONFIG_M386" != "y" ]; then
-  define_bool CONFIG_X86_WP_WORKS_OK y
-  define_bool CONFIG_X86_INVLPG y
-  define_bool CONFIG_X86_BSWAP y
-  define_bool CONFIG_X86_POPAD_OK y
+   define_bool CONFIG_X86_WP_WORKS_OK y
+   define_bool CONFIG_X86_INVLPG y
+   define_bool CONFIG_X86_BSWAP y
+   define_bool CONFIG_X86_POPAD_OK y
 fi
 if [ "$CONFIG_M686" = "y" -o "$CONFIG_M586TSC" = "y" ]; then
-  define_bool CONFIG_X86_TSC y
+   define_bool CONFIG_X86_TSC y
 fi
 if [ "$CONFIG_M686" = "y" ]; then
-  define_bool CONFIG_X86_GOOD_APIC y
+   define_bool CONFIG_X86_GOOD_APIC y
+fi
+if [ "$CONFIG_MK7" = "y" ]; then
+   define_bool CONFIG_X86_TSC y
+   define_bool CONFIG_X86_GOOD_APIC y
+   define_bool CONFIG_X86_USE_3DNOW y
 fi
 
 choice 'Maximum Physical Memory' \
@@ -49,8 +55,8 @@
 comment 'Loadable module support'
 bool 'Enable loadable module support' CONFIG_MODULES
 if [ "$CONFIG_MODULES" = "y" ]; then
-  bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS
-  bool 'Kernel module loader' CONFIG_KMOD
+   bool '  Set version information on all module symbols' CONFIG_MODVERSIONS
+   bool '  Kernel module loader' CONFIG_KMOD
 fi
 endmenu
 
@@ -61,28 +67,29 @@
 bool 'Networking support' CONFIG_NET
 bool 'SGI Visual Workstation support' CONFIG_VISWS
 if [ "$CONFIG_VISWS" = "y" ]; then
-  define_bool CONFIG_X86_VISWS_APIC y
-  define_bool CONFIG_X86_LOCAL_APIC y
-  define_bool CONFIG_PCI y
+   define_bool CONFIG_X86_VISWS_APIC y
+   define_bool CONFIG_X86_LOCAL_APIC y
+   define_bool CONFIG_PCI y
 else
-  if [ "$CONFIG_SMP" = "y" ]; then
-    define_bool CONFIG_X86_IO_APIC y
-    define_bool CONFIG_X86_LOCAL_APIC y
-  fi
-  bool 'PCI support' CONFIG_PCI
-  if [ "$CONFIG_PCI" = "y" ]; then
-    choice 'PCI access mode' \
+   if [ "$CONFIG_SMP" = "y" ]; then
+      define_bool CONFIG_X86_IO_APIC y
+      define_bool CONFIG_X86_LOCAL_APIC y
+   fi
+   bool 'PCI support' CONFIG_PCI
+   if [ "$CONFIG_PCI" = "y" ]; then
+      choice '  PCI access mode' \
 	"BIOS		CONFIG_PCI_GOBIOS	\
 	 Direct		CONFIG_PCI_GODIRECT	\
 	 Any		CONFIG_PCI_GOANY"	Any
-    if [ "$CONFIG_PCI_GOBIOS" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
-      define_bool CONFIG_PCI_BIOS y
-    fi
-    if [ "$CONFIG_PCI_GODIRECT" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
-      define_bool CONFIG_PCI_DIRECT y
-    fi
-  fi
-  bool 'MCA support' CONFIG_MCA
+      if [ "$CONFIG_PCI_GOBIOS" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
+         define_bool CONFIG_PCI_BIOS y
+      fi
+      if [ "$CONFIG_PCI_GODIRECT" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
+         define_bool CONFIG_PCI_DIRECT y
+      fi
+   fi
+   bool 'MCA support' CONFIG_MCA
+
 fi
 
 source drivers/pcmcia/Config.in
@@ -96,17 +103,17 @@
 
 source drivers/parport/Config.in
 
-tristate 'Advanced Power Management BIOS support' CONFIG_APM
+bool 'Advanced Power Management BIOS support' CONFIG_APM
 if [ "$CONFIG_APM" != "n" ]; then
-  bool '   Ignore USER SUSPEND' CONFIG_APM_IGNORE_USER_SUSPEND
-  bool '   Enable PM at boot time' CONFIG_APM_DO_ENABLE
-  bool '   Make CPU Idle calls when idle' CONFIG_APM_CPU_IDLE
-  bool '   Enable console blanking using APM' CONFIG_APM_DISPLAY_BLANK
-  bool '   Power off on shutdown' CONFIG_APM_POWER_OFF
-  bool '   Ignore multiple suspend' CONFIG_APM_IGNORE_MULTIPLE_SUSPEND
-  bool '   Ignore multiple suspend/resume cycles' CONFIG_APM_IGNORE_SUSPEND_BOUNCE
-  bool '   RTC stores time in GMT' CONFIG_APM_RTC_IS_GMT
-  bool '   Allow interrupts during APM BIOS calls' CONFIG_APM_ALLOW_INTS
+   bool '  Ignore USER SUSPEND' CONFIG_APM_IGNORE_USER_SUSPEND
+   bool '  Enable PM at boot time' CONFIG_APM_DO_ENABLE
+   bool '  Make CPU Idle calls when idle' CONFIG_APM_CPU_IDLE
+   bool '  Enable console blanking using APM' CONFIG_APM_DISPLAY_BLANK
+   bool '  Power off on shutdown' CONFIG_APM_POWER_OFF
+   bool '  Ignore multiple suspend' CONFIG_APM_IGNORE_MULTIPLE_SUSPEND
+   bool '  Ignore multiple suspend/resume cycles' CONFIG_APM_IGNORE_SUSPEND_BOUNCE
+   bool '  RTC stores time in GMT' CONFIG_APM_RTC_IS_GMT
+   bool '  Allow interrupts during APM BIOS calls' CONFIG_APM_ALLOW_INTS
 fi
 
 endmenu
@@ -118,7 +125,7 @@
 source drivers/block/Config.in
 
 if [ "$CONFIG_NET" = "y" ]; then
-  source net/Config.in
+   source net/Config.in
 fi
 
 mainmenu_option next_comment
@@ -127,22 +134,22 @@
 tristate 'SCSI support' CONFIG_SCSI
 
 if [ "$CONFIG_SCSI" != "n" ]; then
-  source drivers/scsi/Config.in
+   source drivers/scsi/Config.in
 fi
 endmenu
 
 if [ "$CONFIG_NET" = "y" ]; then
-  mainmenu_option next_comment
-  comment 'Network device support'
+   mainmenu_option next_comment
+   comment 'Network device support'
 
-  bool 'Network device support' CONFIG_NETDEVICES
-  if [ "$CONFIG_NETDEVICES" = "y" ]; then
-    source drivers/net/Config.in
-    if [ "$CONFIG_ATM" = "y" ]; then
-      source drivers/atm/Config.in
-    fi
-  fi
-  endmenu
+   bool 'Network device support' CONFIG_NETDEVICES
+   if [ "$CONFIG_NETDEVICES" = "y" ]; then
+      source drivers/net/Config.in
+      if [ "$CONFIG_ATM" = "y" ]; then
+         source drivers/atm/Config.in
+      fi
+   fi
+   endmenu
 fi
 
 source net/ax25/Config.in
@@ -152,10 +159,10 @@
 mainmenu_option next_comment
 comment 'ISDN subsystem'
 if [ "$CONFIG_NET" != "n" ]; then
-  tristate 'ISDN support' CONFIG_ISDN
-  if [ "$CONFIG_ISDN" != "n" ]; then
-    source drivers/isdn/Config.in
-  fi
+   tristate 'ISDN support' CONFIG_ISDN
+   if [ "$CONFIG_ISDN" != "n" ]; then
+      source drivers/isdn/Config.in
+   fi
 fi
 endmenu
 
@@ -164,7 +171,7 @@
 
 bool 'Support non-SCSI/IDE/ATAPI CDROM drives' CONFIG_CD_NO_IDESCSI
 if [ "$CONFIG_CD_NO_IDESCSI" != "n" ]; then
-  source drivers/cdrom/Config.in
+   source drivers/cdrom/Config.in
 fi
 endmenu
 
@@ -177,15 +184,15 @@
 source fs/Config.in
 
 if [ "$CONFIG_VT" = "y" ]; then
-  mainmenu_option next_comment
-  comment 'Console drivers'
-  bool 'VGA text console' CONFIG_VGA_CONSOLE
-  bool 'Video mode selection support' CONFIG_VIDEO_SELECT
-  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-    tristate 'MDA text console (dual-headed) (EXPERIMENTAL)' CONFIG_MDA_CONSOLE
-    source drivers/video/Config.in
-  fi
-  endmenu
+   mainmenu_option next_comment
+   comment 'Console drivers'
+   bool 'VGA text console' CONFIG_VGA_CONSOLE
+   bool 'Video mode selection support' CONFIG_VIDEO_SELECT
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+      tristate 'MDA text console (dual-headed) (EXPERIMENTAL)' CONFIG_MDA_CONSOLE
+      source drivers/video/Config.in
+   fi
+   endmenu
 fi
 
 mainmenu_option next_comment
@@ -193,7 +200,7 @@
 
 tristate 'Sound card support' CONFIG_SOUND
 if [ "$CONFIG_SOUND" != "n" ]; then
-  source drivers/sound/Config.in
+   source drivers/sound/Config.in
 fi
 endmenu
 
@@ -203,4 +210,3 @@
 #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
 endmenu
-
diff -u --recursive --new-file v2.3.21/linux/arch/i386/defconfig linux/arch/i386/defconfig
--- v2.3.21/linux/arch/i386/defconfig	Mon Oct 11 15:38:14 1999
+++ linux/arch/i386/defconfig	Thu Oct 14 14:22:09 1999
@@ -17,6 +17,7 @@
 # CONFIG_M586 is not set
 # CONFIG_M586TSC is not set
 CONFIG_M686=y
+# CONFIG_MK7 is not set
 CONFIG_X86_WP_WORKS_OK=y
 CONFIG_X86_INVLPG=y
 CONFIG_X86_BSWAP=y
@@ -203,6 +204,7 @@
 # CONFIG_SCSI_INIA100 is not set
 # CONFIG_SCSI_NCR53C406A is not set
 # CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_SIM710 is not set
 # CONFIG_SCSI_NCR53C7xx is not set
 # CONFIG_SCSI_NCR53C8XX is not set
 CONFIG_SCSI_SYM53C8XX=y
diff -u --recursive --new-file v2.3.21/linux/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S
--- v2.3.21/linux/arch/i386/kernel/entry.S	Sat Oct  9 11:47:50 1999
+++ linux/arch/i386/kernel/entry.S	Tue Oct 12 10:05:53 1999
@@ -237,8 +237,11 @@
 	movl $-ENOSYS,EAX(%esp)
 	call SYMBOL_NAME(syscall_trace)
 	movl ORIG_EAX(%esp),%eax
+	cmpl $(NR_syscalls),%eax
+	jae tracesys_exit
 	call *SYMBOL_NAME(sys_call_table)(,%eax,4)
 	movl %eax,EAX(%esp)		# save the return value
+tracesys_exit:
 	call SYMBOL_NAME(syscall_trace)
 	jmp ret_from_sys_call
 badsys:
diff -u --recursive --new-file v2.3.21/linux/arch/i386/kernel/pci-pc.c linux/arch/i386/kernel/pci-pc.c
--- v2.3.21/linux/arch/i386/kernel/pci-pc.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/i386/kernel/pci-pc.c	Thu Oct 14 14:11:08 1999
@@ -120,7 +120,7 @@
 
 #define IOADDR(devfn, where)	((0xC000 | ((devfn & 0x78) << 5)) + where)
 #define FUNC(devfn)		(((devfn & 7) << 1) | 0xf0)
-#define SET(dev)		if (dev->devfn) return PCIBIOS_DEVICE_NOT_FOUND;		\
+#define SET(dev)		if (dev->devfn & 0x80) return PCIBIOS_DEVICE_NOT_FOUND;		\
 				outb(FUNC(dev->devfn), 0xCF8);					\
 				outb(dev->bus->number, 0xCFA);
 
diff -u --recursive --new-file v2.3.21/linux/arch/i386/kernel/ptrace.c linux/arch/i386/kernel/ptrace.c
--- v2.3.21/linux/arch/i386/kernel/ptrace.c	Sun Jul 11 09:11:46 1999
+++ linux/arch/i386/kernel/ptrace.c	Tue Oct 12 10:05:53 1999
@@ -71,8 +71,6 @@
 	unsigned long regno, unsigned long value)
 {
 	switch (regno >> 2) {
-		case ORIG_EAX:
-			return -EIO;
 		case FS:
 			if (value && (value & 3) != 3)
 				return -EIO;
diff -u --recursive --new-file v2.3.21/linux/arch/i386/kernel/setup.c linux/arch/i386/kernel/setup.c
--- v2.3.21/linux/arch/i386/kernel/setup.c	Mon Oct  4 15:49:29 1999
+++ linux/arch/i386/kernel/setup.c	Fri Oct 15 11:49:37 1999
@@ -25,6 +25,10 @@
  *
  *  Memory region support
  *	David Parsons <orc@pell.chi.il.us>, July-August 1999
+ *
+ *  Cleaned up cache-detection code
+ *	Dave Jones <dave@powertweak.com>, October 1999
+ *
  */
 
 /*
@@ -462,7 +466,7 @@
 
 void __init setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * memory_end_p)
 {
-	unsigned long memory_start, memory_end;
+	unsigned long high_pfn, max_pfn;
 	char c = ' ', *to = command_line, *from = COMMAND_LINE;
 	int len = 0;
 	int i;
@@ -493,7 +497,6 @@
 
 	if (!MOUNT_ROOT_RDONLY)
 		root_mountflags &= ~MS_RDONLY;
-	memory_start = (unsigned long) &_end;
 	init_mm.start_code = (unsigned long) &_text;
 	init_mm.end_code = (unsigned long) &_etext;
 	init_mm.end_data = (unsigned long) &_edata;
@@ -557,51 +560,53 @@
 	*to = '\0';
 	*cmdline_p = command_line;
 
-#define VMALLOC_RESERVE	(128 << 20)	/* 128MB for vmalloc and initrd */
-#define MAXMEM	((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE))
-
-	memory_end = 0;
+	/* Find the highest page frame number we have available */
+	max_pfn = 0;
 	for (i=0; i < e820.nr_map; i++) {
 		/* RAM? */
 		if (e820.map[i].type == E820_RAM) {
-			unsigned long end = e820.map[i].addr + e820.map[i].size;
+			unsigned long end_pfn = (e820.map[i].addr + e820.map[i].size) >> PAGE_SHIFT;
 
-			if (end > memory_end)
-				memory_end = end;
+			if (end_pfn > max_pfn)
+				max_pfn = end_pfn;
 		}
 	}
-	memory_end &= PAGE_MASK;
-	ram_resources[1].end = memory_end-1;
 
+/*
+ * We can only allocate a limited amount of direct-mapped memory
+ */
+#define VMALLOC_RESERVE	(128 << 20)	/* 128MB for vmalloc and initrd */
+#define MAXMEM		((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE))
+#define MAXMEM_PFN	(MAXMEM >> PAGE_SHIFT)
+
+	high_pfn = MAXMEM_PFN;
+	if (max_pfn < high_pfn)
+		high_pfn = max_pfn;
+
+/*
+ * But the bigmem stuff may be able to use more of it
+ * (but currently only up to about 4GB)
+ */
 #ifdef CONFIG_BIGMEM
-	bigmem_start = bigmem_end = memory_end;
-#endif
-	if (memory_end > MAXMEM)
-	{
-#ifdef CONFIG_BIGMEM
-#define MAXBIGMEM ((unsigned long)(~(VMALLOC_RESERVE-1)))
-		bigmem_start = MAXMEM;
-		bigmem_end = (memory_end < MAXBIGMEM) ? memory_end : MAXBIGMEM;
-#endif
-		memory_end = MAXMEM;
-#ifdef CONFIG_BIGMEM
-		printk(KERN_NOTICE "%ldMB BIGMEM available.\n",
-			(bigmem_end-bigmem_start)>>20);
-#else
-		printk(KERN_WARNING "Warning only %ldMB will be used.\n",
-			MAXMEM>>20);
+	#define MAXBIGMEM	((unsigned long)(~(VMALLOC_RESERVE-1)))
+	#define MAXBIGMEM_PFN	(MAXBIGMEM >> PAGE_SHIFT)
+	if (max_pfn > MAX_PFN)
+		max_pfn = MAX_PFN;
+
+/* When debugging, make half of "normal" memory be BIGMEM memory instead */
+#ifdef BIGMEM_DEBUG
+	high_pfn >>= 1;
 #endif
-	}
-#if defined(CONFIG_BIGMEM) && defined(BIGMEM_DEBUG)
-	else {
-		memory_end -= memory_end/4;
-		bigmem_start = memory_end;
-	}
+
+	bigmem_start = high_pfn << PAGE_SHIFT;
+	bigmem_end = max_pfn << PAGE_SHIFT;
+	printk(KERN_NOTICE "%ldMB BIGMEM available.\n", (bigmem_end-bigmem_start) >> 20);
 #endif
 
-	memory_end += PAGE_OFFSET;
-	*memory_start_p = memory_start;
-	*memory_end_p = memory_end;
+	ram_resources[1].end = (high_pfn << PAGE_SHIFT)-1;
+
+	*memory_start_p = (unsigned long) &_end;
+	*memory_end_p = PAGE_OFFSET + (high_pfn << PAGE_SHIFT);
 
 #ifdef __SMP__
 	/*
@@ -876,6 +881,15 @@
 		 *	on the MediaGX. So we turn it off for now. 
 		 */
 		
+#ifdef CONFIG_PCI
+		/* It isnt really a PCI quirk directly, but the cure is the
+		   same. The MediaGX has deep magic SMM stuff that handles the
+		   SB emulation. It thows away the fifo on disable_dma() which
+		   is wrong and ruins the audio. */
+		
+		printk(KERN_INFO "Working around Cyrix MediaGX virtual DMA bug.\n");
+		isa_dma_bridge_buggy = 1;
+#endif		
 		/* GXm supports extended cpuid levels 'ala' AMD */
 		if (c->cpuid_level == 2) {
 			get_model_name(c);  /* get CPU marketing name */
@@ -888,15 +902,6 @@
 			c->x86_model = (dir1 & 0x20) ? 1 : 2;
 			c->x86_capability&=~X86_FEATURE_TSC;
 		}
-#ifdef CONFIG_PCI
-		/* It isnt really a PCI quirk directly, but the cure is the
-		   same. The MediaGX has deep magic SMM stuff that handles the
-		   SB emulation. It thows away the fifo on disable_dma() which
-		   is wrong and ruins the audio. */
-		
-		printk(KERN_INFO "Working around Cyrix MediaGX virtual DMA bug.\n");
-		isa_dma_bridge_buggy = 1;
-#endif		
 		break;
 
         case 5: /* 6x86MX/M II */
@@ -1129,49 +1134,47 @@
 		}
 	}
 
-	for (i = 0; i < sizeof(cpu_models)/sizeof(struct cpu_model_info); i++) {
-		if (c->cpuid_level > 1) {
-			/* supports eax=2  call */
-			int edx, cache_size, dummy;
-			
-			cpuid(2, &dummy, &dummy, &dummy, &edx);
-
-			/* We need only the LSB */
-			edx &= 0xff;
-
-			switch (edx) {
-				case 0x40:
-					cache_size = 0;
-					break;
-
-				case 0x41:
-					cache_size = 128;
-					break;
+	if (c->cpuid_level > 1) {
+		/* supports eax=2  call */
+		int edx, dummy;
+
+		cpuid(2, &dummy, &dummy, &dummy, &edx);
+
+		/* We need only the LSB */
+		edx &= 0xff;
+
+		switch (edx) {
+			case 0x40:
+				c->x86_cache_size = 0;
+				break;
 
-				case 0x42:
-					cache_size = 256;
-					break;
+			case 0x41:
+				c->x86_cache_size = 128;
+				break;
 
-				case 0x43:
-					cache_size = 512;
-					break;
+			case 0x42:
+				c->x86_cache_size = 256;
+				break;
 
-				case 0x44:
-					cache_size = 1024;
-					break;
+			case 0x43:
+				c->x86_cache_size = 512;
+				break;
 
-				case 0x45:
-					cache_size = 2048;
-					break;
+			case 0x44:
+				c->x86_cache_size = 1024;
+				break;
 
-				default:
-					cache_size = 0;
-					break;
-			}
+			case 0x45:
+				c->x86_cache_size = 2048;
+				break;
 
-			c->x86_cache_size = cache_size; 
+			default:
+				c->x86_cache_size = 0;
+				break;
 		}
+	}
 
+	for (i = 0; i < sizeof(cpu_models)/sizeof(struct cpu_model_info); i++) {
 		if (cpu_models[i].vendor == c->x86_vendor &&
 		    cpu_models[i].x86 == c->x86) {
 			if (c->x86_model <= 16)
diff -u --recursive --new-file v2.3.21/linux/arch/i386/mm/init.c linux/arch/i386/mm/init.c
--- v2.3.21/linux/arch/i386/mm/init.c	Mon Oct  4 15:49:29 1999
+++ linux/arch/i386/mm/init.c	Thu Oct 14 13:17:03 1999
@@ -367,6 +367,22 @@
 		printk(".\n");
 }
 
+static void __init mem_init_region(unsigned long pfn, unsigned long count, unsigned long start_mem_pfn)
+{
+	printk("memory region: %luk @ %08lx000\n", count << 2, pfn);
+
+	do {
+		if (pfn >= max_mapnr)
+			break;
+
+		/* Avoid the kernel mapping between HIGH_MEMORY and "start_mem".. */
+		if (pfn < (HIGH_MEMORY >> PAGE_SHIFT) || pfn >= start_mem_pfn)
+			clear_bit(PG_reserved, &mem_map[pfn].flags);
+
+		pfn++;
+	} while (--count > 0);
+}
+
 void __init mem_init(unsigned long start_mem, unsigned long end_mem)
 {
 	unsigned long start_low_mem = PAGE_SIZE;
@@ -412,45 +428,22 @@
 	/* walk the whitelist, unreserving good memory
 	 */
 	for (avail = i = 0; i < e820.nr_map; i++) {
-		unsigned long addr, end, size;
+		unsigned long start_pfn, end_pfn;
 
 		if (e820.map[i].type != E820_RAM)	/* not usable memory */
 			continue;
-		addr = e820.map[i].addr;
-		size = e820.map[i].size;
 
-		/* Silently ignore memory regions starting above 4gb */
-		if (addr != e820.map[i].addr)
-			continue;
+		start_pfn = (e820.map[i].addr + PAGE_SIZE - 1) >> PAGE_SHIFT;
+		end_pfn = (e820.map[i].addr + e820.map[i].size) >> PAGE_SHIFT;
 
-		printk("memory region: %luk @ %08lx\n", size >> 10, addr );
+		/* We have a certain amount of low memory reserved */
+		if (start_pfn < MAP_NR(start_low_mem))
+			start_pfn = MAP_NR(start_low_mem);
 
-		/* Make sure we don't get fractional pages */
-		end = PAGE_OFFSET + ((addr + size) & PAGE_MASK);
-		addr= PAGE_OFFSET + PAGE_ALIGN(addr);
-
-		for ( ; addr < end; addr += PAGE_SIZE) {
-
-			/* this little bit of grossness is for dealing
-			 * with memory borrowing for system bookkeeping
-			 * (smp stacks, zero page, kernel code, etc)
-			 * without having to go back and edit the e820
-			 * map to compensate.
-			 *
-			 * if we're in low memory (<1024k), we need to
-			 * avoid the smp stack and zero page.
-			 * if we're in high memory, we need to avoid
-			 * the kernel code.
-			 * in any case, we don't want to hack mem_map
-			 * entries above end_mem.
-			 */
-			if ( (addr < start_low_mem)
-			  || (addr >= (HIGH_MEMORY + PAGE_OFFSET)&& addr <= start_mem)
-			  || (addr > end_mem) )
-				continue;
+		if (end_pfn <= start_pfn)
+			continue;
 
-			clear_bit(PG_reserved, &mem_map[MAP_NR(addr)].flags);
-		}
+		mem_init_region(start_pfn, end_pfn - start_pfn, MAP_NR(start_mem));
 	}
 
 	for (tmp = PAGE_OFFSET ; tmp < end_mem ; tmp += PAGE_SIZE) {
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/Makefile linux/arch/ppc/Makefile
--- v2.3.21/linux/arch/ppc/Makefile	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/Makefile	Tue Oct 12 10:00:58 1999
@@ -88,6 +88,7 @@
 	@$(MAKECHRPBOOT) $@
 
 znetboot: $(CHECKS) vmlinux
+ifdef CONFIG_ALL_PPC
 ifdef CONFIG_SMP
 ifdef CONFIG_PPC64
 	cp -f vmlinux /tftpboot/vmlinux.smp.64
@@ -99,6 +100,7 @@
 	cp -f vmlinux /tftpboot/vmlinux.64
 else
 	cp -f vmlinux /tftpboot/vmlinux
+endif
 endif
 endif
 	@$(MAKECOFFBOOT) $@
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/boot/Makefile linux/arch/ppc/boot/Makefile
--- v2.3.21/linux/arch/ppc/boot/Makefile	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/boot/Makefile	Tue Oct 12 10:00:58 1999
@@ -35,6 +35,12 @@
 TFTPIMAGE=/tftpboot/zImage.prep$(MSIZE)
 endif
 
+ifeq ($(CONFIG_SMP),y)
+TFTPSIMAGE=/tftpboot/sImage.smp
+else
+TFTPSIMAGE=/tftpboot/sImage
+endif
+
 ifeq ($(CONFIG_PPC64),y)
 MSIZE=.64
 else
@@ -121,7 +127,7 @@
 	cp zImage $(TFTPIMAGE)
 endif
 ifdef CONFIG_GEMINI
-	cp sImage /tftpboot/
+	cp sImage $(TFTPSIMAGE)
 endif
 
 znetboot.initrd : zImage.initrd
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/config.in linux/arch/ppc/config.in
--- v2.3.21/linux/arch/ppc/config.in	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/config.in	Tue Oct 12 10:00:58 1999
@@ -82,6 +82,8 @@
 define_bool CONFIG_KERNEL_ELF y
 tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
 
+source drivers/pcmcia/Config.in
+
 source drivers/parport/Config.in
 
 if [ "$CONFIG_8xx" != "y" ]; then
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/Makefile linux/arch/ppc/kernel/Makefile
--- v2.3.21/linux/arch/ppc/kernel/Makefile	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/Makefile	Tue Oct 12 10:00:58 1999
@@ -14,7 +14,7 @@
 OX_OBJS := ppc_ksyms.o setup.o
 KHEAD := head.o
 
-ifdef CONFIG_PPC_ALL
+ifdef CONFIG_ALL_PPC
 CONFIG_PMAC=y
 CONFIG_PREP=y
 CONFIG_CHRP=y
@@ -65,10 +65,13 @@
 else
 ifneq ($(CONFIG_8xx),y)
 O_OBJS += chrp_setup.o chrp_pci.o chrp_time.o \
-	  pmac_time.o pmac_support.o pmac_pci.o pmac_setup.o \
+	  pmac_time.o pmac_pci.o pmac_setup.o \
 	  prom.o open_pic.o feature.o \
 	  i8259.o pmac_pic.o indirect_pci.o \
 	  gemini_pci.o gemini_prom.o gemini_setup.o
+ifeq ($(CONFIG_NVRAM),y)
+O_OBJS += pmac_support.o
+endif
 
 ifeq ($(CONFIG_PREP), y)
 O_OBJS += prep_pci.o prep_setup.o prep_nvram.o prep_time.o residual.o
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/chrp_setup.c linux/arch/ppc/kernel/chrp_setup.c
--- v2.3.21/linux/arch/ppc/kernel/chrp_setup.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/chrp_setup.c	Tue Oct 12 10:00:58 1999
@@ -498,7 +498,9 @@
 void __init
 chrp_init2(void)
 {
+#ifdef CONFIG_NVRAM  
 	pmac_nvram_init();
+#endif
 }
 
 #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
@@ -599,12 +601,6 @@
 		hw->irq = chrp_ide_irq;
 }
 
-#if defined(CONFIG_BLK_DEV_IDE_MODULE)
-EXPORT_SYMBOL(chrp_ide_irq);
-EXPORT_SYMBOL(chrp_ide_ports_known);
-EXPORT_SYMBOL(chrp_ide_regbase);
-EXPORT_SYMBOL(chrp_ide_probe);
-#endif
 #endif
 
 void __init
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/hashtable.S linux/arch/ppc/kernel/hashtable.S
--- v2.3.21/linux/arch/ppc/kernel/hashtable.S	Fri Sep 10 23:57:28 1999
+++ linux/arch/ppc/kernel/hashtable.S	Tue Oct 12 10:00:58 1999
@@ -1,7 +1,7 @@
 /*
  *  arch/ppc/kernel/hashtable.S
  *
- *  $Id: hashtable.S,v 1.3 1999/09/05 11:56:27 paulus Exp $
+ *  $Id: hashtable.S,v 1.6 1999/10/08 01:56:15 paulus Exp $
  *
  *  PowerPC version 
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
@@ -35,7 +35,7 @@
  * _PAGE_RW (2) if a write.  r20 contains DSISR or SRR1,
  * so bit 1 (0x40000000) is set if the exception was due
  * to no matching PTE being found in the hash table.
- * r5 contains the physical address of the current task's thread.
+ * SPRG3 contains the physical address of the current task's thread.
  *
  * Returns to the caller if the access is illegal or there is no
  * mapping for the address.  Otherwise it places an appropriate PTE
@@ -53,12 +53,14 @@
 	.globl	hash_page
 hash_page:
 #ifdef __SMP__
+	SAVE_2GPRS(7,r21)
 	eieio
 	lis	r2,hash_table_lock@h
 	ori	r2,r2,hash_table_lock@l
  	tophys(r2,r2)
-	lis	r6,100000000@h
+	lis	r6,0x0fff0000@h
 	mtctr	r6
+	mfspr	r5,SPRG3
 	lwz	r0,PROCESSOR-THREAD(r5)
 	or	r0,r0,r6
 10:	lwarx	r6,0,r2
@@ -66,10 +68,18 @@
 	bne-	12f
 	stwcx.	r0,0,r2
 	beq+	11f
-12:	cmpw	r6,r0
+	/* spin here a bit */
+12:	mfctr	r7
+	li	r8,1000
+	mtctr	r8
+13:
+	bdnz	13b
+	mtctr	r7
+	cmpw	r6,r0
 	bdnzf	2,10b
 	tw	31,31,31
 11:	eieio
+	REST_2GPRS(7, r21)
 #endif
 	/* Get PTE (linux-style) and check access */
 	mfspr	r2,SPRG3		/* current task's THREAD (phys) */
@@ -182,7 +192,7 @@
 10:	mtctr	r2
 	addi	r3,r4,-8		/* search primary PTEG */
 1:	lwzu	r0,8(r3)		/* get next PTE */
-	srwi.	r0,r0,31		/* only want to check valid bit */
+	rlwinm.	r0,r0,0,0,0		/* only want to check valid bit */
 	bdnzf	2,1b			/* loop while ctr != 0 && !cr0.eq */
 	beq+	found_empty
 
@@ -195,7 +205,7 @@
 	addi	r3,r3,-8
 	mtctr	r2
 2:	lwzu	r0,8(r3)
-	srwi.	r0,r0,31		/* only want to check valid bit */
+	rlwinm.	r0,r0,0,0,0		/* only want to check valid bit */
 	bdnzf	2,2b
 	beq+	found_empty
 
@@ -209,19 +219,20 @@
 	 * put the PTE in the primary PTEG.
 	 */
 	xori	r5,r5,0x40		/* clear H bit again */
-	lwz	r2,next_slot@l(0)
+	lis	r3,next_slot@ha
+	tophys(r3,r3)
+	lwz	r2,next_slot@l(r3)
 	addi	r2,r2,8
 	andi.	r2,r2,0x38
-	stw	r2,next_slot@l(0)
+	stw	r2,next_slot@l(r3)
 	add	r3,r4,r2
 11:		
 	/* update counter of evicted pages */
-	lis	r2,htab_evicts@h
-	ori	r2,r2,htab_evicts@l
+	lis	r2,htab_evicts@ha
 	tophys(r2,r2)
-	lwz	r4,0(r2)
+	lwz	r4,htab_evicts@l(r2)
 	addi	r4,r4,1
-	stw	r4,0(r2)
+	stw	r4,htab_evicts@l(r2)
 
 #ifndef __SMP__
 	/* Store PTE in PTEG */
@@ -271,12 +282,11 @@
  * update the htab misses count
  *   -- Cort
  */
-	lis	r2,htab_reloads@h
-	ori	r2,r2,htab_reloads@l
+	lis	r2,htab_reloads@ha
 	tophys(r2,r2)
-	lwz	r3,0(r2)
+	lwz	r3,htab_reloads@l(r2)
 	addi	r3,r3,1
-	stw	r3,0(r2)
+	stw	r3,htab_reloads@l(r2)
 
 #ifdef __SMP__
 	lis	r2,hash_table_lock@ha
@@ -322,13 +332,13 @@
 	.globl	hash_table_lock
 hash_table_lock:
 	.long	0
-	.text
 #endif /* __SMP__ */
 
-/* next_slot is assumed to be within the first 32kB of physical RAM */
+	.data
 next_slot:
 	.long	0
 
+	.text
 /*
  * Flush entries from the hash table with VSIDs in the range
  * given.
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/head.S linux/arch/ppc/kernel/head.S
--- v2.3.21/linux/arch/ppc/kernel/head.S	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/head.S	Tue Oct 12 10:00:58 1999
@@ -1,7 +1,7 @@
 /*
  *  arch/ppc/kernel/head.S
  *
- *  $Id: head.S,v 1.147 1999/09/15 23:58:53 cort Exp $
+ *  $Id: head.S,v 1.154 1999/10/12 00:33:31 cort Exp $
  *
  *  PowerPC version 
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
@@ -51,6 +51,10 @@
 	
 /* 601 only have IBAT; cr0.eq is set on 601 when using this macro */
 #define LOAD_BAT(n, reg, RA, RB)	\
+	/* see the comment for clear_bats() -- Cort */ \
+	li	RA,0;			\
+	mtspr	IBAT##n##U,RA;		\
+	mtspr	DBAT##n##U,RA;		\
 	lwz	RA,(n*16)+0(reg);	\
 	lwz	RB,(n*16)+4(reg);	\
 	mtspr	IBAT##n##U,RA;		\
@@ -150,7 +154,7 @@
  */
 	mr	r4,r30
 	bl	fix_mem_constants
-#endif
+#endif /* CONFIG_APUS */
 
 /*
  * Use the first pair of BAT registers to map the 1st 16MB
@@ -158,7 +162,7 @@
  * call OF any more.
  */
 	lis	r11,KERNELBASE@h
-#ifndef CONFIG_PPC64xxx
+#ifndef CONFIG_PPC64
 	mfspr	r9,PVR
 	rlwinm	r9,r9,16,16,31		/* r9 = 1 for 601, 4 for 604 */
 	cmpi	0,r9,1
@@ -173,10 +177,19 @@
 	mtspr	IBAT1L,r10
 	b	5f
 #endif /* CONFIG_PPC64 */
-4:
-	tophys(r8,r11)
+
+4:	tophys(r8,r11)
+#ifdef __SMP__
+	ori	r8,r8,0x12		/* R/W access, M=1 */
+#else
 	ori	r8,r8,2			/* R/W access */
+#endif /* __SMP__ */
+#ifdef CONFIG_APUS
+	ori	r11,r11,BL_8M<<2|0x2	/* set up 8MB BAT registers for 604 */
+#else
 	ori	r11,r11,BL_256M<<2|0x2	/* set up BAT registers for 604 */
+#endif /* CONFIG_APUS */
+	
 #ifdef CONFIG_PPC64
 	/* clear out the high 32 bits in the BAT */
 	clrldi	r11,r11,32
@@ -185,32 +198,14 @@
 	clrldi	r16,r16,63
 	mtsdr1	r16
 #else /* CONFIG_PPC64 */
-	/* 
-	 * allow secondary cpus to get at all of ram in early bootup
-	 * since their init_task may be up there -- Cort
+	/*
+	 * If the MMU is off clear the bats.  See clear_bat() -- Cort
 	 */
-#if 0
-	oris	r18,r8,0x10000000@h
-	oris	r21,r11,(KERNELBASE+0x10000000)@h
-#else
-	lis	r18,0x9000
-	ori	r18,r18,0x12
-	lis	r21,0x9000
-	ori	r21,r21,0x7fe
-#endif
-	mtspr	DBAT1L,r18		/* N.B. 6xx (not 601) have valid */
-	mtspr	DBAT1U,r21		/* bit in upper BAT register */
-	mtspr	IBAT1L,r18
-	mtspr	IBAT1U,r21
-
-#if 0	/* for now, otherwise we overflow the 0x100 bytes we have here */
-	oris	r18,r8,0x20000000@h
-	oris	r21,r11,(KERNELBASE+0x20000000)@h
-	mtspr	DBAT2L,r18		/* N.B. 6xx (not 601) have valid */
-	mtspr	DBAT2U,r21		/* bit in upper BAT register */
-	mtspr	IBAT2L,r18
-	mtspr	IBAT2U,r21
-#endif /* 0 */
+	mfmsr	r20
+	andi.	r20,r20,MSR_DR
+	bne	100f
+	bl	clear_bats
+100:
 #endif /* CONFIG_PPC64 */
 	mtspr	DBAT0L,r8		/* N.B. 6xx (not 601) have valid */
 	mtspr	DBAT0U,r11		/* bit in upper BAT register */
@@ -218,27 +213,7 @@
 	mtspr	IBAT0U,r11
 5:	isync
 
-#ifdef CONFIG_APUS
-	/* Unfortunately the APUS specific instructions bloat the
-	 * code so it cannot fit in the 0x100 bytes available. We have
-	 * to do it the crude way. */
-
-	/* Map 0xfff00000 so we can access VTOP/PTOV constant when
-	   MMU is enabled. */
-	lis	r8,0xfff0
-	ori	r11,r8,0x2		/* r/w */
-	ori	r8,r8,0x2		/* 128KB, supervisor */
-	mtspr	DBAT3U,r8
-	mtspr	DBAT3L,r11
-	
-	/* Copy exception code to exception vector base. */
-	lis	r3,KERNELBASE@h
-	tophys(r4,r3)
-	lis	r3,0xfff0		/* Copy to 0xfff00000 on APUS */
-	li	r5,0x4000		/* # bytes of memory to copy */
-	li	r6,0
-	bl	copy_and_flush		/* copy the first 0x4000 bytes */
-#else /* CONFIG_APUS */
+#ifndef CONFIG_APUS
 /*
  * We need to run with _start at physical address 0.
  * On CHRP, we are loaded at 0x10000 since OF on CHRP uses
@@ -267,7 +242,6 @@
  * this shouldn't bother the pmac since it just gets turned on again
  * as we jump to our code at KERNELBASE. -- Cort
  */
-
 turn_on_mmu:
 	mfmsr	r0
 	ori	r0,r0,MSR_DR|MSR_IR
@@ -335,7 +309,8 @@
 /* System reset */
 #ifdef CONFIG_SMP /* MVME/MTX and gemini start the secondary here */
 #ifdef CONFIG_GEMINI
-	STD_EXCEPTION(0x100, Reset, __secondary_start_gemini)
+	. = 0x100
+	b	__secondary_start_gemini
 #else /* CONFIG_GEMINI */
 	STD_EXCEPTION(0x100, Reset, __secondary_start_psurge)
 #endif /* CONFIG_GEMINI */
@@ -356,7 +331,6 @@
 	mfspr	r3,DAR			/* into the hash table */
 	rlwinm	r4,r23,32-13,30,30	/* MSR_PR -> _PAGE_USER */
 	rlwimi	r4,r20,32-23,29,29	/* DSISR_STORE -> _PAGE_RW */
-	mfspr	r5,SPRG3		/* phys addr of THREAD */
 	bl	hash_page
 1:	stw	r20,_DSISR(r21)
 	mr	r5,r20
@@ -378,7 +352,6 @@
 	mr	r3,r22			/* into the hash table */
 	rlwinm	r4,r23,32-13,30,30	/* MSR_PR -> _PAGE_USER */
 	mr	r20,r23			/* SRR1 has reason bits */
-	mfspr	r5,SPRG3		/* phys addr of THREAD */
 	bl	hash_page
 1:	addi	r3,r1,STACK_FRAME_OVERHEAD
 	mr	r4,r22
@@ -392,35 +365,8 @@
 /* External interrupt */
 	. = 0x500;
 HardwareInterrupt:
+#ifndef CONFIG_APUS
 	EXCEPTION_PROLOG;
-#ifdef CONFIG_APUS
-	/* This is horrible, but there's no way around it. Enable the
-	data cache so the IRQ hardware register can be accessed
-	without cache intervention. Then disable interrupts and get
-	the current emulated m68k IPL value. */
-	
-	mfmsr	20
-	xori	r20,r20,MSR_DR
-	sync
-	mtmsr	r20
-	sync
-
-	lis	r3,APUS_IPL_EMU@h
-
-	li	r20,(IPLEMU_SETRESET|IPLEMU_DISABLEINT)
-	stb	r20,APUS_IPL_EMU@l(r3)
-	eieio
-
-	lbz	r3,APUS_IPL_EMU@l(r3)
-
-	mfmsr	r20
-	xori	r20,r20,MSR_DR
-	sync
-	mtmsr	r20
-	sync
-
-	stw	r3,(_CCR+4)(r21);
-#endif
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 	li	r20,MSR_KERNEL
 	li	r4,0
@@ -429,7 +375,12 @@
 do_IRQ_intercept:
 	.long	do_IRQ;
 	.long	ret_from_except
-	
+#else
+ 	EXCEPTION_PROLOG;
+ 	addi	r3,r1,STACK_FRAME_OVERHEAD
+ 	li	r20,MSR_KERNEL
+	bl	apus_interrupt_entry
+#endif /* CONFIG_APUS */
 
 /* Alignment exception */
 	. = 0x600
@@ -723,8 +674,6 @@
 	.globl	transfer_to_handler
 transfer_to_handler:
 	stw	r22,_NIP(r21)
-	lis	r22,MSR_POW@h
-	andc	r23,r23,r22
 	stw	r23,_MSR(r21)
 	SAVE_GPR(7, r21)
 	SAVE_4GPRS(8, r21)
@@ -974,6 +923,19 @@
 	cmpw	r12,r13
 	bne     1b
 
+/*
+ * Map the memory where the exception handlers will
+ * be copied to when hash constants have been patched.  
+ */
+#ifdef CONFIG_APUS_FAST_EXCEPT
+	lis	r8,0xfff0
+#else
+	lis	r8,0
+#endif
+	ori	r8,r8,0x2		/* 128KB, supervisor */
+	mtspr	DBAT3U,r8
+	mtspr	DBAT3L,r8
+
 	lis	r12,__ptov_table_begin@h
 	ori	r12,r12,__ptov_table_begin@l
 	add	r12,r12,r10	         /* table begin phys address */
@@ -1026,11 +988,9 @@
 	mtlr	r5
 	mr	r24,r3			/* cpu # */
 	blr
-
+#ifdef CONFIG_GEMINI
 	.globl	__secondary_start_gemini
 __secondary_start_gemini:
-1011:	b	1011b
-	
         mfspr   r4,HID0
         ori     r4,r4,HID0_ICFI
         li      r3,0
@@ -1040,6 +1000,7 @@
         sync
         bl      prom_init
         b       __secondary_start
+#endif /* CONFIG_GEMINI */
 	
 	.globl	__secondary_start_psurge
 __secondary_start_psurge:
@@ -1281,3 +1242,44 @@
 	.globl	cmd_line
 cmd_line:
 	.space	512
+	
+/* 
+ * An undocumented "feature" of 604e requires that the v bit
+ * be cleared before changing BAT values.
+ *
+ * Also, newer IBM firmware does not clear bat3 and 4 so
+ * this makes sure it's done.
+ *  -- Cort 
+ */
+clear_bats:
+	mfmsr	r20
+	andi.	r19,r20,MSR_DR
+	beqlr
+	
+	li	r20,0
+	
+	mtspr	DBAT0U,r20
+	mtspr	DBAT0L,r20
+	mtspr	IBAT0U,r20
+	mtspr	IBAT0L,r20
+	sync
+	isync
+	
+	mtspr	DBAT1U,r20
+	mtspr	DBAT1L,r20
+	mtspr	IBAT1U,r20
+	mtspr	IBAT1L,r20
+	sync
+	isync	
+
+	mtspr	DBAT2U,r20
+	mtspr	DBAT2L,r20
+	mtspr	IBAT2U,r20
+	mtspr	IBAT2L,r20
+	
+	mtspr	DBAT3U,r20
+	mtspr	DBAT3L,r20
+	mtspr	IBAT3U,r20
+	mtspr	IBAT3L,r20
+	
+	blr
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/misc.S linux/arch/ppc/kernel/misc.S
--- v2.3.21/linux/arch/ppc/kernel/misc.S	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/misc.S	Tue Oct 12 10:00:58 1999
@@ -53,13 +53,29 @@
 
 /* void __no_use_restore_flags(unsigned long flags) */	
 _GLOBAL(__no_use_restore_flags)
-	andi.	r4,r3,MSR_EE
-	bne	10f
-	lis	r4,ppc_n_lost_interrupts@ha
-	lwz	r4,ppc_n_lost_interrupts@l(r4)
-	cmpi	0,r4,0		/* lost interrupts to process first? */
+/*
+ * Just set/clear the MSR_EE bit through restore/flags but do not
+ * change anything else.  This is needed by the RT system and makes
+ * sense anyway.
+ *    -- Cort
+ */
+	mfmsr 	r4
+	/* Copy all except the MSR_EE bit from r4 (current MSR value)
+	   to r3.  This is the sort of thing the rlwimi instruction is
+	   designed for.  -- paulus. */
+	rlwimi	r3,r4,0,17,15
+	 /* Check if things are setup the way we want _already_. */
+	cmpw	0,r3,r4
+	beqlr
+	/* are we enabling interrupts? */
+	rlwinm.	r0,r3,0,16,16
+	beq	1f
+	/* if so, check if there are any lost interrupts */
+	lis	r7,ppc_n_lost_interrupts@ha
+	lwz	r7,ppc_n_lost_interrupts@l(r7)
+	cmpi	0,r7,0		/* lost interrupts to process first? */
 	bne-	do_lost_interrupts
-10:	sync
+1:	sync
 	mtmsr	r3
 	isync
 	blr
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/pci.c linux/arch/ppc/kernel/pci.c
--- v2.3.21/linux/arch/ppc/kernel/pci.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/pci.c	Tue Oct 12 10:00:58 1999
@@ -92,7 +92,7 @@
 				struct resource *pr;
 				if (!r->start)
 					continue;
-				pr = pci_find_parent_resource(dev, r, 0);
+				pr = pci_find_parent_resource(dev, r);
 				if (!pr || request_resource(pr, r) < 0)
 				{
 					printk(KERN_ERR "PCI: Address space collision on region %d of device %s\n", idx, dev->name);
@@ -141,3 +141,8 @@
 	}
 }
 #endif
+
+int pcibios_assign_resource(struct pci_dev *pdev, int resource)
+{
+	return 0;
+}
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/pmac_setup.c linux/arch/ppc/kernel/pmac_setup.c
--- v2.3.21/linux/arch/ppc/kernel/pmac_setup.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/pmac_setup.c	Tue Oct 12 10:00:58 1999
@@ -371,11 +371,18 @@
 int boot_part;
 kdev_t boot_dev;
 
+extern void via_pmu_start(void);
+
 void __init
 pmac_init2(void)
 {
+#ifdef CONFIG_ADB_PMU
+	via_pmu_start();
+#endif
+#ifdef CONFIG_NVRAM  
 	pmac_nvram_init();
-#ifdef CONFIG_PMAC_PBOOK	
+#endif	
+#ifdef CONFIG_PMAC_PBOOK
 	media_bay_init();
 #endif	
 }
@@ -411,7 +418,7 @@
 }
 #endif
 
-#ifdef CONFIG_BLK_DEV_IDE_PMAC
+#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
 extern int pmac_ide_count;
 extern struct device_node *pmac_ide_node[];
 static int ide_majors[] = { 3, 22, 33, 34, 56, 57, 88, 89 };
@@ -441,7 +448,7 @@
 
 	return 0;
 }
-#endif /* CONFIG_BLK_DEV_IDE_PMAC */
+#endif /* CONFIG_BLK_DEV_IDE && CONFIG_BLK_DEV_IDE_PMAC */
 
 void __init find_boot_device(void)
 {
@@ -452,7 +459,7 @@
 			return;
 	}
 #endif
-#ifdef CONFIG_BLK_DEV_IDE_PMAC
+#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
 	boot_dev = find_ide_boot();
 #endif
 }
@@ -564,7 +571,7 @@
 ide_ioreg_t
 pmac_ide_default_io_base(int index)
 {
-#if defined(CONFIG_BLK_DEV_IDE_PMAC)
+#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
         return pmac_ide_regbase[index];
 #else
 	return 0;
@@ -602,7 +609,7 @@
         ppc_generic_ide_fix_driveid(id);
 }
 
-#if defined(CONFIG_BLK_DEV_IDE_PMAC)
+#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
 /* This is declared in drivers/block/ide-pmac.c */
 void pmac_ide_init_hwif_ports (hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq);
 #else
@@ -659,7 +666,7 @@
 #endif
 #endif
 
-#if defined(CONFIG_BLK_DEV_IDE_PMAC)
+#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
         ppc_ide_md.insw = pmac_ide_insw;
         ppc_ide_md.outsw = pmac_ide_outsw;
         ppc_ide_md.default_irq = pmac_ide_default_irq;
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/pmac_support.c linux/arch/ppc/kernel/pmac_support.c
--- v2.3.21/linux/arch/ppc/kernel/pmac_support.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/pmac_support.c	Tue Oct 12 10:00:58 1999
@@ -55,7 +55,6 @@
 	}
 }
 
-#ifdef CONFIG_NVRAM
 unsigned char nvram_read_byte(int addr)
 {
 	struct adb_request req;
@@ -101,4 +100,3 @@
 	}
 	eieio();
 }
-#endif /* CONFIG_NVRAM */
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/ppc_ksyms.c linux/arch/ppc/kernel/ppc_ksyms.c
--- v2.3.21/linux/arch/ppc/kernel/ppc_ksyms.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/ppc_ksyms.c	Tue Oct 12 10:00:58 1999
@@ -34,6 +34,7 @@
 #ifdef __SMP__
 #include <asm/smplock.h>
 #endif /* __SMP__ */
+#include "time.h"
 
 /* Tell string.h we don't want memcpy etc. as cpp defines */
 #define EXPORT_SYMTAB_STROPS
@@ -134,7 +135,7 @@
 EXPORT_SYMBOL(__copy_tofrom_user);
 EXPORT_SYMBOL(__clear_user);
 EXPORT_SYMBOL(__strncpy_from_user);
-EXPORT_SYMBOL(strlen_user);
+EXPORT_SYMBOL(__strnlen_user);
 
 /*
 EXPORT_SYMBOL(inb);
@@ -162,6 +163,12 @@
 EXPORT_SYMBOL(ide_insw);
 EXPORT_SYMBOL(ide_outsw);
 EXPORT_SYMBOL(ppc_ide_md);
+#ifdef CONFIG_BLK_DEV_IDE_MODULE
+EXPORT_SYMBOL(chrp_ide_irq);
+EXPORT_SYMBOL(chrp_ide_ports_known);
+EXPORT_SYMBOL(chrp_ide_regbase);
+EXPORT_SYMBOL(chrp_ide_probe);
+#endif
 
 EXPORT_SYMBOL(start_thread);
 EXPORT_SYMBOL(kernel_thread);
@@ -257,3 +264,6 @@
 extern unsigned long do_IRQ_intercept;
 EXPORT_SYMBOL(do_IRQ_intercept);
 EXPORT_SYMBOL(irq_desc);
+void ppc_irq_dispatch_handler(struct pt_regs *, int);
+EXPORT_SYMBOL(ppc_irq_dispatch_handler);
+EXPORT_SYMBOL(decrementer_count);
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/prom.c linux/arch/ppc/kernel/prom.c
--- v2.3.21/linux/arch/ppc/kernel/prom.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/prom.c	Tue Oct 12 10:00:58 1999
@@ -1,5 +1,5 @@
 /*
- * $Id: prom.c,v 1.77 1999/09/14 01:13:19 cort Exp $
+ * $Id: prom.c,v 1.79 1999/10/08 01:56:32 paulus Exp $
  *
  * Procedures for interfacing to the Open Firmware PROM on
  * Power Macintosh computers.
@@ -147,6 +147,7 @@
 
 extern char cmd_line[512];	/* XXX */
 boot_infos_t *boot_infos = 0;	/* init it so it's in data segment not bss */
+unsigned long dev_tree_size;
 
 /*
  * prom_init() is called very early on, before the kernel text
@@ -557,7 +558,7 @@
 		else
 			prom_print(RELOC("...failed\n"));
 	}
-#endif	
+#endif
 }
 
 /*
@@ -754,8 +755,7 @@
 	unsigned long mem = (unsigned long) klimit;
 
 	mem = finish_node(allnodes, mem, NULL);
-	printk(KERN_INFO "device tree used %lu bytes\n",
-	       mem - (unsigned long) allnodes);
+	dev_tree_size = mem - (unsigned long) allnodes;
 	klimit = (char *) mem;
 }
 
@@ -1494,6 +1494,7 @@
 drawchar(char c)
 {
 	unsigned long offset = reloc_offset();
+	int cline = 0, x;
 
 	switch (c) {
 	case '\b':
@@ -1509,6 +1510,7 @@
 	case '\n':
 		RELOC(g_loc_X) = 0;
 		RELOC(g_loc_Y)++;
+		cline = 1;
 		break;
 	default:
 		draw_byte(c, RELOC(g_loc_X)++, RELOC(g_loc_Y));
@@ -1516,11 +1518,23 @@
 	if (RELOC(g_loc_X) >= RELOC(g_max_loc_X)) {
 		RELOC(g_loc_X) = 0;
 		RELOC(g_loc_Y)++;
+		cline = 1;
 	}
+#if 0
 	while (RELOC(g_loc_Y) >= RELOC(g_max_loc_Y)) {
 		scrollscreen();
 		RELOC(g_loc_Y)--;
 	}
+#else
+	/* wrap around from bottom to top of screen so we don't
+	   waste time scrolling each line.  -- paulus. */
+	if (RELOC(g_loc_Y) >= RELOC(g_max_loc_Y))
+		RELOC(g_loc_Y) = 0;
+	if (cline) {
+		for (x = 0; x < RELOC(g_max_loc_X); ++x)
+			draw_byte(' ', x, RELOC(g_loc_Y));
+	}
+#endif
 }
 
 __pmac
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/residual.c linux/arch/ppc/kernel/residual.c
--- v2.3.21/linux/arch/ppc/kernel/residual.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/residual.c	Tue Oct 12 10:00:58 1999
@@ -1,5 +1,5 @@
 /*
- * $Id: residual.c,v 1.16 1999/09/17 17:23:09 cort Exp $
+ * $Id: residual.c,v 1.17 1999/09/27 18:40:23 cort Exp $
  *
  * Code to deal with the PReP residual data.
  *
@@ -41,12 +41,13 @@
 #include <linux/blk.h>
 #include <linux/ioport.h>
 #include <linux/pci.h>
+#include <linux/ide.h>
 
+#include <asm/init.h>
 #include <asm/mmu.h>
 #include <asm/processor.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
-#include <linux/ide.h>
 #include <asm/ide.h>
 
 
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/setup.c linux/arch/ppc/kernel/setup.c
--- v2.3.21/linux/arch/ppc/kernel/setup.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/setup.c	Tue Oct 12 10:00:58 1999
@@ -1,5 +1,5 @@
 /*
- * $Id: setup.c,v 1.159 1999/09/18 18:40:38 dmalek Exp $
+ * $Id: setup.c,v 1.160 1999/10/08 01:56:38 paulus Exp $
  * Common prep/pmac/chrp boot and setup code.
  */
 
@@ -489,6 +489,28 @@
         m8xx_init(r3, r4, r5, r6, r7);
 #endif
 
+	/* Look for mem= option on command line */
+	if (strstr(cmd_line, "mem=")) {
+		char *p, *q;
+		unsigned long maxmem = 0;
+		extern unsigned long __max_memory;
+
+		for (q = cmd_line; (p = strstr(q, "mem=")) != 0; ) {
+			q = p + 4;
+			if (p > cmd_line && p[-1] != ' ')
+				continue;
+			maxmem = simple_strtoul(q, &q, 0);
+			if (*q == 'k' || *q == 'K') {
+				maxmem <<= 10;
+				++q;
+			} else if (*q == 'm' || *q == 'M') {
+				maxmem <<= 20;
+				++q;
+			}
+		}
+		__max_memory = maxmem;
+	}
+	
 	/* this is for modules since _machine can be a define -- Cort */
 	ppc_md.ppc_machine = _machine;
 
@@ -533,7 +555,7 @@
 	if (strstr(cmd_line, "xmon"))
 		xmon(0);
 #endif /* CONFIG_XMON */
- 
+
 	/* reboot on panic */	
 	panic_timeout = 180;
 
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/kernel/traps.c linux/arch/ppc/kernel/traps.c
--- v2.3.21/linux/arch/ppc/kernel/traps.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/kernel/traps.c	Tue Oct 12 10:00:58 1999
@@ -101,30 +101,27 @@
 		}
 #endif
 		printk("Machine check in kernel mode.\n");
-		printk("Caused by (from msr): ");
-		printk("regs %p ",regs);
-		switch( regs->msr & 0x0000F000)
-		{
-		case (1<<12) :
-			printk("Machine check signal - probably due to mm fault\n"
-				"with mmu off\n");
+		printk("Caused by (from SRR1=%lx): ", regs->msr);
+		switch (regs->msr & 0xF0000) {
+		case 0x80000:
+			printk("Machine check signal\n");
 			break;
-		case (1<<13) :
+		case 0x40000:
 			printk("Transfer error ack signal\n");
 			break;
-		case (1<<14) :
-			printk("Data parity signal\n");
+		case 0x20000:
+			printk("Data parity error signal\n");
 			break;
-		case (1<<15) :
-			printk("Address parity signal\n");
+		case 0x10000:
+			printk("Address parity error signal\n");
 			break;
 		default:
 			printk("Unknown values in msr\n");
 		}
-		show_regs(regs);
 #if defined(CONFIG_XMON) || defined(CONFIG_KGDB)
 		debugger(regs);
 #endif
+		show_regs(regs);
 		print_backtrace((unsigned long *)regs->gpr[1]);
 		panic("machine check");
 	}
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/lib/string.S linux/arch/ppc/lib/string.S
--- v2.3.21/linux/arch/ppc/lib/string.S	Fri Apr 16 08:20:23 1999
+++ linux/arch/ppc/lib/string.S	Tue Oct 12 10:00:58 1999
@@ -380,16 +380,26 @@
 	.long	1b,99b
 .text
 
-	.globl	strlen_user
-strlen_user:
-	addi	r4,r3,-1
-1:	lbzu	r0,1(r4)
+/* r3 = str, r4 = len (> 0), r5 = top (highest addr) */
+	.globl	__strnlen_user
+__strnlen_user:
+	addi	r7,r3,-1
+	subf	r6,r7,r5	/* top+1 - str */
+	cmplw	0,r4,r6
+	bge	0f
+	mr	r6,r4
+0:	mtctr	r6		/* ctr = min(len, top - str) */
+1:	lbzu	r0,1(r7)	/* get next byte */
 	cmpwi	0,r0,0
-	bne	1b
-	subf	r3,r3,r4
-	addi	r3,r3,1
+	bdnzf	2,1b		/* loop if --ctr != 0 && byte != 0 */
+	addi	r7,r7,1
+	subf	r3,r3,r7	/* number of bytes we have looked at */
+	beqlr			/* return if we found a 0 byte */
+	cmpw	0,r3,r4		/* did we look at all len bytes? */
+	blt	99f		/* if not, must have hit top */
+	addi	r3,r4,1		/* return len + 1 to indicate no null found */
 	blr
-99:	li	r3,0
+99:	li	r3,0		/* bad address, return 0 */
 	blr
 .section __ex_table,"a"
 	.align	2
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/mm/init.c linux/arch/ppc/mm/init.c
--- v2.3.21/linux/arch/ppc/mm/init.c	Sat Oct  9 11:47:50 1999
+++ linux/arch/ppc/mm/init.c	Tue Oct 12 10:00:58 1999
@@ -1,5 +1,5 @@
 /*
- *  $Id: init.c,v 1.188 1999/09/18 18:40:44 dmalek Exp $
+ *  $Id: init.c,v 1.193 1999/10/11 18:50:35 geert Exp $
  *
  *  PowerPC version 
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
@@ -113,7 +113,9 @@
 static void remove_mem_piece(struct mem_pieces *, unsigned, unsigned, int);
 void *find_mem_piece(unsigned, unsigned);
 static void print_mem_pieces(struct mem_pieces *);
+#if defined(CONFIG_PREP) || defined(CONFIG_APUS) || defined(CONFIG_ALL_PPC)
 static void append_mem_piece(struct mem_pieces *, unsigned, unsigned);
+#endif
 
 extern struct task_struct *current_set[NR_CPUS];
 
@@ -182,6 +184,8 @@
  */
 int __map_without_bats = 0;
 
+/* max amount of RAM to use */
+unsigned long __max_memory;
 
 void __bad_pte(pmd_t *pmd)
 {
@@ -677,6 +681,7 @@
 	printk("\n");
 }
 
+#if defined(CONFIG_PREP) || defined(CONFIG_APUS) || defined(CONFIG_PPC_ALL)
 /*
  * Add some memory to an array of pieces
  */
@@ -691,6 +696,7 @@
 	rp->address = start;
 	rp->size = size;
 }
+#endif
 
 #ifndef CONFIG_8xx
 static void hash_init(void);
@@ -738,6 +744,7 @@
 	mp->n_regions = d;
 }
 
+#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) || defined(CONFIG_ALL_PPC)
 /*
  * Read in a property describing some pieces of memory.
  */
@@ -760,6 +767,7 @@
 	sort_mem_pieces(mp);
 	coalesce_mem_pieces(mp);
 }
+#endif /* CONFIG_PMAC || CONFIG_CHRP || CONFIG_ALL_PPC */
 
 /*
  * Set up one of the I/D BAT (block address translation) register pairs.
@@ -933,7 +941,7 @@
 	a = (unsigned long)(&START); \
 	for (; a < (unsigned long)(&END); a += PAGE_SIZE) { \
 	  	clear_bit(PG_reserved, &mem_map[MAP_NR(a)].flags); \
-		atomic_set(&mem_map[MAP_NR(a)].count, 1); \
+		set_page_count(mem_map+MAP_NR(a), 1); \
 		free_page(a); \
 		CNT++; \
 	} \
@@ -1005,8 +1013,10 @@
 	else if (_machine == _MACH_apus )
 		end_of_DRAM = apus_find_end_of_memory();
 #endif
+#ifdef CONFIG_GEMINI	
 	else if ( _machine == _MACH_gemini )
 		end_of_DRAM = gemini_find_end_of_memory();
+#endif /* CONFIG_GEMINI	*/
 	else /* prep */
 		end_of_DRAM = prep_find_end_of_memory();
 
@@ -1037,14 +1047,16 @@
 		setbat(3, 0x90000000, 0x90000000, 0x10000000, IO_PAGE);
 		break;
 	case _MACH_Pmac:
+#if 0
 		{
 			unsigned long base = 0xf3000000;
 			struct device_node *macio = find_devices("mac-io");
 			if (macio && macio->n_addrs)
 				base = macio->addrs[0].address;
 			setbat(0, base, base, 0x100000, IO_PAGE);
-			ioremap_base = 0xf0000000;
 		}
+#endif
+		ioremap_base = 0xf0000000;
 		break;
 	case _MACH_apus:
 		/* Map PPC exception vectors. */
@@ -1172,17 +1184,13 @@
 	remove_mem_piece(&phys_avail, __pa(avail_start),
 			 start_mem - avail_start, 1);
 
-	for (addr = PAGE_OFFSET; addr < end_mem; addr += PAGE_SIZE)
-		set_bit(PG_reserved, &mem_map[MAP_NR(addr)].flags);
-
 	for (i = 0; i < phys_avail.n_regions; ++i) {
 		a = (unsigned long) __va(phys_avail.regions[i].address);
-		lim = a + phys_avail.regions[i].size;
+		lim = (a + phys_avail.regions[i].size) & PAGE_MASK;
 		a = PAGE_ALIGN(a);
 		for (; a < lim; a += PAGE_SIZE)
 			clear_bit(PG_reserved, &mem_map[MAP_NR(a)].flags);
 	}
-	phys_avail.n_regions = 0;
 
 #ifdef CONFIG_BLK_DEV_INITRD
 	/* if we are booted from BootX with an initial ramdisk,
@@ -1196,7 +1204,7 @@
 	/* free the prom's memory - no-op on prep */
 	for (i = 0; i < prom_mem.n_regions; ++i) {
 		a = (unsigned long) __va(prom_mem.regions[i].address);
-		lim = a + prom_mem.regions[i].size;
+		lim = (a + prom_mem.regions[i].size) & PAGE_MASK;
 		a = PAGE_ALIGN(a);
 		for (; a < lim; a += PAGE_SIZE)
 			clear_bit(PG_reserved, &mem_map[MAP_NR(a)].flags);
@@ -1215,12 +1223,12 @@
 				datapages++;
 			continue;
 		}
-		atomic_set(&mem_map[MAP_NR(addr)].count, 1);
+		set_page_count(mem_map + MAP_NR(addr), 1);
 #ifdef CONFIG_BLK_DEV_INITRD
 		if (!initrd_start ||
 		    addr < (initrd_start & PAGE_MASK) || addr >= initrd_end)
 #endif /* CONFIG_BLK_DEV_INITRD */
-#ifndef CONFIG_8xx		  
+#ifndef CONFIG_8xx
 			if ( !rtas_data ||
 			     addr < (rtas_data & PAGE_MASK) ||
 			     addr >= (rtas_data+rtas_size))
@@ -1238,7 +1246,7 @@
 }
 
 #ifndef CONFIG_8xx
-#if defined(CONFIG_PMAC) || defined(CONFIG_PPC_ALL)
+#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) || defined(CONFIG_ALL_PPC)
 /*
  * On systems with Open Firmware, collect information about
  * physical RAM and which pieces are already in use.
@@ -1286,8 +1294,12 @@
 	 * to our nearest IO area.
 	 * -- Cort
 	 */
-	if ( phys_mem.regions[0].size >= RAM_LIMIT )
-		phys_mem.regions[0].size = RAM_LIMIT;
+	if (__max_memory == 0 || __max_memory > RAM_LIMIT)
+		__max_memory = RAM_LIMIT;
+	if (phys_mem.regions[0].size >= __max_memory) {
+		phys_mem.regions[0].size = __max_memory;
+		phys_mem.n_regions = 1;
+	}
 	total = phys_mem.regions[0].size;
 	
 	if (phys_mem.n_regions > 1) {
@@ -1300,20 +1312,15 @@
 	if (boot_infos == 0) {
 		/* record which bits the prom is using */
 		get_mem_prop("available", &phys_avail);
+		prom_mem = phys_mem;
+		for (i = 0; i < phys_avail.n_regions; ++i)
+			remove_mem_piece(&prom_mem,
+					 phys_avail.regions[i].address,
+					 phys_avail.regions[i].size, 0);
 	} else {
 		/* booted from BootX - it's all available (after klimit) */
 		phys_avail = phys_mem;
-	}
-	prom_mem = phys_mem;
-	for (i = 0; i < phys_avail.n_regions; ++i)
-	{
-		if ( phys_avail.regions[i].address >= RAM_LIMIT )
-			continue;
-		if ( (phys_avail.regions[i].address+phys_avail.regions[i].size)
-		     >= RAM_LIMIT )
-			phys_avail.regions[i].size = RAM_LIMIT - phys_avail.regions[i].address;
-		remove_mem_piece(&prom_mem, phys_avail.regions[i].address,
-				 phys_avail.regions[i].size, 1);
+		prom_mem.n_regions = 0;
 	}
 
 	/*
@@ -1331,9 +1338,9 @@
 #undef RAM_LIMIT
 	return __va(total);
 }
-#endif /* defined(CONFIG_PMAC) || defined(CONFIG_PPC_ALL) */
+#endif /* CONFIG_PMAC || CONFIG_CHRP || CONFIG_ALL_PPC */
 
-#if defined(CONFIG_PREP) || defined(CONFIG_PPC_ALL)
+#if defined(CONFIG_PREP) || defined(CONFIG_ALL_PPC)
 /*
  * This finds the amount of physical ram and does necessary
  * setup for prep.  This is pretty architecture specific so
@@ -1365,10 +1372,10 @@
 
 	return (__va(total));
 }
-#endif /* defined(CONFIG_PREP) || defined(CONFIG_PPC_ALL) */
+#endif /* defined(CONFIG_PREP) || defined(CONFIG_ALL_PPC) */
 
 
-#if defined(CONFIG_GEMINI) || defined(CONFIG_PPC_ALL)
+#if defined(CONFIG_GEMINI)
 unsigned long __init *gemini_find_end_of_memory(void)
 {
 	unsigned long total, kstart, ksize, *ret;
@@ -1389,7 +1396,7 @@
 	remove_mem_piece( &phys_avail, kstart, ksize, 0 );
 	return ret;
 }
-#endif /* defined(CONFIG_GEMINI) || defined(CONFIG_PPC_ALL) */
+#endif /* defined(CONFIG_GEMINI) || defined(CONFIG_ALL_PPC) */
 
 #ifdef CONFIG_APUS
 #define HARDWARE_MAPPED_SIZE (512*1024)
diff -u --recursive --new-file v2.3.21/linux/arch/ppc/pmac_defconfig linux/arch/ppc/pmac_defconfig
--- v2.3.21/linux/arch/ppc/pmac_defconfig	Sat Jun 26 08:34:19 1999
+++ linux/arch/ppc/pmac_defconfig	Tue Oct 12 10:00:58 1999
@@ -7,15 +7,18 @@
 #
 CONFIG_PPC=y
 CONFIG_6xx=y
+# CONFIG_PPC64 is not set
+# CONFIG_82xx is not set
 # CONFIG_8xx is not set
 CONFIG_PMAC=y
 # CONFIG_PREP is not set
 # CONFIG_CHRP is not set
 # CONFIG_ALL_PPC is not set
+# CONFIG_GEMINI is not set
 # CONFIG_APUS is not set
-# CONFIG_MBX is not set
-CONFIG_MACH_SPECIFIC=y
 # CONFIG_SMP is not set
+CONFIG_MACH_SPECIFIC=y
+CONFIG_6xx=y
 
 #
 # General setup
@@ -25,8 +28,6 @@
 # CONFIG_MODVERSIONS is not set
 CONFIG_KMOD=y
 CONFIG_PCI=y
-# CONFIG_PCI_QUIRKS is not set
-CONFIG_PCI_OLD_PROC=y
 CONFIG_NET=y
 CONFIG_SYSCTL=y
 CONFIG_SYSVIPC=y
@@ -34,27 +35,35 @@
 CONFIG_BINFMT_ELF=y
 CONFIG_KERNEL_ELF=y
 CONFIG_BINFMT_MISC=m
-# CONFIG_BINFMT_JAVA is not set
+
+#
+# PCMCIA/Cardbus support
+#
+CONFIG_PCMCIA=m
+CONFIG_CARDBUS=y
 # CONFIG_PARPORT is not set
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_FB=y
 CONFIG_FB_COMPAT_XPMAC=y
 CONFIG_PMAC_PBOOK=y
-CONFIG_MAC_KEYBOARD=y
 CONFIG_MAC_FLOPPY=y
 CONFIG_MAC_SERIAL=y
-CONFIG_ADBMOUSE=y
-CONFIG_BLK_DEV_IDE_PMAC=y
+# CONFIG_SERIAL_CONSOLE is not set
+CONFIG_ADB=y
+CONFIG_ADB_CUDA=y
+CONFIG_ADB_MACIO=y
+CONFIG_ADB_PMU=y
+CONFIG_ADB_KEYBOARD=y
 CONFIG_PROC_DEVICETREE=y
-# CONFIG_KGDB is not set
-# CONFIG_XMON is not set
 # CONFIG_TOTALMP is not set
 CONFIG_BOOTX_TEXT=y
+# CONFIG_MOTOROLA_HOTSWAP is not set
 
 #
-# Plug and Play support
+# Plug and Play configuration
 #
 # CONFIG_PNP is not set
+# CONFIG_ISAPNP is not set
 
 #
 # Block devices
@@ -67,24 +76,45 @@
 #
 # CONFIG_BLK_DEV_HD_IDE is not set
 CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
 CONFIG_BLK_DEV_IDECD=y
 # CONFIG_BLK_DEV_IDETAPE is not set
 CONFIG_BLK_DEV_IDEFLOPPY=y
 # CONFIG_BLK_DEV_IDESCSI is not set
+
+#
+# IDE chipset support/bugfixes
+#
 # CONFIG_BLK_DEV_CMD640 is not set
 # CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+CONFIG_IDEDMA_PCI_AUTO=y
+CONFIG_IDEDMA_NEW_DRIVE_LISTINGS=y
+CONFIG_IDEDMA_PCI_EXPERIMENTAL=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_AEC6210 is not set
+CONFIG_BLK_DEV_CMD646=y
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_HPT34X is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_PDC202XX is not set
+# CONFIG_BLK_DEV_TRM290 is not set
 # CONFIG_BLK_DEV_SL82C105 is not set
 CONFIG_BLK_DEV_IDE_PMAC=y
 CONFIG_BLK_DEV_IDEDMA_PMAC=y
-CONFIG_BLK_DEV_IDEDMA=y
 CONFIG_IDEDMA_PMAC_AUTO=y
+CONFIG_BLK_DEV_IDEDMA=y
+CONFIG_IDEDMA_AUTO=y
 # CONFIG_IDE_CHIPSETS is not set
+# CONFIG_BLK_CPQ_DA is not set
 
 #
 # Additional Block Devices
 #
-# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_MD is not set
 CONFIG_BLK_DEV_RAM=y
@@ -92,16 +122,19 @@
 # CONFIG_BLK_DEV_XD is not set
 CONFIG_PARIDE_PARPORT=y
 # CONFIG_PARIDE is not set
+CONFIG_BLK_DEV_IDE_MODES=y
 # CONFIG_BLK_DEV_HD is not set
 
 #
 # Networking options
 #
 CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
 CONFIG_NETLINK=y
 # CONFIG_RTNETLINK is not set
 # CONFIG_NETLINK_DEV is not set
-# CONFIG_FIREWALL is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
 # CONFIG_FILTER is not set
 CONFIG_UNIX=y
 CONFIG_INET=y
@@ -118,16 +151,17 @@
 #
 # (it is safe to leave these untouched)
 #
-CONFIG_INET_RARP=y
-CONFIG_IP_NOSR=y
 CONFIG_SKB_LARGE=y
 # CONFIG_IPV6 is not set
+# CONFIG_KHTTPD is not set
+# CONFIG_ATM is not set
 
 #
 #  
 #
 # CONFIG_IPX is not set
 CONFIG_ATALK=m
+# CONFIG_DECNET is not set
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 # CONFIG_BRIDGE is not set
@@ -136,7 +170,6 @@
 # CONFIG_WAN_ROUTER is not set
 # CONFIG_NET_FASTROUTE is not set
 # CONFIG_NET_HW_FLOWCONTROL is not set
-# CONFIG_CPU_IS_SLOW is not set
 
 #
 # QoS and/or fair queueing
@@ -173,9 +206,11 @@
 # CONFIG_SCSI_AHA1542 is not set
 # CONFIG_SCSI_AHA1740 is not set
 CONFIG_SCSI_AIC7XXX=y
-# CONFIG_OVERRIDE_CMDS is not set
+# CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT is not set
+CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
 CONFIG_AIC7XXX_PROC_STATS=y
 CONFIG_AIC7XXX_RESET_DELAY=15
+# CONFIG_SCSI_IPS is not set
 # CONFIG_SCSI_ADVANSYS is not set
 # CONFIG_SCSI_IN2000 is not set
 # CONFIG_SCSI_AM53C974 is not set
@@ -189,15 +224,19 @@
 # CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_GENERIC_NCR5380 is not set
 # CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
 # CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_SYM53C416 is not set
 # CONFIG_SCSI_NCR53C7xx is not set
 # CONFIG_SCSI_NCR53C8XX is not set
+# CONFIG_SCSI_SYM53C8XX is not set
 # CONFIG_SCSI_PAS16 is not set
 # CONFIG_SCSI_PCI2000 is not set
 # CONFIG_SCSI_PCI2220I is not set
 # CONFIG_SCSI_PSI240I is not set
 # CONFIG_SCSI_QLOGIC_FAS is not set
 # CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_SEAGATE is not set
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_T128 is not set
@@ -212,10 +251,19 @@
 # Network device support
 #
 CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
 # CONFIG_ARCNET is not set
 # CONFIG_DUMMY is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_ETHERTAP is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
 CONFIG_NET_ETHERNET=y
 CONFIG_MACE=y
 CONFIG_BMAC=y
@@ -223,12 +271,16 @@
 # CONFIG_LANCE is not set
 # CONFIG_NET_VENDOR_SMC is not set
 # CONFIG_NET_VENDOR_RACAL is not set
-# CONFIG_RTL8139 is not set
 # CONFIG_YELLOWFIN is not set
-# CONFIG_ACENIC is not set
+# CONFIG_RTL8139 is not set
+# CONFIG_SIS900 is not set
+# CONFIG_DM9102 is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
 # CONFIG_NET_ISA is not set
 CONFIG_NET_EISA=y
 # CONFIG_PCNET32 is not set
+# CONFIG_ACENIC is not set
 # CONFIG_AC3200 is not set
 # CONFIG_APRICOT is not set
 # CONFIG_CS89x0 is not set
@@ -247,22 +299,43 @@
 # CONFIG_NET_POCKET is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
-# CONFIG_DLCI is not set
+
+#
+# Appletalk devices
+#
 # CONFIG_LTPC is not set
 # CONFIG_COPS is not set
 # CONFIG_IPDDP is not set
 CONFIG_PPP=y
+CONFIG_PPP_ASYNC=y
+CONFIG_PPP_DEFLATE=y
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_SLIP is not set
 
 #
-# CCP compressors for PPP are only built as modules.
+# Wireless LAN (non-hamradio)
 #
-# CONFIG_SLIP is not set
 # CONFIG_NET_RADIO is not set
+
+#
+# Token Ring driver support
+#
 # CONFIG_TR is not set
-# CONFIG_SHAPER is not set
-# CONFIG_HOSTESS_SV11 is not set
-# CONFIG_COSA is not set
+# CONFIG_NET_FC is not set
 # CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network devices
+#
+# CONFIG_PCMCIA_PCNET is not set
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_RAYCS is not set
 
 #
 # Amateur Radio support
@@ -275,24 +348,32 @@
 # CONFIG_ISDN is not set
 
 #
-# CD-ROM drivers (not for SCSI or IDE/ATAPI drives)
+# Old CD-ROM drivers (not SCSI, not IDE)
 #
 # CONFIG_CD_NO_IDESCSI is not set
 
 #
 # Console drivers
 #
+
+#
+# Frame-buffer support
+#
+CONFIG_FB=y
 CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB_CLGEN is not set
+# CONFIG_FB_PM2 is not set
 CONFIG_FB_OF=y
 CONFIG_FB_CONTROL=y
 CONFIG_FB_PLATINUM=y
 CONFIG_FB_VALKYRIE=y
-CONFIG_FB_ATY=y
 CONFIG_FB_IMSTT=y
 CONFIG_FB_CT65550=y
 # CONFIG_FB_S3TRIO is not set
+# CONFIG_FB_VGA16 is not set
 # CONFIG_FB_MATROX is not set
 CONFIG_FB_ATY=y
+# CONFIG_FB_3DFX is not set
 # CONFIG_FB_VIRTUAL is not set
 # CONFIG_FBCON_ADVANCED is not set
 CONFIG_FBCON_CFB8=y
@@ -314,11 +395,20 @@
 #
 CONFIG_VT=y
 CONFIG_VT_CONSOLE=y
-# CONFIG_SERIAL is not set
+CONFIG_SERIAL=m
 # CONFIG_SERIAL_EXTENDED is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=256
+
+#
+# Mice
+#
+CONFIG_BUSMOUSE=y
+# CONFIG_ATIXL_BUSMOUSE is not set
+# CONFIG_LOGIBUSMOUSE is not set
+# CONFIG_MS_BUSMOUSE is not set
+CONFIG_ADBMOUSE=y
 # CONFIG_MOUSE is not set
 # CONFIG_QIC02_TAPE is not set
 # CONFIG_WATCHDOG is not set
@@ -334,11 +424,51 @@
 # Joystick support
 #
 # CONFIG_JOYSTICK is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
 
 #
 # Ftape, the floppy tape device driver
 #
 # CONFIG_FTAPE is not set
+# CONFIG_DRM is not set
+
+#
+# USB drivers - not for the faint of heart
+#
+CONFIG_USB=y
+
+#
+# USB Controllers
+#
+# CONFIG_USB_UHCI is not set
+CONFIG_USB_OHCI=y
+CONFIG_USB_OHCI_DEBUG=y
+# CONFIG_USB_OHCI_HCD is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEBUG_ISOC=y
+CONFIG_USB_PROC=y
+# CONFIG_USB_EZUSB is not set
+
+#
+# USB Devices
+#
+CONFIG_USB_HUB=y
+CONFIG_USB_MOUSE=y
+CONFIG_USB_HP_SCANNER=m
+CONFIG_USB_KBD=y
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+# CONFIG_USB_SERIAL is not set
+# CONFIG_USB_CPIA is not set
+CONFIG_USB_SCSI=m
+CONFIG_USB_SCSI_DEBUG=y
+# CONFIG_USB_USS720 is not set
 
 #
 # Filesystems
@@ -347,13 +477,15 @@
 CONFIG_AUTOFS_FS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
-CONFIG_HFS_FS=y
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
+# CONFIG_HFS_FS is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
 # CONFIG_UMSDOS_FS is not set
-CONFIG_VFAT_FS=m
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
 CONFIG_ISO9660_FS=y
 # CONFIG_JOLIET is not set
+# CONFIG_UDF_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_NTFS_FS is not set
 # CONFIG_HPFS_FS is not set
@@ -380,52 +512,38 @@
 #
 # Partition Types
 #
-# CONFIG_BSD_DISKLABEL is not set
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_OSF_PARTITION is not set
 CONFIG_MAC_PARTITION=y
-# CONFIG_SMD_DISKLABEL is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
 # CONFIG_SOLARIS_X86_PARTITION is not set
 # CONFIG_UNIXWARE_DISKLABEL is not set
-CONFIG_NLS=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS_CODEPAGE_437=y
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_NLS is not set
 
 #
 # Sound
 #
 CONFIG_SOUND=y
 CONFIG_DMASOUND=y
+# CONFIG_SOUND_CMPCI is not set
 # CONFIG_SOUND_ES1370 is not set
 # CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
 # CONFIG_SOUND_SONICVIBES is not set
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
 # CONFIG_SOUND_OSS is not set
+
+#
+# Kernel hacking
+#
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_KGDB is not set
+# CONFIG_XMON is not set
diff -u --recursive --new-file v2.3.21/linux/drivers/block/md.c linux/drivers/block/md.c
--- v2.3.21/linux/drivers/block/md.c	Thu Aug 12 10:16:28 1999
+++ linux/drivers/block/md.c	Thu Oct 14 14:22:08 1999
@@ -553,6 +553,8 @@
 	   a better idea, please help ! */
   
 	realdev->inode=get_empty_inode ();
+	if (!realdev->inode)
+		return -ENOMEM;
 	realdev->inode->i_dev=dev; 	/* don't care about other fields */
 	insert_inode_hash (realdev->inode);
   
diff -u --recursive --new-file v2.3.21/linux/drivers/block/paride/pcd.c linux/drivers/block/paride/pcd.c
--- v2.3.21/linux/drivers/block/paride/pcd.c	Fri Sep 10 23:57:29 1999
+++ linux/drivers/block/paride/pcd.c	Wed Oct 13 10:32:35 1999
@@ -571,7 +571,7 @@
 	WR(0,6,0xa0 + 0x10*PCD.drive);
 	WR(0,7,8);
 
-	pcd_sleep(2);  		/* delay a bit */
+	pcd_sleep(20*HZ/1000);  		/* delay a bit */
 
 	k = 0;
 	while ((k++ < PCD_RESET_TMO) && (RR(1,6)&IDE_BUSY))
@@ -609,7 +609,7 @@
           if (!p) return 0;
 	  if (!(((p & 0xffff) == 0x0402)||((p & 0xff) == 6))) return p;
           k++;
-          pcd_sleep(100);
+          pcd_sleep(HZ);
         }
         return 0x000020;        /* timeout */
 }
diff -u --recursive --new-file v2.3.21/linux/drivers/block/paride/pf.c linux/drivers/block/paride/pf.c
--- v2.3.21/linux/drivers/block/paride/pf.c	Fri Sep 10 23:57:29 1999
+++ linux/drivers/block/paride/pf.c	Wed Oct 13 10:32:35 1999
@@ -666,11 +666,11 @@
 	WR(0,6,DRIVE);
 	WR(0,7,8);
 
-	pf_sleep(2);
+	pf_sleep(20*HZ/1000);
 
         k = 0;
         while ((k++ < PF_RESET_TMO) && (RR(1,6)&STAT_BUSY))
-                pf_sleep(10);
+                pf_sleep(HZ/10);
 
 	flg = 1;
 	for(i=0;i<5;i++) flg &= (RR(0,i+1) == expect[i]);
diff -u --recursive --new-file v2.3.21/linux/drivers/block/paride/pg.c linux/drivers/block/paride/pg.c
--- v2.3.21/linux/drivers/block/paride/pg.c	Wed Dec 23 09:44:41 1998
+++ linux/drivers/block/paride/pg.c	Wed Oct 13 10:32:35 1999
@@ -463,7 +463,7 @@
 	WR(0,6,DRIVE);
 	WR(0,7,8);
 
-	pg_sleep(2);
+	pg_sleep(20*HZ/1000);
 
 	k = 0;
 	while ((k++ < PG_RESET_TMO) && (RR(1,6)&STAT_BUSY))
diff -u --recursive --new-file v2.3.21/linux/drivers/block/paride/pt.c linux/drivers/block/paride/pt.c
--- v2.3.21/linux/drivers/block/paride/pt.c	Tue Dec 22 08:29:00 1998
+++ linux/drivers/block/paride/pt.c	Wed Oct 13 10:32:35 1999
@@ -498,7 +498,7 @@
 		return;
 	}
 	pi_disconnect(PI);
-	pt_poll_dsc(unit,100,tmo,fun);
+	pt_poll_dsc(unit,HZ,tmo,fun);
 }
 
 static void pt_rewind( int unit )
@@ -526,11 +526,11 @@
 	WR(0,6,DRIVE);
 	WR(0,7,8);
 
-	pt_sleep(2);
+	pt_sleep(20*HZ/1000);
 
         k = 0;
         while ((k++ < PT_RESET_TMO) && (RR(1,6)&STAT_BUSY))
-                pt_sleep(10);
+                pt_sleep(HZ/10);
 
 	flg = 1;
 	for(i=0;i<5;i++) flg &= (RR(0,i+1) == expect[i]);
@@ -559,7 +559,7 @@
 	  if (!p) return 0;
 	  if (!(((p & 0xffff) == 0x0402)||((p & 0xff) == 6))) return p;
 	  k++;
-          pt_sleep(100);
+          pt_sleep(HZ);
 	}
 	return 0x000020;	/* timeout */
 }
@@ -809,7 +809,7 @@
 
 	while (count > 0) {
 
-	    if (!pt_poll_dsc(unit,1,PT_TMO,"read")) return -EIO;
+	    if (!pt_poll_dsc(unit,HZ/100,PT_TMO,"read")) return -EIO;
 
 	    n = count;
 	    if (n > 32768) n = 32768;   /* max per command */
@@ -895,7 +895,7 @@
 
 	while (count > 0) {
 
-	    if (!pt_poll_dsc(unit,1,PT_TMO,"write")) return -EIO;
+	    if (!pt_poll_dsc(unit,HZ/100,PT_TMO,"write")) return -EIO;
 
             n = count;
             if (n > 32768) n = 32768;	/* max per command */
diff -u --recursive --new-file v2.3.21/linux/drivers/char/Config.in linux/drivers/char/Config.in
--- v2.3.21/linux/drivers/char/Config.in	Mon Oct  4 15:49:29 1999
+++ linux/drivers/char/Config.in	Tue Oct 12 10:00:58 1999
@@ -69,7 +69,7 @@
   dep_tristate 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE $CONFIG_BUSMOUSE
   dep_tristate 'Logitech busmouse support' CONFIG_LOGIBUSMOUSE $CONFIG_BUSMOUSE
   dep_tristate 'Microsoft busmouse support' CONFIG_MS_BUSMOUSE $CONFIG_BUSMOUSE
-  if [ "$CONFIG_PPC" = "y" ] ; then
+  if [ "$CONFIG_ADB" = "y" ]; then
     dep_tristate 'Apple Desktop Bus mouse support' CONFIG_ADBMOUSE $CONFIG_BUSMOUSE
   fi
 fi
diff -u --recursive --new-file v2.3.21/linux/drivers/char/adbmouse.c linux/drivers/char/adbmouse.c
--- v2.3.21/linux/drivers/char/adbmouse.c	Mon Oct 11 15:38:14 1999
+++ linux/drivers/char/adbmouse.c	Tue Oct 12 10:00:58 1999
@@ -158,6 +158,8 @@
 	if (!MACH_IS_MAC)
 		return -ENODEV;
 #endif
+	/* all buttons up */
+	memset(adb_mouse_buttons, 7, sizeof(adb_mouse_buttons));
 
 	msedev = register_busmouse(&adb_mouse);
 	if (msedev < 0)
diff -u --recursive --new-file v2.3.21/linux/drivers/char/bttv.c linux/drivers/char/bttv.c
--- v2.3.21/linux/drivers/char/bttv.c	Mon Oct  4 15:49:29 1999
+++ linux/drivers/char/bttv.c	Fri Oct 15 11:49:37 1999
@@ -544,7 +544,13 @@
         /* AVEC Intercapture */
         { 3, 2, 0, 2, 0, { 2, 3, 1, 1}, { 1, 0, 0, 0, 0}},
          /* LifeView FlyKit w/o Tuner */
-        { 3, 1, -1, -1, 0x8dff00, { 2, 3, 1, 1}}
+        { 3, 1, -1, -1, 0x8dff00, { 2, 3, 1, 1}},
+        /* CEI Raffles Card */
+        { 3, 3, 0, 2, 0, {2, 3, 1, 1}, {0, 0, 0, 0 ,0}},
+         /* Lucky Star Image World ConferenceTV */
+        {3, 1, 0, 2, 16777215, { 2, 3, 1, 1}, { 131072, 1, 1638400, 3, 4}},
+         /* Phoebe Tv Master + FM */
+        { 3, 1, 0, 2, 0xc00, { 2, 3, 1, 1},{0, 1, 0x800, 0x400, 0xc00, 0}}
 };
 #define TVCARDS (sizeof(tvcards)/sizeof(tvcard))
 
@@ -2118,6 +2124,21 @@
 			   data &= ~WINVIEW_PT2254_STROBE;
 			   btwrite(data, BT848_GPIO_DATA);
 			}
+                        /* TEA 6320 Audio Support by Michael Wrighton
+                           mgw1@cec.wustl.edu */
+                        if (btv->audio_chip == TEA6320)
+                        {
+                          int vol;
+                          vol = v.volume >> 11;
+                          if (!(v.flags&VIDEO_AUDIO_MUTE))
+                            I2CWrite(&(btv->i2c), I2C_TEA6320,
+                                     TEA6320_S, TEA6320_S_SB,1); /* at least Raffles card uses input B */
+                          else
+                            I2CWrite(&(btv->i2c), I2C_TEA6320,
+                                     TEA6320_S, TEA6320_S_GMU,1);
+                          I2CWrite(&(btv->i2c), I2C_TEA6320,
+                                   TEA6320_V, vol, 1);
+                        }
 			if (btv->have_msp3400) 
 			{
                                 i2c_control_device(&(btv->i2c),
@@ -2597,14 +2618,13 @@
 	if (triton1)
 		triton1=BT848_INT_ETBF;
 	
-	while ((dev = pci_find_device(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_496, dev))) 
+	
+	if(pci_pci_problems&PCIPCI_FAIL)
 	{
-		/* Beware the SiS 85C496 my friend - rev 49 don't work with a bttv */
-		printk(KERN_WARNING "BT848 and SIS 85C496 chipset don't always work together.\n");
-	}			
-
-	/* dev == NULL */
-
+		printk(KERN_WARNING "bttv: This configuration is known to have PCI to PCI DMA problems\n");
+		printk(KERN_WARNING "bttv: You may not be able to use overlay mode.\n");
+	}
+			
 	while ((dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, dev))) 
 	{
 		unsigned char b;
@@ -2721,6 +2741,12 @@
 			btv->pll.pll_crystal=BT848_IFORM_XT0;
 		}
         }
+   
+        if (btv->type == BTTV_CONFERENCETV) {
+		btv->tuner_type = 1;
+	   	btv->pll.pll_ifreq=28636363;
+	   	btv->pll.pll_crystal=BT848_IFORM_XT0;
+	}
 
         if (btv->type == BTTV_PIXVIEWPLAYTV) {
 		btv->pll.pll_ifreq=28636363;
@@ -2772,7 +2798,7 @@
         
         if (I2CRead(&(btv->i2c), I2C_TEA6300) >=0)
         {
-		if(btv->type==BTTV_AVEC_INTERCAP)
+		if(btv->type==BTTV_AVEC_INTERCAP || btv->type==BTTV_CEI_RAFFLES)
         	{
                 	printk(KERN_INFO "bttv%d: fader chip: TEA6320\n",btv->nr);
                 	btv->audio_chip = TEA6320;
@@ -2820,13 +2846,22 @@
 			strcat(btv->video_dev.name,"(AVerMedia TVCapture 98)");
 			break;
 		case BTTV_VHX:
-			strcpy(btv->video_dev.name,"BT848(Aimslab-VHX)");
+			strcpy(btv->video_dev.name,"(Aimslab-VHX)");
  			break;
 	        case BTTV_WINVIEW_601:
-			strcpy(btv->video_dev.name,"BT848(Leadtek WinView 601)");
+			strcpy(btv->video_dev.name,"(Leadtek WinView 601)");
  			break;	   
                 case BTTV_AVEC_INTERCAP:
                         strcpy(btv->video_dev.name,"(AVEC Intercapture)");
+                        break;
+                case BTTV_CEI_RAFFLES:
+                        strcpy(btv->video_dev.name,"(CEI Raffles Card)");
+                        break;
+                case BTTV_CONFERENCETV:
+                        strcpy(btv->video_dev.name,"(Image World ConferenceTV)");
+                        break;
+                case BTTV_PHOEBE_TVMAS:
+                        strcpy(btv->video_dev.name,"(Phoebe TV Master)");
                         break;
 	}
 	printk("%s\n",btv->video_dev.name);
diff -u --recursive --new-file v2.3.21/linux/drivers/char/bttv.h linux/drivers/char/bttv.h
--- v2.3.21/linux/drivers/char/bttv.h	Mon Oct  4 15:49:29 1999
+++ linux/drivers/char/bttv.h	Thu Oct 14 14:22:08 1999
@@ -213,6 +213,10 @@
 #define BTTV_PIXVIEWPLAYTV 0x10
 #define BTTV_WINVIEW_601   0x11
 #define BTTV_AVEC_INTERCAP 0x12
+#define BTTV_LIFE_FLYKIT   0x13
+#define BTTV_CEI_RAFFLES   0x14
+#define BTTV_CONFERENCETV  0x15
+#define BTTV_PHOEBE_TVMAS  0x16
 
 #define AUDIO_TUNER        0x00
 #define AUDIO_RADIO        0x01
@@ -237,6 +241,7 @@
 #define I2C_STBEE          0xae
 #define I2C_VHX 	   0xc0
 #define I2C_TEA6300        0x80 /* same as TEA6320 */
+#define I2C_TEA6320        0x80
 
 #define TDA9840_SW	   0x00
 #define TDA9840_LVADJ	   0x02
diff -u --recursive --new-file v2.3.21/linux/drivers/char/busmouse.c linux/drivers/char/busmouse.c
--- v2.3.21/linux/drivers/char/busmouse.c	Mon Oct 11 15:38:14 1999
+++ linux/drivers/char/busmouse.c	Tue Oct 12 10:00:58 1999
@@ -453,7 +453,7 @@
 #ifdef CONFIG_SUN_MOUSE
 	sun_mouse_init();
 #endif
-#ifdef CONFIG_ADB_MOUSE
+#ifdef CONFIG_ADBMOUSE
 	adb_mouse_init();
 #endif
 #ifdef CONFIG_RPCMOUSE
diff -u --recursive --new-file v2.3.21/linux/drivers/char/buz.c linux/drivers/char/buz.c
--- v2.3.21/linux/drivers/char/buz.c	Mon Oct  4 15:49:29 1999
+++ linux/drivers/char/buz.c	Fri Oct 15 11:49:37 1999
@@ -3366,29 +3366,25 @@
 	return zoran_num;
 }
 
-#include "chipsets.h"
-
 static void handle_chipset(void)
 {
-	int index;
-	struct pci_dev *dev = NULL;
-
-	for (index = 0; index < sizeof(black) / sizeof(black[0]); index++) {
-		if ((dev = pci_find_device(black[index].vendor, black[index].device, dev)) != NULL) {
-			printk(KERN_INFO ": Host bridge: %s, ", black[index].name);
-			switch (black[index].action) {
-
-			case TRITON:
-				printk("enabling Triton support.\n");
-				triton = 1;
-				break;
+	if(pci_pci_problems&PCIPCI_FAIL)
+	{
+		printk(KERN_WARNING "buz: This configuration is known to have PCI to PCI DMA problems\n");
+		printk(KERN_WARNING "buz: You may not be able to use overlay mode.\n");
+	}
+			
 
-			case NATOMA:
-				printk("enabling Natoma workaround.\n");
-				natoma = 1;
-				break;
-			}
-		}
+	if(pci_pci_problems&PCIPCI_TRITON)
+	{
+		printk("buz: Enabling Triton support.\n");
+		triton = 1;
+	}
+	
+	if(pci_pci_problems&PCIPCI_NATOMA)
+	{
+		printk("buz: Enabling Natoma workaround.\n");
+		natoma = 1;
 	}
 }
 
diff -u --recursive --new-file v2.3.21/linux/drivers/char/chipsets.h linux/drivers/char/chipsets.h
--- v2.3.21/linux/drivers/char/chipsets.h	Mon Jul  5 20:07:02 1999
+++ linux/drivers/char/chipsets.h	Wed Dec 31 16:00:00 1969
@@ -1,41 +0,0 @@
-static const struct {
-	unsigned short vendor;
-	unsigned short device;
-	enum {
-		TRITON,
-		NATOMA
-	} action;
-	const char *name;
-} black[] = {
-
-	{
-		PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437, TRITON, "82437"
-	},
-	{
-		PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437VX, TRITON, "82437VX Triton II"
-	},
-	{
-		PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439, TRITON, "82439HX Triton II"
-	},
-	{
-		PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439TX, TRITON, "82439TX"
-	},
-	{
-		PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, NATOMA, "82441FX Natoma"
-	},
-	{
-		PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443LX_0, NATOMA, "440LX - 82443LX PAC Host"
-	},
-	{
-		PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443LX_1, NATOMA, "440LX - 82443LX PAC AGP"
-	},
-	{
-		PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_0, NATOMA, "440BX - 82443BX Host"
-	},
-	{
-		PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_1, NATOMA, "440BX - 82443BX AGP"
-	},
-	{
-		PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_2, NATOMA, "440BX - 82443BX Host (no AGP)"
-	},
-};
diff -u --recursive --new-file v2.3.21/linux/drivers/char/keyboard.c linux/drivers/char/keyboard.c
--- v2.3.21/linux/drivers/char/keyboard.c	Mon Oct 11 15:38:14 1999
+++ linux/drivers/char/keyboard.c	Tue Oct 12 10:05:53 1999
@@ -156,6 +156,7 @@
 
 #ifdef CONFIG_MAGIC_SYSRQ
 static int sysrq_pressed;
+int sysrq_enabled = 1;
 #endif
 
 /*
diff -u --recursive --new-file v2.3.21/linux/drivers/char/pc_keyb.c linux/drivers/char/pc_keyb.c
--- v2.3.21/linux/drivers/char/pc_keyb.c	Mon Oct 11 15:38:14 1999
+++ linux/drivers/char/pc_keyb.c	Tue Oct 12 13:25:07 1999
@@ -871,6 +871,8 @@
 	aux_write_ack(AUX_ENABLE_DEV); /* Enable aux device */
 	kbd_write_cmd(AUX_INTS_ON); /* Enable controller ints */
 
+	send_data(KBD_CMD_ENABLE);	/* try to workaround toshiba4030cdt problem */
+
 	return 0;
 }
 
diff -u --recursive --new-file v2.3.21/linux/drivers/char/raw.c linux/drivers/char/raw.c
--- v2.3.21/linux/drivers/char/raw.c	Mon Aug  9 12:28:41 1999
+++ linux/drivers/char/raw.c	Wed Oct 13 10:32:35 1999
@@ -369,7 +369,7 @@
 		for (i=0; i < blocks; i++) 
 			b[i] = blocknr++;
 		
-		err = brw_kiovec(rw, 1, &iobuf, dev, b, sector_size, 0);
+		err = brw_kiovec(rw, 1, &iobuf, dev, b, sector_size);
 
 		if (err >= 0) {
 			transferred += err;
diff -u --recursive --new-file v2.3.21/linux/drivers/char/synclink.c linux/drivers/char/synclink.c
--- v2.3.21/linux/drivers/char/synclink.c	Tue Aug 31 17:29:13 1999
+++ linux/drivers/char/synclink.c	Wed Oct 13 10:32:35 1999
@@ -1,7 +1,7 @@
 /*
  * linux/drivers/char/synclink.c
  *
- * ==FILEDATE 19990610==
+ * ==FILEDATE 19990901==
  *
  * Device driver for Microgate SyncLink ISA and PCI
  * high speed multiprotocol serial adapters.
@@ -50,6 +50,8 @@
 #define BREAKPOINT() asm("   int $3");
 
 #define MAX_ISA_DEVICES 10
+#define MAX_PCI_DEVICES 10
+#define MAX_TOTAL_DEVICES 20
 
 #include <linux/config.h>	
 #include <linux/module.h>
@@ -91,6 +93,14 @@
 #include <linux/termios.h>
 #include <linux/tqueue.h>
 
+#if LINUX_VERSION_CODE < VERSION(2,3,0) 
+typedef struct wait_queue *wait_queue_head_t;
+#define DECLARE_WAITQUEUE(name,task) struct wait_queue (name) = {(task),NULL}
+#define init_waitqueue_head(head) *(head) = NULL
+#define DECLARE_MUTEX(name) struct semaphore (name) = MUTEX
+#define set_current_state(a) current->state = (a)
+#endif
+
 #if LINUX_VERSION_CODE >= VERSION(2,1,4)
 #include <asm/segment.h>
 #define GET_USER(error,value,addr) error = get_user(value,addr)
@@ -297,6 +307,8 @@
 
 	unsigned int tx_buffer_count;	/* count of total allocated Tx buffers */
 	DMABUFFERENTRY *tx_buffer_list;	/* list of transmit buffer entries */
+	
+	unsigned char *intermediate_rxbuffer;
 
 	int rx_enabled;
 	int rx_overflow;
@@ -306,6 +318,7 @@
 	u32 idle_mode;
 
 	u16 cmr_value;
+	u16 tcsr_value;
 
 	char device_name[25];		/* device instance name */
 
@@ -345,8 +358,8 @@
 	u32 lcr_offset;
 
 	u32 misc_ctrl_value;
-	char flag_buf[HDLC_MAX_FRAME_SIZE];
-	char char_buf[HDLC_MAX_FRAME_SIZE];	
+	char flag_buf[MAX_ASYNC_BUFFER_SIZE];
+	char char_buf[MAX_ASYNC_BUFFER_SIZE];	
 	BOOLEAN drop_rts_on_tx_done;
 
 	BOOLEAN loopmode_insert_requested;
@@ -573,13 +586,21 @@
 #define IDLEMODE_ALT_MARK_SPACE		0x0500
 #define IDLEMODE_SPACE			0x0600
 #define IDLEMODE_MARK			0x0700
+#define IDLEMODE_MASK			0x0700
+
+/*
+ * IUSC revision identifiers
+ */
+#define	IUSC_SL1660			0x4d44
+#define IUSC_PRE_SL1660			0x4553
 
 /*
  * Transmit status Bits in Transmit Command/status Register (TCSR)
  */
 
-#define TCSR_PRESERVE			0x0700
+#define TCSR_PRESERVE			0x0F00
 
+#define TCSR_UNDERWAIT			BIT11
 #define TXSTATUS_PREAMBLE_SENT		BIT7
 #define TXSTATUS_IDLE_SENT		BIT6
 #define TXSTATUS_ABORT_SENT		BIT5
@@ -590,7 +611,7 @@
 #define TXSTATUS_UNDERRUN		BIT1
 #define TXSTATUS_FIFO_EMPTY		BIT0
 #define TXSTATUS_ALL			0x00fa
-#define usc_UnlatchTxstatusBits(a,b) usc_OutReg( (a), TCSR, (u16)((a)->usc_idle_mode + ((b) & 0x00FF)) )
+#define usc_UnlatchTxstatusBits(a,b) usc_OutReg( (a), TCSR, (u16)((a)->tcsr_value + ((b) & 0x00FF)) )
 				
 
 #define MISCSTATUS_RXC_LATCHED		BIT15
@@ -710,9 +731,10 @@
 void usc_RCmd( struct mgsl_struct *info, u16 Cmd );
 void usc_TCmd( struct mgsl_struct *info, u16 Cmd );
 
-#define usc_TCmd(a,b) usc_OutReg((a), TCSR, (u16)((a)->usc_idle_mode + (b)))
+#define usc_TCmd(a,b) usc_OutReg((a), TCSR, (u16)((a)->tcsr_value + (b)))
 #define usc_RCmd(a,b) usc_OutReg((a), RCSR, (b))
 
+void usc_process_rxoverrun_sync( struct mgsl_struct *info );
 void usc_start_receiver( struct mgsl_struct *info );
 void usc_stop_receiver( struct mgsl_struct *info );
 
@@ -799,6 +821,8 @@
 void mgsl_free_frame_memory(struct mgsl_struct *info, DMABUFFERENTRY *BufferList,int Buffercount);
 int  mgsl_alloc_buffer_list_memory(struct mgsl_struct *info);
 void mgsl_free_buffer_list_memory(struct mgsl_struct *info);
+int mgsl_alloc_intermediate_rxbuffer_memory(struct mgsl_struct *info);
+void mgsl_free_intermediate_rxbuffer_memory(struct mgsl_struct *info);
 
 /*
  * Bottom half interrupt handlers
@@ -886,6 +910,7 @@
 static int irq[MAX_ISA_DEVICES] = {0,};
 static int dma[MAX_ISA_DEVICES] = {0,};
 static int debug_level = 0;
+static int maxframe[MAX_TOTAL_DEVICES] = {0,};
 
 	
 #if LINUX_VERSION_CODE >= VERSION(2,1,0)
@@ -896,10 +921,11 @@
 MODULE_PARM(irq,"1-" __MODULE_STRING(MAX_ISA_DEVICES) "i");
 MODULE_PARM(dma,"1-" __MODULE_STRING(MAX_ISA_DEVICES) "i");
 MODULE_PARM(debug_level,"i");
+MODULE_PARM(maxframe,"1-" __MODULE_STRING(MAX_TOTAL_DEVICES) "i");
 #endif
 
 static char *driver_name = "SyncLink serial driver";
-static char *driver_version = "1.7";
+static char *driver_version = "1.14";
 
 static struct tty_driver serial_driver, callout_driver;
 static int serial_refcount;
@@ -1349,11 +1375,14 @@
 	}
 
 	if (status & RXSTATUS_OVERRUN){
-		/* Purge receive FIFO to allow DMA buffer completion
-		 * with overrun status stored in the receive status block.
-		 */
-		usc_RCmd( info, RCmd_EnterHuntmode );
-		usc_RTCmd( info, RTCmd_PurgeRxFifo );
+//		/* Purge receive FIFO to allow DMA buffer completion
+//		 * with overrun status stored in the receive status block.
+//		 */
+//		usc_RCmd( info, RCmd_EnterHuntmode );
+//		usc_RTCmd( info, RTCmd_PurgeRxFifo );
+		
+		info->icount.rxover++;
+		usc_process_rxoverrun_sync( info );
 	}
 
 	usc_ClearIrqPendingBits( info, RECEIVE_STATUS );
@@ -1381,6 +1410,17 @@
 	
 	usc_ClearIrqPendingBits( info, TRANSMIT_STATUS );
 	usc_UnlatchTxstatusBits( info, status );
+	
+	if ( status & (TXSTATUS_UNDERRUN | TXSTATUS_ABORT_SENT) )
+	{
+		/* finished sending HDLC abort. This may leave	*/
+		/* the TxFifo with data from the aborted frame	*/
+		/* so purge the TxFifo. Also shutdown the DMA	*/
+		/* channel in case there is data remaining in 	*/
+		/* the DMA buffer				*/
+ 		usc_DmaCmd( info, DmaCmd_ResetTxChannel );
+ 		usc_RTCmd( info, RTCmd_PurgeTxFifo );
+	}
  
 	if ( status & TXSTATUS_EOF_SENT )
 		info->icount.txok++;
@@ -3343,7 +3383,7 @@
 	
 	if (info->blocked_open) {
 		if (info->close_delay) {
-			current->state = TASK_INTERRUPTIBLE;
+			set_current_state(TASK_INTERRUPTIBLE);
 			schedule_timeout(info->close_delay);
 		}
 		wake_up_interruptible(&info->open_wait);
@@ -3412,7 +3452,7 @@
 		
 	if ( info->params.mode == MGSL_MODE_HDLC ) {
 		while (info->tx_active) {
-			current->state = TASK_INTERRUPTIBLE;
+			set_current_state(TASK_INTERRUPTIBLE);
 			schedule_timeout(char_time);
 			if (signal_pending(current))
 				break;
@@ -3422,7 +3462,7 @@
 	} else {
 		while (!(usc_InReg(info,TCSR) & TXSTATUS_ALL_SENT) &&
 			info->tx_enabled) {
-			current->state = TASK_INTERRUPTIBLE;
+			set_current_state(TASK_INTERRUPTIBLE);
 			schedule_timeout(char_time);
 			if (signal_pending(current))
 				break;
@@ -3431,7 +3471,7 @@
 		}
 	}
       
-	current->state = TASK_RUNNING;
+	set_current_state(TASK_RUNNING);
 exit:
 	if (debug_level >= DEBUG_LEVEL_INFO)
 		printk("%s(%d):mgsl_wait_until_sent(%s) exit\n",
@@ -3589,7 +3629,7 @@
 		schedule();
 	}
 	
-	current->state = TASK_RUNNING;
+	set_current_state(TASK_RUNNING);
 	remove_wait_queue(&info->open_wait, &wait);
 	
 	if (extra_count)
@@ -3799,7 +3839,7 @@
 	 
 	spin_lock_irqsave(&info->irq_spinlock,flags);
 	{	
-	u16 Tscr = usc_InReg( info, TCSR );
+	u16 Tcsr = usc_InReg( info, TCSR );
 	u16 Tdmr = usc_InDmaReg( info, TDMR );
 	u16 Ticr = usc_InReg( info, TICR );
 	u16 Rscr = usc_InReg( info, RCSR );
@@ -3812,7 +3852,7 @@
 	u16 Ccar = inw( info->io_base + CCAR );
 	ret += sprintf(buf+ret, "tcsr=%04X tdmr=%04X ticr=%04X rcsr=%04X rdmr=%04X\n"
                         "ricr=%04X icr =%04X dccr=%04X tmr=%04X tccr=%04X ccar=%04X\n",
-	 		Tscr,Tdmr,Ticr,Rscr,Rdmr,Ricr,Icr,Dccr,Tmr,Tccr,Ccar );
+	 		Tcsr,Tdmr,Ticr,Rscr,Rdmr,Ricr,Icr,Dccr,Tmr,Tccr,Ccar );
 	}
 	spin_unlock_irqrestore(&info->irq_spinlock,flags);
 	
@@ -3878,30 +3918,45 @@
 	unsigned short BuffersPerFrame;
 
 	info->last_mem_alloc = 0;
-	
+
+	/* Calculate the number of DMA buffers necessary to hold the */
+	/* largest allowable frame size. Note: If the max frame size is */
+	/* not an even multiple of the DMA buffer size then we need to */
+	/* round the buffer count per frame up one. */
+
+	BuffersPerFrame = (unsigned short)(info->max_frame_size/DMABUFFERSIZE);
+	if ( info->max_frame_size % DMABUFFERSIZE )
+		BuffersPerFrame++;
+
 	if ( info->bus_type == MGSL_BUS_TYPE_PCI ) {
 		/*
 		 * The PCI adapter has 256KBytes of shared memory to use.
-		 * This is 64 PAGE_SIZE buffers. 1 is used for the buffer
-		 * list. 2 are used for the transmit and one is left as
-		 * a spare. The 4K buffer list can hold 128 DMA_BUFFER
-		 * structures at 32bytes each.
+		 * This is 64 PAGE_SIZE buffers.
+		 *
+		 * The first page is used for padding at this time so the
+		 * buffer list does not begin at offset 0 of the PCI
+		 * adapter's shared memory.
+		 *
+		 * The 2nd page is used for the buffer list. A 4K buffer
+		 * list can hold 128 DMA_BUFFER structures at 32 bytes
+		 * each.
+		 *
+		 * This leaves 62 4K pages.
+		 *
+		 * The next N pages are used for a transmit frame. We
+		 * reserve enough 4K page blocks to hold the configured
+		 * MaxFrameSize
+		 *
+		 * Of the remaining pages (62-N), determine how many can
+		 * be used to receive full MaxFrameSize inbound frames
 		 */
-
-		info->rx_buffer_count = 60;
-		info->tx_buffer_count = 2;
+		
+		info->tx_buffer_count = BuffersPerFrame;
+		info->rx_buffer_count = 62 - info->tx_buffer_count;
 	} else {
 		/* Calculate the number of PAGE_SIZE buffers needed for */
 		/* receive and transmit DMA buffers. */
 
-		/* Calculate the number of DMA buffers necessary to hold the */
-		/* largest allowable frame size. Note: If the max frame size is */
-		/* not an even multiple of the DMA buffer size then we need to */
-		/* round the buffer count per frame up one. */
-
-		BuffersPerFrame = (unsigned short)(info->max_frame_size/DMABUFFERSIZE);
-		if ( info->max_frame_size % DMABUFFERSIZE )
-			BuffersPerFrame++;
 
 		/* Calculate the number of DMA buffers necessary to */
 		/* hold 7 max size receive frames and one max size transmit frame. */
@@ -3909,8 +3964,17 @@
 		/* End of List condition if all receive buffers are used when */
 		/* using linked list DMA buffers. */
 
-		info->rx_buffer_count = (BuffersPerFrame * MAXRXFRAMES) + 6;
 		info->tx_buffer_count = BuffersPerFrame;
+		info->rx_buffer_count = (BuffersPerFrame * MAXRXFRAMES) + 6;
+		
+		/* 
+		 * limit total TxBuffers & RxBuffers to 62 4K total 
+		 * (ala PCI Allocation) 
+		 */
+		
+		if ( (info->tx_buffer_count + info->rx_buffer_count) > 62 )
+			info->rx_buffer_count = 62 - info->tx_buffer_count;
+
 	}
 
 	if ( debug_level >= DEBUG_LEVEL_INFO )
@@ -3919,7 +3983,8 @@
 	
 	if ( mgsl_alloc_buffer_list_memory( info ) < 0 ||
 		  mgsl_alloc_frame_memory(info, info->rx_buffer_list, info->rx_buffer_count) < 0 || 
-		  mgsl_alloc_frame_memory(info, info->tx_buffer_list, info->tx_buffer_count) < 0) {
+		  mgsl_alloc_frame_memory(info, info->tx_buffer_list, info->tx_buffer_count) < 0 || 
+		  mgsl_alloc_intermediate_rxbuffer_memory(info) < 0 ) {
 		printk("%s(%d):Can't allocate DMA buffer memory\n",__FILE__,__LINE__);
 		return -ENOMEM;
 	}
@@ -4146,6 +4211,48 @@
 
 }	/* end of mgsl_free_dma_buffers() */
 
+
+/*
+ * mgsl_alloc_intermediate_rxbuffer_memory()
+ * 
+ * 	Allocate a buffer large enough to hold max_frame_size. This buffer
+ *	is used to pass an assembled frame to the line discipline.
+ * 
+ * Arguments:
+ * 
+ *	info		pointer to device instance data
+ * 
+ * Return Value:	0 if success, otherwise -ENOMEM
+ */
+int mgsl_alloc_intermediate_rxbuffer_memory(struct mgsl_struct *info)
+{
+	info->intermediate_rxbuffer = kmalloc(info->max_frame_size, GFP_KERNEL | GFP_DMA);
+	if ( info->intermediate_rxbuffer == NULL )
+		return -ENOMEM;
+
+	return 0;
+
+}	/* end of mgsl_alloc_intermediate_rxbuffer_memory() */
+
+/*
+ * mgsl_free_intermediate_rxbuffer_memory()
+ * 
+ * 
+ * Arguments:
+ * 
+ *	info		pointer to device instance data
+ * 
+ * Return Value:	None
+ */
+void mgsl_free_intermediate_rxbuffer_memory(struct mgsl_struct *info)
+{
+	if ( info->intermediate_rxbuffer )
+		kfree_s( info->intermediate_rxbuffer, info->max_frame_size);
+
+	info->intermediate_rxbuffer = NULL;
+
+}	/* end of mgsl_free_intermediate_rxbuffer_memory() */
+
 /* mgsl_claim_resources()
  * 
  * 	Claim all resources used by a device
@@ -4254,6 +4361,7 @@
 		info->dma_requested = 0;
 	}
 	mgsl_free_dma_buffers(info);
+	mgsl_free_intermediate_rxbuffer_memory(info);
 	
 	if ( info->io_addr_requested ) {
 		release_region(info->io_base,info->io_addr_size);
@@ -4301,13 +4409,20 @@
 		current_dev->next_device = info;
 	}
 	
+	if ( info->max_frame_size < 4096 )
+		info->max_frame_size = 4096;
+	else if ( info->max_frame_size > 65535 )
+		info->max_frame_size = 65535;
+	
 	if ( info->bus_type == MGSL_BUS_TYPE_PCI ) {
-		printk( "SyncLink device %s added:PCI bus IO=%04X IRQ=%d Mem=%08X LCR=%08X\n",
+		printk( "SyncLink device %s added:PCI bus IO=%04X IRQ=%d Mem=%08X LCR=%08X MaxFrameSize=%u\n",
 			info->device_name, info->io_base, info->irq_level,
-			info->phys_memory_base, info->phys_lcr_base );
+			info->phys_memory_base, info->phys_lcr_base,
+		     	info->max_frame_size );
 	} else {
-		printk( "SyncLink device %s added:ISA bus IO=%04X IRQ=%d DMA=%d\n",
-			info->device_name, info->io_base, info->irq_level, info->dma_level );
+		printk( "SyncLink device %s added:ISA bus IO=%04X IRQ=%d DMA=%d MaxFrameSize=%u\n",
+			info->device_name, info->io_base, info->irq_level, info->dma_level,
+		     	info->max_frame_size );
 	}
 	
 }	/* end of mgsl_add_device() */
@@ -4316,7 +4431,7 @@
  * 
  * 	Allocate and initialize a device instance structure
  * 	
- * Arguments:		None
+ * Arguments:		none
  * Return Value:	pointer to mgsl_struct if success, otherwise NULL
  */
 struct mgsl_struct* mgsl_allocate_device()
@@ -4362,6 +4477,7 @@
 {
 	struct mgsl_struct *info;
 	int i;
+	int num_devices = 0;
 		
 	/* Check for user specified ISA devices */
 	
@@ -4391,9 +4507,16 @@
 		info->bus_type = MGSL_BUS_TYPE_ISA;
 		info->io_addr_size = 16;
 		info->irq_flags = 0;
+		
+		/* override default max frame size if arg available */
+		if ( num_devices < MAX_TOTAL_DEVICES && 
+				maxframe[num_devices] )
+			info->max_frame_size = maxframe[num_devices];
 				
 		/* add new device to device list */
 		mgsl_add_device( info );
+		
+		++num_devices;
 	}
 	
 	
@@ -4478,6 +4601,11 @@
 				info->irq_flags = SA_SHIRQ;
 				info->bus = bus;
 				info->function = func;
+		
+				/* override default max frame size if arg available */
+				if ( num_devices < MAX_TOTAL_DEVICES && 
+						maxframe[num_devices] )
+				info->max_frame_size = maxframe[num_devices];
 				
 		/* Store the PCI9050 misc control register value because a flaw
 		 * in the PCI9050 prevents LCR registers from being read if 
@@ -4860,6 +4988,24 @@
 void usc_set_sdlc_mode( struct mgsl_struct *info )
 {
 	u16 RegValue;
+	int PreSL1660;
+	
+	/*
+	 * determine if the IUSC on the adapter is pre-SL1660. If
+	 * not, take advantage of the UnderWait feature of more
+	 * modern chips. If an underrun occurs and this bit is set,
+	 * the transmitter will idle the programmed idle pattern
+	 * until the driver has time to service the underrun. Otherwise,
+	 * the dma controller may get the cycles previously requested
+	 * and begin transmitting queued tx data.
+	 */
+	usc_OutReg(info,TMCR,0x1f);
+	RegValue=usc_InReg(info,TMDR);
+	if ( RegValue == IUSC_PRE_SL1660 )
+		PreSL1660 = 1;
+	else
+		PreSL1660 = 0;
+	
 
  	if ( info->params.flags & HDLC_FLAG_HDLC_LOOPMODE )
  	{
@@ -4951,6 +5097,8 @@
 
 	if ( info->params.crc_type == HDLC_CRC_16_CCITT )
 		RegValue |= BIT9;
+	else if ( info->params.crc_type == HDLC_CRC_32_CCITT )
+		RegValue |= ( BIT12 | BIT10 | BIT9 );
 
 	usc_OutReg( info, RMR, RegValue );
 
@@ -5026,6 +5174,8 @@
 
 	if ( info->params.crc_type == HDLC_CRC_16_CCITT )
 		RegValue |= BIT9 + BIT8;
+	else if ( info->params.crc_type == HDLC_CRC_32_CCITT )
+		RegValue |= ( BIT12 | BIT10 | BIT9 | BIT8);
 
 	usc_OutReg( info, TMR, RegValue );
 
@@ -5057,6 +5207,30 @@
 	usc_UnlatchTxstatusBits( info, TXSTATUS_ALL );
 	usc_ClearIrqPendingBits( info, TRANSMIT_STATUS );
 
+	/*
+	** Transmit Command/Status Register (TCSR)
+	**
+	** <15..12>	0000	TCmd
+	** <11> 	0/1	UnderWait
+	** <10..08>	000	TxIdle
+	** <7>		x	PreSent
+	** <6>         	x	IdleSent
+	** <5>         	x	AbortSent
+	** <4>         	x	EOF/EOM Sent
+	** <3>         	x	CRC Sent
+	** <2>         	x	All Sent
+	** <1>         	x	TxUnder
+	** <0>         	x	TxEmpty
+	** 
+	** 0000 0000 0000 0000 = 0x0000
+	*/
+	info->tcsr_value = 0;
+
+	if ( !PreSL1660 )
+		info->tcsr_value |= TCSR_UNDERWAIT;
+		
+	usc_OutReg( info, TCSR, info->tcsr_value );
+
 	/* Clock mode Control Register (CMCR)
 	 *
 	 * <15..14>	00	counter 1 Source = Disabled
@@ -5472,6 +5646,152 @@
 
 }	/* end of usc_enable_aux_clock() */
 
+/*
+ *
+ * usc_process_rxoverrun_sync()
+ *
+ *		This function processes a receive overrun by resetting the
+ *		receive DMA buffers and issuing a Purge Rx FIFO command
+ *		to allow the receiver to continue receiving.
+ *
+ * Arguments:
+ *
+ *	info		pointer to device extension
+ *
+ * Return Value: None
+ */
+void usc_process_rxoverrun_sync( struct mgsl_struct *info )
+{
+	int start_index;
+	int end_index;
+	int frame_start_index;
+	int start_of_frame_found = FALSE;
+	int end_of_frame_found = FALSE;
+	int reprogram_dma = FALSE;
+
+	DMABUFFERENTRY *buffer_list = info->rx_buffer_list;
+	u32 phys_addr;
+
+	usc_DmaCmd( info, DmaCmd_PauseRxChannel );
+	usc_RCmd( info, RCmd_EnterHuntmode );
+	usc_RTCmd( info, RTCmd_PurgeRxFifo );
+
+	/* CurrentRxBuffer points to the 1st buffer of the next */
+	/* possibly available receive frame. */
+	
+	frame_start_index = start_index = end_index = info->current_rx_buffer;
+
+	/* Search for an unfinished string of buffers. This means */
+	/* that a receive frame started (at least one buffer with */
+	/* count set to zero) but there is no terminiting buffer */
+	/* (status set to non-zero). */
+
+	while( !buffer_list[end_index].count )
+	{
+		/* Count field has been reset to zero by 16C32. */
+		/* This buffer is currently in use. */
+
+		if ( !start_of_frame_found )
+		{
+			start_of_frame_found = TRUE;
+			frame_start_index = end_index;
+			end_of_frame_found = FALSE;
+		}
+
+		if ( buffer_list[end_index].status )
+		{
+			/* Status field has been set by 16C32. */
+			/* This is the last buffer of a received frame. */
+
+			/* We want to leave the buffers for this frame intact. */
+			/* Move on to next possible frame. */
+
+			start_of_frame_found = FALSE;
+			end_of_frame_found = TRUE;
+		}
+
+  		/* advance to next buffer entry in linked list */
+  		end_index++;
+  		if ( end_index == info->rx_buffer_count )
+  			end_index = 0;
+
+		if ( start_index == end_index )
+		{
+			/* The entire list has been searched with all Counts == 0 and */
+			/* all Status == 0. The receive buffers are */
+			/* completely screwed, reset all receive buffers! */
+			mgsl_reset_rx_dma_buffers( info );
+			frame_start_index = 0;
+			start_of_frame_found = FALSE;
+			reprogram_dma = TRUE;
+			break;
+		}
+	}
+
+	if ( start_of_frame_found && !end_of_frame_found )
+	{
+		/* There is an unfinished string of receive DMA buffers */
+		/* as a result of the receiver overrun. */
+
+		/* Reset the buffers for the unfinished frame */
+		/* and reprogram the receive DMA controller to start */
+		/* at the 1st buffer of unfinished frame. */
+
+		start_index = frame_start_index;
+
+		do
+		{
+			*((unsigned long *)&(info->rx_buffer_list[start_index++].count)) = DMABUFFERSIZE;
+
+  			/* Adjust index for wrap around. */
+  			if ( start_index == info->rx_buffer_count )
+  				start_index = 0;
+
+		} while( start_index != end_index );
+
+		reprogram_dma = TRUE;
+	}
+
+	if ( reprogram_dma )
+	{
+		usc_UnlatchRxstatusBits(info,RXSTATUS_ALL);
+		usc_ClearIrqPendingBits(info, RECEIVE_DATA|RECEIVE_STATUS);
+		usc_UnlatchRxstatusBits(info, RECEIVE_DATA|RECEIVE_STATUS);
+		
+		usc_EnableReceiver(info,DISABLE_UNCONDITIONAL);
+		
+		/* This empties the receive FIFO and loads the RCC with RCLR */
+		usc_OutReg( info, CCSR, (u16)(usc_InReg(info,CCSR) | BIT13) );
+
+		/* program 16C32 with physical address of 1st DMA buffer entry */
+		phys_addr = info->rx_buffer_list[frame_start_index].phys_entry;
+		usc_OutDmaReg( info, NRARL, (u16)phys_addr );
+		usc_OutDmaReg( info, NRARU, (u16)(phys_addr >> 16) );
+
+		usc_UnlatchRxstatusBits( info, RXSTATUS_ALL );
+		usc_ClearIrqPendingBits( info, RECEIVE_DATA + RECEIVE_STATUS );
+		usc_EnableInterrupts( info, RECEIVE_STATUS );
+
+		/* 1. Arm End of Buffer (EOB) Receive DMA Interrupt (BIT2 of RDIAR) */
+		/* 2. Enable Receive DMA Interrupts (BIT1 of DICR) */
+
+		usc_OutDmaReg( info, RDIAR, BIT3 + BIT2 );
+		usc_OutDmaReg( info, DICR, (u16)(usc_InDmaReg(info,DICR) | BIT1) );
+		usc_DmaCmd( info, DmaCmd_InitRxChannel );
+		if ( info->params.flags & HDLC_FLAG_AUTO_DCD )
+			usc_EnableReceiver(info,ENABLE_AUTO_DCD);
+		else
+			usc_EnableReceiver(info,ENABLE_UNCONDITIONAL);
+	}
+	else
+	{
+		/* This empties the receive FIFO and loads the RCC with RCLR */
+		usc_OutReg( info, CCSR, (u16)(usc_InReg(info,CCSR) | BIT13) );
+		usc_RTCmd( info, RTCmd_PurgeRxFifo );
+	}
+
+}	/* end of usc_process_rxoverrun_sync() */
+
 /* usc_stop_receiver()
  *
  *	Disable USC receiver
@@ -6155,7 +6475,10 @@
 	}
 
 	info->usc_idle_mode = usc_idle_mode;
-	usc_OutReg(info, TCSR, usc_idle_mode);
+	//usc_OutReg(info, TCSR, usc_idle_mode);
+	info->tcsr_value &= ~IDLEMODE_MASK;	/* clear idle mode bits */
+	info->tcsr_value += usc_idle_mode;
+	usc_OutReg(info, TCSR, info->tcsr_value);
 
 }	/* end of usc_set_txidle() */
 
@@ -6493,6 +6816,8 @@
 		/* adjust frame size for CRC if any */
 		if ( info->params.crc_type == HDLC_CRC_16_CCITT )
 			framesize -= 2;
+		else if ( info->params.crc_type == HDLC_CRC_32_CCITT )
+			framesize -= 4;		
 	}
 
 	if ( debug_level >= DEBUG_LEVEL_BH )
@@ -6501,16 +6826,49 @@
 			
 	if ( debug_level >= DEBUG_LEVEL_DATA )
 		mgsl_trace_block(info,info->rx_buffer_list[StartIndex].virt_addr,
-			framesize,0);	
+			MIN(framesize,DMABUFFERSIZE),0);	
 		
 	if (framesize) {
-		if (framesize > HDLC_MAX_FRAME_SIZE)
+		if (framesize > info->max_frame_size)
 			info->icount.rxlong++;
 		else {
+#if 1
+			/* 
+			 * copy contents of dma frame buffer(s) to intermediate
+		         * rxbuffer for presentation to line discipline
+			 */	 
+			int copy_count = framesize;
+			int index = StartIndex;
+			unsigned char *ptmp = info->intermediate_rxbuffer;
+
+			info->icount.rxok++;
+			
+			while( copy_count )
+			{
+				int partial_count;
+				if ( copy_count > DMABUFFERSIZE )
+					partial_count = DMABUFFERSIZE;
+				else
+					partial_count = copy_count;
+			
+				pBufEntry = &(info->rx_buffer_list[index]);
+				memcpy( ptmp, pBufEntry->virt_addr, partial_count );
+				ptmp += partial_count;
+				copy_count -= partial_count;
+				
+				if ( ++index == info->rx_buffer_count )
+					index = 0;
+				
+			}
+			
+			/* Call the line discipline receive callback directly. */
+			tty->ldisc.receive_buf(tty, info->intermediate_rxbuffer, info->flag_buf, framesize);
+#else
 			info->icount.rxok++;
 			pBufEntry = &(info->rx_buffer_list[StartIndex]);
 			/* Call the line discipline receive callback directly. */
 			tty->ldisc.receive_buf(tty, pBufEntry->virt_addr, info->flag_buf, framesize);
+#endif
 		}
 	}
 	/* Free the buffers used by this frame. */
@@ -6526,8 +6884,8 @@
 		 * receive buffers are now empty, then restart receiver.
 		 */
 
-		if ( !info->rx_buffer_list[info->current_rx_buffer].status &&
-			info->rx_buffer_list[info->current_rx_buffer].count ) {
+		if ( !info->rx_buffer_list[EndIndex].status &&
+			info->rx_buffer_list[EndIndex].count ) {
 			spin_lock_irqsave(&info->irq_spinlock,flags);
 			usc_start_receiver(info);
 			spin_unlock_irqrestore(&info->irq_spinlock,flags);
@@ -6558,7 +6916,7 @@
 	DMABUFFERENTRY *pBufEntry;
 	
 	if ( debug_level >= DEBUG_LEVEL_DATA )
-		mgsl_trace_block(info,Buffer,BufferSize,1);	
+		mgsl_trace_block(info,Buffer, MIN(BufferSize,DMABUFFERSIZE), 1);	
 
 	if (info->params.flags & HDLC_FLAG_HDLC_LOOPMODE) {
 		/* set CMR:13 to start transmit when
@@ -6701,9 +7059,9 @@
 
 	EndTime=100;
 	while( EndTime-- && !info->irq_occurred ) {
-		current->state = TASK_INTERRUPTIBLE;
+		set_current_state(TASK_INTERRUPTIBLE);
 		schedule_timeout(jiffies_from_ms(10));
-		current->state = TASK_RUNNING;
+		set_current_state(TASK_RUNNING);
 	}
 	
 	spin_lock_irqsave(&info->irq_spinlock,flags);
@@ -6883,7 +7241,7 @@
 
 	/* unlatch Tx status bits, and start transmit channel. */
 
-	usc_OutReg( info, TCSR, (unsigned short)(( usc_InReg(info, TCSR) & 0x0700) | 0xfa) );
+	usc_OutReg( info, TCSR, (unsigned short)(( usc_InReg(info, TCSR) & 0x0f00) | 0xfa) );
 	usc_DmaCmd( info, DmaCmd_InitTxChannel );
 
 	/* wait for DMA controller to fill transmit FIFO */
diff -u --recursive --new-file v2.3.21/linux/drivers/i2o/i2o_block.c linux/drivers/i2o/i2o_block.c
--- v2.3.21/linux/drivers/i2o/i2o_block.c	Mon Oct  4 15:49:29 1999
+++ linux/drivers/i2o/i2o_block.c	Wed Oct 13 10:32:34 1999
@@ -643,27 +643,9 @@
 
 	dev = &i2ob_dev[minor];
 	switch (cmd) {
-		case BLKRASET:
-			if(!capable(CAP_SYS_ADMIN))  return -EACCES;
-			if(arg > 0xff) return -EINVAL;
-			read_ahead[MAJOR(inode->i_rdev)] = arg;
-			return 0;
-
-		case BLKRAGET:
-			if (!arg)  return -EINVAL;
-			return put_user(read_ahead[MAJOR(inode->i_rdev)],
-					(long *) arg); 
 		case BLKGETSIZE:
 			return put_user(i2ob[minor].nr_sects, (long *) arg);
 
-		case BLKFLSBUF:
-			if(!capable(CAP_SYS_ADMIN))
-				return -EACCES;
-
-			fsync_dev(inode->i_rdev);
-			invalidate_buffers(inode->i_rdev);
-			return 0;
-			
 		case HDIO_GETGEO:
 		{
 			struct hd_geometry g;
@@ -679,8 +661,16 @@
 				return -EACCES;
 			return do_i2ob_revalidate(inode->i_rdev,1);
 			
-		default:
+		case BLKFLSBUF:
+		case BLKROSET:
+		case BLKROGET:
+		case BLKRASET:
+		case BLKRAGET:
+		case BLKPG:
 			return blk_ioctl(inode->i_rdev, cmd, arg);
+			
+		default:
+			return -EINVAL;
 	}
 }
 
diff -u --recursive --new-file v2.3.21/linux/drivers/isdn/Config.in linux/drivers/isdn/Config.in
--- v2.3.21/linux/drivers/isdn/Config.in	Thu Aug 26 13:05:35 1999
+++ linux/drivers/isdn/Config.in	Wed Oct 13 10:32:35 1999
@@ -2,77 +2,76 @@
 # ISDN device configuration
 #
 if [ "$CONFIG_INET" != "n" ]; then
-  bool 'Support synchronous PPP' CONFIG_ISDN_PPP
-  if [ "$CONFIG_ISDN_PPP" != "n" ]; then
-    bool 'Use VJ-compression with synchronous PPP' CONFIG_ISDN_PPP_VJ
-    bool 'Support generic MP (RFC 1717)' CONFIG_ISDN_MPP
-  fi
+   bool '  Support synchronous PPP' CONFIG_ISDN_PPP
+   if [ "$CONFIG_ISDN_PPP" != "n" ]; then
+      bool '    Use VJ-compression with synchronous PPP' CONFIG_ISDN_PPP_VJ
+      bool '    Support generic MP (RFC 1717)' CONFIG_ISDN_MPP
+   fi
 fi
-bool 'Support audio via ISDN' CONFIG_ISDN_AUDIO
+bool '  Support audio via ISDN' CONFIG_ISDN_AUDIO
 if [ "$CONFIG_ISDN_AUDIO" != "n" ]; then
-  bool 'Support AT-Fax Class 2 commands' CONFIG_ISDN_TTY_FAX
+   bool '    Support AT-Fax Class 2 commands' CONFIG_ISDN_TTY_FAX
 fi
-bool 'Support isdn diversion services' CONFIG_ISDN_DIVERSION
-if [ "$CONFIG_X25" != "n" ]; then
-  bool 'X.25 PLP on top of ISDN (EXPERIMENTAL)' CONFIG_ISDN_X25
-fi
-dep_tristate 'ICN 2B and 4B support' CONFIG_ISDN_DRV_ICN $CONFIG_ISDN
-dep_tristate 'isdnloop support' CONFIG_ISDN_DRV_LOOP $CONFIG_ISDN
-dep_tristate 'PCBIT-D support' CONFIG_ISDN_DRV_PCBIT $CONFIG_ISDN
-dep_tristate 'HiSax SiemensChipSet driver support' CONFIG_ISDN_DRV_HISAX $CONFIG_ISDN
+bool '  Support isdn diversion services' CONFIG_ISDN_DIVERSION
+if [ "$CONFIG_X25" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then
+   bool '    X.25 PLP on top of ISDN (EXPERIMENTAL)' CONFIG_ISDN_X25
+fi
+dep_tristate '  ICN 2B and 4B support' CONFIG_ISDN_DRV_ICN $CONFIG_ISDN
+dep_tristate '  isdnloop support' CONFIG_ISDN_DRV_LOOP $CONFIG_ISDN
+dep_tristate '  PCBIT-D support' CONFIG_ISDN_DRV_PCBIT $CONFIG_ISDN
+dep_tristate '  HiSax SiemensChipSet driver support' CONFIG_ISDN_DRV_HISAX $CONFIG_ISDN
 if [ "$CONFIG_ISDN_DRV_HISAX" != "n" ]; then
-    bool 'HiSax Support for EURO/DSS1' CONFIG_HISAX_EURO
-    if [ "$CONFIG_HISAX_EURO" != "n" ]; then
-	    bool 'Support for german chargeinfo' CONFIG_DE_AOC
-	    bool 'Disable sending complete' CONFIG_HISAX_NO_SENDCOMPLETE
-	    bool 'Disable sending low layer compatibility' CONFIG_HISAX_NO_LLC
-    fi
-    bool 'HiSax Support for german 1TR6' CONFIG_HISAX_1TR6
-    bool 'HiSax Support for Teles 16.0/8.0' CONFIG_HISAX_16_0
-    bool 'HiSax Support for Teles 16.3 or PNP or PCMCIA' CONFIG_HISAX_16_3
-    bool 'HiSax Support for Teles PCI' CONFIG_HISAX_TELESPCI 
-    bool 'HiSax Support for Teles S0Box' CONFIG_HISAX_S0BOX 
-    bool 'HiSax Support for AVM A1 (Fritz)' CONFIG_HISAX_AVM_A1
-    bool 'HiSax Support for AVM PnP/PCI (Fritz!PnP/PCI)' CONFIG_HISAX_FRITZPCI
-    bool 'HiSax Support for AVM A1 PCMCIA (Fritz)' CONFIG_HISAX_AVM_A1_PCMCIA
-    bool 'HiSax Support for Elsa cards' CONFIG_HISAX_ELSA
-    bool 'HiSax Support for ITK ix1-micro Revision 2' CONFIG_HISAX_IX1MICROR2
-    bool 'HiSax Support for Eicon.Diehl Diva cards' CONFIG_HISAX_DIEHLDIVA
-    bool 'HiSax Support for ASUSCOM cards' CONFIG_HISAX_ASUSCOM
-    bool 'HiSax Support for TELEINT cards' CONFIG_HISAX_TELEINT
-    bool 'HiSax Support for HFC-S based cards' CONFIG_HISAX_HFCS
-    bool 'HiSax Support for Sedlbauer cards' CONFIG_HISAX_SEDLBAUER
-    bool 'HiSax Support for USR Sportster internal TA' CONFIG_HISAX_SPORTSTER
-    bool 'HiSax Support for MIC card' CONFIG_HISAX_MIC
-    bool 'HiSax Support for NETjet card' CONFIG_HISAX_NETJET
-    bool 'HiSax Support for Niccy PnP/PCI card' CONFIG_HISAX_NICCY
-    bool 'HiSax Support for Siemens I-Surf card' CONFIG_HISAX_ISURF
-    bool 'HiSax Support for HST Saphir card' CONFIG_HISAX_HSTSAPHIR
-    bool 'HiSax Support for Telekom A4T card' CONFIG_HISAX_BKM_A4T
-    bool 'HiSax Support for Scitel Quadro card' CONFIG_HISAX_SCT_QUADRO
-    bool 'HiSax Support for Gazel cards' CONFIG_HISAX_GAZEL
-    bool 'HiSax Support for HFC PCI-Bus cards' CONFIG_HISAX_HFC_PCI
-    if [ "$CONFIG_EXPERIMENTAL" != "n" ]; then
-#	bool 'HiSax Support for TESTEMULATOR (EXPERIMENTAL)' CONFIG_HISAX_TESTEMU
-	if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then
-		bool 'HiSax Support for Am7930' CONFIG_HISAX_AMD7930
-	fi
-    fi
+   bool '    HiSax Support for EURO/DSS1' CONFIG_HISAX_EURO
+   if [ "$CONFIG_HISAX_EURO" != "n" ]; then
+      bool '      Support for german chargeinfo' CONFIG_DE_AOC
+      bool '      Disable sending complete' CONFIG_HISAX_NO_SENDCOMPLETE
+      bool '      Disable sending low layer compatibility' CONFIG_HISAX_NO_LLC
+   fi
+   bool '    HiSax Support for german 1TR6' CONFIG_HISAX_1TR6
+   bool '    HiSax Support for Teles 16.0/8.0' CONFIG_HISAX_16_0
+   bool '    HiSax Support for Teles 16.3 or PNP or PCMCIA' CONFIG_HISAX_16_3
+   bool '    HiSax Support for Teles PCI' CONFIG_HISAX_TELESPCI 
+   bool '    HiSax Support for Teles S0Box' CONFIG_HISAX_S0BOX 
+   bool '    HiSax Support for AVM A1 (Fritz)' CONFIG_HISAX_AVM_A1
+   bool '    HiSax Support for AVM PnP/PCI (Fritz!PnP/PCI)' CONFIG_HISAX_FRITZPCI
+   bool '    HiSax Support for AVM A1 PCMCIA (Fritz)' CONFIG_HISAX_AVM_A1_PCMCIA
+   bool '    HiSax Support for Elsa cards' CONFIG_HISAX_ELSA
+   bool '    HiSax Support for ITK ix1-micro Revision 2' CONFIG_HISAX_IX1MICROR2
+   bool '    HiSax Support for Eicon.Diehl Diva cards' CONFIG_HISAX_DIEHLDIVA
+   bool '    HiSax Support for ASUSCOM cards' CONFIG_HISAX_ASUSCOM
+   bool '    HiSax Support for TELEINT cards' CONFIG_HISAX_TELEINT
+   bool '    HiSax Support for HFC-S based cards' CONFIG_HISAX_HFCS
+   bool '    HiSax Support for Sedlbauer cards' CONFIG_HISAX_SEDLBAUER
+   bool '    HiSax Support for USR Sportster internal TA' CONFIG_HISAX_SPORTSTER
+   bool '    HiSax Support for MIC card' CONFIG_HISAX_MIC
+   bool '    HiSax Support for NETjet card' CONFIG_HISAX_NETJET
+   bool '    HiSax Support for Niccy PnP/PCI card' CONFIG_HISAX_NICCY
+   bool '    HiSax Support for Siemens I-Surf card' CONFIG_HISAX_ISURF
+   bool '    HiSax Support for HST Saphir card' CONFIG_HISAX_HSTSAPHIR
+   bool '    HiSax Support for Telekom A4T card' CONFIG_HISAX_BKM_A4T
+   bool '    HiSax Support for Scitel Quadro card' CONFIG_HISAX_SCT_QUADRO
+   bool '    HiSax Support for Gazel cards' CONFIG_HISAX_GAZEL
+   bool '    HiSax Support for HFC PCI-Bus cards' CONFIG_HISAX_HFC_PCI
+   if [ "$CONFIG_EXPERIMENTAL" != "n" ]; then
+#      bool '    HiSax Support for TESTEMULATOR (EXPERIMENTAL)' CONFIG_HISAX_TESTEMU
+      if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then
+	 bool '    HiSax Support for Am7930' CONFIG_HISAX_AMD7930
+      fi
+   fi
 fi
 if [ "$CONFIG_EXPERIMENTAL" != "n" ]; then
-	dep_tristate 'Spellcaster support (EXPERIMENTAL)' CONFIG_ISDN_DRV_SC $CONFIG_ISDN
-	dep_tristate 'IBM Active 2000 support (EXPERIMENTAL)' CONFIG_ISDN_DRV_ACT2000 $CONFIG_ISDN
+	dep_tristate '  Spellcaster support (EXPERIMENTAL)' CONFIG_ISDN_DRV_SC $CONFIG_ISDN
+	dep_tristate '  IBM Active 2000 support (EXPERIMENTAL)' CONFIG_ISDN_DRV_ACT2000 $CONFIG_ISDN
 fi
-dep_tristate 'Eicon.Diehl active card support' CONFIG_ISDN_DRV_EICON $CONFIG_ISDN
+dep_tristate '  Eicon.Diehl active card support' CONFIG_ISDN_DRV_EICON $CONFIG_ISDN
 if [ "$CONFIG_ISDN_DRV_EICON" != "n" ]; then
-    bool 'Eicon S,SX,SCOM,Quadro,S2M support' CONFIG_ISDN_DRV_EICON_ISA
+    bool '    Eicon S, SX, SCOM, Quadro, S2M support' CONFIG_ISDN_DRV_EICON_ISA
 fi
-dep_tristate 'AVM CAPI2.0 support' CONFIG_ISDN_DRV_AVMB1 $CONFIG_ISDN
+dep_tristate '  AVM CAPI2.0 support' CONFIG_ISDN_DRV_AVMB1 $CONFIG_ISDN
 if [ "$CONFIG_ISDN_DRV_AVMB1" != "n" ]; then
-    bool 'AVM B1 ISA support' CONFIG_ISDN_DRV_AVMB1_B1ISA
-    bool 'AVM B1 PCI support' CONFIG_ISDN_DRV_AVMB1_B1PCI
-    bool 'AVM T1/T1B ISA support' CONFIG_ISDN_DRV_AVMB1_T1ISA
-    bool 'AVM B1/M1/M2 PCMCIA support' CONFIG_ISDN_DRV_AVMB1_B1PCMCIA
-    bool 'Verbose reason code reporting (kernel size +=7K)' CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON
+   bool '    AVM B1 ISA support' CONFIG_ISDN_DRV_AVMB1_B1ISA
+   bool '    AVM B1 PCI support' CONFIG_ISDN_DRV_AVMB1_B1PCI
+   bool '    AVM T1/T1B ISA support' CONFIG_ISDN_DRV_AVMB1_T1ISA
+   bool '    AVM B1/M1/M2 PCMCIA support' CONFIG_ISDN_DRV_AVMB1_B1PCMCIA
+   bool '    Verbose reason code reporting (kernel size +=7K)' CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON
 fi
-
diff -u --recursive --new-file v2.3.21/linux/drivers/isdn/isdn_common.c linux/drivers/isdn/isdn_common.c
--- v2.3.21/linux/drivers/isdn/isdn_common.c	Thu Aug 12 09:42:33 1999
+++ linux/drivers/isdn/isdn_common.c	Thu Oct 14 14:22:08 1999
@@ -2319,8 +2319,8 @@
 #ifdef COMPAT_HAS_NEW_WAITQ
 	d->snd_waitq = d->rcv_waitq + m;
 	for (j = 0; j < m; j++) {
-		init_waitqueue_head(&d->rcv_waitq[m]);
-		init_waitqueue_head(&d->snd_waitq[m]);
+		init_waitqueue_head(&d->rcv_waitq[j]);
+		init_waitqueue_head(&d->snd_waitq[j]);
 	}
 #else
 	memset((char *) d->rcv_waitq, 0, sizeof(struct wait_queue *) * m);
diff -u --recursive --new-file v2.3.21/linux/drivers/macintosh/mac_keyb.c linux/drivers/macintosh/mac_keyb.c
--- v2.3.21/linux/drivers/macintosh/mac_keyb.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/macintosh/mac_keyb.c	Tue Oct 12 10:00:58 1999
@@ -240,7 +240,7 @@
 static void init_turbomouse(int id);
 static void init_microspeed(int id);
 
-#ifdef CONFIG_ADB_MOUSE
+#ifdef CONFIG_ADBMOUSE
 /* XXX: Hook for mouse driver */
 void (*adb_mouse_interrupt_hook)(unsigned char *, int);
 int adb_emulate_buttons = 0;
@@ -336,7 +336,7 @@
 	if (!repeat)
 		del_timer(&repeat_timer);
 
-#ifdef CONFIG_ADB_MOUSE
+#ifdef CONFIG_ADBMOUSE
 	/*
 	 * XXX: Add mouse button 2+3 fake codes here if mouse open.
 	 *	Keep track of 'button' states here as we only send 
@@ -366,7 +366,7 @@
 		}
 		return;
 	}
-#endif /* CONFIG_ADB_MOUSE */
+#endif /* CONFIG_ADBMOUSE */
 
 	if (kbd->kbdmode != VC_RAW) {
 		if (!up_flag && !dont_repeat[keycode]) {
@@ -422,7 +422,7 @@
 	}
 }
 
-#ifdef CONFIG_ADB_MOUSE
+#ifdef CONFIG_ADBMOUSE
 static void
 mouse_input(unsigned char *data, int nb, struct pt_regs *regs, int autopoll)
 {
@@ -554,7 +554,7 @@
 		}
 	}
 }
-#endif /* CONFIG_ADB_MOUSE */
+#endif /* CONFIG_ADBMOUSE */
 
 /* XXX Needs to get rid of this, see comments in pmu.c */
 extern int backlight_level;
@@ -700,7 +700,7 @@
 	memcpy(key_maps[8], macalt_map, sizeof(plain_map));
 	memcpy(key_maps[12], macctrl_alt_map, sizeof(plain_map));
 
-#ifdef CONFIG_ADB_MOUSE
+#ifdef CONFIG_ADBMOUSE
 	/* initialize mouse interrupt hook */
 	adb_mouse_interrupt_hook = NULL;
 #endif
@@ -736,9 +736,9 @@
 	struct adb_request req;
 	int i;
 
-#ifdef CONFIG_ADB_MOUSE
+#ifdef CONFIG_ADBMOUSE
 	adb_register(ADB_MOUSE, 0, &mouse_ids, mouse_input);
-#endif /* CONFIG_ADB_MOUSE */
+#endif /* CONFIG_ADBMOUSE */
 
 	adb_register(ADB_KEYBOARD, 0, &keyboard_ids, keyboard_input);
 	adb_register(0x07, 0x1F, &buttons_ids, buttons_input);
diff -u --recursive --new-file v2.3.21/linux/drivers/macintosh/mediabay.c linux/drivers/macintosh/mediabay.c
--- v2.3.21/linux/drivers/macintosh/mediabay.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/macintosh/mediabay.c	Tue Oct 12 10:00:58 1999
@@ -418,8 +418,10 @@
 					   middle of a wait loop */
 					if (bay->reset_timer)
 						bay->reset_timer = MB_RESET_COUNT;
+#ifdef CONFIG_BLK_DEV_IDE
 					if (bay->cd_timer)
 						bay->cd_timer = MB_IDE_WAIT;
+#endif
 				}
 			}
 		}
diff -u --recursive --new-file v2.3.21/linux/drivers/macintosh/via-pmu.c linux/drivers/macintosh/via-pmu.c
--- v2.3.21/linux/drivers/macintosh/via-pmu.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/macintosh/via-pmu.c	Tue Oct 12 10:00:58 1999
@@ -150,7 +150,7 @@
  * - the number of response bytes which the PMU will return, or
  *   -1 if it will send a length byte.
  */
-static s8 pmu_data_len[256][2] __openfirmwaredata = {
+static const s8 pmu_data_len[256][2] __openfirmwaredata = {
 /*	   0	   1	   2	   3	   4	   5	   6	   7  */
 /*00*/	{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 /*08*/	{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
@@ -263,6 +263,20 @@
 {
 	if (vias == NULL)
 		return -ENXIO;
+	return 0;
+}
+
+/*
+ * We can't wait until pmu_init gets called, that happens too late.
+ * It happens after IDE and SCSI initialization, which can take a few
+ * seconds, and by that time the PMU could have given up on us and
+ * turned us off.
+ * This is called from arch/ppc/kernel/pmac_setup.c:pmac_init2().
+ */
+void via_pmu_start(void)
+{
+	if (vias == NULL)
+		return;
 
 	bright_req_1.complete = 1;
 	bright_req_2.complete = 1;
@@ -272,7 +286,7 @@
 			(void *)0)) {
 		printk(KERN_ERR "VIA-PMU: can't get irq %d\n",
 		       vias->intrs[0].line);
-		return -ENXIO;
+		return;
 	}
 
 	/* Enable interrupts */
@@ -282,8 +296,6 @@
 	
 	/* Enable backlight */
 	pmu_enable_backlight(1);
-
-	return 0;
 }
 
 static int __openfirmware
diff -u --recursive --new-file v2.3.21/linux/drivers/misc/acpi.c linux/drivers/misc/acpi.c
--- v2.3.21/linux/drivers/misc/acpi.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/misc/acpi.c	Tue Oct 12 12:54:23 1999
@@ -28,6 +28,7 @@
 #include <linux/miscdevice.h>
 #include <linux/sched.h>
 #include <linux/wait.h>
+#include <linux/spinlock.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
 #include <linux/acpi.h>
@@ -52,21 +53,40 @@
 static unsigned long acpi_facp_addr = 0;
 static unsigned long acpi_dsdt_addr = 0;
 
+static spinlock_t acpi_event_lock = SPIN_LOCK_UNLOCKED;
 static volatile u32 acpi_pm1_status = 0;
 static volatile u32 acpi_gpe_status = 0;
 static volatile u32 acpi_gpe_level = 0;
 static DECLARE_WAIT_QUEUE_HEAD(acpi_wait_event);
 
+/* Make it impossible to enter L2/L3 until after we've initialized */
+static unsigned long acpi_p_lvl2_lat = ~0UL;
+static unsigned long acpi_p_lvl3_lat = ~0UL;
+
+/* Initialize to guaranteed harmless port read */
+static u16 acpi_p_lvl2 = 0x80;
+static u16 acpi_p_lvl3 = 0x80;
+
+
+/*
+ * Get the value of the PM1 control register (SCI_EN, ...)
+ */
+static u32 acpi_read_pm1_control(struct acpi_facp *facp)
+{
+	u32 value = inw(facp->pm1a_cnt);
+	if (facp->pm1b_cnt)
+		value |= inw(facp->pm1b_cnt);
+	return value;
+}
+
 /*
  * Get the value of the fixed event status register
  */
 static u32 acpi_read_pm1_status(struct acpi_facp *facp)
 {
 	u32 value = inw(facp->pm1a_evt);
-
-	if (facp->pm1b_evt) {
+	if (facp->pm1b_evt)
 		value |= inw(facp->pm1b_evt);
-	}
 	return value;
 }
 
@@ -76,9 +96,8 @@
 static void acpi_write_pm1_status(struct acpi_facp *facp, u32 value)
 {
 	outw(value, facp->pm1a_evt);
-	if (facp->pm1b_evt) {
+	if (facp->pm1b_evt)
 		outw(value, facp->pm1b_evt);
-	}
 }
 
 /*
@@ -88,9 +107,8 @@
 {
 	int offset = facp->pm1_evt_len >> 1;
 	u32 value = inw(facp->pm1a_evt + offset);
-	if (facp->pm1b_evt) {
+	if (facp->pm1b_evt)
 		value |= inw(facp->pm1b_evt + offset);
-	}
 	return value;
 }
 
@@ -100,11 +118,9 @@
 static void acpi_write_pm1_enable(struct acpi_facp *facp, u32 value)
 {
 	int offset = facp->pm1_evt_len >> 1;
-
 	outw(value, facp->pm1a_evt + offset);
-	if (facp->pm1b_evt) {
+	if (facp->pm1b_evt)
 		outw(value, facp->pm1b_evt + offset);
-	}
 }
 
 /*
@@ -117,14 +133,12 @@
 
 	if (facp->gpe1) {
 		size = facp->gpe1_len >> 1;
-		for (i = size - 1; i >= 0; i--) {
+		for (i = size - 1; i >= 0; i--)
 			value = (value << 8) | inb(facp->gpe1 + i);
-		}
 	}
 	size = facp->gpe0_len >> 1;
-	for (i = size - 1; i >= 0; i--) {
+	for (i = size - 1; i >= 0; i--)
 		value = (value << 8) | inb(facp->gpe0 + i);
-	}
 	return value;
 }
 
@@ -165,9 +179,8 @@
 		}
 	}
 	size = facp->gpe0_len >> 1;
-	for (i = size - 1; i >= 0; i--) {
+	for (i = size - 1; i >= 0; i--)
 		value = (value << 8) | inb(facp->gpe0 + offset + i);
-	}
 	return value;
 }
 
@@ -201,14 +214,15 @@
 	if (addr) {
 		// map table header to determine size
 		table = (struct acpi_table *)
-		    ioremap_nocache((unsigned long) addr,
-				    sizeof(struct acpi_table));
+			ioremap_nocache((unsigned long) addr,
+					sizeof(struct acpi_table));
 		if (table) {
 			unsigned long table_size = table->length;
 			iounmap(table);
 			// remap entire table
 			table = (struct acpi_table *)
-			    ioremap_nocache((unsigned long) addr, table_size);
+				ioremap_nocache((unsigned long) addr,
+						table_size);
 		}
 	}
 	return table;
@@ -219,9 +233,8 @@
  */
 static void acpi_unmap_table(struct acpi_table *table)
 {
-	if (table) {
+	if (table)
 		iounmap(table);
-	}
 }
 
 /*
@@ -313,6 +326,8 @@
 static void acpi_irq(int irq, void *dev_id, struct pt_regs *regs)
 {
 	u32 pm1_status, gpe_status, gpe_level, gpe_edge;
+	unsigned long flags;
+
 	// detect and clear fixed events
 	pm1_status = (acpi_read_pm1_status(acpi_facp)
 		      & acpi_read_pm1_enable(acpi_facp));
@@ -323,7 +338,7 @@
 		      & acpi_read_gpe_enable(acpi_facp));
 	gpe_level = gpe_status & acpi_gpe_level;
 	if (gpe_level) {
-		// disable level-triggered events
+		// disable level-triggered events (re-enabled after handling)
 		acpi_write_gpe_enable(
 			acpi_facp,
 			acpi_read_gpe_enable(acpi_facp) & ~gpe_level);
@@ -334,10 +349,12 @@
 		while (acpi_read_gpe_status(acpi_facp) & gpe_edge)
 			acpi_write_gpe_status(acpi_facp, gpe_edge);
 	}
-	
-	// notify process reading /dev/acpi
+
+	// notify process waiting on /dev/acpi
+	spin_lock_irqsave(&acpi_event_lock, flags);
 	acpi_pm1_status |= pm1_status;
 	acpi_gpe_status |= gpe_status;
+	spin_unlock_irqrestore(&acpi_event_lock, flags);
 	wake_up_interruptible(&acpi_wait_event);
 }
 
@@ -360,6 +377,39 @@
 }
 
 /*
+ * Is ACPI enabled or not?
+ */
+static inline int acpi_is_enabled(struct acpi_facp *facp)
+{
+	return ((acpi_read_pm1_control(facp) & ACPI_SCI_EN) ? 1:0);
+}
+
+/*
+ * Enable SCI
+ */
+static int acpi_enable(struct acpi_facp *facp)
+{
+	outb(facp->acpi_enable, facp->smi_cmd);
+	return (acpi_is_enabled(facp) ? 0:-1);
+}
+
+/*
+ * Disable SCI
+ */
+static int acpi_disable(struct acpi_facp *facp)
+{
+	// disable and clear any pending events
+	acpi_write_gpe_enable(facp, 0);
+	while (acpi_read_gpe_status(facp))
+		acpi_write_gpe_status(facp, acpi_read_gpe_status(facp));
+	acpi_write_pm1_enable(facp, 0);
+	acpi_write_pm1_status(facp, acpi_read_pm1_status(facp));
+	
+	outb(facp->acpi_disable, facp->smi_cmd);
+	return (acpi_is_enabled(facp) ? -1:0);
+}
+
+/*
  * Handle command to /dev/acpi
  */
 static int acpi_ioctl(struct inode *inode,
@@ -369,6 +419,9 @@
 {
 	int status = -EINVAL;
 
+	if (!capable(CAP_SYS_ADMIN))
+		return -EPERM;
+
 	switch (cmd) {
 	case ACPI_FIND_TABLES:
 		status = verify_area(VERIFY_WRITE,
@@ -391,7 +444,7 @@
 				= (struct acpi_enable_event *) arg;
 			u32 pm1_enable, gpe_enable, gpe_level;
 			u32 pm1_enabling, gpe_enabling;
-			
+
 			get_user(pm1_enable, &rqst->pm1_enable);
 			get_user(gpe_enable, &rqst->gpe_enable);
 			get_user(gpe_level, &rqst->gpe_level);
@@ -405,12 +458,30 @@
 					~acpi_read_gpe_enable(acpi_facp));
 			while (acpi_read_gpe_status(acpi_facp) & gpe_enabling)
 				acpi_write_gpe_status(acpi_facp, gpe_enabling);
-			
-			acpi_write_pm1_enable(acpi_facp, pm1_enable);
-			acpi_write_gpe_enable(acpi_facp, gpe_enable);
-			acpi_gpe_level = gpe_level;
-			
+
 			status = 0;
+
+			if (pm1_enable || gpe_enable) {
+				// enable ACPI unless it is already
+				if (!acpi_is_enabled(acpi_facp)
+				    && acpi_enable(acpi_facp)) {
+					status = -EBUSY;
+				}
+			}
+			else {
+				// disable ACPI unless it is already
+				if (acpi_is_enabled(acpi_facp)
+				    && acpi_disable(acpi_facp)) {
+					status = -EBUSY;
+				}
+			}
+
+			if (!status)
+			{
+				acpi_write_pm1_enable(acpi_facp, pm1_enable);
+				acpi_write_gpe_enable(acpi_facp, gpe_enable);
+				acpi_gpe_level = gpe_level;
+			}
 		}
 		break;
 	case ACPI_WAIT_EVENT:
@@ -427,13 +498,13 @@
 				unsigned long flags;
 				
 				// we need an atomic exchange here
-				save_flags(flags);
-				cli();
+				spin_lock_irqsave(&acpi_event_lock, flags);
 				pm1_status = acpi_pm1_status;
 				acpi_pm1_status = 0;
 				gpe_status = acpi_gpe_status;
 				acpi_gpe_status = 0;
-				restore_flags(flags);
+				spin_unlock_irqrestore(&acpi_event_lock,
+						       flags);
 
 				if (pm1_status || gpe_status)
 					break;
@@ -453,6 +524,41 @@
 	return status;
 }
 
+static void acpi_idle_handler(void)
+{
+	unsigned long time;
+	static int sleep_level = 1;
+
+	time = inl(acpi_facp->pm_tmr);
+	switch (sleep_level) {
+	case 1:
+		__asm__ __volatile__("sti ; hlt": : :"memory");
+		break;
+	case 2:
+		inb(acpi_p_lvl2);
+		break;
+	case 3:
+		/* Disable PCI arbitration while sleeping,
+		   to avoid DMA corruption? */
+		if (acpi_facp->pm2_cnt) {
+			unsigned int port = acpi_facp->pm2_cnt;
+			outb(inb(port) | ACPI_ARB_DIS, port);
+			inb(acpi_p_lvl3);
+			outb(inb(port) & ~ACPI_ARB_DIS, port);
+			break;
+		}
+		inb(acpi_p_lvl3);
+	}
+	time = (inl(acpi_facp->pm_tmr) - time) & ACPI_TMR_MASK;
+
+	if (time > acpi_p_lvl3_lat)
+		sleep_level = 3;
+	else if (time > acpi_p_lvl2_lat)
+		sleep_level = 2;
+	else
+		sleep_level = 1;
+}
+
 static struct file_operations acpi_fops =
 {
 	NULL,			/* llseek */
@@ -481,46 +587,48 @@
 	NULL
 };
 
-/* Make it impossible to enter L2/L3 until after we've initialized */
-static unsigned long acpi_p_lvl2_lat = ~0UL;
-static unsigned long acpi_p_lvl3_lat = ~0UL;
+/*
+ * Claim ACPI I/O ports
+ */
+static int acpi_claim_ioports(struct acpi_facp *facp)
+{
+	// we don't get a guarantee of contiguity for any of the ACPI registers
+	request_region(facp->pm1a_evt, facp->pm1_evt_len, "acpi");
+	if (facp->pm1b_evt)
+		request_region(facp->pm1b_evt, facp->pm1_evt_len, "acpi");
+	request_region(facp->pm1a_cnt, facp->pm1_cnt_len, "acpi");
+	if (facp->pm1b_cnt)
+		request_region(facp->pm1b_cnt, facp->pm1_cnt_len, "acpi");
+	if (facp->pm2_cnt)
+		request_region(facp->pm2_cnt, facp->pm2_cnt_len, "acpi");
+	request_region(facp->pm_tmr, facp->pm_tm_len, "acpi");
+	request_region(facp->gpe0, facp->gpe0_len, "acpi");
+	if (facp->gpe1)
+		request_region(facp->gpe1, facp->gpe1_len, "acpi");
 
-/* Initialize to guaranteed harmless port read */
-static u16 acpi_p_lvl2 = 0x80;
-static u16 acpi_p_lvl3 = 0x80;
+	return 0;
+}
 
-static void acpi_idle_handler(void)
+/*
+ * Free ACPI I/O ports
+ */
+static int acpi_release_ioports(struct acpi_facp *facp)
 {
-	unsigned long time;
-	static int sleep_level = 1;
+	// we don't get a guarantee of contiguity for any of the ACPI registers
+	release_region(facp->pm1a_evt, facp->pm1_evt_len);
+	if (facp->pm1b_evt)
+		release_region(facp->pm1b_evt, facp->pm1_evt_len);
+	release_region(facp->pm1a_cnt, facp->pm1_cnt_len);
+	if (facp->pm1b_cnt)
+		release_region(facp->pm1b_cnt, facp->pm1_cnt_len);
+	if (facp->pm2_cnt)
+		release_region(facp->pm2_cnt, facp->pm2_cnt_len);
+	release_region(facp->pm_tmr, facp->pm_tm_len);
+	release_region(facp->gpe0, facp->gpe0_len);
+	if (facp->gpe1)
+		release_region(facp->gpe1, facp->gpe1_len);
 
-	time = inl(acpi_facp->pm_tmr);
-	switch (sleep_level) {
-	case 1:
-		__asm__ __volatile__("sti ; hlt": : :"memory");
-		break;
-	case 2:
-		inb(acpi_p_lvl2);
-		break;
-	case 3:
-		/* Disable PCI arbitration while sleeping, to avoid DMA corruption? */
-		if (acpi_facp->pm2_cnt) {
-			unsigned int port = acpi_facp->pm2_cnt;
-			outb(inb(port) | ACPI_ARB_DIS, port);
-			inb(acpi_p_lvl3);
-			outb(inb(port) & ~ACPI_ARB_DIS, port);
-			break;
-		}
-		inb(acpi_p_lvl3);
-	}
-	time = (inl(acpi_facp->pm_tmr) - time) & ACPI_TMR_MASK;
-
-	if (time > acpi_p_lvl3_lat)
-		sleep_level = 3;
-	else if (time > acpi_p_lvl2_lat)
-		sleep_level = 2;
-	else
-		sleep_level = 1;
+	return 0;
 }
 
 /*
@@ -528,9 +636,9 @@
  */
 static int __init acpi_init(void)
 {
-	if (acpi_map_tables()) {
+	if (acpi_map_tables())
 		return -ENODEV;
-	}
+
 	if (request_irq(acpi_facp->sci_int,
 			acpi_irq,
 			SA_INTERRUPT | SA_SHIRQ,
@@ -541,9 +649,11 @@
 		acpi_unmap_tables();
 		return -ENODEV;
 	}
-	if (misc_register(&acpi_device)) {
+
+	acpi_claim_ioports(acpi_facp);
+
+	if (misc_register(&acpi_device))
 		printk(KERN_ERR "ACPI: misc. register failed\n");
-	}
 
 	/*
 	 * Set up the ACPI idle function. Note that we can't really
@@ -564,20 +674,9 @@
 static void __exit acpi_exit(void)
 {
 	misc_deregister(&acpi_device);
-
-	// disable and clear any pending events
-	acpi_write_gpe_enable(acpi_facp, 0);
-	while (acpi_read_gpe_status(acpi_facp)) {
-		acpi_write_gpe_status(acpi_facp,
-				      acpi_read_gpe_status(acpi_facp));
-	}
-	acpi_write_pm1_enable(acpi_facp, 0);
-	acpi_write_pm1_status(acpi_facp, acpi_read_pm1_status(acpi_facp));
-
-	// disable SCI and free interrupt
-	outb(acpi_facp->acpi_disable, acpi_facp->smi_cmd);
+	acpi_disable(acpi_facp);
+	acpi_release_ioports(acpi_facp);
 	free_irq(acpi_facp->sci_int, NULL);
-
 	acpi_unmap_tables();
 }
 
diff -u --recursive --new-file v2.3.21/linux/drivers/net/3c509.c linux/drivers/net/3c509.c
--- v2.3.21/linux/drivers/net/3c509.c	Mon Oct  4 15:49:29 1999
+++ linux/drivers/net/3c509.c	Thu Oct 14 14:55:24 1999
@@ -902,6 +902,7 @@
 MODULE_PARM(debug,"i");
 MODULE_PARM(irq,"1-8i");
 MODULE_PARM(xcvr,"1-8i");
+MODULE_PARM(max_interrupt_work, "i");
 
 int
 init_module(void)
diff -u --recursive --new-file v2.3.21/linux/drivers/net/Config.in linux/drivers/net/Config.in
--- v2.3.21/linux/drivers/net/Config.in	Mon Oct 11 15:38:14 1999
+++ linux/drivers/net/Config.in	Thu Oct 14 14:22:08 1999
@@ -130,9 +130,9 @@
    bool '  EISA, VLB, PCI and on board controllers' CONFIG_NET_EISA
    if [ "$CONFIG_NET_EISA" = "y" ]; then
       tristate '    AMD PCnet32 (VLB and PCI) support' CONFIG_PCNET32
-#     if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-#	 tristate '    Adaptec Starfire support (EXPERIMENTAL)' CONFIG_ADAPTEC_STARFIRE
-#     fi
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	 tristate '    Adaptec Starfire support (EXPERIMENTAL)' CONFIG_ADAPTEC_STARFIRE
+      fi
       tristate '    Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support' CONFIG_ACENIC
       if [ "$CONFIG_ACENIC" != "n" ]; then
 	 bool '      Omit support for old Tigon I based AceNICs' CONFIG_ACENIC_OMIT_TIGON_I
diff -u --recursive --new-file v2.3.21/linux/drivers/net/Makefile linux/drivers/net/Makefile
--- v2.3.21/linux/drivers/net/Makefile	Mon Oct 11 15:38:14 1999
+++ linux/drivers/net/Makefile	Thu Oct 14 14:22:08 1999
@@ -1035,6 +1035,14 @@
   endif
 endif
 
+ifeq ($(CONFIG_ADAPTEC_STARFIRE),y)
+L_OBJS += starfire.o
+else
+  ifeq ($(CONFIG_ADAPTEC_STARFIRE),m)
+  M_OBJS += starfire.o
+  endif
+endif
+
 #
 # HIPPI adapters
 #
diff -u --recursive --new-file v2.3.21/linux/drivers/net/ne.c linux/drivers/net/ne.c
--- v2.3.21/linux/drivers/net/ne.c	Wed Aug 18 11:36:42 1999
+++ linux/drivers/net/ne.c	Thu Oct 14 14:32:18 1999
@@ -28,7 +28,8 @@
     rjohnson@analogic.com : Changed init order so an interrupt will only
     occur after memory is allocated for dev->priv. Deallocated memory
     last in cleanup_modue()
-
+    Richard Guenther    : Added support for ISAPnP cards
+    
 */
 
 /* Routines for the NatSemi-based designs (NE[12]000). */
@@ -43,6 +44,7 @@
 #include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/pci.h>
+#include <linux/isapnp.h>
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <asm/system.h>
@@ -90,6 +92,13 @@
 static int probe_pci = 1;
 #endif
 
+static struct { unsigned short vendor, function; char *name; }
+isapnp_clone_list[] __initdata = {
+	{ISAPNP_VENDOR('E','D','I'), ISAPNP_FUNCTION(0x0216),		"NN NE2000" },
+	{ISAPNP_VENDOR('P','N','P'), ISAPNP_FUNCTION(0x80d6),		"Generic PNP" },
+	{0,}
+};
+
 #ifdef SUPPORT_NE_BAD_CLONES
 /* A list of bad clones that we none-the-less recognize. */
 static struct { const char *name8, *name16; unsigned char SAprefix[4];}
@@ -128,6 +137,7 @@
 
 int ne_probe(struct net_device *dev);
 static int ne_probe1(struct net_device *dev, int ioaddr);
+static int ne_probe_isapnp(struct net_device *dev);
 #ifdef CONFIG_PCI
 static int ne_probe_pci(struct net_device *dev);
 #endif
@@ -193,6 +203,10 @@
 		return 0;
 #endif
 
+	/* Then look for any installed ISAPnP clones */
+	if (isapnp_present() && (ne_probe_isapnp(dev) == 0))
+		return 0;
+
 #ifndef MODULE
 	/* Last resort. The semi-risky ISA auto-probe. */
 	for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) {
@@ -243,6 +257,46 @@
 }
 #endif  /* CONFIG_PCI */
 
+static int __init ne_probe_isapnp(struct net_device *dev)
+{
+	int i;
+	
+	for (i = 0; isapnp_clone_list[i].vendor != 0; i++) {
+		struct pci_dev *idev = NULL;
+
+		while ((idev = isapnp_find_dev(NULL,
+					       isapnp_clone_list[i].vendor,
+					       isapnp_clone_list[i].function,
+					       idev))) {
+			/* Avoid already found cards from previous calls */
+			if (idev->prepare(idev))
+				continue;
+			if (idev->activate(idev))
+				continue;
+			pci_irq_line = idev->irq_resource[0].start;
+			/* if no irq, search for next */
+			if (!pci_irq_line)
+				continue;
+			/* found it */
+			if (ne_probe1(dev, idev->resource[0].start) != 0) {	/* Shouldn't happen. */
+				printk(KERN_ERR "ne.c: Probe of ISAPnP card at %#lx failed.\n",
+				       idev->resource[0].start);
+				return -ENXIO;
+			}
+			ei_status.priv = (unsigned long)idev;
+			break;
+		}
+		if (!idev)
+			continue;
+		printk(KERN_INFO "ne.c: ISAPnP reports %s at i/o %#lx, irq %d.\n",
+				isapnp_clone_list[i].name,
+				dev->base_addr, dev->irq);
+		return 0;
+	}
+
+	return -ENODEV;
+}
+
 static int __init ne_probe1(struct net_device *dev, int ioaddr)
 {
 	int i;
@@ -491,6 +545,7 @@
 	ei_status.block_input = &ne_block_input;
 	ei_status.block_output = &ne_block_output;
 	ei_status.get_8390_hdr = &ne_get_8390_hdr;
+	ei_status.priv = 0;
 	dev->open = &ne_open;
 	dev->stop = &ne_close;
 	NS8390_init(dev, 0);
@@ -819,6 +874,9 @@
 		struct net_device *dev = &dev_ne[this_dev];
 		if (dev->priv != NULL) {
 			void *priv = dev->priv;
+			struct pci_dev *idev = (struct pci_dev *)ei_status.priv;
+			if (idev)
+				idev->deactivate(idev);
 			free_irq(dev->irq, dev);
 			release_region(dev->base_addr, NE_IO_EXTENT);
 			unregister_netdev(dev);
diff -u --recursive --new-file v2.3.21/linux/drivers/net/ppp_generic.c linux/drivers/net/ppp_generic.c
--- v2.3.21/linux/drivers/net/ppp_generic.c	Fri Sep 10 23:57:30 1999
+++ linux/drivers/net/ppp_generic.c	Tue Oct 12 09:58:43 1999
@@ -19,10 +19,10 @@
  * PPP driver, written by Michael Callahan and Al Longyear, and
  * subsequently hacked by Paul Mackerras.
  *
- * ==FILEVERSION 990806==
+ * ==FILEVERSION 990915==
  */
 
-/* $Id: ppp_generic.c,v 1.3 1999/09/02 05:30:12 paulus Exp $ */
+/* $Id: ppp_generic.c,v 1.5 1999/09/15 11:21:48 paulus Exp $ */
 
 #include <linux/config.h>
 #include <linux/module.h>
@@ -131,7 +131,7 @@
 #define PPP_MAX_RQLEN	32
 
 /* Prototypes. */
-static void ppp_xmit_unlock(struct ppp *ppp);
+static void ppp_xmit_unlock(struct ppp *ppp, int do_mark_bh);
 static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb);
 static void ppp_push(struct ppp *ppp);
 static void ppp_recv_unlock(struct ppp *ppp);
@@ -199,6 +199,13 @@
 /*
  * Routines for locking and unlocking the transmit and receive paths
  * of each unit.
+ *
+ * On the transmit side, we have threads of control coming into the
+ * driver from (at least) three places: the core net code, write calls
+ * on /dev/ppp from pppd, and wakeup calls from channels.  There is
+ * possible concurrency even on UP systems (between mainline and
+ * BH processing).  The XMIT_BUSY bit in ppp->busy serializes the
+ * transmit-side processing for each ppp unit.
  */
 static inline void
 lock_path(struct ppp *ppp, int bit)
@@ -329,16 +336,20 @@
 	struct ppp *ppp = (struct ppp *) file->private_data;
 	struct sk_buff *skb;
 	ssize_t ret;
+	int extra;
 
 	ret = -ENXIO;
 	if (ppp == 0)
 		goto out;
 
 	ret = -ENOMEM;
-	skb = alloc_skb(count + 2, GFP_KERNEL);
+	extra = PPP_HDRLEN - 2;
+	if (ppp->dev && ppp->dev->hard_header_len > PPP_HDRLEN)
+		extra = ppp->dev->hard_header_len - 2;
+	skb = alloc_skb(count + extra, GFP_KERNEL);
 	if (skb == 0)
 		goto out;
-	skb_reserve(skb, 2);
+	skb_reserve(skb, extra);
 	ret = -EFAULT;
 	if (copy_from_user(skb_put(skb, count), buf, count)) {
 		kfree_skb(skb);
@@ -347,7 +358,7 @@
 
 	skb_queue_tail(&ppp->xq, skb);
 	if (trylock_xmit_path(ppp))
-		ppp_xmit_unlock(ppp);
+		ppp_xmit_unlock(ppp, 1);
 
 	ret = count;
 
@@ -490,7 +501,7 @@
 			slhc_free(ppp->vj);
 		ppp->vj = slhc_init(val2+1, val+1);
 		ppp_recv_unlock(ppp);
-		ppp_xmit_unlock(ppp);
+		ppp_xmit_unlock(ppp, 1);
 		err = -ENOMEM;
 		if (ppp->vj == 0) {
 			printk(KERN_ERR "PPP: no memory (VJ compressor)\n");
@@ -580,10 +591,6 @@
 	int npi, proto;
 	unsigned char *pp;
 
-	if (skb == 0)
-		return 0;
-	/* can skb->data ever be 0? */
-
 	npi = ethertype_to_npindex(ntohs(skb->protocol));
 	if (npi < 0)
 		goto outf;
@@ -601,30 +608,15 @@
 		goto outf;
 	}
 
-	/* The transmit side of the ppp interface is serialized by
-	   the XMIT_BUSY bit in ppp->busy. */
-	if (!trylock_xmit_path(ppp)) {
-		dev->tbusy = 1;
-		return 1;
-	}
-	if (ppp->xmit_pending)
-		ppp_push(ppp);
-	if (ppp->xmit_pending) {
-		dev->tbusy = 1;
-		ppp_xmit_unlock(ppp);
-		return 1;
-	}
-	dev->tbusy = 0;
-
 	/* Put the 2-byte PPP protocol number on the front,
 	   making sure there is room for the address and control fields. */
 	if (skb_headroom(skb) < PPP_HDRLEN) {
 		struct sk_buff *ns;
 
-		ns = alloc_skb(skb->len + PPP_HDRLEN, GFP_ATOMIC);
+		ns = alloc_skb(skb->len + dev->hard_header_len, GFP_ATOMIC);
 		if (ns == 0)
-			goto outnbusy;
-		skb_reserve(ns, PPP_HDRLEN);
+			goto outf;
+		skb_reserve(ns, dev->hard_header_len);
 		memcpy(skb_put(ns, skb->len), skb->data, skb->len);
 		kfree_skb(skb);
 		skb = ns;
@@ -634,13 +626,16 @@
 	pp[0] = proto >> 8;
 	pp[1] = proto;
 
-	ppp_send_frame(ppp, skb);
-	ppp_xmit_unlock(ppp);
+	/*
+	 * ppp->xq should only ever have more than 1 data packet on it
+	 * if the core net code calls us when dev->tbusy == 1.
+	 */
+	dev->tbusy = 1;
+	skb_queue_tail(&ppp->xq, skb);
+	if (trylock_xmit_path(ppp))
+		ppp_xmit_unlock(ppp, 0);
 	return 0;
 
- outnbusy:
-	ppp_xmit_unlock(ppp);
-
  outf:
 	kfree_skb(skb);
 	return 0;
@@ -723,20 +718,34 @@
  * making sure that any work queued up gets done.
  */
 static void
-ppp_xmit_unlock(struct ppp *ppp)
+ppp_xmit_unlock(struct ppp *ppp, int do_mark_bh)
 {
 	struct sk_buff *skb;
 
 	for (;;) {
+		/* Do whatever work is waiting to be done. */
 		if (test_and_clear_bit(XMIT_WAKEUP, &ppp->busy))
 			ppp_push(ppp);
+		/* If there's no work left to do, tell the core net
+		   code that we can accept some more. */
 		while (ppp->xmit_pending == 0
 		       && (skb = skb_dequeue(&ppp->xq)) != 0)
 			ppp_send_frame(ppp, skb);
+		if (ppp->xmit_pending == 0 && skb_peek(&ppp->xq) == 0
+		    && ppp->dev->tbusy) {
+			ppp->dev->tbusy = 0;
+			if (do_mark_bh)
+				mark_bh(NET_BH);
+		}
+		/* Now unlock the transmit path, let others in. */
 		unlock_xmit_path(ppp);
+		/* Check whether any work was queued up
+		   between our last check and the unlock. */
 		if (!(test_bit(XMIT_WAKEUP, &ppp->busy)
 		      || (ppp->xmit_pending == 0 && skb_peek(&ppp->xq))))
 			break;
+		/* If so, lock again and do the work.  If we can't get
+		   the lock, someone else has it and they'll do the work. */
 		if (!trylock_xmit_path(ppp))
 			break;
 	}
@@ -763,12 +772,13 @@
 		if (ppp->vj == 0 || (ppp->flags & SC_COMP_TCP) == 0)
 			break;
 		/* try to do VJ TCP header compression */
-		new_skb = alloc_skb(skb->len + 2, GFP_ATOMIC);
+		new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2,
+				    GFP_ATOMIC);
 		if (new_skb == 0) {
 			printk(KERN_ERR "PPP: no memory (VJ comp pkt)\n");
 			goto drop;
 		}
-		skb_reserve(new_skb, 2);
+		skb_reserve(new_skb, ppp->dev->hard_header_len - 2);
 		cp = skb->data + 2;
 		len = slhc_compress(ppp->vj, cp, skb->len - 2,
 				    new_skb->data + 2, &cp,
@@ -801,11 +811,15 @@
 	/* try to do packet compression */
 	if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state != 0
 	    && proto != PPP_LCP && proto != PPP_CCP) {
-		new_skb = alloc_skb(ppp->dev->mtu + PPP_HDRLEN, GFP_ATOMIC);
+		new_skb = alloc_skb(ppp->dev->mtu + ppp->dev->hard_header_len,
+				    GFP_ATOMIC);
 		if (new_skb == 0) {
 			printk(KERN_ERR "PPP: no memory (comp pkt)\n");
 			goto drop;
 		}
+		if (ppp->dev->hard_header_len > PPP_HDRLEN)
+			skb_reserve(new_skb,
+				    ppp->dev->hard_header_len - PPP_HDRLEN);
 
 		/* compressor still expects A/C bytes in hdr */
 		len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2,
@@ -1120,6 +1134,8 @@
 	list_add(&pch->list, &ppp->channels);
 	chan->ppp = pch;
 	++ppp->n_channels;
+	if (ppp->dev && chan->hdrlen + PPP_HDRLEN > ppp->dev->hard_header_len)
+		ppp->dev->hard_header_len = chan->hdrlen + PPP_HDRLEN;
 	ret = 0;
  out:
 	spin_unlock(&all_ppp_lock);
@@ -1160,11 +1176,7 @@
 	pch->blocked = 0;
 	set_bit(XMIT_WAKEUP, &ppp->busy);
 	if (trylock_xmit_path(ppp))
-		ppp_xmit_unlock(ppp);
-	if (ppp->xmit_pending == 0) {
-		ppp->dev->tbusy = 0;
-		mark_bh(NET_BH);
-	}
+		ppp_xmit_unlock(ppp, 1);
 }
 
 /*
@@ -1215,7 +1227,7 @@
 
 		ppp->xcomp = cp;
 		ppp->xc_state = cp->comp_alloc(ccp_option, data.length);
-		ppp_xmit_unlock(ppp);
+		ppp_xmit_unlock(ppp, 1);
 		if (ppp->xc_state == 0)
 			goto out;
 
@@ -1321,7 +1333,7 @@
 		ppp->xcomp->comp_free(ppp->xc_state);
 		ppp->xc_state = 0;
 	}
-	ppp_xmit_unlock(ppp);
+	ppp_xmit_unlock(ppp, 1);
 
 	lock_recv_path(ppp);
 	ppp->xstate &= ~SC_DECOMP_RUN;
diff -u --recursive --new-file v2.3.21/linux/drivers/net/tokenring/Config.in linux/drivers/net/tokenring/Config.in
--- v2.3.21/linux/drivers/net/tokenring/Config.in	Mon Oct 11 15:38:15 1999
+++ linux/drivers/net/tokenring/Config.in	Thu Oct 14 14:22:09 1999
@@ -9,7 +9,7 @@
 if [ "$CONFIG_TR" = "y" ]; then
    tristate '  IBM Tropic chipset based adapter support' CONFIG_IBMTR
    tristate '  IBM Olympic chipset PCI adapter support' CONFIG_IBMOL
-   tristate '  SysKonnect adapter support' CONFIG_SKTR
+   tristate '  Generic TMS380 Token Ring ISA/PCI adapter support' CONFIG_TMS380TR
 fi
 
 endmenu
diff -u --recursive --new-file v2.3.21/linux/drivers/net/tokenring/Makefile linux/drivers/net/tokenring/Makefile
--- v2.3.21/linux/drivers/net/tokenring/Makefile	Mon Oct 11 15:38:15 1999
+++ linux/drivers/net/tokenring/Makefile	Thu Oct 14 14:22:09 1999
@@ -39,11 +39,11 @@
   endif
 endif
 
-ifeq ($(CONFIG_SKTR),y)
-  L_OBJS += sktr.o
+ifeq ($(CONFIG_TMS380TR),y)
+  L_OBJS += tms380tr.o
 else
-  ifeq ($(CONFIG_SKTR),m)
-    M_OBJS += sktr.o
+  ifeq ($(CONFIG_TMS380TR),m)
+    M_OBJS += tms380tr.o
   endif
 endif
 
diff -u --recursive --new-file v2.3.21/linux/drivers/net/tokenring/sktr.c linux/drivers/net/tokenring/sktr.c
--- v2.3.21/linux/drivers/net/tokenring/sktr.c	Mon Oct 11 15:38:15 1999
+++ linux/drivers/net/tokenring/sktr.c	Wed Dec 31 16:00:00 1969
@@ -1,2707 +0,0 @@
-/*
- *  sktr.c: A network driver for the SysKonnect Token Ring ISA/PCI Adapters.
- *
- *  Written 1997 by Christoph Goos
- *
- *  A fine result of the Linux Systems Network Architecture Project.
- *  http://samba.anu.edu.au/linux-sna/
- *
- *  This software may be used and distributed according to the terms
- *  of the GNU Public License, incorporated herein by reference.
- *
- *  This device driver works with the following SysKonnect adapters:
- *	- SysKonnect TR4/16(+) ISA	(SK-4190)
- *	- SysKonnect TR4/16(+) PCI	(SK-4590)
- *	- SysKonnect TR4/16 PCI		(SK-4591)
- *
- *  Sources:
- *  	- The hardware related parts of this driver are take from
- *  	  the SysKonnect Token Ring driver for Windows NT.
- *  	- I used the IBM Token Ring driver 'ibmtr.c' as a base for this
- *  	  driver, as well as the 'skeleton.c' driver by Donald Becker.
- *  	- Also various other drivers in the linux source tree were taken
- *  	  as samples for some tasks.
- *
- *  Maintainer(s):
- *    JS        Jay Schulist            jschlst@samba.anu.edu.au
- *    CG	Christoph Goos          cgoos@syskonnect.de
- *    AF	Adam Fritzler		mid@auk.cx
- *
- *  Modification History:
- *	29-Aug-97	CG	Created
- *	04-Apr-98	CG	Fixed problems caused by tok_timer_check
- *	10-Apr-98	CG	Fixed lockups at cable disconnection
- *	27-May-98	JS	Formated to Linux Kernel Format
- *	31-May-98	JS	Hacked in PCI support
- *	16-Jun-98	JS	Modulized for multiple cards with one driver
- *	21-Sep-99	CG	Fixed source routing issues for 2.2 kernels
- *	21-Sep-99	AF	Added multicast changes recommended by 
- *				  Jochen Friedrich <jochen@nwe.de> (untested)
- *				Added detection of compatible Compaq PCI card  
- *
- *  To do:
- *    1. Selectable 16 Mbps or 4Mbps
- *    2. Multi/Broadcast packet handling (might be done)
- *
- */
-
-static const char *version = "sktr.c: v1.01 08/29/97 by Christoph Goos\n";
-
-#ifdef MODULE
-#include <linux/module.h>
-#include <linux/version.h>
-#endif
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#include <linux/ptrace.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/malloc.h>
-#include <linux/string.h>
-#include <linux/time.h>
-#include <asm/system.h>
-#include <asm/bitops.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <asm/irq.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/trdevice.h>
-
-#include "sktr.h"		/* Our Stuff */
-#include "sktr_firmware.h"	/* SysKonnect adapter firmware */
-
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int sktr_portlist[] __initdata = {
-	0x0A20, 0x1A20, 0x0B20, 0x1B20, 0x0980, 0x1980, 0x0900, 0x1900,
-	0
-};
-
-/* A zero-terminated list of IRQs to be probed. 
- * Used again after initial probe for sktr_chipset_init, called from sktr_open.
- */
-static unsigned short sktr_irqlist[] = {
-	3, 5, 9, 10, 11, 12, 15,
-	0
-};
-
-/* A zero-terminated list of DMAs to be probed. */
-static int sktr_dmalist[] __initdata = {
-	5, 6, 7,
-	0
-};
-
-/* Card names */
-static char *pci_cardname = "SK NET TR 4/16 PCI\0";
-static char *isa_cardname = "SK NET TR 4/16 ISA\0";
-static char *AdapterName;
-
-/* Use 0 for production, 1 for verification, 2 for debug, and
- * 3 for very verbose debug.
- */
-#ifndef SKTR_DEBUG
-#define SKTR_DEBUG 1
-#endif
-static unsigned int sktr_debug = SKTR_DEBUG;
-
-/* The number of low I/O ports used by the tokencard. */
-#define SKTR_IO_EXTENT 32
-
-/* Index to functions, as function prototypes.
- * Alphabetical by function name.
- */
-
-/* "B" */
-static int      sktr_bringup_diags(struct net_device *dev);
-/* "C" */
-static void	sktr_cancel_tx_queue(struct net_local* tp);
-static int 	sktr_chipset_init(struct net_device *dev);
-static void 	sktr_chk_irq(struct net_device *dev);
-static unsigned char sktr_chk_frame(struct net_device *dev, unsigned char *Addr);
-static void 	sktr_chk_outstanding_cmds(struct net_device *dev);
-static void 	sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr);
-static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType);
-static int 	sktr_close(struct net_device *dev);
-static void 	sktr_cmd_status_irq(struct net_device *dev);
-/* "D" */
-static void 	sktr_disable_interrupts(struct net_device *dev);
-static void 	sktr_dump(unsigned char *Data, int length);
-/* "E" */
-static void 	sktr_enable_interrupts(struct net_device *dev);
-static void 	sktr_exec_cmd(struct net_device *dev, unsigned short Command);
-static void 	sktr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue);
-/* "F" */
-/* "G" */
-static struct enet_statistics *sktr_get_stats(struct net_device *dev);
-/* "H" */
-static void 	sktr_hardware_send_packet(struct net_device *dev,
-			struct net_local* tp);
-/* "I" */
-static int 	sktr_init_adapter(struct net_device *dev);
-static int 	sktr_init_card(struct net_device *dev);
-static void 	sktr_init_ipb(struct net_local *tp);
-static void 	sktr_init_net_local(struct net_device *dev);
-static void 	sktr_init_opb(struct net_local *tp);
-static void 	sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-static int 	sktr_isa_chk_card(struct net_device *dev, int ioaddr);
-static int      sktr_isa_chk_ioaddr(int ioaddr);
-/* "O" */
-static int 	sktr_open(struct net_device *dev);
-static void	sktr_open_adapter(struct net_device *dev);
-/* "P" */
-static int 	sktr_pci_chk_card(struct net_device *dev);
-int 		sktr_probe(struct net_device *dev);
-static int 	sktr_probe1(struct net_device *dev, int ioaddr);
-/* "R" */
-static void 	sktr_rcv_status_irq(struct net_device *dev);
-static void 	sktr_read_addr(struct net_device *dev, unsigned char *Address);
-static void 	sktr_read_ptr(struct net_device *dev);
-static void 	sktr_read_ram(struct net_device *dev, unsigned char *Data,
-			unsigned short Address, int Length);
-static int 	sktr_reset_adapter(struct net_device *dev);
-static void 	sktr_reset_interrupt(struct net_device *dev);
-static void 	sktr_ring_status_irq(struct net_device *dev);
-/* "S" */
-static int 	sktr_send_packet(struct sk_buff *skb, struct net_device *dev);
-static void 	sktr_set_multicast_list(struct net_device *dev);
-/* "T" */
-static void 	sktr_timer_chk(unsigned long data);
-static void 	sktr_timer_end_wait(unsigned long data);
-static void 	sktr_tx_status_irq(struct net_device *dev);
-/* "U" */
-static void 	sktr_update_rcv_stats(struct net_local *tp,
-			unsigned char DataPtr[], unsigned int Length);
-/* "W" */
-static void 	sktr_wait(unsigned long time);
-static void 	sktr_write_rpl_status(RPL *rpl, unsigned int Status);
-static void 	sktr_write_tpl_status(TPL *tpl, unsigned int Status);
-
-/*
- * Check for a network adapter of this type, and return '0' if one exists.
- * If dev->base_addr == 0, probe all likely locations.
- * If dev->base_addr == 1, always return failure.
- */
-int __init sktr_probe(struct net_device *dev)
-{
-	int i;
-	int base_addr = dev ? dev->base_addr : 0;
-
-	if(base_addr > 0x1ff)    /* Check a single specified location. */
-		return (sktr_probe1(dev, base_addr));
-	else if(base_addr != 0)  /* Don't probe at all. */
-		return (-ENXIO);
-
-	for(i = 0; sktr_portlist[i]; i++)
-	{
-		int ioaddr = sktr_portlist[i];
-		if(check_region(ioaddr, SKTR_IO_EXTENT))
-			continue;
-		if(sktr_probe1(dev, ioaddr))
-		{
-#ifndef MODULE
-                        tr_freedev(dev);
-#endif
-                }
-		else
-			return (0);
-	}
-
-	return (-ENODEV);
-}
-
-/*
- * Detect and setup the PCI SysKonnect TR cards in slot order.
- */
-static int __init sktr_pci_chk_card(struct net_device *dev)
-{
-	static int pci_index = 0;
-	unsigned char pci_bus, pci_device_fn;
-
-	if(!pci_present())
-		return (-1);	/* No PCI present. */
-
-	for(; pci_index < 0xff; pci_index++)
-	{
-		unsigned int pci_irq_line;
-		struct pci_dev *pdev;
-		unsigned short pci_command, new_command, vendor, device;
-		unsigned int pci_ioaddr;
-
-		if(pcibios_find_class(PCI_CLASS_NETWORK_TOKEN_RING << 8,
-			pci_index, &pci_bus, &pci_device_fn)
-			!= PCIBIOS_SUCCESSFUL)
-		{
-			break;
-		}
-
-		pcibios_read_config_word(pci_bus, pci_device_fn,
-						PCI_VENDOR_ID, &vendor);
-		pcibios_read_config_word(pci_bus, pci_device_fn,
-						PCI_DEVICE_ID, &device);
-
-		pdev		= pci_find_slot(pci_bus, pci_device_fn);
-		pci_irq_line 	= pdev->irq;
-		pci_ioaddr 	= pdev->resource[0].start;
-
-		pcibios_read_config_word(pci_bus, pci_device_fn,
-						PCI_COMMAND, &pci_command);
-
-		/* Remove I/O space marker in bit 0. */
-		pci_ioaddr &= ~3;
-
-		if((vendor != PCI_VENDOR_ID_SK) &&
-		   (vendor != PCI_VENDOR_ID_COMPAQ))
-			continue;
-
-		if((vendor == PCI_VENDOR_ID_SK) && 
-		   (device != PCI_DEVICE_ID_SK_TR))
-			continue;
-		else if((vendor == PCI_VENDOR_ID_COMPAQ) && 
-			(device != PCI_DEVICE_ID_COMPAQ_TOKENRING))
-			continue;
-     
-		if(check_region(pci_ioaddr, SKTR_IO_EXTENT))
-			continue;
-		request_region(pci_ioaddr, SKTR_IO_EXTENT, pci_cardname);
-		if(request_irq(pdev->irq, sktr_interrupt, SA_SHIRQ,
-				pci_cardname, dev))
-			return (-ENODEV); /* continue; ?? */
-
-		AdapterName = pci_cardname;
-
-		new_command = (pci_command|PCI_COMMAND_MASTER|PCI_COMMAND_IO);
-
-		if(pci_command != new_command)
-		{
-			printk("The PCI BIOS has not enabled this"
-				"device! Updating PCI command %4.4x->%4.4x.\n",
-			  	pci_command, new_command);
-			pcibios_write_config_word(pci_bus, pci_device_fn,
-				PCI_COMMAND, new_command);
-		}
-
-		/* At this point we have found a valid PCI TR card. */
-		dev->base_addr	= pci_ioaddr;
-		dev->irq 	= pci_irq_line;
-		dev->dma	= 0;
-
-		printk("%s: %s found at %#4x, using IRQ %d.\n",
-			dev->name, AdapterName, pci_ioaddr, dev->irq);
-
-		return (0);
-	}
-
-	return (-1);
-}
-
-/*
- * Detect and setup the ISA SysKonnect TR cards.
- */
-static int __init sktr_isa_chk_card(struct net_device *dev, int ioaddr)
-{
-	int i, err;
-	unsigned long flags;
-
-	err = sktr_isa_chk_ioaddr(ioaddr);
-	if(err < 0)
-		return (-ENODEV);
-
-        if(virt_to_bus((void*)((unsigned long)dev->priv+sizeof(struct net_local)))
-		> ISA_MAX_ADDRESS)
-        {
-                printk("%s: Memory not accessible for DMA\n", dev->name);
-                kfree(dev->priv);
-                return (-EAGAIN);
-        }
-
-	AdapterName = isa_cardname;
-
-        /* Grab the region so that no one else tries to probe our ioports. */
-        request_region(ioaddr, SKTR_IO_EXTENT, AdapterName);
-        dev->base_addr = ioaddr;
-
-        /* Autoselect IRQ and DMA if dev->irq == 0 */
-        if(dev->irq == 0)
-        {
-                for(i = 0; sktr_irqlist[i] != 0; i++)
-                {
-                        dev->irq = sktr_irqlist[i];
-                        err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev);
-                        if(!err)
-				break;
-                }
-
-                if(sktr_irqlist[i] == 0)
-                {
-                        printk("%s: AutoSelect no IRQ available\n", dev->name);
-                        return (-EAGAIN);
-                }
-        }
-        else
-        {
-                err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev);
-		if(err)
-                {
-                        printk("%s: Selected IRQ not available\n", dev->name);
-                        return (-EAGAIN);
-                }
-        }
-
-        /* Always allocate the DMA channel after IRQ and clean up on failure */
-        if(dev->dma == 0)
-        {
-                for(i = 0; sktr_dmalist[i] != 0; i++)
-                {
-			dev->dma = sktr_dmalist[i];
-                        err = request_dma(dev->dma, AdapterName);
-                        if(!err)
-                                break;
-                }
-
-                if(dev->dma == 0)
-                {
-                        printk("%s: AutoSelect no DMA available\n", dev->name);
-                        free_irq(dev->irq, NULL);
-                        return (-EAGAIN);
-                }
-        }
-        else
-        {
-                err = request_dma(dev->dma, AdapterName);
-                if(err)
-                {
-                        printk("%s: Selected DMA not available\n", dev->name);
-                        free_irq(dev->irq, NULL);
-                        return (-EAGAIN);
-                }
-        }
-
-	flags=claim_dma_lock();
-	disable_dma(dev->dma);
-        set_dma_mode(dev->dma, DMA_MODE_CASCADE);
-        enable_dma(dev->dma);
-        release_dma_lock(flags);
-
-	printk("%s: %s found at %#4x, using IRQ %d and DMA %d.\n",
-                dev->name, AdapterName, ioaddr, dev->irq, dev->dma);
-
-	return (0);
-}
-
-static int __init sktr_probe1(struct net_device *dev, int ioaddr)
-{
-	static unsigned version_printed = 0;
-	struct net_local *tp;
-	int DeviceType = SK_PCI;
-	int err;
-
-	if(sktr_debug && version_printed++ == 0)
-		printk("%s", version);
-
-#ifndef MODULE
-	dev = init_trdev(dev, 0);
-	if(dev == NULL)
-		return (-ENOMEM);
-#endif
-
-	err = sktr_pci_chk_card(dev);
-	if(err < 0)
-	{
-		err = sktr_isa_chk_card(dev, ioaddr);
-		if(err < 0)
-			return (-ENODEV);
-		DeviceType = SK_ISA;
-	}
-
-	/* Setup this devices private information structure */
-	tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA);
-	if(tp == NULL)
-		return (-ENOMEM);
-	memset(tp, 0, sizeof(struct net_local));
- 	tp->DeviceType = DeviceType;
-	init_waitqueue_head(&tp->wait_for_tok_int);
-	
-	dev->priv		= tp;
-	dev->init               = sktr_init_card;
-        dev->open               = sktr_open;
-        dev->stop               = sktr_close;
-        dev->hard_start_xmit    = sktr_send_packet;
-        dev->get_stats          = sktr_get_stats;
-        dev->set_multicast_list = &sktr_set_multicast_list;
-
-        return (0);
-}
-
-/* Dummy function */
-static int __init sktr_init_card(struct net_device *dev)
-{
-	if(sktr_debug > 3)
-		printk("%s: sktr_init_card\n", dev->name);
-
-	return (0);
-}
-
-/*
- * This function tests if an adapter is really installed at the
- * given I/O address. Return negative if no adapter at IO addr.
- */
-static int __init sktr_isa_chk_ioaddr(int ioaddr)
-{
-	unsigned char old, chk1, chk2;
-
-	old = inb(ioaddr + SIFADR);	/* Get the old SIFADR value */
-
-	chk1 = 0;	/* Begin with check value 0 */
-	do {
-		/* Write new SIFADR value */
-		outb(chk1, ioaddr + SIFADR);
-
-		/* Read, invert and write */
-		chk2 = inb(ioaddr + SIFADD);
-		chk2 ^= 0x0FE;
-		outb(chk2, ioaddr + SIFADR);
-
-		/* Read, invert and compare */
-		chk2 = inb(ioaddr + SIFADD);
-		chk2 ^= 0x0FE;
-
-		if(chk1 != chk2)
-			return (-1);	/* No adapter */
-
-		chk1 -= 2;
-	} while(chk1 != 0);	/* Repeat 128 times (all byte values) */
-
-    	/* Restore the SIFADR value */
-	outb(old, ioaddr + SIFADR);
-
-	return (0);
-}
-
-/*
- * Open/initialize the board. This is called sometime after
- * booting when the 'ifconfig' program is run.
- *
- * This routine should set everything up anew at each open, even
- * registers that "should" only need to be set once at boot, so that
- * there is non-reboot way to recover if something goes wrong.
- */
-static int sktr_open(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-	int err;
-
-	/* Reset the hardware here. Don't forget to set the station address. */
-	err = sktr_chipset_init(dev);
-	if(err)
-	{
-		printk(KERN_INFO "%s: Chipset initialization error\n", 
-			dev->name);
-		return (-1);
-	}
-
-	dev->addr_len = 6;
-	sktr_read_addr(dev, (unsigned char*)dev->dev_addr);
-
-	init_timer(&tp->timer);
-	tp->timer.expires	= jiffies + 30*HZ;
-	tp->timer.function	= sktr_timer_end_wait;
-	tp->timer.data		= (unsigned long)dev;
-	tp->timer.next		= NULL;
-	tp->timer.prev		= NULL;
-	add_timer(&tp->timer);
-
-	sktr_read_ptr(dev);
-	sktr_enable_interrupts(dev);
-	sktr_open_adapter(dev);
-
-	dev->tbusy = 0;
-	dev->interrupt = 0;
-	dev->start = 0;
-
-	/* Wait for interrupt from hardware. If interrupt does not come,
-	 * there will be a timeout from the timer.
-	 */
-	tp->Sleeping = 1;
-	interruptible_sleep_on(&tp->wait_for_tok_int);
-	del_timer(&tp->timer);
-
-	/* If AdapterVirtOpenFlag is 1, the adapter is now open for use */
-	if(tp->AdapterVirtOpenFlag == 0)
-	{
-		sktr_disable_interrupts(dev);
-		return (-1);
-	}
-
-	dev->start = 1;
-
-	tp->StartTime = jiffies;
-
-	/* Start function control timer */
-	tp->timer.expires	= jiffies + 2*HZ;
-	tp->timer.function	= sktr_timer_chk;
-	tp->timer.data		= (unsigned long)dev;
-	add_timer(&tp->timer);
-
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-
-	return (0);
-}
-
-/*
- * Timeout function while waiting for event
- */
-static void sktr_timer_end_wait(unsigned long data)
-{
-	struct net_device *dev = (struct net_device*)data;
-	struct net_local *tp = (struct net_local *)dev->priv;
-
-	if(tp->Sleeping)
-	{
-		tp->Sleeping = 0;
-		wake_up_interruptible(&tp->wait_for_tok_int);
-	}
-
-	return;
-}
-
-/*
- * Initialize the chipset
- */
-static int sktr_chipset_init(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-	unsigned char PosReg, Tmp;
-	int i, err;
-
-	sktr_init_ipb(tp);
-	sktr_init_opb(tp);
-	sktr_init_net_local(dev);
-
-	/* Set pos register: selects irq and dma channel.
-	 * Only for ISA bus adapters.
-	 */
-	if(dev->dma > 0)
-	{
-		PosReg = 0;
-		for(i = 0; sktr_irqlist[i] != 0; i++)
-		{
-			if(sktr_irqlist[i] == dev->irq)
-				break;
-		}
-
-		/* Choose default cycle time, 500 nsec   */
-		PosReg |= CYCLE_TIME << 2;
-		PosReg |= i << 4;
-		i = dev->dma - 5;
-		PosReg |= i;
-
-		if(tp->DataRate == SPEED_4)
-			PosReg |= LINE_SPEED_BIT;
-		else
-			PosReg &= ~LINE_SPEED_BIT;
-
-		outb(PosReg, dev->base_addr + POSREG);
-		Tmp = inb(dev->base_addr + POSREG);
-		if((Tmp & ~CYCLE_TIME) != (PosReg & ~CYCLE_TIME))
-			printk(KERN_INFO "%s: POSREG error\n", dev->name);
-	}
-
-	err = sktr_reset_adapter(dev);
-	if(err < 0)
-		return (-1);
-
-	err = sktr_bringup_diags(dev);
-	if(err < 0)
-		return (-1);
-
-	err = sktr_init_adapter(dev);
-	if(err < 0)
-		return (-1);
-
-	return (0);
-}
-
-/*
- * Initializes the net_local structure.
- */
-static void sktr_init_net_local(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-	int i;
-
-	tp->scb.CMD	= 0;
-	tp->scb.Parm[0] = 0;
-	tp->scb.Parm[1] = 0;
-
-	tp->ssb.STS	= 0;
-	tp->ssb.Parm[0] = 0;
-	tp->ssb.Parm[1] = 0;
-	tp->ssb.Parm[2] = 0;
-
-	tp->CMDqueue	= 0;
-
-	tp->AdapterOpenFlag	= 0;
-	tp->AdapterVirtOpenFlag = 0;
-	tp->ScbInUse		= 0;
-	tp->OpenCommandIssued	= 0;
-	tp->ReOpenInProgress	= 0;
-	tp->HaltInProgress	= 0;
-	tp->TransmitHaltScheduled = 0;
-	tp->LobeWireFaultLogged	= 0;
-	tp->LastOpenStatus	= 0;
-	tp->MaxPacketSize	= DEFAULT_PACKET_SIZE;
-
-	skb_queue_head_init(&tp->SendSkbQueue);
-	tp->QueueSkb = MAX_TX_QUEUE;
-
-	/* Create circular chain of transmit lists */
-	for (i = 0; i < TPL_NUM; i++)
-	{
-		tp->Tpl[i].NextTPLAddr = htonl((unsigned long) virt_to_bus(&tp->Tpl[(i+1) % TPL_NUM]));
-		tp->Tpl[i].Status	= 0;
-		tp->Tpl[i].FrameSize	= 0;
-		tp->Tpl[i].FragList[0].DataCount	= 0;
-		tp->Tpl[i].FragList[0].DataAddr		= 0;
-		tp->Tpl[i].NextTPLPtr	= &tp->Tpl[(i+1) % TPL_NUM];
-		tp->Tpl[i].MData	= NULL;
-		tp->Tpl[i].TPLIndex	= i;
-		tp->Tpl[i].BusyFlag	= 0;
-	}
-
-	tp->TplFree = tp->TplBusy = &tp->Tpl[0];
-
-	/* Create circular chain of receive lists */
-	for (i = 0; i < RPL_NUM; i++)
-	{
-		tp->Rpl[i].NextRPLAddr = htonl((unsigned long) virt_to_bus(&tp->Rpl[(i+1) % RPL_NUM]));
-		tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
-		tp->Rpl[i].FrameSize = 0;
-		tp->Rpl[i].FragList[0].DataCount = SWAPB(tp->MaxPacketSize);
-
-		/* Alloc skb and point adapter to data area */
-		tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize);
-
-		/* skb == NULL ? then use local buffer */
-		if(tp->Rpl[i].Skb == NULL)
-		{
-			tp->Rpl[i].SkbStat = SKB_UNAVAILABLE;
-			tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i]));
-			tp->Rpl[i].MData = tp->LocalRxBuffers[i];
-		}
-		else	/* SKB != NULL */
-		{
-			tp->Rpl[i].Skb->dev = dev;
-			skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize);
-
-			/* data unreachable for DMA ? then use local buffer */
-			if(tp->DeviceType == SK_ISA &&
-				virt_to_bus(tp->Rpl[i].Skb->data) +
-				tp->MaxPacketSize > ISA_MAX_ADDRESS)
-			{
-				tp->Rpl[i].SkbStat = SKB_DATA_COPY;
-				tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i]));
-				tp->Rpl[i].MData = tp->LocalRxBuffers[i];
-			}
-			else	/* DMA directly in skb->data */
-			{
-				tp->Rpl[i].SkbStat = SKB_DMA_DIRECT;
-				tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->Rpl[i].Skb->data));
-				tp->Rpl[i].MData = tp->Rpl[i].Skb->data;
-			}
-		}
-
-		tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM];
-		tp->Rpl[i].RPLIndex = i;
-	}
-
-	tp->RplHead = &tp->Rpl[0];
-	tp->RplTail = &tp->Rpl[RPL_NUM-1];
-	tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
-
-	return;
-}
-
-/*
- * Initializes the initialisation parameter block.
- */
-static void sktr_init_ipb(struct net_local *tp)
-{
-	tp->ipb.Init_Options	= BURST_MODE;
-	tp->ipb.CMD_Status_IV	= 0;
-	tp->ipb.TX_IV		= 0;
-	tp->ipb.RX_IV		= 0;
-	tp->ipb.Ring_Status_IV	= 0;
-	tp->ipb.SCB_Clear_IV	= 0;
-	tp->ipb.Adapter_CHK_IV	= 0;
-	tp->ipb.RX_Burst_Size	= BURST_SIZE;
-	tp->ipb.TX_Burst_Size	= BURST_SIZE;
-	tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES;
-	tp->ipb.SCB_Addr	= 0;
-	tp->ipb.SSB_Addr	= 0;
-
-	return;
-}
-
-/*
- * Initializes the open parameter block.
- */
-static void sktr_init_opb(struct net_local *tp)
-{
-	unsigned long Addr;
-	unsigned short RplSize    = RPL_SIZE;
-	unsigned short TplSize    = TPL_SIZE;
-	unsigned short BufferSize = BUFFER_SIZE;
-
-	tp->ocpl.OPENOptions 	 = 0;
-	tp->ocpl.OPENOptions 	|= ENABLE_FULL_DUPLEX_SELECTION;
-/*	tp->ocpl.OPENOptions 	|= PAD_ROUTING_FIELD; no more needed */
-	tp->ocpl.FullDuplex 	 = 0;
-	tp->ocpl.FullDuplex 	|= OPEN_FULL_DUPLEX_OFF;
-
-	/* Fixme: If mac address setable:
-	 * for (i=0; i<LENGTH_OF_ADDRESS; i++)
-	 *	mac->Vam->ocpl.NodeAddr[i] = mac->CurrentAddress[i];
-	 */
-
-	tp->ocpl.GroupAddr	 = 0;
-	tp->ocpl.FunctAddr	 = 0;
-	tp->ocpl.RxListSize	 = SWAPB(RplSize);
-	tp->ocpl.TxListSize	 = SWAPB(TplSize);
-	tp->ocpl.BufSize	 = SWAPB(BufferSize);
-	tp->ocpl.Reserved	 = 0;
-	tp->ocpl.TXBufMin	 = TX_BUF_MIN;
-	tp->ocpl.TXBufMax	 = TX_BUF_MAX;
-
-	Addr = htonl(virt_to_bus(tp->ProductID));
-
-	tp->ocpl.ProdIDAddr[0]	 = LOWORD(Addr);
-	tp->ocpl.ProdIDAddr[1]	 = HIWORD(Addr);
-
-	return;
-}
-
-/*
- * Send OPEN command to adapter
- */
-static void sktr_open_adapter(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-
-	if(tp->OpenCommandIssued)
-		return;
-
-	tp->OpenCommandIssued = 1;
-	sktr_exec_cmd(dev, OC_OPEN);
-
-	return;
-}
-
-/*
- * Clear the adapter's interrupt flag. Clear system interrupt enable
- * (SINTEN): disable adapter to system interrupts.
- */
-static void sktr_disable_interrupts(struct net_device *dev)
-{
-	outb(0, dev->base_addr + SIFACL);
-
-	return;
-}
-
-/*
- * Set the adapter's interrupt flag. Set system interrupt enable
- * (SINTEN): enable adapter to system interrupts.
- */
-static void sktr_enable_interrupts(struct net_device *dev)
-{
-	outb(ACL_SINTEN, dev->base_addr + SIFACL);
-
-	return;
-}
-
-/*
- * Put command in command queue, try to execute it.
- */
-static void sktr_exec_cmd(struct net_device *dev, unsigned short Command)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-
-	tp->CMDqueue |= Command;
-	sktr_chk_outstanding_cmds(dev);
-
-	return;
-}
-
-/*
- * Gets skb from system, queues it and checks if it can be sent
- */
-static int sktr_send_packet(struct sk_buff *skb, struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-
-	if(dev->tbusy)
-	{
-		/*
-		 * If we get here, some higher level has decided we are broken.
-		 * There should really be a "kick me" function call instead.
-		 *
-		 * Resetting the token ring adapter takes a long time so just
-		 * fake transmission time and go on trying. Our own timeout
-		 * routine is in sktr_timer_chk()
-		 */
-		dev->tbusy 	 = 0;
-		dev->trans_start = jiffies;
-		return (1);
-	}
-
-	/*
-	 * If some higher layer thinks we've missed an tx-done interrupt we
-	 * are passed NULL.
-	 */
-	if(skb == NULL)
-		return (0);
-
-	/*
-	 * Block a timer-based transmit from overlapping. This could better be
-	 * done with atomic_swap(1, dev->tbusy), but set_bit() works as well.
-	 */
-	if(test_and_set_bit(0, (void*)&dev->tbusy) != 0)
-	{
-		printk("%s: Transmitter access conflict.\n", dev->name);
-		return (1);
-	}
-
-	if(tp->QueueSkb == 0)
-		return (1);	/* Return with tbusy set: queue full */
-
-	tp->QueueSkb--;
-	skb_queue_tail(&tp->SendSkbQueue, skb);
-	sktr_hardware_send_packet(dev, tp);
-	if(tp->QueueSkb > 0)
-		dev->tbusy = 0;
-
-	return (0);
-}
-
-/*
- * Move frames from internal skb queue into adapter tx queue
- */
-static void sktr_hardware_send_packet(struct net_device *dev, struct net_local* tp)
-{
-	TPL *tpl;
-	short length;
-	unsigned char *buf, *newbuf;
-	struct sk_buff *skb;
-	int i;
-    
-	for(;;)
-	{
-		/* Try to get a free TPL from the chain.
-		 *
-		 * NOTE: We *must* always leave one unused TPL in the chain, 
-		 * because otherwise the adapter might send frames twice.
-		 */
-		if(tp->TplFree->NextTPLPtr->BusyFlag)	/* No free TPL */
-		{
-			printk(KERN_INFO "%s: No free TPL\n", dev->name);
-			return;
-		}
-
-		/* Send first buffer from queue */
-		skb = skb_dequeue(&tp->SendSkbQueue);
-		if(skb == NULL)
-			return;
-
-		tp->QueueSkb++;
-		/* Is buffer reachable for Busmaster-DMA? */
-		if(tp->DeviceType == SK_ISA && 
-			virt_to_bus((void*)(((long) skb->data) + skb->len))
-			> ISA_MAX_ADDRESS)
-		{
-			/* Copy frame to local buffer */
-			i 	= tp->TplFree->TPLIndex;
-			length 	= skb->len;
-			buf 	= tp->LocalTxBuffers[i];
-			memcpy(buf, skb->data, length);
-			newbuf 	= buf;
-		}
-		else
-		{
-			/* Send direct from skb->data */
-			length = skb->len;
-			newbuf = skb->data;
-		}
-
-		/* Source address in packet? */
-		sktr_chk_src_addr(newbuf, dev->dev_addr);
-
-		tp->LastSendTime	= jiffies;
-		tpl 			= tp->TplFree;	/* Get the "free" TPL */
-		tpl->BusyFlag 		= 1;		/* Mark TPL as busy */
-		tp->TplFree 		= tpl->NextTPLPtr;
-    
-		/* Save the skb for delayed return of skb to system */
-		tpl->Skb = skb;
-		tpl->FragList[0].DataCount = (unsigned short) SWAPB(length);
-		tpl->FragList[0].DataAddr  = htonl(virt_to_bus(newbuf));
-
-		/* Write the data length in the transmit list. */
-		tpl->FrameSize 	= (unsigned short) SWAPB(length);
-		tpl->MData 	= newbuf;
-
-		/* Transmit the frame and set the status values. */
-		sktr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME
-					| TX_END_FRAME | TX_PASS_SRC_ADDR
-					| TX_FRAME_IRQ);
-
-		/* Let adapter send the frame. */
-		sktr_exec_sifcmd(dev, CMD_TX_VALID);
-	}
-
-	return;
-}
-
-/*
- * Write the given value to the 'Status' field of the specified TPL.
- * NOTE: This function should be used whenever the status of any TPL must be
- * modified by the driver, because the compiler may otherwise change the
- * order of instructions such that writing the TPL status may be executed at
- * an undesireable time. When this function is used, the status is always
- * written when the function is called.
- */
-static void sktr_write_tpl_status(TPL *tpl, unsigned int Status)
-{
-	tpl->Status = Status;
-}
-
-static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr)
-{
-	unsigned char SRBit;
-
-	if((((unsigned long)frame[8]) & ~0x80) != 0)	/* Compare 4 bytes */
-		return;
-	if((unsigned short)frame[12] != 0)		/* Compare 2 bytes */
-		return;
-
-	SRBit = frame[8] & 0x80;
-	memcpy(&frame[8], hw_addr, 6);
-	frame[8] |= SRBit;
-
-	return;
-}
-
-/*
- * The timer routine: Check if adapter still open and working, reopen if not. 
- */
-static void sktr_timer_chk(unsigned long data)
-{
-	struct net_device *dev = (struct net_device*)data;
-	struct net_local *tp = (struct net_local*)dev->priv;
-
-	if(tp->HaltInProgress)
-		return;
-
-	sktr_chk_outstanding_cmds(dev);
-	if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies)
-		&& (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy))
-	{
-		/* Anything to send, but stalled to long */
-		tp->LastSendTime = jiffies;
-		sktr_exec_cmd(dev, OC_CLOSE);	/* Does reopen automatically */
-	}
-
-	tp->timer.expires = jiffies + 2*HZ;
-	add_timer(&tp->timer);
-
-	if(tp->AdapterOpenFlag || tp->ReOpenInProgress)
-		return;
-	tp->ReOpenInProgress = 1;
-	sktr_open_adapter(dev);
-
-	return;
-}
-
-/*
- * The typical workload of the driver: Handle the network interface interrupts.
- */
-static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-	struct net_device *dev = dev_id;
-	struct net_local *tp;
-	int ioaddr;
-	unsigned short irq_type;
-
-	if(dev == NULL)
-	{
-		printk("%s: irq %d for unknown device.\n", dev->name, irq);
-		return;
-	}
-
-	dev->interrupt = 1;
-
-	ioaddr = dev->base_addr;
-	tp = (struct net_local *)dev->priv;
-
-	irq_type = inw(ioaddr + SIFSTS);
-
-	while(irq_type & STS_SYSTEM_IRQ)
-	{
-		irq_type &= STS_IRQ_MASK;
-
-		if(!sktr_chk_ssb(tp, irq_type))
-		{
-			printk(KERN_INFO "%s: DATA LATE occurred\n", dev->name);
-			break;
-		}
-
-		switch(irq_type)
-		{
-			case STS_IRQ_RECEIVE_STATUS:
-				sktr_reset_interrupt(dev);
-				sktr_rcv_status_irq(dev);
-				break;
-
-			case STS_IRQ_TRANSMIT_STATUS:
-				/* Check if TRANSMIT.HALT command is complete */
-				if(tp->ssb.Parm[0] & COMMAND_COMPLETE)
-				{
-					tp->TransmitCommandActive = 0;
-					tp->TransmitHaltScheduled = 0;
-
-					/* Issue a new transmit command. */
-					sktr_exec_cmd(dev, OC_TRANSMIT);
-				}
-
-				sktr_reset_interrupt(dev);
-				sktr_tx_status_irq(dev);
-				break;
-
-			case STS_IRQ_COMMAND_STATUS:
-				/* The SSB contains status of last command
-				 * other than receive/transmit.
-				 */
-				sktr_cmd_status_irq(dev);
-				break;
-
-			case STS_IRQ_SCB_CLEAR:
-				/* The SCB is free for another command. */
-				tp->ScbInUse = 0;
-				sktr_chk_outstanding_cmds(dev);
-				break;
-
-			case STS_IRQ_RING_STATUS:
-				sktr_ring_status_irq(dev);
-				break;
-
-			case STS_IRQ_ADAPTER_CHECK:
-				sktr_chk_irq(dev);
-				break;
-
-			default:
-				printk(KERN_INFO "Unknown Token Ring IRQ\n");
-				break;
-		}
-
-		/* Reset system interrupt if not already done. */
-		if(irq_type != STS_IRQ_TRANSMIT_STATUS
-			&& irq_type != STS_IRQ_RECEIVE_STATUS)
-		{
-			sktr_reset_interrupt(dev);
-		}
-
-		irq_type = inw(ioaddr + SIFSTS);
-	}
-
-	dev->interrupt = 0;
-
-	return;
-}
-
-/*
- *  Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command.
- */
-static void sktr_reset_interrupt(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-	SSB *ssb = &tp->ssb;
-
-	/*
-	 * [Workaround for "Data Late"]
-	 * Set all fields of the SSB to well-defined values so we can
-	 * check if the adapter has written the SSB.
-	 */
-
-	ssb->STS	= (unsigned short) -1;
-	ssb->Parm[0] 	= (unsigned short) -1;
-	ssb->Parm[1] 	= (unsigned short) -1;
-	ssb->Parm[2] 	= (unsigned short) -1;
-
-	/* Free SSB by issuing SSB_CLEAR command after reading IRQ code
-	 * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts.
-	 */
-	sktr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ);
-
-	return;
-}
-
-/*
- * Check if the SSB has actually been written by the adapter.
- */
-static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType)
-{
-	SSB *ssb = &tp->ssb;	/* The address of the SSB. */
-
-	/* C 0 1 2 INTERRUPT CODE
-	 * - - - - --------------
-	 * 1 1 1 1 TRANSMIT STATUS
-	 * 1 1 1 1 RECEIVE STATUS
-	 * 1 ? ? 0 COMMAND STATUS
-	 * 0 0 0 0 SCB CLEAR
-	 * 1 1 0 0 RING STATUS
-	 * 0 0 0 0 ADAPTER CHECK
-	 *
-	 * 0 = SSB field not affected by interrupt
-	 * 1 = SSB field is affected by interrupt
-	 *
-	 * C = SSB ADDRESS +0: COMMAND
-	 * 0 = SSB ADDRESS +2: STATUS 0
-	 * 1 = SSB ADDRESS +4: STATUS 1
-	 * 2 = SSB ADDRESS +6: STATUS 2
-	 */
-
-	/* Check if this interrupt does use the SSB. */
-
-	if(IrqType != STS_IRQ_TRANSMIT_STATUS
-		&& IrqType != STS_IRQ_RECEIVE_STATUS
-		&& IrqType != STS_IRQ_COMMAND_STATUS
-		&& IrqType != STS_IRQ_RING_STATUS)
-	{
-		return (1);	/* SSB not involved. */
-	}
-
-	/* Note: All fields of the SSB have been set to all ones (-1) after it
-	 * has last been used by the software (see DriverIsr()).
-	 *
-	 * Check if the affected SSB fields are still unchanged.
-	 */
-
-	if(ssb->STS == (unsigned short) -1)
-		return (0);	/* Command field not yet available. */
-	if(IrqType == STS_IRQ_COMMAND_STATUS)
-		return (1);	/* Status fields not always affected. */
-	if(ssb->Parm[0] == (unsigned short) -1)
-		return (0);	/* Status 1 field not yet available. */
-	if(IrqType == STS_IRQ_RING_STATUS)
-		return (1);	/* Status 2 & 3 fields not affected. */
-
-	/* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */
-	if(ssb->Parm[1] == (unsigned short) -1)
-		return (0);	/* Status 2 field not yet available. */
-	if(ssb->Parm[2] == (unsigned short) -1)
-		return (0);	/* Status 3 field not yet available. */
-
-	return (1);	/* All SSB fields have been written by the adapter. */
-}
-
-/*
- * Evaluates the command results status in the SSB status field.
- */
-static void sktr_cmd_status_irq(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-	unsigned short ssb_cmd, ssb_parm_0;
-	unsigned short ssb_parm_1;
-	char *open_err = "Open error -";
-	char *code_err = "Open code -";
-
-	/* Copy the ssb values to local variables */
-	ssb_cmd    = tp->ssb.STS;
-	ssb_parm_0 = tp->ssb.Parm[0];
-	ssb_parm_1 = tp->ssb.Parm[1];
-
-	if(ssb_cmd == OPEN)
-	{
-		tp->Sleeping = 0;
-		if(!tp->ReOpenInProgress)
-	    		wake_up_interruptible(&tp->wait_for_tok_int);
-
-		tp->OpenCommandIssued = 0;
-		tp->ScbInUse = 0;
-
-		if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION)
-		{
-			/* Success, the adapter is open. */
-			tp->LobeWireFaultLogged	= 0;
-			tp->AdapterOpenFlag 	= 1;
-			tp->AdapterVirtOpenFlag = 1;
-			tp->TransmitCommandActive = 0;
-			sktr_exec_cmd(dev, OC_TRANSMIT);
-			sktr_exec_cmd(dev, OC_RECEIVE);
-
-			if(tp->ReOpenInProgress)
-				tp->ReOpenInProgress = 0;
-
-			return;
-		}
-		else 	/* The adapter did not open. */
-		{
-	    		if(ssb_parm_0 & NODE_ADDR_ERROR)
-				printk(KERN_INFO "%s: Node address error\n",
-					dev->name);
-	    		if(ssb_parm_0 & LIST_SIZE_ERROR)
-				printk(KERN_INFO "%s: List size error\n",
-					dev->name);
-	    		if(ssb_parm_0 & BUF_SIZE_ERROR)
-				printk(KERN_INFO "%s: Buffer size error\n",
-					dev->name);
-	    		if(ssb_parm_0 & TX_BUF_COUNT_ERROR)
-				printk(KERN_INFO "%s: Tx buffer count error\n",
-					dev->name);
-	    		if(ssb_parm_0 & INVALID_OPEN_OPTION)
-				printk(KERN_INFO "%s: Invalid open option\n",
-					dev->name);
-	    		if(ssb_parm_0 & OPEN_ERROR)
-			{
-				/* Show the open phase. */
-				switch(ssb_parm_0 & OPEN_PHASES_MASK)
-				{
-					case LOBE_MEDIA_TEST:
-						if(!tp->LobeWireFaultLogged)
-						{
-							tp->LobeWireFaultLogged = 1;
-							printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err);
-		    				}
-						tp->ReOpenInProgress	= 1;
-						tp->AdapterOpenFlag 	= 0;
-						tp->AdapterVirtOpenFlag = 1;
-						sktr_open_adapter(dev);
-						return;
-
-					case PHYSICAL_INSERTION:
-						printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err);
-						break;
-
-					case ADDRESS_VERIFICATION:
-						printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err);
-						break;
-
-					case PARTICIPATION_IN_RING_POLL:
-						printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err);
-						break;
-
-					case REQUEST_INITIALISATION:
-						printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err);
-						break;
-
-					case FULLDUPLEX_CHECK:
-						printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err);
-						break;
-
-					default:
-						printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err);
-						break;
-				}
-
-				/* Show the open errors. */
-				switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK)
-				{
-					case OPEN_FUNCTION_FAILURE:
-						printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err);
-						tp->LastOpenStatus =
-							OPEN_FUNCTION_FAILURE;
-						break;
-
-					case OPEN_SIGNAL_LOSS:
-						printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err);
-						tp->LastOpenStatus =
-							OPEN_SIGNAL_LOSS;
-						break;
-
-					case OPEN_TIMEOUT:
-						printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err);
-						tp->LastOpenStatus =
-							OPEN_TIMEOUT;
-						break;
-
-					case OPEN_RING_FAILURE:
-						printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err);
-						tp->LastOpenStatus =
-							OPEN_RING_FAILURE;
-						break;
-
-					case OPEN_RING_BEACONING:
-						printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err);
-						tp->LastOpenStatus =
-							OPEN_RING_BEACONING;
-						break;
-
-					case OPEN_DUPLICATE_NODEADDR:
-						printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err);
-						tp->LastOpenStatus =
-							OPEN_DUPLICATE_NODEADDR;
-						break;
-
-					case OPEN_REQUEST_INIT:
-						printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err);
-						tp->LastOpenStatus =
-							OPEN_REQUEST_INIT;
-						break;
-
-					case OPEN_REMOVE_RECEIVED:
-						printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err);
-						tp->LastOpenStatus =
-							OPEN_REMOVE_RECEIVED;
-						break;
-
-					case OPEN_FULLDUPLEX_SET:
-						printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err);
-						tp->LastOpenStatus =
-							OPEN_FULLDUPLEX_SET;
-						break;
-
-					default:
-						printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err);
-						tp->LastOpenStatus =
-							OPEN_FUNCTION_FAILURE;
-						break;
-				}
-			}
-
-			tp->AdapterOpenFlag 	= 0;
-			tp->AdapterVirtOpenFlag = 0;
-
-			return;
-		}
-	}
-	else
-	{
-		if(ssb_cmd != READ_ERROR_LOG)
-			return;
-
-		/* Add values from the error log table to the MAC
-		 * statistics counters and update the errorlogtable
-		 * memory.
-		 */
-		tp->MacStat.line_errors += tp->errorlogtable.Line_Error;
-		tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error;
-		tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error;
-		tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error;
-		tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error;
-		tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error;
-		tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error;
-		tp->MacStat.token_errors += tp->errorlogtable.Token_Error;
-		tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error;
-		tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error;
-		tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters;
-		tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error;
-		tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error;
-	}
-
-	return;
-}
-
-/*
- * The inverse routine to sktr_open().
- */
-static int sktr_close(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-
-	dev->tbusy = 1;
-	dev->start = 0;
-
-	del_timer(&tp->timer);
-
-	/* Flush the Tx and disable Rx here. */
-
-	tp->HaltInProgress 	= 1;
-	sktr_exec_cmd(dev, OC_CLOSE);
-	tp->timer.expires	= jiffies + 1*HZ;
-	tp->timer.function 	= sktr_timer_end_wait;
-	tp->timer.data 		= (unsigned long)dev;
-	add_timer(&tp->timer);
-
-	sktr_enable_interrupts(dev);
-
-	tp->Sleeping = 1;
-	interruptible_sleep_on(&tp->wait_for_tok_int);
-	tp->TransmitCommandActive = 0;
-    
-	del_timer(&tp->timer);
-	sktr_disable_interrupts(dev);
-   
-	if(dev->dma > 0) 
-	{
-		unsigned long flags=claim_dma_lock();
-		disable_dma(dev->dma);
-		release_dma_lock(flags);
-	}
-	
-	outw(0xFF00, dev->base_addr + SIFCMD);
-	if(dev->dma > 0)
-		outb(0xff, dev->base_addr + POSREG);
-
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-
-	sktr_cancel_tx_queue(tp);
-
-	return (0);
-}
-
-/*
- * Get the current statistics. This may be called with the card open
- * or closed.
- */
-static struct enet_statistics *sktr_get_stats(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-
-	return ((struct enet_statistics *)&tp->MacStat);
-}
-
-/*
- * Set or clear the multicast filter for this adapter.
- */
-static void sktr_set_multicast_list(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-        unsigned int OpenOptions;
-	
-        OpenOptions = tp->ocpl.OPENOptions &
-                ~(PASS_ADAPTER_MAC_FRAMES
-		  | PASS_ATTENTION_FRAMES
-		  | PASS_BEACON_MAC_FRAMES
-		  | COPY_ALL_MAC_FRAMES
-		  | COPY_ALL_NON_MAC_FRAMES);
-	
-        tp->ocpl.FunctAddr = 0;
-	
-        if(dev->flags & IFF_PROMISC)
-                /* Enable promiscuous mode */
-                OpenOptions |= COPY_ALL_NON_MAC_FRAMES |
-			COPY_ALL_MAC_FRAMES;
-        else
-        {
-                if(dev->flags & IFF_ALLMULTI)
-                {
-                        /* Disable promiscuous mode, use normal mode. */
-                        tp->ocpl.FunctAddr = 0xFFFFFFFF;
-			
-                }
-                else
-                {
-                        int i;
-                        struct dev_mc_list *mclist = dev->mc_list;
-                        for (i=0; i< dev->mc_count; i++)
-                        {
-                                ((char *)(&tp->ocpl.FunctAddr))[0] |=
-					mclist->dmi_addr[2];
-                                ((char *)(&tp->ocpl.FunctAddr))[1] |=
-					mclist->dmi_addr[3];
-                                ((char *)(&tp->ocpl.FunctAddr))[2] |=
-					mclist->dmi_addr[4];
-                                ((char *)(&tp->ocpl.FunctAddr))[3] |=
-					mclist->dmi_addr[5];
-                                 mclist = mclist->next;
-                         }
-                }
-                sktr_exec_cmd(dev, OC_SET_FUNCT_ADDR);
-        }
-	
-        tp->ocpl.OPENOptions = OpenOptions;
-        sktr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS);
-        return;
-}
-
-/*
- * Wait for some time (microseconds)
- *
- * udelay() is a bit harsh, but using a looser timer causes
- * the bring-up-diags to stall indefinitly.  
- *
- */
-
-static void sktr_wait(unsigned long time)
-{
-	udelay(time);
-	return;
-}
-
-/*
- * Write a command value to the SIFCMD register
- */
-static void sktr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue)
-{
-	int ioaddr = dev->base_addr;
-	unsigned short cmd;
-	unsigned short SifStsValue;
-	unsigned long loop_counter;
-
-	WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER);
-	cmd = (unsigned short)WriteValue;
-	loop_counter = 0,5 * 800000;
-	do {
-		SifStsValue = inw(ioaddr + SIFSTS);
-	} while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--);
-	outw(cmd, ioaddr + SIFCMD);
-
-	return;
-}
-
-/*
- * Processes adapter hardware reset, halts adapter and downloads firmware,
- * clears the halt bit.
- */
-static int sktr_reset_adapter(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-	unsigned short *fw_ptr = (unsigned short *)&sktr_code;
-	unsigned short count, c;
-	int ioaddr = dev->base_addr;
-
-	/* Hardware adapter reset */
-	outw(ACL_ARESET, ioaddr + SIFACL);
-	sktr_wait(40);
-
-	c = inw(ioaddr + SIFACL);
-	sktr_wait(20);
-
-	if(dev->dma == 0)	/* For PCI adapters */
-	{
-		c &= ~(ACL_SPEED4 | ACL_SPEED16);	/* Clear bits */
-		if(tp->DataRate == SPEED_4)
-			c |= ACL_SPEED4;		/* Set 4Mbps */
-		else
-			c |= ACL_SPEED16;		/* Set 16Mbps */
-	}
-
-	/* In case a command is pending - forget it */
-	tp->ScbInUse = 0;
-
-	c &= ~ACL_ARESET;		/* Clear adapter reset bit */
-	c |=  ACL_CPHALT;		/* Halt adapter CPU, allow download */
-	c &= ~ACL_PSDMAEN;		/* Clear pseudo dma bit */
-	outw(c, ioaddr + SIFACL);
-	sktr_wait(40);
-
-	/* Download firmware via DIO interface: */
-	do {
-		/* Download first address part */
-		outw(*fw_ptr, ioaddr + SIFADX);
-		fw_ptr++;
-
-		/* Download second address part */
-		outw(*fw_ptr, ioaddr + SIFADD);
-		fw_ptr++;
-
-		if((count = *fw_ptr) != 0)	/* Load loop counter */
-		{
-			fw_ptr++;	/* Download block data */
-			for(; count > 0; count--)
-			{
-				outw(*fw_ptr, ioaddr + SIFINC);
-				fw_ptr++;
-			}
-		}
-		else	/* Stop, if last block downloaded */
-		{
-			c = inw(ioaddr + SIFACL);
-			c &= (~ACL_CPHALT | ACL_SINTEN);
-
-			/* Clear CPHALT and start BUD */
-			outw(c, ioaddr + SIFACL);
-			return (1);
-		}
-	} while(count == 0);
-
-	return (-1);
-}
-
-/*
- * Starts bring up diagnostics of token ring adapter and evaluates
- * diagnostic results.
- */
-static int sktr_bringup_diags(struct net_device *dev)
-{
-	int loop_cnt, retry_cnt;
-	unsigned short Status;
-	int ioaddr = dev->base_addr;
-
-	sktr_wait(HALF_SECOND);
-	sktr_exec_sifcmd(dev, EXEC_SOFT_RESET);
-	sktr_wait(HALF_SECOND);
-
-	retry_cnt = BUD_MAX_RETRIES;	/* maximal number of retrys */
-
-	do {
-		retry_cnt--;
-		if(sktr_debug > 3)
-			printk(KERN_INFO "BUD-Status: \n");
-		loop_cnt = BUD_MAX_LOOPCNT;	/* maximum: three seconds*/
-		do {			/* Inspect BUD results */
-			loop_cnt--;
-			sktr_wait(HALF_SECOND);
-			Status = inw(ioaddr + SIFSTS);
-			Status &= STS_MASK;
-
-			if(sktr_debug > 3)
-				printk(KERN_INFO " %04X \n", Status);
-			/* BUD successfully completed */
-			if(Status == STS_INITIALIZE)
-				return (1);
-		/* Unrecoverable hardware error, BUD not completed? */
-		} while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST))
-			!= (STS_ERROR | STS_TEST)));
-
-		/* Error preventing completion of BUD */
-		if(retry_cnt > 0)
-		{
-			printk(KERN_INFO "%s: Adapter Software Reset.\n", 
-				dev->name);
-			sktr_exec_sifcmd(dev, EXEC_SOFT_RESET);
-			sktr_wait(HALF_SECOND);
-		}
-	} while(retry_cnt > 0);
-
-	Status = inw(ioaddr + SIFSTS);
-	Status &= STS_ERROR_MASK;	/* Hardware error occurred! */
-
-	printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n",
-		dev->name, Status);
-
-	return (-1);
-}
-
-/*
- * Copy initialisation data to adapter memory, beginning at address
- * 1:0A00; Starting DMA test and evaluating result bits.
- */
-static int sktr_init_adapter(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-
-	const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B};
-	const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7,
-						0xC5, 0xD9, 0xC3, 0xD4};
-	void *ptr = (void *)&tp->ipb;
-	unsigned short *ipb_ptr = (unsigned short *)ptr;
-	unsigned char *cb_ptr = (unsigned char *) &tp->scb;
-	unsigned char *sb_ptr = (unsigned char *) &tp->ssb;
-	unsigned short Status;
-	int i, loop_cnt, retry_cnt;
-	int ioaddr = dev->base_addr;
-
-	/* Normalize: byte order low/high, word order high/low! (only IPB!) */
-	tp->ipb.SCB_Addr = SWAPW(virt_to_bus(&tp->scb));
-	tp->ipb.SSB_Addr = SWAPW(virt_to_bus(&tp->ssb));
-
-	/* Maximum: three initialization retries */
-	retry_cnt = INIT_MAX_RETRIES;
-
-	do {
-		retry_cnt--;
-
-		/* Transfer initialization block */
-		outw(0x0001, ioaddr + SIFADX);
-
-		/* To address 0001:0A00 of adapter RAM */
-		outw(0x0A00, ioaddr + SIFADD);
-
-		/* Write 11 words to adapter RAM */
-		for(i = 0; i < 11; i++)
-			outw(ipb_ptr[i], ioaddr + SIFINC);
-
-		/* Execute SCB adapter command */
-		sktr_exec_sifcmd(dev, CMD_EXECUTE);
-
-		loop_cnt = INIT_MAX_LOOPCNT;	/* Maximum: 11 seconds */
-
-		/* While remaining retries, no error and not completed */
-		do {
-			Status = 0;
-			loop_cnt--;
-			sktr_wait(HALF_SECOND);
-
-			/* Mask interesting status bits */
-			Status = inw(ioaddr + SIFSTS);
-			Status &= STS_MASK;
-		} while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0)
-			&& ((Status & STS_ERROR) == 0) && (loop_cnt != 0));
-
-		if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0)
-		{
-			/* Initialization completed without error */
-			i = 0;
-			do {	/* Test if contents of SCB is valid */
-				if(SCB_Test[i] != *(cb_ptr + i))
-					/* DMA data error: wrong data in SCB */
-					return (-1);
-				i++;
-			} while(i < 6);
-
-			i = 0;
-			do {	/* Test if contents of SSB is valid */
-				if(SSB_Test[i] != *(sb_ptr + i))
-					/* DMA data error: wrong data in SSB */
-					return (-1);
-				i++;
-			} while (i < 8);
-
-			return (1);	/* Adapter successfully initialized */
-		}
-		else
-		{
-			if((Status & STS_ERROR) != 0)
-			{
-				/* Initialization error occurred */
-				Status = inw(ioaddr + SIFSTS);
-				Status &= STS_ERROR_MASK;
-				/* ShowInitialisationErrorCode(Status); */
-				return (-1); /* Unrecoverable error */
-			}
-			else
-			{
-				if(retry_cnt > 0)
-				{
-					/* Reset adapter and try init again */
-					sktr_exec_sifcmd(dev, EXEC_SOFT_RESET);
-					sktr_wait(HALF_SECOND);
-				}
-			}
-		}
-	} while(retry_cnt > 0);
-
-	return (-1);
-}
-
-/*
- * Check for outstanding commands in command queue and tries to execute
- * command immediately. Corresponding command flag in command queue is cleared.
- */
-static void sktr_chk_outstanding_cmds(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-	unsigned long Addr = 0;
-	unsigned char i = 0;
-
-	if(tp->CMDqueue == 0)
-		return;		/* No command execution */
-
-	/* If SCB in use: no command */
-	if(tp->ScbInUse == 1)
-		return;
-
-	/* Check if adapter is opened, avoiding COMMAND_REJECT
-	 * interrupt by the adapter!
-	 */
-	if(tp->AdapterOpenFlag == 0)
-	{
-		if(tp->CMDqueue & OC_OPEN)
-		{
-			/* Execute OPEN command	*/
-			tp->CMDqueue ^= OC_OPEN;
-
-			/* Copy the 18 bytes of the product ID */
-			while((AdapterName[i] != '\0') && (i < PROD_ID_SIZE))
-			{
-				tp->ProductID[i] = AdapterName[i];
-				i++;
-			}
-
-			Addr = htonl(virt_to_bus(&tp->ocpl));
-			tp->scb.Parm[0] = LOWORD(Addr);
-			tp->scb.Parm[1] = HIWORD(Addr);
-			tp->scb.CMD = OPEN;
-		}
-		else
-			/* No OPEN command queued, but adapter closed. Note:
-			 * We'll try to re-open the adapter in DriverPoll()
-			 */
-			return;		/* No adapter command issued */
-	}
-	else
-	{
-		/* Adapter is open; evaluate command queue: try to execute
-		 * outstanding commands (depending on priority!) CLOSE
-		 * command queued
-		 */
-		if(tp->CMDqueue & OC_CLOSE)
-		{
-			tp->CMDqueue ^= OC_CLOSE;
-			tp->AdapterOpenFlag = 0;
-			tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */
-			tp->scb.Parm[1] = 0; /* but should be set to zero! */
-			tp->scb.CMD = CLOSE;
-			if(!tp->HaltInProgress)
-				tp->CMDqueue |= OC_OPEN; /* re-open adapter */
-			else
-				tp->CMDqueue = 0;	/* no more commands */
-		}
-		else
-		{
-			if(tp->CMDqueue & OC_RECEIVE)
-			{
-				tp->CMDqueue ^= OC_RECEIVE;
-				Addr = htonl(virt_to_bus(tp->RplHead));
-				tp->scb.Parm[0] = LOWORD(Addr);
-				tp->scb.Parm[1] = HIWORD(Addr);
-				tp->scb.CMD = RECEIVE;
-			}
-			else
-			{
-				if(tp->CMDqueue & OC_TRANSMIT_HALT)
-				{
-					/* NOTE: TRANSMIT.HALT must be checked 
-					 * before TRANSMIT.
-					 */
-					tp->CMDqueue ^= OC_TRANSMIT_HALT;
-					tp->scb.CMD = TRANSMIT_HALT;
-
-					/* Parm[0] and Parm[1] are ignored
-					 * but should be set to zero!
-					 */
-					tp->scb.Parm[0] = 0;
-					tp->scb.Parm[1] = 0;
-				}
-				else
-				{
-					if(tp->CMDqueue & OC_TRANSMIT)
-					{
-						/* NOTE: TRANSMIT must be 
-						 * checked after TRANSMIT.HALT
-						 */
-						if(tp->TransmitCommandActive)
-						{
-							if(!tp->TransmitHaltScheduled)
-							{
-								tp->TransmitHaltScheduled = 1;
-								sktr_exec_cmd(dev, OC_TRANSMIT_HALT) ;
-							}
-							tp->TransmitCommandActive = 0;
-							return;
-						}
-
-						tp->CMDqueue ^= OC_TRANSMIT;
-						sktr_cancel_tx_queue(tp);
-						Addr = htonl(virt_to_bus(tp->TplBusy));
-						tp->scb.Parm[0] = LOWORD(Addr);
-						tp->scb.Parm[1] = HIWORD(Addr);
-						tp->scb.CMD = TRANSMIT;
-						tp->TransmitCommandActive = 1;
-					}
-					else
-					{
-						if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS)
-						{
-							tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS;
-							tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/
-							tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION;
-							tp->scb.Parm[1] = 0; /* is ignored but should be zero */
-							tp->scb.CMD = MODIFY_OPEN_PARMS;
-						}
-						else
-						{
-							if(tp->CMDqueue & OC_SET_FUNCT_ADDR)
-							{
-								tp->CMDqueue ^= OC_SET_FUNCT_ADDR;
-								tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr);
-								tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr);
-								tp->scb.CMD = SET_FUNCT_ADDR;
-							}
-							else
-							{
-								if(tp->CMDqueue & OC_SET_GROUP_ADDR)
-								{
-									tp->CMDqueue ^= OC_SET_GROUP_ADDR;
-									tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr);
-									tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr);
-									tp->scb.CMD = SET_GROUP_ADDR;
-								}
-								else
-								{
-									if(tp->CMDqueue & OC_READ_ERROR_LOG)
-									{
-										tp->CMDqueue ^= OC_READ_ERROR_LOG;
-										Addr = htonl(virt_to_bus(&tp->errorlogtable));
-										tp->scb.Parm[0] = LOWORD(Addr);
-										tp->scb.Parm[1] = HIWORD(Addr);
-										tp->scb.CMD = READ_ERROR_LOG;
-									}
-									else
-									{
-										printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n");
-										tp->CMDqueue = 0;
-										return;
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-	tp->ScbInUse = 1;	/* Set semaphore: SCB in use. */
-
-	/* Execute SCB and generate IRQ when done. */
-	sktr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST);
-
-	return;
-}
-
-/*
- * IRQ conditions: signal loss on the ring, transmit or receive of beacon
- * frames (disabled if bit 1 of OPEN option is set); report error MAC
- * frame transmit (disabled if bit 2 of OPEN option is set); open or short
- * cirquit fault on the lobe is detected; remove MAC frame received;
- * error counter overflow (255); opened adapter is the only station in ring.
- * After some of the IRQs the adapter is closed!
- */
-static void sktr_ring_status_irq(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-
-	tp->CurrentRingStatus = SWAPB(tp->ssb.Parm[0]);
-
-	/* First: fill up statistics */
-	if(tp->ssb.Parm[0] & SIGNAL_LOSS)
-	{
-		printk(KERN_INFO "%s: Signal Loss\n", dev->name);
-		tp->MacStat.line_errors++;
-	}
-
-	/* Adapter is closed, but initialized */
-	if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT)
-	{
-		printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n", 
-			dev->name);
-		tp->MacStat.line_errors++;
-	}
-
-	if(tp->ssb.Parm[0] & RING_RECOVERY)
-		printk(KERN_INFO "%s: Ring Recovery\n", dev->name);
-
-	/* Counter overflow: read error log */
-	if(tp->ssb.Parm[0] & COUNTER_OVERFLOW)
-	{
-		printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
-		sktr_exec_cmd(dev, OC_READ_ERROR_LOG);
-	}
-
-	/* Adapter is closed, but initialized */
-	if(tp->ssb.Parm[0] & REMOVE_RECEIVED)
-		printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n", 
-			dev->name);
-
-	/* Adapter is closed, but initialized */
-	if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR)
-		printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n", 
-			dev->name);
-
-	if(tp->ssb.Parm[0] & HARD_ERROR)
-		printk(KERN_INFO "%s: Hard Error\n", dev->name);
-
-	if(tp->ssb.Parm[0] & SOFT_ERROR)
-		printk(KERN_INFO "%s: Soft Error\n", dev->name);
-
-	if(tp->ssb.Parm[0] & TRANSMIT_BEACON)
-		printk(KERN_INFO "%s: Transmit Beacon\n", dev->name);
-
-	if(tp->ssb.Parm[0] & SINGLE_STATION)
-		printk(KERN_INFO "%s: Single Station\n", dev->name);
-
-	/* Check if adapter has been closed */
-	if(tp->ssb.Parm[0] & ADAPTER_CLOSED)
-	{
-		printk(KERN_INFO "%s: Adapter closed (Reopening)," 
-			"QueueSkb %d, CurrentRingStat %x\n",
-			dev->name, tp->QueueSkb, tp->CurrentRingStatus);
-		tp->AdapterOpenFlag = 0;
-		sktr_open_adapter(dev);
-	}
-
-	return;
-}
-
-/*
- * Issued if adapter has encountered an unrecoverable hardware
- * or software error.
- */
-static void sktr_chk_irq(struct net_device *dev)
-{
-	int i;
-	unsigned short AdapterCheckBlock[4];
-	unsigned short ioaddr = dev->base_addr;
-	struct net_local *tp = (struct net_local *)dev->priv;
-
-	tp->AdapterOpenFlag = 0;	/* Adapter closed now */
-
-	/* Page number of adapter memory */
-	outw(0x0001, ioaddr + SIFADX);
-	/* Address offset */
-	outw(CHECKADDR, ioaddr + SIFADR);
-
-	/* Reading 8 byte adapter check block. */
-	for(i = 0; i < 4; i++)
-		AdapterCheckBlock[i] = inw(ioaddr + SIFINC);
-
-	if(sktr_debug > 3)
-	{
-		printk("%s: AdapterCheckBlock: ", dev->name);
-		for (i = 0; i < 4; i++)
-			printk("%04X", AdapterCheckBlock[i]);
-		printk("\n");
-	}
-
-	switch(AdapterCheckBlock[0])
-	{
-		case DIO_PARITY:
-			printk(KERN_INFO "%s: DIO parity error\n", dev->name);
-			break;
-
-		case DMA_READ_ABORT:
-			printk(KERN_INFO "%s DMA read operation aborted:\n",
-				dev->name);
-			switch (AdapterCheckBlock[1])
-			{
-				case 0:
-					printk(KERN_INFO "Timeout\n");
-					printk(KERN_INFO "Address: %04X %04X\n",
-						AdapterCheckBlock[2],
-						AdapterCheckBlock[3]);
-					break;
-
-				case 1:
-					printk(KERN_INFO "Parity error\n");
-					printk(KERN_INFO "Address: %04X %04X\n",
-						AdapterCheckBlock[2], 
-						AdapterCheckBlock[3]);
-					break;
-
-				case 2: 
-					printk(KERN_INFO "Bus error\n");
-					printk(KERN_INFO "Address: %04X %04X\n",
-						AdapterCheckBlock[2], 
-						AdapterCheckBlock[3]);
-					break;
-
-				default:
-					printk(KERN_INFO "Unknown error.\n");
-					break;
-			}
-			break;
-
-		case DMA_WRITE_ABORT:
-			printk(KERN_INFO "%s: DMA write operation aborted: \n",
-				dev->name);
-			switch (AdapterCheckBlock[1])
-			{
-				case 0: 
-					printk(KERN_INFO "Timeout\n");
-					printk(KERN_INFO "Address: %04X %04X\n",
-						AdapterCheckBlock[2], 
-						AdapterCheckBlock[3]);
-					break;
-
-				case 1: 
-					printk(KERN_INFO "Parity error\n");
-					printk(KERN_INFO "Address: %04X %04X\n",
-						AdapterCheckBlock[2], 
-						AdapterCheckBlock[3]);
-					break;
-
-				case 2: 
-					printk(KERN_INFO "Bus error\n");
-					printk(KERN_INFO "Address: %04X %04X\n",
-						AdapterCheckBlock[2], 
-						AdapterCheckBlock[3]);
-					break;
-
-				default:
-					printk(KERN_INFO "Unknown error.\n");
-					break;
-			}
-			break;
-
-		case ILLEGAL_OP_CODE:
-			printk("%s: Illegal operation code in firmware\n",
-				dev->name);
-			/* Parm[0-3]: adapter internal register R13-R15 */
-			break;
-
-		case PARITY_ERRORS:
-			printk("%s: Adapter internal bus parity error\n",
-				dev->name);
-			/* Parm[0-3]: adapter internal register R13-R15 */
-			break;
-
-		case RAM_DATA_ERROR:
-			printk("%s: RAM data error\n", dev->name);
-			/* Parm[0-1]: MSW/LSW address of RAM location. */
-			break;
-
-		case RAM_PARITY_ERROR:
-			printk("%s: RAM parity error\n", dev->name);
-			/* Parm[0-1]: MSW/LSW address of RAM location. */
-			break;
-
-		case RING_UNDERRUN:
-			printk("%s: Internal DMA underrun detected\n",
-				dev->name);
-			break;
-
-		case INVALID_IRQ:
-			printk("%s: Unrecognized interrupt detected\n",
-				dev->name);
-			/* Parm[0-3]: adapter internal register R13-R15 */
-			break;
-
-		case INVALID_ERROR_IRQ:
-			printk("%s: Unrecognized error interrupt detected\n",
-				dev->name);
-			/* Parm[0-3]: adapter internal register R13-R15 */
-			break;
-
-		case INVALID_XOP:
-			printk("%s: Unrecognized XOP request detected\n",
-				dev->name);
-			/* Parm[0-3]: adapter internal register R13-R15 */
-			break;
-
-		default:
-			printk("%s: Unknown status", dev->name);
-			break;
-	}
-
-	if(sktr_chipset_init(dev) == 1)
-	{
-		/* Restart of firmware successful */
-		tp->AdapterOpenFlag = 1;
-	}
-
-	return;
-}
-
-/*
- * Internal adapter pointer to RAM data are copied from adapter into
- * host system.
- */
-static void sktr_read_ptr(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-	unsigned short adapterram;
-
-	sktr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr,
-			ADAPTER_INT_PTRS, 16);
-	sktr_read_ram(dev, (unsigned char *)&adapterram,
-			(unsigned short)SWAPB(tp->intptrs.AdapterRAMPtr), 2);
-
-	printk(KERN_INFO "%s: Adapter RAM size: %d K\n", 
-		dev->name, SWAPB(adapterram));
-
-	return;
-}
-
-/*
- * Reads a number of bytes from adapter to system memory.
- */
-static void sktr_read_ram(struct net_device *dev, unsigned char *Data,
-				unsigned short Address, int Length)
-{
-	int i;
-	unsigned short old_sifadx, old_sifadr, InWord;
-	unsigned short ioaddr = dev->base_addr;
-
-	/* Save the current values */
-	old_sifadx = inw(ioaddr + SIFADX);
-	old_sifadr = inw(ioaddr + SIFADR);
-
-	/* Page number of adapter memory */
-	outw(0x0001, ioaddr + SIFADX);
-	/* Address offset in adapter RAM */
-	outw(Address, ioaddr + SIFADR);
-
-	/* Copy len byte from adapter memory to system data area. */
-	i = 0;
-	for(;;)
-	{
-		InWord = inw(ioaddr + SIFINC);
-
-		*(Data + i) = HIBYTE(InWord);	/* Write first byte */
-		if(++i == Length)		/* All is done break */
-			break;
-
-		*(Data + i) = LOBYTE(InWord);	/* Write second byte */
-		if (++i == Length)		/* All is done break */
-			break;
-	}
-
-	/* Restore original values */
-	outw(old_sifadx, ioaddr + SIFADX);
-	outw(old_sifadr, ioaddr + SIFADR);
-
-	return;
-}
-
-/*
- * Reads MAC address from adapter ROM.
- */
-static void sktr_read_addr(struct net_device *dev, unsigned char *Address)
-{
-	int i, In;
-	unsigned short ioaddr = dev->base_addr;
-
-	/* Address: 0000:0000 */
-	outw(0, ioaddr + SIFADX);
-	outw(0, ioaddr + SIFADR);
-
-	/* Read six byte MAC address data */
-	for(i = 0; i < 6; i++)
-	{
-		In = inw(ioaddr + SIFINC);
-		*(Address + i) = (unsigned char)(In >> 8);
-	}
-
-	return;
-}
-
-/*
- * Cancel all queued packets in the transmission queue.
- */
-static void sktr_cancel_tx_queue(struct net_local* tp)
-{
-	TPL *tpl;
-	struct sk_buff *skb;
-
-	/*
-	 * NOTE: There must not be an active TRANSMIT command pending, when
-	 * this function is called.
-	 */
-	if(tp->TransmitCommandActive)
-		return;
-
-	for(;;)
-	{
-		tpl = tp->TplBusy;
-		if(!tpl->BusyFlag)
-			break;
-		/* "Remove" TPL from busy list. */
-		tp->TplBusy = tpl->NextTPLPtr;
-		sktr_write_tpl_status(tpl, 0);	/* Clear VALID bit */
-		tpl->BusyFlag = 0;		/* "free" TPL */
-
-		printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl);
-
-		dev_kfree_skb(tpl->Skb);
-	}
-
-	for(;;)
-	{
-		skb = skb_dequeue(&tp->SendSkbQueue);
-		if(skb == NULL)
-			break;
-		tp->QueueSkb++;
-		dev_kfree_skb(skb);
-	}
-
-	return;
-}
-
-/*
- * This function is called whenever a transmit interrupt is generated by the
- * adapter. For a command complete interrupt, it is checked if we have to
- * issue a new transmit command or not.
- */
-static void sktr_tx_status_irq(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-	unsigned char HighByte, HighAc, LowAc;
-	TPL *tpl;
-
-	/* NOTE: At this point the SSB from TRANSMIT STATUS is no longer
-	 * available, because the CLEAR SSB command has already been issued.
-	 *
-	 * Process all complete transmissions.
-	 */
-
-	for(;;)
-	{
-		tpl = tp->TplBusy;
-		if(!tpl->BusyFlag || (tpl->Status
-			& (TX_VALID | TX_FRAME_COMPLETE))
-			!= TX_FRAME_COMPLETE)
-		{
-			break;
-		}
-
-		/* "Remove" TPL from busy list. */
-		tp->TplBusy = tpl->NextTPLPtr ;
-
-		if(sktr_debug > 3)
-			sktr_dump(tpl->MData, SWAPB(tpl->FrameSize));
-
-		/* Check the transmit status field only for directed frames*/
-		if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0)
-		{
-			HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status);
-			HighAc   = GET_FRAME_STATUS_HIGH_AC(HighByte);
-			LowAc    = GET_FRAME_STATUS_LOW_AC(HighByte);
-
-			if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED))
-			{
-				printk(KERN_INFO "%s: (DA=%08lX not recognized)",
-					dev->name,
-					*(unsigned long *)&tpl->MData[2+2]);
-			}
-			else
-			{
-				if(sktr_debug > 3)
-					printk("%s: Directed frame tx'd\n", 
-						dev->name);
-			}
-		}
-		else
-		{
-			if(!DIRECTED_FRAME(tpl))
-			{
-				if(sktr_debug > 3)
-					printk("%s: Broadcast frame tx'd\n",
-						dev->name);
-			}
-		}
-
-                tp->MacStat.tx_packets++;
-		dev_kfree_skb(tpl->Skb);
-		tpl->BusyFlag = 0;	/* "free" TPL */
-	}
-
-	dev->tbusy = 0;
-	if(tp->QueueSkb < MAX_TX_QUEUE)
-		sktr_hardware_send_packet(dev, tp);
-
-	return;
-}
-
-/*
- * Called if a frame receive interrupt is generated by the adapter.
- * Check if the frame is valid and indicate it to system.
- */
-static void sktr_rcv_status_irq(struct net_device *dev)
-{
-	struct net_local *tp = (struct net_local *)dev->priv;
-	unsigned char *ReceiveDataPtr;
-	struct sk_buff *skb;
-	unsigned int Length, Length2;
-	RPL *rpl;
-	RPL *SaveHead;
-
-	/* NOTE: At this point the SSB from RECEIVE STATUS is no longer
-	 * available, because the CLEAR SSB command has already been issued.
-	 *
-	 * Process all complete receives.
-	 */
-
-	for(;;)
-	{
-		rpl = tp->RplHead;
-		if(rpl->Status & RX_VALID)
-			break;		/* RPL still in use by adapter */
-
-		/* Forward RPLHead pointer to next list. */
-		SaveHead = tp->RplHead;
-		tp->RplHead = rpl->NextRPLPtr;
-
-		/* Get the frame size (Byte swap for Intel).
-		 * Do this early (see workaround comment below)
-		 */
-		Length = (unsigned short)SWAPB(rpl->FrameSize);
-
-		/* Check if the Frame_Start, Frame_End and
-		 * Frame_Complete bits are set.
-		 */
-		if((rpl->Status & VALID_SINGLE_BUFFER_FRAME)
-			== VALID_SINGLE_BUFFER_FRAME)
-		{
-			ReceiveDataPtr = rpl->MData;
-
-			/* Workaround for delayed write of FrameSize on ISA
-			 * (FrameSize is false but valid-bit is reset)
-			 * Frame size is set to zero when the RPL is freed.
-			 * Length2 is there because there have also been
-			 * cases where the FrameSize was partially written
-			 */
-			Length2 = (unsigned short)SWAPB(rpl->FrameSize);
-
-			if(Length == 0 || Length != Length2)
-			{
-				tp->RplHead = SaveHead;
-				break;	/* Return to sktr_interrupt */
-			}
-
-			/* Drop frames sent by myself */
-			if(sktr_chk_frame(dev, rpl->MData))
-			{
-				if(rpl->Skb != NULL)
-					dev_kfree_skb(rpl->Skb);
-			}
-			else
-			{
-				sktr_update_rcv_stats(tp,ReceiveDataPtr,Length);
-
-				if(sktr_debug > 3)
-					printk("%s: Packet Length %04X (%d)\n",
-						dev->name, Length, Length);
-
-				/* Indicate the received frame to system.
-				 * The source routing padding is no more
-				 * necessary with 2.2.x kernel.
-				 * See: OpenOptions in sktr_init_opb()
-				 */
-				skb = rpl->Skb;
-				if(rpl->SkbStat == SKB_UNAVAILABLE)
-				{
-					/* Try again to allocate skb */
-					skb = dev_alloc_skb(tp->MaxPacketSize);
-					if(skb == NULL)
-					{
-						/* Update Stats ?? */
-					}
-					else
-					{
-						skb->dev	= dev;
-						skb_put(skb, tp->MaxPacketSize);
-						rpl->SkbStat 	= SKB_DATA_COPY;
-						ReceiveDataPtr 	= rpl->MData;
-					}
-				}
-
-				if(rpl->SkbStat == SKB_DATA_COPY
-					|| rpl->SkbStat == SKB_DMA_DIRECT)
-				{
-					if(rpl->SkbStat == SKB_DATA_COPY)
-					{
-						memmove(skb->data, ReceiveDataPtr, Length);
-					}
-
-					/* Deliver frame to system */
-					rpl->Skb = NULL;
-					skb_trim(skb,Length);
-					skb->dev = dev;
-					skb->protocol = tr_type_trans(skb,dev);
-					netif_rx(skb);
-				}
-			}
-		}
-		else	/* Invalid frame */
-		{
-			if(rpl->Skb != NULL)
-				dev_kfree_skb(rpl->Skb);
-
-			/* Skip list. */
-			if(rpl->Status & RX_START_FRAME)
-				/* Frame start bit is set -> overflow. */
-				tp->MacStat.rx_errors++;
-		}
-
-		/* Allocate new skb for rpl */
-		rpl->Skb = dev_alloc_skb(tp->MaxPacketSize);
-
-		/* skb == NULL ? then use local buffer */
-		if(rpl->Skb == NULL)
-		{
-			rpl->SkbStat = SKB_UNAVAILABLE;
-			rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex]));
-			rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
-		}
-		else	/* skb != NULL */
-		{
-			rpl->Skb->dev = dev;
-			skb_put(rpl->Skb, tp->MaxPacketSize);
-
-			/* Data unreachable for DMA ? then use local buffer */
-			if(tp->DeviceType == SK_ISA &&
-				virt_to_bus(rpl->Skb->data) + tp->MaxPacketSize
-				> ISA_MAX_ADDRESS)
-			{
-				rpl->SkbStat = SKB_DATA_COPY;
-				rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex]));
-				rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
-			}
-			else
-			{
-				/* DMA directly in skb->data */
-				rpl->SkbStat = SKB_DMA_DIRECT;
-				rpl->FragList[0].DataAddr = htonl(virt_to_bus(rpl->Skb->data));
-				rpl->MData = rpl->Skb->data;
-			}
-		}
-
-		rpl->FragList[0].DataCount = SWAPB(tp->MaxPacketSize);
-		rpl->FrameSize = 0;
-
-		/* Pass the last RPL back to the adapter */
-		tp->RplTail->FrameSize = 0;
-
-		/* Reset the CSTAT field in the list. */
-		sktr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ);
-
-		/* Current RPL becomes last one in list. */
-		tp->RplTail = tp->RplTail->NextRPLPtr;
-
-		/* Inform adapter about RPL valid. */
-		sktr_exec_sifcmd(dev, CMD_RX_VALID);
-	}
-
-	return;
-}
-
-/*
- * This function should be used whenever the status of any RPL must be
- * modified by the driver, because the compiler may otherwise change the
- * order of instructions such that writing the RPL status may be executed
- * at an undesireable time. When this function is used, the status is
- * always written when the function is called.
- */
-static void sktr_write_rpl_status(RPL *rpl, unsigned int Status)
-{
-	rpl->Status = Status;
-
-	return;
-}
-
-/*
- * The function updates the statistic counters in mac->MacStat.
- * It differtiates between directed and broadcast/multicast ( ==functional)
- * frames.
- */
-static void sktr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[],
-					unsigned int Length)
-{
-	tp->MacStat.rx_packets++;
-
-	/* Test functional bit */
-	if(DataPtr[2] & GROUP_BIT)
-		tp->MacStat.multicast++;
-
-	return;
-}
-
-/*
- * Check if it is a frame of myself. Compare source address with my current
- * address in reverse direction, and mask out the TR_RII.
- */
-static unsigned char sktr_chk_frame(struct net_device *dev, unsigned char *Addr)
-{
-	int i;
-
-	for(i = 5; i > 0; i--)
-	{
-		if(Addr[8 + i] != dev->dev_addr[i])
-			return (0);
-	}
-
-	/* Mask out RIF bit. */
-	if((Addr[8] & ~TR_RII) != (unsigned char)(dev->dev_addr[0]))
-		return (0);
-
-	return (1);  /* It is my frame. */
-}
-
-/*
- * Dump Packet (data)
- */
-static void sktr_dump(unsigned char *Data, int length)
-{
-        int i, j;
-
-        for (i = 0, j = 0; i < length / 8; i++, j += 8)
-        {
-		printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n",
-			Data[j+0],Data[j+1],Data[j+2],Data[j+3],
-                        Data[j+4],Data[j+5],Data[j+6],Data[j+7]);
-        }
-
-        return;
-}
-
-#ifdef MODULE
-
-static struct net_device* dev_sktr[SKTR_MAX_ADAPTERS];
-static int io[SKTR_MAX_ADAPTERS]	= { 0, 0 };
-static int irq[SKTR_MAX_ADAPTERS] 	= { 0, 0 };
-static int mem[SKTR_MAX_ADAPTERS] 	= { 0, 0 };
-
-MODULE_PARM(io,  "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i");
-MODULE_PARM(irq, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i");
-MODULE_PARM(mem, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i");
-
-int init_module(void)
-{
-	int i;
-
-	for(i = 0; i < SKTR_MAX_ADAPTERS; i++)
-	{
-                irq[i] = 0;
-                mem[i] = 0;
-                dev_sktr[i] = NULL;
-                dev_sktr[i] = init_trdev(dev_sktr[i], 0);
-                if(dev_sktr[i] == NULL)
-                        return (-ENOMEM);
-
-		dev_sktr[i]->base_addr = io[i];
-                dev_sktr[i]->irq       = irq[i];
-                dev_sktr[i]->mem_start = mem[i];
-                dev_sktr[i]->init      = &sktr_probe;
-
-                if(register_trdev(dev_sktr[i]) != 0)
-		{
-                        kfree_s(dev_sktr[i], sizeof(struct net_device));
-                        dev_sktr[i] = NULL;
-                        if(i == 0)
-			{
-                                printk("sktr: register_trdev() returned non-zero.\n");
-                                return (-EIO);
-                        }
-			else
-                                return (0);
-                }
-        }
-
-        return (0);
-}
-
-void cleanup_module(void)
-{
-	int i;
-
-        for(i = 0; i < SKTR_MAX_ADAPTERS; i++)
-	{
-		if(dev_sktr[i])
-		{
-			unregister_trdev(dev_sktr[i]);
-			release_region(dev_sktr[i]->base_addr, SKTR_IO_EXTENT);
-			if(dev_sktr[i]->irq)
-				free_irq(dev_sktr[i]->irq, dev_sktr[i]);
-			if(dev_sktr[i]->dma > 0)
-				free_dma(dev_sktr[i]->dma);
-			if(dev_sktr[i]->priv)
-				kfree_s(dev_sktr[i]->priv, sizeof(struct net_local));
-			kfree_s(dev_sktr[i], sizeof(struct net_device));
-			dev_sktr[i] = NULL;
-                }
-	}
-}
-#endif /* MODULE */
diff -u --recursive --new-file v2.3.21/linux/drivers/net/tokenring/sktr.h linux/drivers/net/tokenring/sktr.h
--- v2.3.21/linux/drivers/net/tokenring/sktr.h	Mon Oct 11 15:38:15 1999
+++ linux/drivers/net/tokenring/sktr.h	Wed Dec 31 16:00:00 1969
@@ -1,1103 +0,0 @@
-/* sktr.h: SysKonnect TokenRing driver for Linux
- *
- * Authors:
- * - Christoph Goos <cgoos@syskonnect.de>
- */
-
-#ifndef __LINUX_SKTR_H
-#define __LINUX_SKTR_H
-
-#ifdef __KERNEL__
-
-#define SKTR_MAX_ADAPTERS 7
-
-#define SEND_TIMEOUT 10*HZ
-
-#define TR_RCF_LONGEST_FRAME_MASK 0x0070
-#define TR_RCF_FRAME4K 0x0030
-
-#define SK_ISA 0
-#define SK_PCI 1
-
-/*------------------------------------------------------------------*/
-/*  Bit order for adapter communication with DMA		    */
-/*  --------------------------------------------------------------  */
-/*  Bit  8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7|  */
-/*  --------------------------------------------------------------  */
-/*  The bytes in a word must be byte swapped. Also, if a double	    */
-/*  word is used for storage, then the words, as well as the bytes, */
-/*  must be swapped. 						    */
-/*  Bit order for adapter communication with DIO 		    */
-/*  --------------------------------------------------------------  */
-/*  Bit  0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15|  */
-/*  --------------------------------------------------------------  */
-/*------------------------------------------------------------------*/
-
-/* Swap bytes of a word.                        */
-#define SWAPB(x) (((unsigned short)((x) << 8)) | ((unsigned short)((x) >> 8)))
-
-/* Swap words of a long.                        */
-#define SWAPW(x) (((x) << 16) | ((x) >> 16))
-
-/* Get the low byte of a word.                      */
-#define LOBYTE(w)       ((unsigned char)(w))
-
-/* Get the high byte of a word.                     */
-#define HIBYTE(w)       ((unsigned char)((unsigned short)(w) >> 8))
-
-/* Get the low word of a long.                      */
-#define LOWORD(l)       ((unsigned short)(l))
-
-/* Get the high word of a long.                     */
-#define HIWORD(l)       ((unsigned short)((unsigned long)(l) >> 16))
-
-
-
-/* Token ring adapter I/O addresses for normal mode. */
-#define SIFDAT      		0L	/* SIF/DMA data. */
-#define SIFINC      		2L  	/* IO Word data with auto increment. */
-#define SIFINH      		3L  	/* IO Byte data with auto increment. */
-#define SIFADR      		4L  	/* SIF/DMA Address. */
-#define SIFCMD      		6L  	/* SIF Command. */
-#define SIFSTS      		6L  	/* SIF Status. */
-#define SIFACL      		8L  	/* SIF Adapter Control Register. */
-#define SIFADD      		10L 	/* SIF/DMA Address. */
-#define SIFADX      		12L
-#define DMALEN      		14L 	/* SIF DMA length. */
-#define POSREG      		16L 	/* Adapter Program Option Select (POS)
-			 		 * Register: base IO address + 16 byte.
-			 		 */
-#define POSREG_2    		24L 	/* only for TR4/16+ adapter
-			 		 * base IO address + 24 byte.
-			 		 */
-
-
-/* SIFCMD command codes (high-low) */
-#define CMD_INTERRUPT_ADAPTER   0x8000  /* Cause internal adapter interrupt */
-#define CMD_ADAPTER_RESET   	0x4000  /* Hardware reset of adapter */
-#define CMD_SSB_CLEAR		0x2000  /* Acknowledge to adapter to
-					 * system interrupts.
-					 */
-#define CMD_EXECUTE		0x1000	/* Execute SCB command */
-#define CMD_SCB_REQUEST		0x0800  /* Request adapter to interrupt
-					 * system when SCB is available for
-					 * another command.
-					 */
-#define CMD_RX_CONTINUE		0x0400  /* Continue receive after odd pointer
-					 * stop. (odd pointer receive method)
-					 */
-#define CMD_RX_VALID		0x0200  /* Now actual RPL is valid. */
-#define CMD_TX_VALID		0x0100  /* Now actual TPL is valid. (valid
-					 * bit receive/transmit method)
-					 */
-#define CMD_SYSTEM_IRQ		0x0080  /* Adapter-to-attached-system
-					 * interrupt is reset.
-					 */
-#define CMD_CLEAR_SYSTEM_IRQ	0x0080	/* Clear SYSTEM_INTERRUPT bit.
-					 * (write: 1=ignore, 0=reset)
-					 */
-#define EXEC_SOFT_RESET		0xFF00  /* adapter soft reset. (restart
-					 * adapter after hardware reset)
-					 */
-
-
-/* ACL commands (high-low) */
-#define ACL_SWHLDA		0x0800  /* Software hold acknowledge. */
-#define ACL_SWDDIR		0x0400  /* Data transfer direction. */
-#define ACL_SWHRQ		0x0200  /* Pseudo DMA operation. */
-#define ACL_PSDMAEN		0x0100  /* Enable pseudo system DMA. */
-#define ACL_ARESET		0x0080  /* Adapter hardware reset command.
-					 * (held in reset condition as
-					 * long as bit is set)
-					 */
-#define ACL_CPHALT		0x0040  /* Communication processor halt.
-					 * (can only be set while ACL_ARESET
-					 * bit is set; prevents adapter
-					 * processor from executing code while
-					 * downloading firmware)
-					 */
-#define ACL_BOOT		0x0020
-#define ACL_SINTEN		0x0008  /* System interrupt enable/disable
-					 * (1/0): can be written if ACL_ARESET
-					 * is zero.
-					 */
-#define ACL_SPEED4		0x0003
-#define ACL_SPEED16		0x0001
-#define PS_DMA_MASK		(ACL_SWHRQ | ACL_PSDMAEN)
-
-
-/* SIFSTS register return codes (high-low) */
-#define STS_SYSTEM_IRQ		0x0080	/* Adapter-to-attached-system
-					 * interrupt is valid.
-					 */
-#define STS_INITIALIZE		0x0040  /* INITIALIZE status. (ready to
-					 * initialize)
-					 */
-#define STS_TEST		0x0020  /* TEST status. (BUD not completed) */
-#define STS_ERROR		0x0010  /* ERROR status. (unrecoverable
-					 * HW error occurred)
-					 */
-#define STS_MASK		0x00F0  /* Mask interesting status bits. */
-#define STS_ERROR_MASK		0x000F  /* Get Error Code by masking the
-					 * interrupt code bits.
-					 */
-#define ADAPTER_INT_PTRS	0x0A00  /* Address offset of adapter internal
-					 * pointers 01:0a00 (high-low) have to
-					 * be read after init and before open.
-					 */
-
-
-/* Interrupt Codes (only MAC IRQs) */
-#define STS_IRQ_ADAPTER_CHECK   0x0000  /* unrecoverable hardware or
-					 * software error.
-					 */ 
-#define STS_IRQ_RING_STATUS     0x0004  /* SSB is updated with ring status. */
-#define STS_IRQ_SCB_CLEAR       0x0006  /* SCB clear, following an
-					 * SCB_REQUEST IRQ.
-					 */
-#define STS_IRQ_COMMAND_STATUS  0x0008  /* SSB is updated with command 
-					 * status.
-					 */ 
-#define STS_IRQ_RECEIVE_STATUS  0x000A  /* SSB is updated with receive
-					 * status.
-					 */
-#define STS_IRQ_TRANSMIT_STATUS 0x000C  /* SSB is updated with transmit
-                                         * status
-					 */
-#define STS_IRQ_MASK            0x000F  /* = STS_ERROR_MASK. */
-
-
-/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */
-#define COMMAND_COMPLETE        0x0080  /* TRANSMIT command completed
-                                         * (avoid this!) issue another transmit
-					 * to send additional frames.
-					 */
-#define FRAME_COMPLETE          0x0040  /* Frame has been transmitted;
-					 * INTERRUPT_FRAME bit was set in the
-					 * CSTAT request; indication of possibly
-					 * more than one frame transmissions!
-					 * SSB.Parm[0-1]: 32 bit pointer to
-					 * TPL of last frame.
-					 */
-#define LIST_ERROR              0x0020  /* Error in one of the TPLs that
-					 * compose the frame; TRANSMIT
-					 * terminated; Parm[1-2]: 32 bit pointer
-					 * to TPL which starts the error
-					 * frame; error details in bits 8-13.
-					 * (14?)
-					 */
-#define FRAME_SIZE_ERROR        0x8000  /* FRAME_SIZE does not equal the sum of
-					 * the valid DATA_COUNT fields;
-					 * FRAME_SIZE less than header plus
-					 * information field. (15 bytes +
-					 * routing field) Or if FRAME_SIZE
-					 * was specified as zero in one list.
-					 */
-#define TX_THRESHOLD            0x4000  /* FRAME_SIZE greater than (BUFFER_SIZE
-					 * - 9) * TX_BUF_MAX.
-					 */
-#define ODD_ADDRESS             0x2000  /* Odd forward pointer value is
-					 * read on a list without END_FRAME
-					 * indication.
-					 */
-#define FRAME_ERROR             0x1000  /* START_FRAME bit is (not) anticipated,
-					 * but (not) set.
-					 */
-#define ACCESS_PRIORITY_ERROR   0x0800  /* Access priority requested has not
-					 * been allowed.
-					 */
-#define UNENABLED_MAC_FRAME     0x0400  /* MAC frame has source class of zero
-					 * or MAC frame PCF ATTN field is
-					 * greater than one.
-					 */
-#define ILLEGAL_FRAME_FORMAT    0x0200  /* Bit 0 or FC field was set to one. */
-
-
-/*
- * Since we need to support some functions even if the adapter is in a
- * CLOSED state, we have a (pseudo-) command queue which holds commands
- * that are outstandig to be executed.
- *
- * Each time a command completes, an interrupt occurs and the next
- * command is executed. The command queue is actually a simple word with 
- * a bit for each outstandig command. Therefore the commands will not be
- * executed in the order they have been queued.
- *
- * The following defines the command code bits and the command queue:
- */
-#define OC_OPEN                 0x0001	/* OPEN command */
-#define OC_TRANSMIT             0x0002  /* TRANSMIT command */
-#define OC_TRANSMIT_HALT        0x0004  /* TRANSMIT_HALT command */
-#define OC_RECEIVE              0x0008  /* RECEIVE command */
-#define OC_CLOSE                0x0010  /* CLOSE command */
-#define OC_SET_GROUP_ADDR       0x0020  /* SET_GROUP_ADDR command */
-#define OC_SET_FUNCT_ADDR       0x0040  /* SET_FUNCT_ADDR command */
-#define OC_READ_ERROR_LOG       0x0080  /* READ_ERROR_LOG command */
-#define OC_READ_ADAPTER         0x0100  /* READ_ADAPTER command */
-#define OC_MODIFY_OPEN_PARMS    0x0400  /* MODIFY_OPEN_PARMS command */
-#define OC_RESTORE_OPEN_PARMS   0x0800  /* RESTORE_OPEN_PARMS command */
-#define OC_SET_FIRST_16_GROUP   0x1000  /* SET_FIRST_16_GROUP command */
-#define OC_SET_BRIDGE_PARMS     0x2000  /* SET_BRIDGE_PARMS command */
-#define OC_CONFIG_BRIDGE_PARMS  0x4000  /* CONFIG_BRIDGE_PARMS command */
-
-#define OPEN			0x0300  /* C: open command. S: completion. */
-#define TRANSMIT		0x0400  /* C: transmit command. S: completion
-					 * status. (reject: COMMAND_REJECT if
-					 * adapter not opened, TRANSMIT already
-					 * issued or address passed in the SCB
-					 * not word aligned)
-					 */
-#define TRANSMIT_HALT		0x0500  /* C: interrupt TX TPL chain; if no
-					 * TRANSMIT command issued, the command
-					 * is ignored. (completion with TRANSMIT
-					 * status (0x0400)!)
-					 */
-#define RECEIVE			0x0600  /* C: receive command. S: completion
-					 * status. (reject: COMMAND_REJECT if
-					 * adapter not opened, RECEIVE already
-					 * issued or address passed in the SCB 
-					 * not word aligned)
-					 */
-#define CLOSE			0x0700  /* C: close adapter. S: completion.
-					 * (COMMAND_REJECT if adapter not open)
-					 */
-#define SET_GROUP_ADDR		0x0800  /* C: alter adapter group address after
-					 * OPEN.  S: completion. (COMMAND_REJECT
-					 * if adapter not open)
-					 */
-#define SET_FUNCT_ADDR		0x0900  /* C: alter adapter functional address
-					 * after OPEN. S: completion.
-					 * (COMMAND_REJECT if adapter not open)
-					 */
-#define READ_ERROR_LOG		0x0A00  /* C: read adapter error counters.
-					 * S: completion. (command ignored
-					 * if adapter not open!)
-					 */
-#define READ_ADAPTER		0x0B00  /* C: read data from adapter memory.
-					 * (important: after init and before
-					 * open!) S: completion. (ADAPTER_CHECK
-					 * interrupt if undefined storage area
-					 * read)
-					 */
-#define MODIFY_OPEN_PARMS	0x0D00  /* C: modify some adapter operational
-					 * parameters. (bit correspondend to
-					 * WRAP_INTERFACE is ignored)
-					 * S: completion. (reject: 
-					 * COMMAND_REJECT)
-					 */
-#define RESTORE_OPEN_PARMS	0x0E00  /* C: modify some adapter operational
-					 * parameters. (bit correspondend
-					 * to WRAP_INTERFACE is ignored)
-					 * S: completion. (reject:
-					 * COMMAND_REJECT)
-					 */
-#define SET_FIRST_16_GROUP	0x0F00  /* C: alter the first two bytes in
-					 * adapter group address.
-					 * S: completion. (reject:
-					 * COMMAND_REJECT)
-					 */
-#define SET_BRIDGE_PARMS	0x1000  /* C: values and conditions for the
-					 * adapter hardware to use when frames
-					 * are copied for forwarding.
-					 * S: completion. (reject:
-					 * COMMAND_REJECT)
-					 */
-#define CONFIG_BRIDGE_PARMS 0x1100	/* C: ..
-					 * S: completion. (reject:
-					 * COMMAND_REJECT)
-					 */
-
-#define SPEED_4         4
-#define SPEED_16        16	/* Default transmission speed  */
-
-
-/* Initialization Parameter Block (IPB); word alignment necessary! */
-#define BURST_SIZE      0x0018  /* Default burst size */
-#define BURST_MODE      0x9F00  /* Burst mode enable */
-#define DMA_RETRIES     0x0505  /* Magic DMA retry number... */
-
-#define CYCLE_TIME      3	/* Default AT-bus cycle time: 500 ns
-				 * (later adapter version: fix  cycle time!)
-				 */
-#define LINE_SPEED_BIT	0x80
-
-/* Macro definition for the wait function. */
-#define ONE_SECOND_TICKS	1000000
-#define HALF_SECOND		(ONE_SECOND_TICKS / 2)
-#define ONE_SECOND		(ONE_SECOND_TICKS)
-#define TWO_SECONDS		(ONE_SECOND_TICKS * 2)
-#define THREE_SECONDS		(ONE_SECOND_TICKS * 3)
-#define FOUR_SECONDS		(ONE_SECOND_TICKS * 4)
-#define FIVE_SECONDS		(ONE_SECOND_TICKS * 5)
-
-#define BUFFER_SIZE 2048	/* Buffers on Adapter */
-
-#pragma pack(1)
-typedef struct {
-	unsigned short Init_Options;	/* Initialize with burst mode;
-					 * LLC disabled. (MAC only)
-					 */
-
-	/* Interrupt vectors the adapter places on attached system bus. */
-	unsigned char CMD_Status_IV;	/* Interrupt vector: command status. */
-	unsigned char TX_IV;     	/* Interrupt vector: transmit. */
-	unsigned char RX_IV;     	/* Interrupt vector: receive. */
-	unsigned char Ring_Status_IV;	/* Interrupt vector: ring status. */
-	unsigned char SCB_Clear_IV;  	/* Interrupt vector: SCB clear. */
-	unsigned char Adapter_CHK_IV;	/* Interrupt vector: adapter check. */
-
-	unsigned short RX_Burst_Size;	/* Max. number of transfer cycles. */
-	unsigned short TX_Burst_Size;	/* During DMA burst; even value! */
-	unsigned short DMA_Abort_Thrhld; /* Number of DMA retries. */
-
-	unsigned long SCB_Addr;	/* SCB address: even, word aligned, high-low. */
-	unsigned long SSB_Addr;	/* SSB address: even, word aligned, high-low. */
-} IPB, *IPB_Ptr;
-#pragma pack()
-
-/*
- * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to
- * be reopened)
- */
-#define BUFFER_SIZE	2048		/* Buffers on Adapter. */
-#define TPL_SIZE	8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */
-#define RPL_SIZE	14		/* (with TI firmware v2.26 handling
-					 * up to nine fragments possible)
-					 */
-#define TX_BUF_MIN      20		/* ??? (Stephan: calculation with */
-#define TX_BUF_MAX      40		/* BUFFER_SIZE and MAX_FRAME_SIZE) ??? 
-					 */
-#define DISABLE_EARLY_TOKEN_RELEASE 0x1000
-
-/* OPEN Options (high-low) */
-#define WRAP_INTERFACE		0x0080	/* Inserting omitted for test
-					 * purposes; transmit data appears
-					 * as receive data. (usefull for
-					 * testing; change: CLOSE necessary)
-					 */
-#define DISABLE_HARD_ERROR	0x0040  /* On HARD_ERROR & TRANSMIT_BEACON
-					 * no RING.STATUS interrupt.
-					 */
-#define DISABLE_SOFT_ERROR	0x0020  /* On SOFT_ERROR, no RING.STATUS
-					 * interrupt.
-					 */
-#define PASS_ADAPTER_MAC_FRAMES 0x0010  /* Passing unsupported MAC frames
-					 * to system.
-					 */
-#define PASS_ATTENTION_FRAMES   0x0008  /* All changed attention MAC frames are
-					 * passed to the system.
-					 */
-#define PAD_ROUTING_FIELD	0x0004  /* Routing field is padded to 18
-					 * bytes.
-					 */
-#define FRAME_HOLD		0x0002  /* Adapter waits for entire frame before
-					 * initiating DMA transfer; otherwise:
-					 * DMA transfer initiation if internal
-					 * buffer filled.
-					 */
-#define CONTENDER		0x0001  /* Adapter participates in the monitor
-					 * contention process.
-					 */
-#define PASS_BEACON_MAC_FRAMES  0x8000  /* Adapter passes beacon MAC frames
-					 * to the system.
-					 */
-#define EARLY_TOKEN_RELEASE 	0x1000  /* Only valid in 16 Mbps operation;
-					 * 0 = ETR. (no effect in 4 Mbps
-					 * operation)
-					 */
-#define COPY_ALL_MAC_FRAMES	0x0400  /* All MAC frames are copied to
-					 * the system. (after OPEN: duplicate
-					 * address test (DAT) MAC frame is 
-					 * first received frame copied to the
-					 * system)
-					 */
-#define COPY_ALL_NON_MAC_FRAMES	0x0200  /* All non MAC frames are copied to
-					 * the system.
-					 */
-#define PASS_FIRST_BUF_ONLY	0x0100  /* Passes only first internal buffer
-					 * of each received frame; FrameSize
-					 * of RPLs must contain internal
-					 * BUFFER_SIZE bits for promiscous mode.
-					 */
-#define ENABLE_FULL_DUPLEX_SELECTION 0x2000 /* Enable the use of full-duplex
-					 * settings with bits in byte 22 in
-					 * ocpl. (new feature in firmware
-					 * version 3.09)
-					 */
-
-/* Full-duplex settings */
-#define OPEN_FULL_DUPLEX_OFF	0x0000
-#define OPEN_FULL_DUPLEX_ON	0x00c0
-#define OPEN_FULL_DUPLEX_AUTO	0x0080
-
-#define PROD_ID_SIZE	18	/* Length of product ID. */
-
-#define TX_FRAG_NUM	3	 /* Number of fragments used in one TPL. */
-#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more
-				  * fragments following.
-				  */
-
-#define ISA_MAX_ADDRESS 0x00ffffff
-
-#pragma pack(1)
-typedef struct {
-	unsigned short OPENOptions;
-	unsigned char NodeAddr[6];	/* Adapter node address; use ROM 
-					 * address
-					 */
-	unsigned long GroupAddr;	/* Multicast: high order
-					 * bytes = 0xC000
-					 */
-	unsigned long FunctAddr;	/* High order bytes = 0xC000 */
-	unsigned short RxListSize;	/* RPL size: 0 (=26), 14, 20 or
-					 * 26 bytes read by the adapter.
-					 * (Depending on the number of 
-					 * fragments/list)
-					 */
-	unsigned short TxListSize;	/* TPL size */
-	unsigned short BufSize;		/* Is automatically rounded up to the
-					 * nearest nK boundary.
-					 */
-	unsigned short FullDuplex;
-	unsigned short Reserved;
-	unsigned char TXBufMin;		/* Number of adapter buffers reserved
-					 * for transmission a minimum of 2
-					 * buffers must be allocated.
-					 */
-	unsigned char TXBufMax;		/* Maximum number of adapter buffers
-					 * for transmit; a minimum of 2 buffers
-					 * must be available for receive.
-					 * Default: 6
-					 */
-	unsigned short ProdIDAddr[2];	/* Pointer to product ID. */
-} OPB, *OPB_Ptr;
-#pragma pack()
-
-/*
- * SCB: adapter commands enabled by the host system started by writing
- * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO
- * register. (special case: | CMD_SYSTEM_IRQ for initialization)
- */
-#pragma pack(1)
-typedef struct {
-	unsigned short CMD;	/* Command code */
-	unsigned short Parm[2];	/* Pointer to Command Parameter Block */
-} SCB;	/* System Command Block (32 bit physical address; big endian)*/
-#pragma pack()
-
-/*
- * SSB: adapter command return status can be evaluated after COMMAND_STATUS
- * adapter to system interrupt after reading SSB, the availability of the SSB
- * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR
- * in the SIFCMD IO register.
- */
-#pragma pack(1)
-typedef struct {
-	unsigned short STS;	/* Status code */
-	unsigned short Parm[3];	/* Parameter or pointer to Status Parameter
-				 * Block.
-				 */
-} SSB;	/* System Status Block (big endian - physical address)  */
-#pragma pack()
-
-typedef struct {
-	unsigned short BurnedInAddrPtr;	/* Pointer to adapter burned in
-					 * address. (BIA)
-					 */
-	unsigned short SoftwareLevelPtr;/* Pointer to software level data. */
-	unsigned short AdapterAddrPtr;	/* Pointer to adapter addresses. */
-	unsigned short AdapterParmsPtr;	/* Pointer to adapter parameters. */
-	unsigned short MACBufferPtr;	/* Pointer to MAC buffer. (internal) */
-	unsigned short LLCCountersPtr;	/* Pointer to LLC counters.  */
-	unsigned short SpeedFlagPtr;	/* Pointer to data rate flag.
-					 * (4/16 Mbps)
-					 */
-	unsigned short AdapterRAMPtr;	/* Pointer to adapter RAM found. (KB) */
-} INTPTRS;	/* Adapter internal pointers */
-
-#pragma pack(1)
-typedef struct {
-	unsigned char Line_Error;	/* Line error: code violation in
-					 * frame or in a token, or FCS error.
-					 */
-	unsigned char Internal_Error;	/* IBM specific. (Reserved_1) */
-	unsigned char Burst_Error;
-	unsigned char ARI_FCI_Error;	/* ARI/FCI bit zero in AMP or
-					 * SMP MAC frame.
-					 */
-	unsigned char AbortDelimeters;	/* IBM specific. (Reserved_2) */
-	unsigned char Reserved_3;
-	unsigned char Lost_Frame_Error;	/* Receive of end of transmitted
-					 * frame failed.
-					 */
-	unsigned char Rx_Congest_Error;	/* Adapter in repeat mode has not
-					 * enough buffer space to copy incoming
-					 * frame.
-					 */
-	unsigned char Frame_Copied_Error;/* ARI bit not zero in frame
-					 * addressed to adapter.
-					 */
-	unsigned char Frequency_Error;	/* IBM specific. (Reserved_4) */
-	unsigned char Token_Error;	/* (active only in monitor station) */
-	unsigned char Reserved_5;
-	unsigned char DMA_Bus_Error;	/* DMA bus errors not exceeding the
-					 * abort thresholds.
-					 */
-	unsigned char DMA_Parity_Error;	/* DMA parity errors not exceeding
-					 * the abort thresholds.
-					 */
-} ERRORTAB;	/* Adapter error counters */
-#pragma pack()
-
-
-/*--------------------- Send and Receive definitions -------------------*/
-#pragma pack(1)
-typedef struct {
-	unsigned short DataCount;	/* Value 0, even and odd values are
-					 * permitted; value is unaltered most
-					 * significant bit set: following
-					 * fragments last fragment: most
-					 * significant bit is not evaluated.
-					 * (???)
-					 */
-	unsigned long DataAddr;		/* Pointer to frame data fragment;
-					 * even or odd.
-					 */
-} Fragment;
-#pragma pack()
-
-#define MAX_FRAG_NUMBERS    9	/* Maximal number of fragments possible to use
-				 * in one RPL/TPL. (depending on TI firmware 
-				 * version)
-				 */
-#define MAX_TX_QUEUE	    10	/* Maximal number of skb's queued in driver. */
-
-/*
- * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504
- * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176,
- * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide
- * Page 2-27.
- */
-#define HEADER_SIZE		(1 + 1 + 6 + 6)
-#define SRC_SIZE		18
-#define MIN_DATA_SIZE		516
-#define DEFAULT_DATA_SIZE	4472
-#define MAX_DATA_SIZE		17800
-
-#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE)
-#define MIN_PACKET_SIZE     (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE)
-#define MAX_PACKET_SIZE     (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE)
-
-/*
- * Macros to deal with the frame status field.
- */
-#define AC_NOT_RECOGNIZED	0x00
-#define GROUP_BIT		0x80
-#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8))
-#define GET_FRAME_STATUS_HIGH_AC(Fs)	  ((unsigned char)(((Fs) & 0xC0) >> 6))
-#define GET_FRAME_STATUS_LOW_AC(Fs)       ((unsigned char)(((Fs) & 0x0C) >> 2))
-#define DIRECTED_FRAME(Context)           (!((Context)->MData[2] & GROUP_BIT))
-
-
-/*--------------------- Send Functions ---------------------------------*/
-/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */
-
-#define TX_VALID		0x0080	/* R: set via TRANSMIT.VALID interrupt.
-					 * C: always reset to zero!
-					 */
-#define TX_FRAME_COMPLETE	0x0040	/* R: must be reset to zero.
-					 * C: set to one.
-					 */
-#define TX_START_FRAME		0x0020  /* R: start of a frame: 1 
-					 * C: unchanged.
-					 */
-#define TX_END_FRAME		0x0010  /* R: end of a frame: 1
-					 * C: unchanged.
-					 */
-#define TX_FRAME_IRQ		0x0008  /* R: request interrupt generation
-					 * after transmission.
-					 * C: unchanged.
-					 */
-#define TX_ERROR		0x0004  /* R: reserved.
-					 * C: set to one if Error occurred.
-					 */
-#define TX_INTERFRAME_WAIT	0x0004
-#define TX_PASS_CRC		0x0002  /* R: set if CRC value is already
-					 * calculated. (valid only in
-					 * FRAME_START TPL)
-					 * C: unchanged.
-					 */
-#define TX_PASS_SRC_ADDR	0x0001  /* R: adapter uses explicit frame
-					 * source address and does not overwrite
-					 * with the adapter node address.
-					 * (valid only in FRAME_START TPL)
-					 *
-					 * C: unchanged.
-					 */
-#define TX_STRIP_FS		0xFF00  /* R: reserved.
-					 * C: if no Transmission Error,
-					 * field contains copy of FS byte after
-					 * stripping of frame.
-					 */
-
-/*
- * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL,
- * but possibly multiple TPLs for one frame) the length of the TPLs has to be
- * initialized in the OPL. (OPEN parameter list)
- */
-#define TPL_NUM		9	/* Number of Transmit Parameter Lists.
-				 * !! MUST BE >= 3 !!
-				 */
-
-#pragma pack(1)
-typedef struct s_TPL TPL;
-
-struct s_TPL {	/* Transmit Parameter List (align on even word boundaries) */
-	unsigned long NextTPLAddr;	/* Pointer to next TPL in chain; if
-					 * pointer is odd: this is the last
-					 * TPL. Pointing to itself can cause
-					 * problems!
-					 */
-	volatile unsigned short Status;	/* Initialized by the adapter:
-					 * CSTAT_REQUEST important: update least
-					 * significant bit first! Set by the
-					 * adapter: CSTAT_COMPLETE status.
-					 */
-	unsigned short FrameSize;	/* Number of bytes to be transmitted
-					 * as a frame including AC/FC,
-					 * Destination, Source, Routing field
-					 * not including CRC, FS, End Delimiter
-					 * (valid only if START_FRAME bit in 
-					 * CSTAT nonzero) must not be zero in
-					 * any list; maximum value: (BUFFER_SIZE
-					 * - 8) * TX_BUF_MAX sum of DataCount
-					 * values in FragmentList must equal
-					 * Frame_Size value in START_FRAME TPL!
-					 * frame data fragment list.
-					 */
-
-	/* TPL/RPL size in OPEN parameter list depending on maximal
-	 * numbers of fragments used in one parameter list.
-	 */
-	Fragment FragList[TX_FRAG_NUM];	/* Maximum: nine frame fragments in one
-					 * TPL actual version of firmware: 9
-					 * fragments possible.
-					 */
-#pragma pack()
-
-	/* Special proprietary data and precalculations */
-
-	TPL *NextTPLPtr;		/* Pointer to next TPL in chain. */
-	unsigned char *MData;
-	struct sk_buff *Skb;
-	unsigned char TPLIndex;
-	volatile unsigned char BusyFlag;/* Flag: TPL busy? */
-};
-
-/* ---------------------Receive Functions-------------------------------*
- * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values.
- * (high-low)
- */
-#define RX_VALID		0x0080	/* R: set; tell adapter with
-					 * RECEIVE.VALID interrupt.
-					 * C: reset to zero.
-					 */
-#define RX_FRAME_COMPLETE	0x0040  /* R: must be reset to zero,
-					 * C: set to one.
-					 */
-#define RX_START_FRAME		0x0020  /* R: must be reset to zero.
-					 * C: set to one on the list.
-					 */
-#define RX_END_FRAME		0x0010  /* R: must be reset to zero.
-					 * C: set to one on the list
-					 * that ends the frame.
-					 */
-#define RX_FRAME_IRQ		0x0008  /* R: request interrupt generation
-					 * after receive.
-					 * C: unchanged.
-					 */
-#define RX_INTERFRAME_WAIT	0x0004  /* R: after receiving a frame:
-					 * interrupt and wait for a
-					 * RECEIVE.CONTINUE.
-					 * C: unchanged.
-					 */
-#define RX_PASS_CRC		0x0002  /* R: if set, the adapter includes
-					 * the CRC in data passed. (last four 
-					 * bytes; valid only if FRAME_START is
-					 * set)
-					 * C: set, if CRC is included in
-					 * received data.
-					 */
-#define RX_PASS_SRC_ADDR	0x0001  /* R: adapter uses explicit frame
-					 * source address and does not
-					 * overwrite with the adapter node
-					 * address. (valid only if FRAME_START
-					 * is set)
-					 * C: unchanged.
-					 */
-#define RX_RECEIVE_FS		0xFC00  /* R: reserved; must be reset to zero.
-					 * C: on lists with START_FRAME, field
-					 * contains frame status field from
-					 * received frame; otherwise cleared.
-					 */
-#define RX_ADDR_MATCH		0x0300  /* R: reserved; must be reset to zero.
-					 * C: address match code mask.
-					 */ 
-#define RX_STATUS_MASK		0x00FF  /* Mask for receive status bits. */
-
-#define RX_INTERN_ADDR_MATCH    0x0100  /* C: internally address match. */
-#define RX_EXTERN_ADDR_MATCH    0x0200  /* C: externally matched via
-					 * XMATCH/XFAIL interface.
-					 */
-#define RX_INTEXT_ADDR_MATCH    0x0300  /* C: internally and externally
-					 * matched.
-					 */
-#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */
-
-/* Constants for Command Status Interrupt.
- * COMMAND_REJECT status field bit functions (SSB.Parm[0])
- */
-#define ILLEGAL_COMMAND		0x0080	/* Set if an unknown command
-					 * is issued to the adapter
-					 */
-#define ADDRESS_ERROR		0x0040  /* Set if any address field in
-					 * the SCB is odd. (not word aligned)
-					 */
-#define ADAPTER_OPEN		0x0020  /* Command issued illegal with
-					 * open adapter.
-					 */
-#define ADAPTER_CLOSE		0x0010  /* Command issued illegal with
-					 * closed adapter.
-					 */
-#define SAME_COMMAND		0x0008  /* Command issued with same command
-					 * already executing.
-					 */
-
-/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */
-#define NODE_ADDR_ERROR		0x0040  /* Wrong address or BIA read
-					 * zero address.
-					 */
-#define LIST_SIZE_ERROR		0x0020  /* If List_Size value not in 0,
-					 * 14, 20, 26.
-					 */
-#define BUF_SIZE_ERROR		0x0010  /* Not enough available memory for
-					 * two buffers.
-					 */
-#define TX_BUF_COUNT_ERROR	0x0004  /* Remaining receive buffers less than
-					 * two.
-					 */
-#define OPEN_ERROR		0x0002	/* Error during ring insertion; more
-					 * information in bits 8-15.
-					 */
-
-/* Standard return codes */
-#define GOOD_COMPLETION		0x0080  /* =OPEN_SUCCESSFULL */
-#define INVALID_OPEN_OPTION	0x0001  /* OPEN options are not supported by
-					 * the adapter.
-					 */
-
-/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB)            */
-#define OPEN_PHASES_MASK            0xF000  /* Check only the bits 8-11. */
-#define LOBE_MEDIA_TEST             0x1000
-#define PHYSICAL_INSERTION          0x2000
-#define ADDRESS_VERIFICATION        0x3000
-#define PARTICIPATION_IN_RING_POLL  0x4000
-#define REQUEST_INITIALISATION      0x5000
-#define FULLDUPLEX_CHECK            0x6000
-
-/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */
-#define OPEN_ERROR_CODES_MASK	0x0F00  /* Check only the bits 12-15. */
-#define OPEN_FUNCTION_FAILURE   0x0100  /* Unable to transmit to itself or
-					 * frames received before insertion.
-					 */
-#define OPEN_SIGNAL_LOSS	0x0200	/* Signal loss condition detected at
-					 * receiver.
-					 */
-#define OPEN_TIMEOUT		0x0500	/* Insertion timer expired before
-					 * logical insertion.
-					 */
-#define OPEN_RING_FAILURE	0x0600	/* Unable to receive own ring purge
-					 * MAC frames.
-					 */
-#define OPEN_RING_BEACONING	0x0700	/* Beacon MAC frame received after
-					 * ring insertion.
-					 */
-#define OPEN_DUPLICATE_NODEADDR	0x0800  /* Other station in ring found
-					 * with the same address.
-					 */
-#define OPEN_REQUEST_INIT	0x0900	/* RPS present but does not respond. */
-#define OPEN_REMOVE_RECEIVED    0x0A00  /* Adapter received a remove adapter
-					 * MAC frame.
-					 */
-#define OPEN_FULLDUPLEX_SET	0x0D00	/* Got this with full duplex on when
-					 * trying to connect to a normal ring.
-					 */
-
-/* SET_BRIDGE_PARMS return codes: */
-#define BRIDGE_INVALID_MAX_LEN  0x4000  /* MAX_ROUTING_FIELD_LENGTH odd,
-					 * less than 6 or > 30.
-					 */
-#define BRIDGE_INVALID_SRC_RING 0x2000  /* SOURCE_RING number zero, too large
-					 * or = TARGET_RING.
-					 */
-#define BRIDGE_INVALID_TRG_RING 0x1000  /* TARGET_RING number zero, too large
-					 * or = SOURCE_RING.
-					 */
-#define BRIDGE_INVALID_BRDGE_NO 0x0800  /* BRIDGE_NUMBER too large. */
-#define BRIDGE_INVALID_OPTIONS  0x0400  /* Invalid bridge options. */
-#define BRIDGE_DIAGS_FAILED     0x0200  /* Diagnostics of TMS380SRA failed. */
-#define BRIDGE_NO_SRA           0x0100  /* The TMS380SRA does not exist in HW
-					 * configuration.
-					 */
-
-/*
- * Bring Up Diagnostics error codes.
- */
-#define BUD_INITIAL_ERROR       0x0
-#define BUD_CHECKSUM_ERROR      0x1
-#define BUD_ADAPTER_RAM_ERROR   0x2
-#define BUD_INSTRUCTION_ERROR   0x3
-#define BUD_CONTEXT_ERROR       0x4
-#define BUD_PROTOCOL_ERROR      0x5
-#define BUD_INTERFACE_ERROR	0x6
-
-/* BUD constants */
-#define BUD_MAX_RETRIES         3
-#define BUD_MAX_LOOPCNT         6
-#define BUD_TIMEOUT             3000
-
-/* Initialization constants */
-#define INIT_MAX_RETRIES        3	/* Maximum three retries. */
-#define INIT_MAX_LOOPCNT        22      /* Maximum loop counts. */
-
-/* RING STATUS field values (high/low) */
-#define SIGNAL_LOSS             0x0080  /* Loss of signal on the ring
-					 * detected.
-					 */
-#define HARD_ERROR              0x0040  /* Transmitting or receiving beacon
-					 * frames.
-					 */
-#define SOFT_ERROR              0x0020  /* Report error MAC frame
-					 * transmitted.
-					 */
-#define TRANSMIT_BEACON         0x0010  /* Transmitting beacon frames on the
-					 * ring.
-					 */
-#define LOBE_WIRE_FAULT         0x0008  /* Open or short circuit in the
-					 * cable to concentrator; adapter
-					 * closed.
-					 */
-#define AUTO_REMOVAL_ERROR      0x0004  /* Lobe wrap test failed, deinserted;
-					 * adapter closed.
-					 */
-#define REMOVE_RECEIVED         0x0001  /* Received a remove ring station MAC
-					 * MAC frame request; adapter closed.
-					 */
-#define COUNTER_OVERFLOW        0x8000  /* Overflow of one of the adapters
-					 * error counters; READ.ERROR.LOG.
-					 */
-#define SINGLE_STATION          0x4000  /* Adapter is the only station on the
-					 * ring.
-					 */
-#define RING_RECOVERY           0x2000  /* Claim token MAC frames on the ring;
-					 * reset after ring purge frame.
-					 */
-
-#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\
-                        REMOVE_RECEIVED)
-
-/* Adapter_check_block.Status field bit assignments: */
-#define DIO_PARITY              0x8000  /* Adapter detects bad parity
-					 * through direct I/O access.
-					 */
-#define DMA_READ_ABORT          0x4000  /* Aborting DMA read operation
-					 * from system Parm[0]: 0=timeout,
-					 * 1=parity error, 2=bus error;
-					 * Parm[1]: 32 bit pointer to host
-					 * system address at failure.
-					 */
-#define DMA_WRITE_ABORT         0x2000  /* Aborting DMA write operation
-					 * to system. (parameters analogous to
-					 * DMA_READ_ABORT)
-					 */
-#define ILLEGAL_OP_CODE         0x1000  /* Illegal operation code in the
-					 * the adapters firmware Parm[0]-2:
-					 * communications processor registers
-					 * R13-R15.
-					 */
-#define PARITY_ERRORS           0x0800  /* Adapter detects internal bus
-					 * parity error.
-					 */
-#define RAM_DATA_ERROR          0x0080  /* Valid only during RAM testing;
-					 * RAM data error Parm[0-1]: 32 bit
-					 * pointer to RAM location.
-					 */
-#define RAM_PARITY_ERROR        0x0040  /* Valid only during RAM testing;
-					 * RAM parity error Parm[0-1]: 32 bit
-					 * pointer to RAM location.
-					 */
-#define RING_UNDERRUN           0x0020  /* Internal DMA underrun when
-					 * transmitting onto ring.
-					 */
-#define INVALID_IRQ             0x0008  /* Unrecognized interrupt generated
-					 * internal to adapter Parm[0-2]:
-					 * adapter register R13-R15.
-					 */
-#define INVALID_ERROR_IRQ       0x0004  /* Unrecognized error interrupt
-					 * generated Parm[0-2]: adapter register
-					 * R13-R15.
-					 */
-#define INVALID_XOP             0x0002  /* Unrecognized XOP request in
-					 * communication processor Parm[0-2]:
-					 * adapter register R13-R15.
-					 */
-#define CHECKADDR               0x05E0  /* Adapter check status information
-					 * address offset.
-					 */
-#define ROM_PAGE_0              0x0000  /* Adapter ROM page 0. */
-
-/*
- * RECEIVE.STATUS interrupt result SSB values: (high-low)
- * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0])
- */
-#define RX_COMPLETE             0x0080  /* SSB.Parm[0]; SSB.Parm[1]: 32
-					 * bit pointer to last RPL.
-					 */
-#define RX_SUSPENDED            0x0040  /* SSB.Parm[0]; SSB.Parm[1]: 32
-					 * bit pointer to RPL with odd
-					 * forward pointer.
-					 */
-
-/* Valid receive CSTAT: */
-#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \
-			       RX_FRAME_COMPLETE)
-#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \
-				   RX_FRAME_COMPLETE)
-
-typedef enum SKB_STAT SKB_STAT;
-enum SKB_STAT {
-	SKB_UNAVAILABLE,
-	SKB_DMA_DIRECT,
-	SKB_DATA_COPY
-};
-
-/* Receive Parameter List (RPL) The length of the RPLs has to be initialized 
- * in the OPL. (OPEN parameter list)
- */
-#define RPL_NUM		3
-
-#define RX_FRAG_NUM     1	/* Maximal number of used fragments in one RPL.
-				 * (up to firmware v2.24: 3, now: up to 9)
-				 */
-
-#pragma pack(1)
-typedef struct s_RPL RPL;
-struct s_RPL {	/* Receive Parameter List */
-	unsigned long NextRPLAddr;	/* Pointer to next RPL in chain
-					 * (normalized = physical 32 bit
-					 * address) if pointer is odd: this
-					 * is last RPL. Pointing to itself can
-					 * cause problems!
-					 */
-	volatile unsigned short Status;	/* Set by creation of Receive Parameter
-					 * List RECEIVE_CSTAT_COMPLETE set by
-					 * adapter in lists that start or end
-					 * a frame.
-					 */
-	volatile unsigned short FrameSize; /* Number of bytes received as a
-					 * frame including AC/FC, Destination,
-					 * Source, Routing field not including 
-					 * CRC, FS (Frame Status), End Delimiter
-					 * (valid only if START_FRAME bit in 
-					 * CSTAT nonzero) must not be zero in
-					 * any list; maximum value: (BUFFER_SIZE
-					 * - 8) * TX_BUF_MAX sum of DataCount
-					 * values in FragmentList must equal
-					 * Frame_Size value in START_FRAME TPL!
-					 * frame data fragment list
-					 */
-
-	/* TPL/RPL size in OPEN parameter list depending on maximal numbers
-	 * of fragments used in one parameter list.
-	 */
-	Fragment FragList[RX_FRAG_NUM];	/* Maximum: nine frame fragments in
-					 * one TPL. Actual version of firmware:
-					 * 9 fragments possible.
-					 */
-#pragma pack()
-
-	/* Special proprietary data and precalculations. */
-	RPL *NextRPLPtr;	/* Logical pointer to next RPL in chain. */
-	unsigned char *MData;
-	struct sk_buff *Skb;
-	SKB_STAT SkbStat;
-	int RPLIndex;
-};
-
-/* Information that need to be kept for each board. */
-typedef struct net_local {
-#pragma pack(1)
-	IPB ipb;	/* Initialization Parameter Block. */
-	SCB scb;	/* System Command Block: system to adapter 
-			 * communication.
-			 */
-	SSB ssb;	/* System Status Block: adapter to system 
-			 * communication.
-			 */
-	OPB ocpl;	/* Open Options Parameter Block. */
-
-	ERRORTAB errorlogtable;	/* Adapter statistic error counters.
-				 * (read from adapter memory)
-				 */
-	unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */
-#pragma pack()
-
-	TPL Tpl[TPL_NUM];
-	TPL *TplFree;
-	TPL *TplBusy;
-	unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE];
-
-	RPL Rpl[RPL_NUM];
-	RPL *RplHead;
-	RPL *RplTail;
-	unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE];
-
-	int DataRate;
-	unsigned char ScbInUse;
-	unsigned short CMDqueue;
-
-	unsigned int DeviceType;
-
-	unsigned long AdapterOpenFlag:1;
-	unsigned long AdapterVirtOpenFlag:1;
-	unsigned long OpenCommandIssued:1;
-	unsigned long TransmitCommandActive:1;
-	unsigned long TransmitHaltScheduled:1;
-	unsigned long HaltInProgress:1;
-	unsigned long LobeWireFaultLogged:1;
-	unsigned long ReOpenInProgress:1;
-	unsigned long Sleeping:1;
-
-	unsigned long LastOpenStatus;
-	unsigned short CurrentRingStatus;
-	unsigned long MaxPacketSize;
-	
-	unsigned long StartTime;
-	unsigned long LastSendTime;
-
-	struct sk_buff_head SendSkbQueue;
-	unsigned short QueueSkb;
-
-	struct tr_statistics MacStat;	/* MAC statistics structure */
-
-	struct timer_list timer;
-
-	wait_queue_head_t  wait_for_tok_int;
-
-	INTPTRS intptrs;	/* Internal adapter pointer. Must be read
-				 * before OPEN command.
-				 */
-} NET_LOCAL;
-
-#endif	/* __KERNEL__ */
-#endif	/* __LINUX_SKTR_H */
diff -u --recursive --new-file v2.3.21/linux/drivers/net/tokenring/sktr_firmware.h linux/drivers/net/tokenring/sktr_firmware.h
--- v2.3.21/linux/drivers/net/tokenring/sktr_firmware.h	Mon Oct 11 15:38:15 1999
+++ linux/drivers/net/tokenring/sktr_firmware.h	Wed Dec 31 16:00:00 1969
@@ -1,3616 +0,0 @@
-/*
- * The firmware this driver downloads into the tokenring card is a
- * separate program and is not GPL'd source code, even though the Linux
- * side driver and the routine that loads this data into the card are.
- *
- * This firmware is licensed to you strictly for use in conjunction
- * with the use of SysKonnect TokenRing adapters. There is no
- * waranty expressed or implied about its fitness for any purpose.
- */
-
-/* sktr_firmware.h: SysKonnect TokenRing driver firmware dump for Linux.
- *
- * Notes:
- *  - Loaded from sktr_reset_adapter upon adapter reset.
- *
- * Authors:
- * - Christoph Goos <cgoos@syskonnect.de>
- */
-
-#include <linux/config.h>
-
-#if defined(CONFIG_SKTR) || defined(CONFIG_SKTR_MODULE)
-
-unsigned char sktr_code[] = {
-	0x00, 0x00, 0x00, 0xA0, 0x00, 0x20, 0x68, 0x54,
-	0x73, 0x69, 0x63, 0x20, 0x64, 0x6F, 0x20, 0x65,
-	0x73, 0x69, 0x72, 0x20, 0x6C, 0x65, 0x61, 0x65,
-	0x65, 0x73, 0x20, 0x64, 0x6E, 0x75, 0x65, 0x64,
-	0x20, 0x72, 0x69, 0x6C, 0x65, 0x63, 0x63, 0x6E,
-	0x20, 0x65, 0x6E, 0x4F, 0x79, 0x6C, 0x20, 0x2C,
-	0x6C, 0x41, 0x20, 0x6C, 0x69, 0x72, 0x68, 0x67,
-	0x73, 0x74, 0x72, 0x20, 0x73, 0x65, 0x72, 0x65,
-	0x65, 0x76, 0x2E, 0x64, 0x60, 0x01, 0x42, 0x01,
-	0x00, 0x08, 0x08, 0x16, 0xB0, 0x03, 0xE0, 0x04,
-	0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xFF, 0xFF,
-	0xFC, 0x13, 0x80, 0x03, 0xA0, 0x07, 0x42, 0x01,
-	0x00, 0x08, 0x20, 0x07, 0x00, 0x00, 0xE0, 0x04,
-	0x00, 0x01, 0x8B, 0x07, 0x00, 0x3D, 0x60, 0x01,
-	0x42, 0x01, 0x80, 0x00, 0x09, 0x13, 0x8B, 0x07,
-	0x00, 0x2D, 0x20, 0xC0, 0x4E, 0x01, 0x80, 0x02,
-	0x41, 0x0F, 0x02, 0x11, 0x8B, 0x07, 0x00, 0x3D,
-	0x0B, 0xC8, 0x4A, 0x01, 0x00, 0x02, 0x00, 0x90,
-	0xA0, 0x09, 0x00, 0xC8, 0x66, 0x01, 0xE0, 0x02,
-	0xA0, 0x00, 0xA0, 0x07, 0x04, 0x01, 0x20, 0x00,
-	0xA0, 0x01, 0x40, 0x01, 0x00, 0xFE, 0x20, 0x48,
-	0x2A, 0xE0, 0x42, 0x01, 0xE0, 0x04, 0x02, 0x01,
-	0xE0, 0x04, 0x60, 0x09, 0xE0, 0x04, 0x82, 0x01,
-	0x60, 0x01, 0x1C, 0x01, 0x04, 0x00, 0x03, 0x16,
-	0xE0, 0x01, 0x40, 0x01, 0x00, 0x0C, 0xA0, 0x06,
-	0xBC, 0xA1, 0xA0, 0x07, 0x04, 0x01, 0x2D, 0x00,
-	0x20, 0xC2, 0x00, 0xE0, 0x88, 0x02, 0x11, 0xE3,
-	0x14, 0x16, 0xA0, 0x07, 0x04, 0x01, 0x2E, 0x00,
-	0x60, 0x01, 0x42, 0x01, 0x00, 0x03, 0x0D, 0x16,
-	0xA0, 0x07, 0x04, 0x01, 0x21, 0x00, 0x88, 0x07,
-	0x00, 0xA0, 0x89, 0x07, 0xFE, 0xFF, 0xA8, 0x09,
-	0xA9, 0x09, 0x8A, 0x07, 0x02, 0xE0, 0xA0, 0x06,
-	0x84, 0xEC, 0x56, 0x10, 0x88, 0x07, 0x00, 0x90,
-	0x89, 0x07, 0xFE, 0x9F, 0xA8, 0x09, 0xA9, 0x09,
-	0x8A, 0x07, 0x78, 0xE0, 0xA0, 0x06, 0x84, 0xEC,
-	0x4B, 0x10, 0xA0, 0x05, 0x04, 0x01, 0x88, 0x07,
-	0x08, 0x00, 0x89, 0x07, 0x7A, 0x00, 0x00, 0x03,
-	0x01, 0x00, 0xA0, 0x06, 0xD2, 0xAC, 0x40, 0x10,
-	0xA0, 0x06, 0xBC, 0xA1, 0xE0, 0x02, 0xF4, 0x03,
-	0x88, 0x07, 0xA0, 0x00, 0x89, 0x07, 0xFE, 0x00,
-	0xA0, 0x06, 0xD2, 0xAC, 0x35, 0x10, 0xE0, 0x02,
-	0xA0, 0x00, 0xE0, 0x04, 0x7E, 0x01, 0xC8, 0x04,
-	0x09, 0x02, 0xF2, 0x03, 0x48, 0x62, 0xE0, 0xC1,
-	0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04,
-	0x18, 0xCE, 0x09, 0x06, 0xFD, 0x16, 0xA0, 0x01,
-	0x40, 0x01, 0x00, 0x40, 0x07, 0xC8, 0x40, 0x01,
-	0x88, 0x07, 0xF4, 0x03, 0x89, 0x07, 0xFE, 0x3F,
-	0xA0, 0x06, 0xD2, 0xAC, 0x19, 0x10, 0xE0, 0x02,
-	0xA0, 0x00, 0xA0, 0x06, 0xFA, 0xAD, 0x14, 0x10,
-	0x08, 0xC8, 0x44, 0x04, 0x09, 0xC8, 0x46, 0x04,
-	0xA0, 0x06, 0x28, 0xAD, 0x0D, 0x10, 0x81, 0x07,
-	0x7C, 0xE0, 0xB1, 0xC0, 0x26, 0x13, 0x01, 0xC8,
-	0xE0, 0x00, 0xA0, 0x05, 0x04, 0x01, 0x92, 0x06,
-	0x03, 0x10, 0x60, 0xC0, 0xE0, 0x00, 0xF5, 0x10,
-	0xE0, 0x01, 0x04, 0x01, 0x10, 0x00, 0xB0, 0x03,
-	0xFF, 0x10, 0xA0, 0x01, 0x04, 0x01, 0x00, 0x80,
-	0x80, 0x03, 0x80, 0x07, 0xA0, 0x00, 0xC2, 0x04,
-	0x80, 0xCC, 0x81, 0x07, 0xAA, 0xA1, 0x82, 0x02,
-	0x1E, 0x00, 0x02, 0x16, 0x81, 0x07, 0xB4, 0xA1,
-	0x81, 0xC4, 0x81, 0x8C, 0xE9, 0x16, 0x82, 0x02,
-	0x7C, 0x00, 0xF2, 0x16, 0x00, 0x03, 0x0F, 0x00,
-	0x5B, 0x04, 0x81, 0x07, 0x08, 0xE1, 0x82, 0x07,
-	0x04, 0x00, 0xE0, 0x04, 0x80, 0x01, 0xE0, 0x04,
-	0x82, 0x01, 0x91, 0xC4, 0xB1, 0x8C, 0xD8, 0x16,
-	0x82, 0x02, 0x7C, 0x00, 0xFA, 0x16, 0x20, 0xC8,
-	0x04, 0xE0, 0x82, 0x01, 0x20, 0xE8, 0x0C, 0xE0,
-	0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0x80, 0x01,
-	0x81, 0x07, 0x86, 0xE0, 0xB1, 0xC0, 0x07, 0x13,
-	0xB1, 0xC4, 0xFC, 0x10, 0xA0, 0x07, 0x04, 0x01,
-	0x2E, 0x00, 0x60, 0x04, 0xAA, 0xA1, 0x81, 0x07,
-	0x34, 0xE0, 0x82, 0x07, 0xFC, 0x05, 0x83, 0x07,
-	0x0A, 0x00, 0xB1, 0xCC, 0x43, 0x06, 0xFD, 0x16,
-	0x02, 0x02, 0x00, 0x06, 0x60, 0xD0, 0x4E, 0x01,
-	0xED, 0x13, 0x21, 0x02, 0x00, 0xF7, 0x21, 0x02,
-	0x00, 0xC0, 0x81, 0xDC, 0x60, 0xD0, 0x4F, 0x01,
-	0xC1, 0xC0, 0x41, 0x09, 0x21, 0x02, 0x00, 0xF0,
-	0x81, 0xDC, 0x43, 0x02, 0x00, 0x0F, 0x23, 0x02,
-	0x00, 0xF0, 0x83, 0xDC, 0x01, 0x02, 0x32, 0x0C,
-	0xA0, 0xC0, 0x44, 0x04, 0xE0, 0xC0, 0x46, 0x04,
-	0x03, 0xC1, 0x02, 0x61, 0x84, 0x05, 0x04, 0xC8,
-	0x48, 0x04, 0x03, 0xC1, 0x84, 0x05, 0x04, 0xA1,
-	0x01, 0xA1, 0x04, 0xC8, 0x30, 0x0C, 0x03, 0xC1,
-	0x84, 0x05, 0xF1, 0x04, 0x04, 0x06, 0xFD, 0x16,
-	0x08, 0x02, 0x00, 0xA0, 0xA8, 0x09, 0x60, 0xC2,
-	0x30, 0x0C, 0x29, 0x02, 0xFF, 0x03, 0xA9, 0x09,
-	0x29, 0x02, 0x40, 0x00, 0x80, 0x07, 0x00, 0x90,
-	0xA0, 0x09, 0x8A, 0x07, 0xFE, 0x9F, 0x2A, 0x02,
-	0xFF, 0x03, 0xAA, 0x09, 0x01, 0x02, 0x32, 0x0C,
-	0x05, 0x02, 0x00, 0x00, 0x03, 0xC1, 0x84, 0x05,
-	0x11, 0x07, 0xC1, 0x05, 0x85, 0x05, 0x04, 0x06,
-	0x0B, 0x13, 0x85, 0x80, 0xF9, 0x1A, 0x05, 0x80,
-	0xF8, 0x1A, 0x85, 0x82, 0xF5, 0x1A, 0x05, 0x82,
-	0xF4, 0x1A, 0x45, 0x82, 0xF1, 0x1A, 0xF1, 0x10,
-	0x20, 0x2D, 0x02, 0x00, 0x60, 0x01, 0x40, 0x01,
-	0x00, 0x40, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x08,
-	0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 0x48, 0x10,
-	0x60, 0x01, 0x42, 0x01, 0x00, 0x80, 0x06, 0x16,
-	0x8A, 0x07, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01,
-	0x00, 0x80, 0x3E, 0x10, 0x60, 0x01, 0x02, 0x01,
-	0x00, 0x10, 0x0A, 0x16, 0x60, 0x01, 0x00, 0x01,
-	0x00, 0x04, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x80,
-	0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0x30, 0x10,
-	0x60, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0A, 0x16,
-	0x60, 0x01, 0x00, 0x01, 0x00, 0x04, 0x06, 0x16,
-	0xA0, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0D, 0x02,
-	0x01, 0x00, 0x0D, 0x10, 0x60, 0x01, 0x02, 0x01,
-	0x00, 0x04, 0x16, 0x16, 0x60, 0x01, 0x00, 0x01,
-	0x00, 0x08, 0x12, 0x16, 0xA0, 0x01, 0x02, 0x01,
-	0x00, 0x04, 0x0D, 0x02, 0x02, 0x00, 0xA0, 0xC3,
-	0x0E, 0x01, 0xE0, 0xC3, 0x10, 0x01, 0x8A, 0x07,
-	0x00, 0x20, 0x60, 0x01, 0x00, 0x01, 0x00, 0x80,
-	0x0B, 0x13, 0x8A, 0x07, 0x00, 0x40, 0x08, 0x10,
-	0x8A, 0x07, 0x04, 0x00, 0x05, 0x10, 0x8A, 0x07,
-	0x02, 0x00, 0x02, 0x10, 0x8A, 0x07, 0x08, 0x00,
-	0x00, 0x03, 0x00, 0x00, 0xE0, 0x04, 0x82, 0x01,
-	0x8B, 0x07, 0xE0, 0x05, 0xCA, 0xCE, 0xCD, 0xCE,
-	0xCE, 0xCE, 0xCF, 0xC6, 0x20, 0xC3, 0x58, 0x07,
-	0x20, 0x23, 0x04, 0xE0, 0x12, 0x13, 0x8B, 0x07,
-	0x18, 0xFF, 0x8A, 0x02, 0x00, 0x80, 0x0A, 0x13,
-	0x8B, 0x05, 0xCD, 0xA2, 0x8A, 0x02, 0x00, 0x40,
-	0x05, 0x13, 0x8A, 0x02, 0x00, 0x20, 0x02, 0x13,
-	0x8B, 0x07, 0x1D, 0xFF, 0x0B, 0xC8, 0x04, 0x01,
-	0x0D, 0x10, 0x20, 0xD3, 0x05, 0x01, 0xFD, 0x11,
-	0x20, 0xD8, 0xDF, 0x07, 0x17, 0x01, 0x8B, 0x07,
-	0x80, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0x20, 0xE8,
-	0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x04, 0x01,
-	0xE0, 0x22, 0x86, 0xE1, 0xFB, 0x16, 0xE0, 0x02,
-	0xA0, 0x00, 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8,
-	0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01,
-	0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0xA0, 0x01,
-	0x40, 0x01, 0x00, 0xF6, 0x60, 0x04, 0x90, 0xA0,
-	0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, 0x02, 0x01,
-	0xFF, 0xDF, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03,
-	0x00, 0x03, 0x02, 0x00, 0x09, 0x07, 0xA0, 0xC2,
-	0x04, 0x01, 0x8A, 0x01, 0x80, 0x00, 0x4A, 0x52,
-	0x89, 0xD2, 0x0A, 0xC8, 0x04, 0x01, 0xA0, 0xD2,
-	0x04, 0x01, 0xF9, 0x16, 0x49, 0x05, 0x89, 0x01,
-	0x00, 0x80, 0x49, 0x01, 0x00, 0x40, 0x0E, 0x13,
-	0x09, 0xF8, 0x3A, 0x07, 0x60, 0xC2, 0x36, 0x07,
-	0x03, 0x16, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03,
-	0xE0, 0x04, 0x36, 0x07, 0x54, 0x04, 0x90, 0x03,
-	0xFF, 0xFF, 0x80, 0x03, 0x60, 0x22, 0x86, 0xE1,
-	0xC2, 0x13, 0xE0, 0x04, 0x82, 0x01, 0x60, 0x04,
-	0xE0, 0xA3, 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07,
-	0x62, 0x09, 0xE8, 0x03, 0xC9, 0x04, 0xA0, 0xC1,
-	0x34, 0x06, 0x04, 0x16, 0xA0, 0x06, 0x50, 0xB5,
-	0xE0, 0x04, 0x20, 0x09, 0x86, 0x07, 0xE8, 0x05,
-	0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 0x20, 0xC2,
-	0x84, 0x01, 0x20, 0x48, 0x08, 0xE0, 0x84, 0x01,
-	0x20, 0x22, 0x08, 0xE0, 0x08, 0x13, 0x60, 0x01,
-	0xAE, 0x01, 0x01, 0x00, 0x04, 0x16, 0xE0, 0x01,
-	0x34, 0x06, 0x00, 0x80, 0x06, 0x10, 0x20, 0xC2,
-	0x32, 0x09, 0x06, 0x13, 0xE0, 0x01, 0x34, 0x06,
-	0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x09, 0x07,
-	0xA0, 0x05, 0xEE, 0x05, 0x20, 0x06, 0xEC, 0x05,
-	0x02, 0x16, 0x16, 0xC2, 0x03, 0x16, 0x49, 0xC2,
-	0x12, 0x16, 0x80, 0x03, 0x98, 0xC5, 0xE8, 0xC1,
-	0x02, 0x00, 0xE0, 0xE9, 0x14, 0xE0, 0x04, 0x00,
-	0xD7, 0x04, 0x27, 0x02, 0x08, 0x00, 0xA0, 0x06,
-	0xE6, 0xB4, 0x16, 0xC2, 0x04, 0x13, 0x28, 0xC8,
-	0x08, 0x00, 0xEC, 0x05, 0xEF, 0x13, 0x54, 0x04,
-	0x00, 0x03, 0x02, 0x00, 0xE0, 0xC1, 0x86, 0x01,
-	0x47, 0x02, 0x0E, 0x00, 0xA7, 0xC2, 0x90, 0xE1,
-	0x5A, 0x04, 0x8A, 0x07, 0x00, 0xA0, 0x0A, 0xC8,
-	0x86, 0x01, 0xC7, 0xA1, 0x27, 0x02, 0x98, 0xE1,
-	0x37, 0xE8, 0x34, 0x06, 0x17, 0xE8, 0xD2, 0x06,
-	0xE0, 0x04, 0x30, 0x06, 0x60, 0x04, 0xF2, 0xA9,
-	0x0A, 0xE8, 0xD2, 0x06, 0xE0, 0x01, 0x34, 0x06,
-	0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x20, 0xE0,
-	0x18, 0xE0, 0x5B, 0x04, 0xA0, 0x05, 0x20, 0x09,
-	0x20, 0x88, 0x20, 0x09, 0x16, 0xE0, 0xE5, 0x1A,
-	0xE0, 0x04, 0x20, 0x09, 0xA0, 0x06, 0xD0, 0xD5,
-	0x80, 0x03, 0xA0, 0x05, 0x32, 0x09, 0x80, 0x03,
-	0x01, 0xC3, 0xFB, 0x13, 0x60, 0x01, 0x6A, 0x09,
-	0x01, 0x00, 0x78, 0x13, 0xA0, 0x05, 0x32, 0x09,
-	0x75, 0x10, 0x41, 0xC0, 0x06, 0x13, 0x01, 0xC8,
-	0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x01, 0x11,
-	0x7B, 0x10, 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00,
-	0x79, 0x16, 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01,
-	0x41, 0xC0, 0x04, 0x13, 0x01, 0xC8, 0x8A, 0x01,
-	0x01, 0xC8, 0x18, 0x09, 0x86, 0x07, 0x43, 0x00,
-	0x06, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x02, 0xFC,    
-	0x17, 0xC2, 0x60, 0x04, 0xFA, 0xA6, 0xE0, 0x04, 
-	0x18, 0x09, 0xC7, 0x61, 0x08, 0x07, 0x60, 0x01, 
-	0x06, 0xFC, 0x40, 0x00, 0x02, 0x13, 0x08, 0x02, 
-	0x01, 0x00, 0x09, 0x10, 0x4C, 0xC2, 0x20, 0xC3, 
-	0x00, 0xFC, 0x2A, 0x13, 0x0C, 0xC8, 0x6C, 0x01, 
-	0xE0, 0xC2, 0x02, 0xFC, 0x1B, 0x11, 0x4B, 0x01, 
-	0x00, 0x01, 0xF4, 0x16, 0xC8, 0x22, 0x12, 0x13, 
-	0xCB, 0x01, 0x00, 0x40, 0x0B, 0xC8, 0x02, 0xFC, 
-	0x0D, 0x10, 0xE0, 0xC1, 0x18, 0x09, 0x01, 0xC3, 
-	0x21, 0x13, 0x4C, 0xC2, 0x15, 0x13, 0x0C, 0xC8, 
-	0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x06, 0x11, 
-	0xCC, 0x81, 0xD5, 0x13, 0x4C, 0xC2, 0x20, 0xC3, 
-	0x00, 0xFC, 0xF4, 0x10, 0x09, 0xC8, 0x6C, 0x01, 
-	0xE0, 0xC2, 0x02, 0xFC, 0x1E, 0x16, 0xA0, 0x07, 
-	0x02, 0xFC, 0x00, 0x80, 0x09, 0xC3, 0x19, 0x10, 
-	0x09, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 
-	0x05, 0x16, 0xA0, 0x07, 0x02, 0xFC, 0x00, 0x80, 
-	0x09, 0xC3, 0x0F, 0x10, 0xE0, 0xC2, 0x02, 0x0C, 
-	0x01, 0x11, 0x1E, 0x10, 0x20, 0xD8, 0x00, 0xE2, 
-	0x83, 0x01, 0x8B, 0x09, 0x8B, 0x09, 0x8B, 0x09,  
-	0x8B, 0x09, 0xA0, 0x07, 0x8A, 0x01, 0x43, 0x00,  
-	0x13, 0x10, 0x0C, 0xC8, 0x8A, 0x01, 0x0C, 0xC8,  
-	0x18, 0x09, 0x0E, 0x10, 0x00, 0x03, 0x02, 0x00, 
-	0xE0, 0xC0, 0x6C, 0x01, 0x20, 0xC3, 0x8A, 0x01,  
-	0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x81, 0x13,  
-	0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0xB9, 0x13, 
-	0x01, 0x83, 0x31, 0x16, 0x03, 0xC8, 0x6C, 0x01, 
-	0x40, 0x01, 0x10, 0x00, 0x14, 0x16, 0xE0, 0xC2, 
-	0x2E, 0x06, 0x11, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 
-	0x0E, 0x13, 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 
-	0x80, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x36, 0x07, 
-	0x06, 0x13, 0xE0, 0x04, 0x36, 0x07, 0x80, 0x01, 
-	0x20, 0x00, 0x60, 0x04, 0xF2, 0xA9, 0x40, 0x01, 
-	0x20, 0x00, 0xF9, 0x13, 0x90, 0x03, 0xFF, 0x11, 
-	0x80, 0x03, 0x08, 0x01, 0x00, 0x04, 0x19, 0x16,  
-	0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 0x15, 0x16,  
-	0x88, 0x01, 0x00, 0x1A, 0xC8, 0x01, 0x00, 0x01, 
-	0xC8, 0xC5, 0x0F, 0x10, 0xE0, 0x04, 0x18, 0x09, 
-	0xC0, 0x01, 0x04, 0x00, 0x15, 0x10, 0x81, 0xC1, 
-	0x01, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x00, 0xFC, 
-	0x77, 0xC0, 0x17, 0xC2, 0x48, 0x01, 0x00, 0x18, 
-	0xE4, 0x13, 0x40, 0x01, 0x40, 0x00, 0x15, 0x16, 
-	0x80, 0x01, 0x45, 0x00, 0x46, 0xC1, 0x20, 0xD0, 
-	0x07, 0xFC, 0x60, 0x81, 0x18, 0x09, 0xE6, 0x13, 
-	0xE0, 0xC2, 0x08, 0xFC, 0x08, 0x11, 0xE0, 0xC2, 
-	0x0E, 0xFC, 0x07, 0x15, 0x06, 0x13, 0xE0, 0xC2, 
-	0x14, 0xFC, 0x03, 0x15, 0x02, 0x13, 0xC0, 0x01, 
-	0x01, 0x00, 0x48, 0x01, 0x00, 0x01, 0x11, 0x13, 
-	0x40, 0x01, 0x80, 0x40, 0x69, 0x13, 0x60, 0x04, 
-	0x66, 0xA6, 0x48, 0x01, 0x01, 0x00, 0x03, 0x16, 
-	0x40, 0x01, 0x00, 0x40, 0x0B, 0x16, 0xC8, 0x01, 
-	0x00, 0x40, 0xA0, 0x05, 0x32, 0x09, 0xC8, 0xC5, 
-	0x05, 0x10, 0xC0, 0x01, 0x40, 0x00, 0x40, 0x01, 
-	0x04, 0x00, 0xEF, 0x13, 0xB7, 0x01, 0x20, 0x00, 
-	0xD7, 0xC2, 0xC4, 0x62, 0x0B, 0x05, 0x2B, 0x02, 
-	0xFC, 0xFF, 0xCB, 0xC5, 0x02, 0x15, 0x46, 0x81, 
-	0x6A, 0x13, 0x08, 0x01, 0x00, 0x5E, 0x67, 0x16, 
-	0x08, 0x01, 0x88, 0x00, 0x13, 0x16, 0x86, 0x02, 
-	0x43, 0x00, 0x25, 0x16, 0x40, 0x01, 0x00, 0x40, 
-	0x0B, 0x13, 0x08, 0x01, 0x03, 0x00, 0x08, 0x13, 
-	0x84, 0xC2, 0x2A, 0x02, 0xD8, 0xFF, 0x06, 0xC8, 
-	0x6C, 0x01, 0x0A, 0x68, 0x04, 0xFC, 0x73, 0x10, 
-	0x60, 0x04, 0xD2, 0xA8, 0x40, 0x01, 0x01, 0x00, 
-	0xEA, 0x13, 0x08, 0x01, 0x02, 0x00, 0xE7, 0x16, 
-	0x48, 0x01, 0x01, 0x00, 0xE4, 0x16, 0x40, 0x01, 
-	0x00, 0x40, 0x04, 0x16, 0x60, 0x01, 0xA8, 0x09, 
-	0x80, 0x00, 0xDD, 0x13, 0x8A, 0x07, 0x80, 0x00, 
-	0xA0, 0x06, 0x32, 0xA5, 0xD8, 0x10, 0x00, 0xC0, 
-	0xE7, 0x11, 0x60, 0xC2, 0x6A, 0x09, 0x40, 0x01, 
-	0x00, 0x40, 0x0A, 0x13, 0x48, 0x01, 0x01, 0x00, 
-	0x34, 0x13, 0x48, 0x01, 0x02, 0x00, 0x0A, 0x13, 
-	0x49, 0x01, 0x04, 0x00, 0xD9, 0x16, 0x06, 0x10, 
-	0x49, 0x01, 0x02, 0x00, 0x03, 0x13, 0x08, 0x01, 
-	0x03, 0x00, 0x6E, 0x13, 0x49, 0x01, 0x01, 0x00, 
-	0x12, 0x13, 0x40, 0x01, 0x80, 0x40, 0x01, 0x16, 
-	0x46, 0xC1, 0xE0, 0x04, 0x00, 0xFC, 0x87, 0x07, 
-	0xF8, 0x05, 0x17, 0xC2, 0x14, 0x13, 0xC7, 0x05, 
-	0x17, 0xC8, 0x6C, 0x01, 0x05, 0xC8, 0x00, 0xFC,  
-	0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x07, 0x02, 
-	0x02, 0xFC, 0xE0, 0xA1, 0x2C, 0x09, 0xE0, 0xCD,  
-	0xEE, 0x05, 0xE0, 0xC5, 0x04, 0xFC, 0x20, 0xC8, 
-	0x2C, 0x09, 0x04, 0xFC, 0xE2, 0x10, 0xC5, 0xCD, 
-	0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x60, 0x04, 
-	0xB6, 0xA8, 0x06, 0xC8, 0x6C, 0x01, 0x85, 0x81, 
-	0x1A, 0x13, 0xE0, 0xC2, 0x04, 0xFC, 0x17, 0x15, 
-	0x86, 0xC2, 0x8A, 0xA2, 0xAA, 0xC1, 0x32, 0x0C, 
-	0x06, 0xC8, 0x6C, 0x01, 0x0B, 0xA8, 0x04, 0xFC, 
-	0x1A, 0x09, 0x0A, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 
-	0x02, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 0x06, 0xC8, 
-	0x6C, 0x01, 0x0B, 0xC8, 0x02, 0xFC, 0xA0, 0x06, 
-	0x3E, 0xB4, 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 
-	0x00, 0xFC, 0xA0, 0x01, 0x02, 0xFC, 0x02, 0x00, 
-	0x87, 0x07, 0x30, 0x06, 0xE7, 0x01, 0x04, 0x00, 
-	0x40, 0x00, 0xD7, 0x04, 0x27, 0x02, 0x0C, 0x00, 
-	0x05, 0xC2, 0x60, 0x01, 0x6A, 0x09, 0x04, 0x00, 
-	0x03, 0x16, 0xE0, 0x01, 0x02, 0xFC, 0x20, 0x00, 
-	0xA0, 0x06, 0xFC, 0xB4, 0xC0, 0x01, 0x20, 0x00, 
-	0x60, 0x04, 0x66, 0xA6, 0x48, 0x01, 0x00, 0x18, 
-	0x03, 0x13, 0x48, 0x01, 0x00, 0x10, 0x02, 0x16, 
-	0xA0, 0x05, 0x32, 0x09, 0x86, 0x02, 0x43, 0x00, 
-	0x03, 0x13, 0x40, 0x01, 0x80, 0x40, 0x98, 0x13, 
-	0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC,  
-	0x85, 0xC2, 0xA0, 0x06, 0x3E, 0xB4, 0x20, 0x06, 
-	0x62, 0x09, 0xE6, 0x16, 0xA0, 0x06, 0xD0, 0xD5, 
-	0xE3, 0x10, 0xA0, 0xC2, 0xF6, 0x05, 0x56, 0x16, 
-	0x19, 0xC8, 0xF0, 0x05, 0xA9, 0xC2, 0x0A, 0x00, 
-	0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 0x0A, 0xD8, 
-	0x80, 0x01, 0x29, 0xC8, 0x06, 0x00, 0x8C, 0x01, 
-	0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 0x09, 0xC8, 
-	0xF4, 0x05, 0x46, 0x10, 0x29, 0xC8, 0x06, 0x00, 
-	0x6C, 0x01, 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 
-	0x20, 0xC8, 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 
-	0x12, 0xFC, 0xB2, 0x01, 0xA0, 0xF2, 0x2E, 0x09, 
-	0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x80, 0x01, 
-	0x00, 0xC4, 0xE1, 0x10, 0x47, 0x01, 0x08, 0x00, 
-	0x06, 0x16, 0xA8, 0xC2, 0x06, 0x00, 0xA0, 0x06, 
-	0x3E, 0xB4, 0xE8, 0x04, 0x06, 0x00, 0x07, 0x01, 
-	0x20, 0x00, 0x31, 0x13, 0xE8, 0x04, 0x02, 0x00, 
-	0x3B, 0x10, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x06, 
-	0x3E, 0xB4, 0x29, 0x10, 0x00, 0x03, 0x02, 0x00, 
-	0x20, 0xC2, 0x8C, 0x01, 0xE0, 0xC0, 0x6C, 0x01, 
-	0x20, 0xC2, 0xF4, 0x05, 0x28, 0xC8, 0x08, 0x00, 
-	0x6C, 0x01, 0xE8, 0xC1, 0x0A, 0x00, 0x20, 0xC3, 
-	0x02, 0xFC, 0x8C, 0x01, 0x20, 0x00, 0x0C, 0xC8, 
-	0x02, 0xFC, 0x0C, 0x01, 0x00, 0xFE, 0x3B, 0x16, 
-	0x47, 0x01, 0x40, 0x00, 0x50, 0x13, 0x60, 0xC2, 
-	0xF0, 0x05, 0xA7, 0x16, 0xE0, 0x04, 0xF4, 0x05, 
-	0x0C, 0xCA, 0x08, 0x00, 0x47, 0x01, 0x80, 0x00, 
-	0xC9, 0x16, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
-	0xA0, 0xC2, 0x00, 0xFC, 0xD2, 0x16, 0xE8, 0xC1, 
-	0x02, 0x00, 0xD7, 0xC2, 0x0F, 0x16, 0x27, 0x02, 
-	0x10, 0x00, 0xD8, 0x04, 0x57, 0xC2, 0x0E, 0x13, 
-	0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, 
-	0x03, 0xC8, 0x6C, 0x01, 0x0D, 0x11, 0x90, 0x03, 
-	0xFF, 0x11, 0x80, 0x03, 0xD7, 0x04, 0xC3, 0x01, 
-	0x00, 0x80, 0xED, 0x10, 0xE7, 0x01, 0xF4, 0xFF, 
-	0x20, 0x00, 0xC8, 0xCD, 0xC8, 0xC5, 0xF0, 0x10, 
-	0x90, 0x03, 0xF8, 0x11, 0xE0, 0x02, 0xC0, 0x00, 
-	0x60, 0xC3, 0xFA, 0x00, 0xA0, 0xC3, 0xFC, 0x00, 
-	0xE0, 0xC3, 0xFE, 0x00, 0x54, 0x04, 0xE8, 0xC2, 
-	0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x0C, 0xC3, 
-	0x33, 0x11, 0x20, 0x23, 0x0A, 0xE0, 0x45, 0x13, 
-	0x20, 0x23, 0x10, 0xE0, 0x46, 0x13, 0x20, 0x23, 
-	0x0E, 0xE0, 0x13, 0x13, 0xE0, 0x21, 0x16, 0xE0, 
-	0xB6, 0x16, 0x20, 0x23, 0x06, 0xE0, 0x03, 0x16, 
-	0x20, 0x27, 0xA8, 0xE4, 0x0A, 0x13, 0xE8, 0xC2, 
-	0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x4C, 0x01, 
-	0x88, 0x00, 0xA9, 0x16, 0x0C, 0x01, 0x44, 0x00, 
-	0xA6, 0x16, 0x20, 0x06, 0x16, 0x09, 0xA3, 0x13, 
-	0x0A, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x04, 0xE0, 
-	0x02, 0xFC, 0x0B, 0xC8, 0x6C, 0x01, 0xA0, 0x07, 
-	0x02, 0xFC, 0x00, 0x81, 0x20, 0xC3, 0x80, 0x01, 
-	0xA0, 0x01, 0x80, 0x01, 0x00, 0xC4, 0x0C, 0xC8, 
-	0x80, 0x01, 0x0A, 0xC8, 0x8C, 0x01, 0xAC, 0x10, 
-	0x0A, 0xC2, 0x0F, 0x13, 0x08, 0xC8, 0x6C, 0x01, 
-	0xA0, 0xC2, 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 
-	0x20, 0x23, 0x12, 0xE0, 0xF5, 0x16, 0x0B, 0xC8, 
-	0x6C, 0x01, 0x0C, 0xC8, 0x02, 0xFC, 0x60, 0x04, 
-	0x72, 0xA9, 0x8A, 0x07, 0x00, 0x04, 0x60, 0x04, 
-	0x8A, 0xA3, 0x8A, 0x07, 0x20, 0x00, 0x60, 0x04, 
-	0x8A, 0xA3, 0x8A, 0x07, 0x00, 0x02, 0x20, 0x27, 
-	0x0E, 0xE0, 0x04, 0x16, 0xA0, 0x06, 0x32, 0xA5, 
-	0xC3, 0x01, 0x00, 0x80, 0xA8, 0xC2, 0x06, 0x00, 
-	0x60, 0x04, 0x98, 0xA9, 0x00, 0x03, 0x02, 0x00, 
-	0xC0, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x2E, 0x06, 
-	0x08, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 0x05, 0x13, 
-	0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 0x80, 0x01, 
-	0x10, 0x00, 0x90, 0x03, 0xFF, 0x7F, 0x80, 0x03, 
-	0x00, 0x03, 0x02, 0x00, 0x20, 0xC2, 0xF6, 0x05, 
-	0x20, 0xE2, 0xF4, 0x05, 0x0E, 0x16, 0x20, 0xD8, 
-	0x2E, 0x09, 0x80, 0x01, 0x2B, 0xC8, 0x06, 0x00, 
-	0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 
-	0x0B, 0xC8, 0xF4, 0x05, 0x90, 0x03, 0xFF, 0xFF, 
-	0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 0xDB, 0x04, 
-	0x57, 0xC2, 0x05, 0x16, 0xCB, 0xCD, 0xCB, 0xC5, 
-	0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0xC7, 0x05, 
-	0x57, 0xC2, 0x4B, 0xC6, 0xCB, 0xC5, 0x90, 0x03, 
-	0xFF, 0xFF, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 
-	0x0B, 0xC2, 0x20, 0xC3, 0xF4, 0x05, 0x0F, 0x13, 
-	0xA8, 0xC2, 0x0A, 0x00, 0x4A, 0x01, 0x10, 0x00, 
-	0x16, 0x16, 0xA0, 0x22, 0x04, 0xE0, 0x1A, 0x16, 
-	0x08, 0xC3, 0xA0, 0x06, 0x36, 0xAC, 0x0C, 0xC2, 
-	0x20, 0xC3, 0xF4, 0x05, 0x13, 0x16, 0x68, 0x01, 
-	0x0A, 0x00, 0x10, 0x00, 0x03, 0x13, 0xE0, 0xC2, 
-	0xF6, 0x05, 0x05, 0x16, 0xA0, 0x06, 0x78, 0xAC, 
-	0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 
-	0xF0, 0x05, 0xA0, 0x06, 0xE6, 0xB4, 0x90, 0x03, 
-	0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 
-	0xA0, 0x06, 0x2C, 0xB5, 0x80, 0x03, 0x00, 0x03, 
-	0x02, 0x00, 0x87, 0x07, 0xF0, 0x05, 0xCB, 0xC2, 
-	0x08, 0x16, 0xA0, 0x06, 0x36, 0xAC, 0x20, 0x07, 
-	0xF6, 0x05, 0x60, 0xCB, 0xF4, 0x05, 0x02, 0x00, 
-	0x80, 0x03, 0xE0, 0x04, 0xF6, 0x05, 0x20, 0xC2, 
-	0xF4, 0x05, 0x05, 0x16, 0x17, 0xC2, 0x03, 0x13, 
-	0xD8, 0xC5, 0xA0, 0x06, 0x78, 0xAC, 0x80, 0x03, 
-	0x00, 0x03, 0x02, 0x00, 0x0B, 0xC3, 0xA0, 0x06, 
-	0x36, 0xAC, 0x8C, 0xC2, 0xCC, 0xC1, 0x27, 0x02, 
-	0x10, 0x00, 0x88, 0x07, 0xF0, 0x05, 0x88, 0xC1, 
-	0x18, 0xC2, 0x26, 0x13, 0xA8, 0x82, 0x02, 0x00, 
-	0xFA, 0x16, 0xE8, 0xC2, 0x0A, 0x00, 0xE0, 0x22, 
-	0x1E, 0xE0, 0xF5, 0x16, 0x98, 0xC5, 0xE0, 0x22, 
-	0x1C, 0xE0, 0x0B, 0x16, 0x28, 0xC8, 0x06, 0x00, 
-	0xF4, 0x00, 0xE0, 0x02, 0xE0, 0x00, 0xA0, 0x06, 
-	0x3E, 0xB4, 0xE0, 0x02, 0xC0, 0x00, 0xE8, 0x04, 
-	0x06, 0x00, 0xE0, 0x22, 0x18, 0xE0, 0xE4, 0x13, 
-	0x20, 0xEA, 0x22, 0xE0, 0x0A, 0x00, 0xA0, 0xEA, 
-	0x18, 0xE0, 0x04, 0x00, 0xDA, 0x04, 0xA0, 0x06, 
-	0xE6, 0xB4, 0x47, 0x06, 0x06, 0xC2, 0xD8, 0x10, 
-	0x06, 0xC8, 0xF2, 0x05, 0x60, 0xCB, 0xF4, 0x05, 
-	0x02, 0x00, 0x54, 0x04, 0x20, 0xC2, 0xF4, 0x05, 
-	0x13, 0x13, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, 
-	0x8B, 0x0B, 0x8B, 0x0B, 0x60, 0x01, 0x9C, 0x01, 
-	0x00, 0x40, 0x0A, 0x16, 0x60, 0xC2, 0x6C, 0x01, 
-	0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC2, 
-	0x02, 0xFC, 0x03, 0x11, 0x09, 0xC8, 0x6C, 0x01, 
-	0x5B, 0x04, 0x09, 0xC8, 0x6C, 0x01, 0x4B, 0xC2, 
-	0x87, 0x07, 0xF0, 0x05, 0xA0, 0x06, 0x2C, 0xB5, 
-	0xE0, 0x04, 0xF4, 0x05, 0x59, 0x04, 0xA8, 0xC2, 
-	0x0A, 0x00, 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 
-	0x0A, 0xD8, 0x80, 0x01, 0x28, 0xC8, 0x06, 0x00, 
-	0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 
-	0x08, 0xC8, 0xF4, 0x05, 0x5B, 0x04, 0x20, 0xC3, 
-	0x6C, 0x01, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
-	0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 0x20, 0xC8, 
-	0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 0x12, 0xFC, 
-	0xB2, 0x01, 0x0C, 0xC8, 0x6C, 0x01, 0xA0, 0xF2, 
-	0x2E, 0x09, 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 
-	0x80, 0x01, 0x00, 0xC4, 0xDD, 0x10, 0x48, 0xC0, 
-	0x89, 0xC0, 0x81, 0x60, 0xC2, 0x05, 0x5B, 0x04, 
-	0x0B, 0xC3, 0xA0, 0x06, 0xC8, 0xAC, 0x41, 0xCC, 
-	0x42, 0x06, 0xFD, 0x16, 0xA0, 0x06, 0xC8, 0xAC, 
-	0x01, 0xC1, 0x44, 0x8C, 0x12, 0x16, 0xC4, 0x05, 
-	0x42, 0x06, 0xFB, 0x16, 0x04, 0x02, 0x0E, 0xAD, 
-	0x03, 0x02, 0x01, 0x01, 0x94, 0x06, 0x03, 0x02, 
-	0x5A, 0x5A, 0x94, 0x06, 0x43, 0x05, 0x94, 0x06, 
-	0x03, 0x07, 0x94, 0x06, 0xC3, 0x04, 0x94, 0x06, 
-	0xCC, 0x05, 0x5C, 0x04, 0xCB, 0xC1, 0xA0, 0x06, 
-	0xC8, 0xAC, 0x43, 0xCC, 0x42, 0x06, 0xFD, 0x16, 
-	0xA0, 0x06, 0xC8, 0xAC, 0x43, 0x8C, 0xF5, 0x16, 
-	0x42, 0x06, 0xFC, 0x16, 0x57, 0x04, 0x8B, 0xC2, 
-	0x08, 0xC0, 0x49, 0xC1, 0x85, 0x05, 0x80, 0x02, 
-	0x40, 0x00, 0x03, 0x11, 0x80, 0x02, 0x4F, 0x00, 
-	0x45, 0x12, 0x01, 0x02, 0xC8, 0xAC, 0xA1, 0x09, 
-	0x01, 0x80, 0x40, 0x13, 0x01, 0x02, 0xF8, 0xAD, 
-	0xA1, 0x09, 0x01, 0x80, 0x3B, 0x13, 0x60, 0xC0, 
-	0x06, 0x00, 0xA1, 0x09, 0x01, 0x80, 0x36, 0x13, 
-	0x81, 0x05, 0x01, 0x80, 0x33, 0x13, 0x4A, 0xC0, 
-	0xA1, 0x09, 0x01, 0x80, 0x2F, 0x13, 0x00, 0xC8, 
-	0x6A, 0x01, 0x80, 0x02, 0x80, 0x00, 0x17, 0x14, 
-	0x01, 0x02, 0x00, 0xF8, 0xA0, 0xC1, 0x40, 0x01, 
-	0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 0x02, 0x02, 
-	0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0xB1, 0xCC, 
-	0x43, 0x06, 0xFD, 0x16, 0xA0, 0x01, 0x40, 0x01, 
-	0x00, 0x40, 0x08, 0x02, 0x10, 0xF8, 0x06, 0xC8, 
-	0x40, 0x01, 0x00, 0xC0, 0x02, 0x13, 0x08, 0x02, 
-	0x00, 0xF8, 0x09, 0x02, 0xFE, 0xFB, 0xA0, 0x06, 
-	0xD2, 0xAC, 0x25, 0x10, 0x80, 0x02, 0x80, 0x00, 
-	0x09, 0x14, 0x01, 0x02, 0x00, 0xF8, 0x02, 0x02, 
-	0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0x72, 0xCC, 
-	0x43, 0x06, 0xFD, 0x16, 0x80, 0x05, 0x80, 0x02, 
-	0x80, 0x00, 0x04, 0x12, 0x60, 0x01, 0x04, 0x01, 
-	0x20, 0x00, 0x05, 0x13, 0x40, 0x81, 0xAB, 0x16, 
-	0x80, 0x02, 0x80, 0x00, 0x0B, 0x14, 0xA0, 0x07, 
-	0x6A, 0x01, 0x7E, 0x00, 0x02, 0x02, 0x00, 0x10, 
-	0x03, 0x02, 0x00, 0x04, 0xC1, 0x04, 0x81, 0xCC, 
-	0x43, 0x06, 0xFD, 0x16, 0xCA, 0x05, 0x5A, 0x04, 
-	0x00, 0x02, 0xEA, 0xAD, 0x01, 0x02, 0x1A, 0xAF, 
-	0x40, 0x02, 0x00, 0xFC, 0x41, 0x02, 0x00, 0xFC, 
-	0x40, 0x80, 0x04, 0x13, 0xA0, 0x07, 0x04, 0x01, 
-	0x3C, 0x00, 0x5B, 0x04, 0xC0, 0x04, 0x01, 0x02, 
-	0x08, 0x00, 0x02, 0x02, 0x00, 0x12, 0xE0, 0xC1, 
-	0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 
-	0x03, 0x02, 0x00, 0x01, 0x00, 0xC8, 0x6A, 0x01, 
-	0xA0, 0xCC, 0x10, 0xF8, 0x80, 0x05, 0x03, 0x06, 
-	0xF9, 0x16, 0x22, 0x02, 0x00, 0x02, 0x01, 0x06, 
-	0xF3, 0x16, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 
-	0x07, 0xC8, 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, 
-	0x40, 0xC0, 0x01, 0x06, 0x01, 0xC8, 0x6A, 0x01, 
-	0x61, 0x02, 0x00, 0x80, 0x01, 0xC8, 0x10, 0xF8, 
-	0x00, 0x06, 0xF6, 0x16, 0xC0, 0x04, 0xC8, 0x04, 
-	0xC9, 0x04, 0x03, 0x02, 0x00, 0x08, 0x00, 0xC8, 
-	0x6A, 0x01, 0x80, 0xC1, 0x66, 0x02, 0x00, 0x80, 
-	0x20, 0xC1, 0x10, 0xF8, 0x06, 0x81, 0x15, 0x16, 
-	0x08, 0xC2, 0x06, 0x13, 0x80, 0x05, 0x03, 0x06, 
-	0xF2, 0x16, 0x08, 0xC2, 0x0D, 0x13, 0x19, 0x10, 
-	0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 0x20, 0xC1, 
-	0x10, 0xF8, 0x84, 0x02, 0x55, 0x55, 0x02, 0x16, 
-	0x06, 0xC2, 0xF0, 0x10, 0x06, 0x81, 0xEE, 0x13, 
-	0x5B, 0x04, 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 
-	0x60, 0xC1, 0x10, 0xF8, 0x05, 0x81, 0x03, 0x13, 
-	0x85, 0x02, 0x55, 0x55, 0xF5, 0x16, 0x08, 0xC2, 
-	0xE1, 0x13, 0x40, 0xC2, 0x09, 0x06, 0x48, 0x02, 
-	0xFF, 0x07, 0xC0, 0x04, 0x01, 0x02, 0x08, 0x00, 
-	0x02, 0x02, 0x00, 0x12, 0x03, 0x02, 0x00, 0x01, 
-	0x00, 0xC8, 0x6A, 0x01, 0x32, 0xC8, 0x10, 0xF8, 
-	0x80, 0x05, 0x03, 0x06, 0xF9, 0x16, 0x22, 0x02, 
-	0x00, 0x02, 0x01, 0x06, 0xF3, 0x16, 0x88, 0x02, 
-	0x40, 0x00, 0x13, 0x15, 0x89, 0x02, 0x4F, 0x00, 
-	0x10, 0x11, 0xC0, 0x04, 0x02, 0x02, 0x00, 0x12, 
-	0x01, 0x02, 0x08, 0x00, 0x03, 0x02, 0x00, 0x01, 
-	0x80, 0xCC, 0x03, 0x06, 0xFD, 0x16, 0x22, 0x02, 
-	0x00, 0x02, 0x01, 0x06, 0xF7, 0x16, 0xCB, 0x05, 
-	0x5B, 0x04, 0xA0, 0x07, 0x04, 0x01, 0x37, 0x00, 
-	0x5B, 0x04, 0x33, 0x07, 0x33, 0x07, 0x0C, 0x10, 
-	0x13, 0x07, 0x23, 0x07, 0x02, 0x00, 0xCB, 0xC8, 
-	0x06, 0x00, 0x23, 0x02, 0x18, 0x00, 0xE0, 0xCC, 
-	0x6C, 0x01, 0xCD, 0xCC, 0xCE, 0xCC, 0xCF, 0xCC, 
-	0x83, 0x07, 0x30, 0x06, 0xD3, 0xC1, 0x0A, 0x13, 
-	0x83, 0x07, 0x36, 0x07, 0xD3, 0xC1, 0x06, 0x13, 
-	0x83, 0x07, 0xA0, 0x00, 0x93, 0x00, 0x0C, 0xC8, 
-	0x6C, 0x01, 0x80, 0x03, 0x63, 0x07, 0x02, 0x00, 
-	0x2A, 0x15, 0x63, 0xC2, 0x04, 0x00, 0x63, 0x42, 
-	0x06, 0x00, 0xDB, 0x13, 0x63, 0xC3, 0x1A, 0x00, 
-	0x49, 0xD2, 0x0C, 0x13, 0xC9, 0x06, 0x49, 0x72, 
-	0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 0x49, 0x72, 
-	0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 
-	0x02, 0x00, 0x52, 0x04, 0x69, 0xC2, 0xC0, 0xE1, 
-	0x49, 0x72, 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 
-	0xE9, 0xA2, 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 
-	0x12, 0x00, 0x0F, 0x13, 0xDC, 0xC6, 0x03, 0x16, 
-	0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 
-	0x02, 0x00, 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 
-	0xFF, 0x01, 0x93, 0x00, 0x0C, 0xC8, 0x6C, 0x01, 
-	0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, 
-	0x00, 0xFC, 0xF1, 0x16, 0xE9, 0x48, 0x04, 0xE0, 
-	0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 0x4C, 0xCB, 
-	0x04, 0x00, 0xED, 0x10, 0x00, 0x03, 0x02, 0x00, 
-	0xDB, 0xC2, 0x63, 0xC2, 0x04, 0x00, 0x4B, 0x42, 
-	0x9F, 0x13, 0x49, 0xD2, 0x0E, 0x13, 0xC9, 0x06, 
-	0x49, 0x72, 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 
-	0x49, 0x72, 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 
-	0x49, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, 
-	0x80, 0x03, 0x69, 0xC2, 0xC0, 0xE1, 0x49, 0x72, 
-	0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 0xE9, 0xA2, 
-	0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 0x12, 0x00, 
-	0x0C, 0x13, 0xDC, 0xC6, 0x03, 0x16, 0xE9, 0x48, 
-	0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 
-	0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 0xFF, 0xFF, 
-	0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, 
-	0x00, 0xFC, 0xF4, 0x16, 0xF0, 0x10, 0x00, 0x03, 
-	0x02, 0x00, 0xBB, 0xC2, 0xBB, 0xC1, 0x86, 0xD1, 
-	0x03, 0x13, 0x86, 0xEA, 0x04, 0x00, 0x13, 0x10, 
-	0xA6, 0xD1, 0xC0, 0xE1, 0xC6, 0x06, 0x86, 0x71, 
-	0xCA, 0xC1, 0xE6, 0xA1, 0xB8, 0xE1, 0xA6, 0xEA, 
-	0x14, 0xE0, 0x04, 0x00, 0x1B, 0xC2, 0x86, 0x02, 
-	0x02, 0x00, 0x03, 0x16, 0xA0, 0x06, 0x0C, 0xB5, 
-	0x02, 0x10, 0xA0, 0x06, 0xE6, 0xB4, 0xDA, 0x04, 
-	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xAB, 0xC2, 
-	0x06, 0x00, 0x8C, 0x07, 0xE8, 0x05, 0x5C, 0xC2, 
-	0x16, 0x13, 0xA0, 0xC1, 0xEC, 0x05, 0x8A, 0x81, 
-	0x1A, 0x1A, 0xC6, 0xC1, 0x09, 0xC2, 0x59, 0xC2, 
-	0x20, 0x13, 0xE9, 0xA1, 0x08, 0x00, 0x87, 0x82, 
-	0xF9, 0x12, 0xA9, 0xA2, 0x08, 0x00, 0x87, 0x62, 
-	0xCA, 0xCA, 0x08, 0x00, 0x4A, 0x6A, 0x08, 0x00, 
-	0xC9, 0xC6, 0x0B, 0xC6, 0x80, 0x03, 0xCA, 0xCA, 
-	0x08, 0x00, 0x0A, 0xC8, 0xEC, 0x05, 0xDB, 0x04, 
-	0x0B, 0xCF, 0x0B, 0xC7, 0x80, 0x03, 0x8A, 0x61, 
-	0x46, 0xCA, 0x08, 0x00, 0xCA, 0xCA, 0x08, 0x00, 
-	0x0A, 0xC8, 0xEC, 0x05, 0xC9, 0xC6, 0x0B, 0xC7, 
-	0x80, 0x03, 0x87, 0x62, 0xCA, 0xCA, 0x08, 0x00, 
-	0xDB, 0x04, 0x0B, 0xC6, 0x0B, 0xCB, 0x02, 0x00, 
-	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xBB, 0xC1, 
-	0xDB, 0xC2, 0x8C, 0x07, 0xE8, 0x05, 0x4C, 0xC2, 
-	0xED, 0x04, 0x02, 0x00, 0x09, 0xC2, 0x59, 0xC2, 
-	0x18, 0x13, 0xA9, 0x81, 0x02, 0x00, 0xFA, 0x16, 
-	0xE9, 0x82, 0x04, 0x00, 0xF7, 0x16, 0x49, 0xCB, 
-	0x04, 0x00, 0x99, 0xC2, 0x0A, 0xC6, 0x0A, 0x13, 
-	0x08, 0x83, 0x04, 0x13, 0xA9, 0xAA, 0x08, 0x00, 
-	0x08, 0x00, 0x80, 0x03, 0x2A, 0xA8, 0x08, 0x00, 
-	0xEC, 0x05, 0x80, 0x03, 0x08, 0xCB, 0x02, 0x00, 
-	0x80, 0x03, 0x2D, 0x07, 0x02, 0x00, 0x8C, 0x07, 
-	0x08, 0x00, 0x06, 0xA3, 0x4C, 0xC2, 0x09, 0xC2, 
-	0x59, 0xC2, 0x13, 0x13, 0xE9, 0x82, 0x04, 0x00, 
-	0xFA, 0x16, 0xAD, 0x07, 0x02, 0x00, 0x01, 0x00, 
-	0x49, 0xCB, 0x04, 0x00, 0x19, 0xC6, 0x01, 0x13, 
-	0x80, 0x03, 0x08, 0x83, 0x04, 0x16, 0xA0, 0x49, 
-	0x14, 0xE0, 0x04, 0x00, 0x80, 0x03, 0x08, 0xCB, 
-	0x02, 0x00, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 
-	0x0B, 0x06, 0x1F, 0x11, 0x4D, 0x13, 0x8B, 0x07, 
-	0x00, 0x4E, 0x60, 0x01, 0x42, 0x01, 0x80, 0x00, 
-	0x09, 0x13, 0x8B, 0x07, 0x00, 0x3A, 0x20, 0xC1, 
-	0x4E, 0x01, 0x84, 0x02, 0x41, 0x0F, 0x02, 0x11, 
-	0x8B, 0x07, 0x00, 0x4E, 0x0B, 0xC8, 0x44, 0x01, 
-	0xA0, 0x07, 0x62, 0x09, 0xE8, 0x03, 0xE0, 0x01, 
-	0x40, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x40, 0x01, 
-	0x00, 0x20, 0x84, 0x07, 0x34, 0xAF, 0x60, 0x04, 
-	0x42, 0xAF, 0x20, 0xC8, 0x16, 0xE0, 0xE0, 0x00, 
-	0xE0, 0xC2, 0x6A, 0x09, 0xE0, 0x22, 0x10, 0xE0, 
-	0x03, 0x13, 0x20, 0xE8, 0x14, 0xE0, 0xE0, 0x00, 
-	0x20, 0xC8, 0x04, 0xE0, 0x82, 0x01, 0x20, 0xC8, 
-	0xE2, 0x00, 0x8A, 0x01, 0xE0, 0x04, 0x18, 0x09, 
-	0xE0, 0x04, 0xF4, 0x05, 0xE0, 0x04, 0xF8, 0x05, 
-	0xE0, 0x04, 0xF0, 0x05, 0xE0, 0x04, 0x42, 0x07, 
-	0xA0, 0x07, 0x88, 0x01, 0x20, 0x00, 0xE0, 0xC2, 
-	0x30, 0x09, 0x09, 0x13, 0xA0, 0x07, 0x88, 0x01, 
-	0x80, 0x00, 0x20, 0xE8, 0x16, 0xE0, 0x80, 0x01, 
-	0xE0, 0x01, 0x82, 0x01, 0x00, 0x03, 0x8B, 0x07, 
-	0x00, 0xA0, 0x0B, 0xE8, 0x86, 0x01, 0x80, 0x03, 
-	0xE0, 0x04, 0x86, 0x01, 0xE0, 0x01, 0x9C, 0x01, 
-	0x40, 0x00, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, 
-	0xCB, 0x04, 0xB0, 0x03, 0x0B, 0x06, 0x04, 0x13, 
-	0x60, 0x01, 0x9C, 0x01, 0x00, 0x40, 0xF9, 0x16, 
-	0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, 0x08, 0xE0, 
-	0x6A, 0x09, 0x8B, 0x07, 0x00, 0x80, 0x0B, 0xC8, 
-	0x98, 0x07, 0x0B, 0xC8, 0x78, 0x07, 0x20, 0xC8, 
-	0x04, 0xE0, 0x82, 0x01, 0x8B, 0x07, 0x6F, 0x87, 
-	0x0B, 0x48, 0x3A, 0x07, 0xE0, 0xC2, 0x50, 0x07, 
-	0x8B, 0x02, 0x58, 0x07, 0x10, 0x13, 0x20, 0xE8, 
-	0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, 
-	0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0x8B, 0x07, 
-	0x58, 0x07, 0x0B, 0xC8, 0x50, 0x07, 0x8B, 0x07, 
-	0x0C, 0xB8, 0x0B, 0xC8, 0x52, 0x07, 0x80, 0x03, 
-	0x00, 0x03, 0x02, 0x00, 0xE0, 0xC2, 0x1A, 0x09, 
-	0x0C, 0x13, 0x20, 0x06, 0x1C, 0x09, 0x0B, 0xC8, 
-	0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 0x1A, 0x09, 
-	0x4B, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, 
-	0x80, 0x03, 0x41, 0xC0, 0x0F, 0x13, 0x81, 0x80, 
-	0x0D, 0x13, 0x82, 0xA0, 0xE2, 0xC2, 0x32, 0x0C, 
-	0x12, 0x09, 0x0B, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 
-	0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 0x07, 0x11, 
-	0x02, 0xC8, 0x00, 0xFC, 0xED, 0x04, 0x02, 0x00, 
-	0xE0, 0x04, 0x6C, 0x01, 0x80, 0x03, 0x42, 0xCB, 
-	0x02, 0x00, 0x02, 0xC8, 0x6C, 0x01, 0x8B, 0xC0, 
-	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x83, 0x07, 
-	0x00, 0x80, 0x60, 0xC2, 0x7E, 0x09, 0x09, 0xC1, 
-	0x24, 0x02, 0xF8, 0xFF, 0xA9, 0x08, 0x01, 0x02, 
-	0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0B, 0x02, 
-	0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x07, 0x02, 
-	0x00, 0x00, 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 
-	0x06, 0x13, 0x8B, 0x05, 0xCC, 0x05, 0x0B, 0x88, 
-	0x46, 0x04, 0x27, 0x1B, 0xF6, 0x10, 0x09, 0xC2, 
-	0x8B, 0xC2, 0x08, 0x06, 0x0A, 0x13, 0x8B, 0x05, 
-	0xCC, 0x05, 0x0B, 0x88, 0x46, 0x04, 0x1D, 0x1B, 
-	0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 0xED, 0x16, 
-	0xF4, 0x10, 0x82, 0xC0, 0x14, 0x13, 0x02, 0xC8, 
-	0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 0x0A, 0xC8, 
-	0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x07, 
-	0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, 
-	0x0A, 0xC2, 0x08, 0xA2, 0x02, 0xCA, 0x32, 0x0C, 
-	0x8A, 0xC0, 0x87, 0x05, 0xD6, 0x10, 0x4A, 0xC0, 
-	0xEE, 0x10, 0x47, 0xCB, 0x02, 0x00, 0xE0, 0x04, 
-	0x6C, 0x01, 0x8B, 0x07, 0x43, 0x00, 0xE0, 0x04, 
-	0x00, 0x0C, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, 
-	0x6C, 0x01, 0x8B, 0x02, 0x43, 0x00, 0x04, 0x13, 
-	0x60, 0x01, 0x02, 0xFC, 0x20, 0x00, 0x06, 0x13, 
-	0x8B, 0xC2, 0xA0, 0x06, 0x42, 0xB4, 0x90, 0x03, 
-	0x7F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x02, 0xFC, 
-	0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 
-	0x0B, 0x16, 0x0A, 0x02, 0x02, 0xFC, 0xA0, 0xA2, 
-	0x2C, 0x09, 0xA0, 0xCE, 0xEE, 0x05, 0xA0, 0xC6, 
-	0x04, 0xFC, 0x20, 0xC8, 0x2C, 0x09, 0x04, 0xFC, 
-	0x8A, 0x07, 0xF8, 0x05, 0x5A, 0xC2, 0x08, 0x13, 
-	0xCA, 0x05, 0x5A, 0xC2, 0x09, 0xC8, 0x6C, 0x01, 
-	0x0B, 0xC8, 0x00, 0xFC, 0x8B, 0xC6, 0x02, 0x10, 
-	0x8B, 0xCE, 0x8B, 0xC6, 0x20, 0x20, 0x1A, 0xE0, 
-	0x05, 0x16, 0x20, 0xE8, 0x04, 0xE0, 0x3A, 0x07, 
-	0xE0, 0x04, 0x36, 0x07, 0x90, 0x03, 0x7F, 0x00, 
-	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, 
-	0x6C, 0x01, 0xCC, 0x04, 0xE0, 0x04, 0x00, 0xFC, 
-	0x8B, 0xC2, 0xA0, 0x06, 0x50, 0xB4, 0x90, 0x03, 
-	0x7F, 0x00, 0x80, 0x03, 0xA0, 0x07, 0x02, 0xFC, 
-	0x00, 0x80, 0x20, 0xC8, 0x8C, 0xE1, 0x04, 0xFC, 
-	0x41, 0xC0, 0x0F, 0x16, 0x20, 0xD8, 0x00, 0xE2, 
-	0x83, 0x01, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 
-	0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 
-	0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x0A, 0xC8, 
-	0x8A, 0x01, 0x5B, 0x04, 0x0A, 0xC8, 0x6C, 0x01, 
-	0x20, 0xC3, 0x00, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 
-	0x8A, 0x02, 0x43, 0x00, 0xDF, 0x13, 0xA0, 0x07, 
-	0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, 
-	0x20, 0x98, 0x84, 0x09, 0x1D, 0x09, 0x0A, 0x13, 
-	0x20, 0xC8, 0x1A, 0x09, 0x00, 0xFC, 0x0A, 0xC8, 
-	0x1A, 0x09, 0xA0, 0x05, 0x1C, 0x09, 0x8C, 0xC2, 
-	0xE5, 0x16, 0x5B, 0x04, 0x41, 0xC0, 0x10, 0x13, 
-	0x8A, 0xA2, 0x82, 0xCA, 0x32, 0x0C, 0x1A, 0x09, 
-	0x02, 0xC8, 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 
-	0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 
-	0x09, 0x13, 0x8C, 0xC2, 0xD3, 0x16, 0x5B, 0x04, 
-	0x4A, 0xC0, 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 
-	0x00, 0xE2, 0x1B, 0x16, 0xE0, 0x01, 0x9C, 0x01, 
-	0x40, 0x00, 0xA0, 0x07, 0x64, 0x09, 0x00, 0x70, 
-	0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0x07, 0x13, 
-	0x20, 0x06, 0x64, 0x09, 0xF9, 0x16, 0x0A, 0x02, 
-	0x00, 0x01, 0x60, 0x04, 0x8A, 0xA3, 0x60, 0x01, 
-	0x02, 0x0C, 0x00, 0x01, 0xE2, 0x13, 0x20, 0xD8, 
-	0x2F, 0x09, 0x83, 0x01, 0xA0, 0x07, 0x02, 0x0C, 
-	0x00, 0x80, 0x0A, 0xC8, 0x8A, 0x01, 0x0A, 0xC8, 
-	0x18, 0x09, 0xD7, 0x10, 0xD8, 0x04, 0x57, 0xC2, 
-	0x03, 0x16, 0xC8, 0xCD, 0xC8, 0xC5, 0x5B, 0x04, 
-	0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, 
-	0x5B, 0x04, 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xA2, 
-	0x20, 0xCA, 0x00, 0xFC, 0x32, 0x0C, 0x18, 0x09, 
-	0x02, 0x10, 0x08, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 
-	0x00, 0xFC, 0x57, 0xC2, 0x03, 0x16, 0xC8, 0xCD, 
-	0xC8, 0xC5, 0x5B, 0x04, 0xC7, 0x05, 0x17, 0xC8, 
-	0x6C, 0x01, 0x08, 0xC8, 0x00, 0xFC, 0xC8, 0xC5, 
-	0x5B, 0x04, 0x17, 0xC6, 0x02, 0x16, 0xC8, 0xC9, 
-	0x02, 0x00, 0xC8, 0xC5, 0x5B, 0x04, 0x17, 0xC2, 
-	0x08, 0xC8, 0x6C, 0x01, 0x07, 0x13, 0xE0, 0xC5, 
-	0x00, 0xFC, 0x08, 0xA2, 0x28, 0xC8, 0x32, 0x0C, 
-	0x00, 0xFC, 0x18, 0x09, 0x5B, 0x04, 0x60, 0x01, 
-	0x82, 0x01, 0x00, 0x20, 0x0A, 0x16, 0x60, 0xC2, 
-	0x84, 0x01, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x20, 
-	0xE0, 0x01, 0x82, 0x01, 0x00, 0x20, 0x09, 0xC8, 
-	0x84, 0x01, 0xC9, 0x04, 0x5B, 0x04, 0xA0, 0x06, 
-	0xBE, 0xB7, 0xD3, 0x04, 0xE0, 0x04, 0x02, 0x01, 
-	0x20, 0xE8, 0x14, 0xE0, 0x00, 0x01, 0x20, 0xC8, 
-	0x16, 0xE0, 0x04, 0x01, 0x05, 0x2C, 0x20, 0x48, 
-	0x14, 0xE0, 0x00, 0x01, 0x8C, 0x07, 0x00, 0x0A, 
-	0x8D, 0x07, 0xD8, 0x07, 0x8E, 0x07, 0x18, 0x00, 
-	0x7C, 0xCF, 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x02, 
-	0xD8, 0x07, 0x8F, 0x07, 0x11, 0xFF, 0x8B, 0x02, 
-	0x3B, 0x59, 0x21, 0x16, 0x8A, 0x02, 0x3B, 0x59, 
-	0x1E, 0x13, 0x8F, 0x05, 0x20, 0x20, 0x16, 0xE0, 
-	0x01, 0x16, 0x19, 0x10, 0x20, 0x20, 0x04, 0xE0, 
-	0x16, 0x16, 0x00, 0x01, 0xBF, 0x00, 0x13, 0x16, 
-	0x8B, 0x07, 0xC0, 0x40, 0x00, 0x01, 0x00, 0x60, 
-	0x10, 0x13, 0x40, 0x01, 0x00, 0x60, 0x0B, 0x16, 
-	0x8B, 0x07, 0xC4, 0x44, 0xA0, 0xC3, 0x02, 0x01, 
-	0x0E, 0x48, 0x02, 0x01, 0x4E, 0x01, 0x00, 0x10, 
-	0x04, 0x16, 0x8F, 0x07, 0x18, 0xFF, 0x60, 0x04, 
-	0x94, 0xB7, 0x0B, 0xC3, 0x4B, 0xC3, 0x20, 0x20, 
-	0x0A, 0xE0, 0x02, 0x16, 0x6B, 0x02, 0x20, 0x20, 
-	0x20, 0x20, 0x0C, 0xE0, 0x02, 0x16, 0x6C, 0x02, 
-	0x00, 0x20, 0x20, 0x20, 0x0E, 0xE0, 0x02, 0x16, 
-	0x6C, 0x02, 0x20, 0x00, 0x8F, 0x05, 0x20, 0x20, 
-	0x10, 0xE0, 0x07, 0x16, 0x6D, 0x02, 0x20, 0x00, 
-	0x20, 0x21, 0x22, 0xE0, 0xE4, 0x13, 0x04, 0xC1, 
-	0x02, 0x16, 0x84, 0x07, 0xFE, 0x7F, 0x8F, 0x05, 
-	0x20, 0x20, 0x12, 0xE0, 0x02, 0x16, 0x6D, 0x02, 
-	0x00, 0x20, 0x60, 0x21, 0x22, 0xE0, 0xD7, 0x13, 
-	0x45, 0xC1, 0x02, 0x16, 0x85, 0x07, 0xFE, 0x7F, 
-	0x8F, 0x05, 0x86, 0xD1, 0x0B, 0x13, 0xA0, 0x25, 
-	0x26, 0xE0, 0x08, 0x13, 0x8F, 0x05, 0x20, 0x26, 
-	0x22, 0xE0, 0x04, 0x16, 0x8F, 0x05, 0xA0, 0x26, 
-	0x22, 0xE0, 0x02, 0x13, 0x60, 0x04, 0x94, 0xB7, 
-	0x01, 0xD8, 0xEC, 0x08, 0x20, 0xD8, 0xDB, 0x07, 
-	0x00, 0x09, 0x02, 0xD8, 0xF6, 0x08, 0x20, 0xD8, 
-	0xDD, 0x07, 0xE2, 0x08, 0xE0, 0x02, 0x58, 0x07, 
-	0x20, 0xD8, 0xEF, 0x07, 0xF4, 0x07, 0x20, 0xD8, 
-	0xF1, 0x07, 0xF6, 0x07, 0x20, 0xD8, 0xF3, 0x07, 
-	0xF8, 0x07, 0x09, 0x02, 0x06, 0x00, 0xCB, 0x04, 
-	0x0F, 0x02, 0xEE, 0x07, 0x8F, 0x05, 0xCB, 0xDF, 
-	0x09, 0x06, 0xFC, 0x16, 0xA0, 0x06, 0xBE, 0xB7, 
-	0x89, 0x07, 0x5C, 0xE3, 0xE0, 0x04, 0x1A, 0x01, 
-	0x20, 0xC8, 0xE4, 0x07, 0x18, 0x01, 0x19, 0xC8, 
-	0x0C, 0x01, 0x39, 0xC8, 0x0A, 0x01, 0x39, 0xC8, 
-	0x12, 0x01, 0x09, 0x16, 0x79, 0xC3, 0x0F, 0x02, 
-	0x00, 0xE0, 0x4F, 0x63, 0x2D, 0x02, 0x00, 0x90, 
-	0x0D, 0xC8, 0x14, 0x01, 0x02, 0x10, 0x39, 0xC8, 
-	0x14, 0x01, 0xF9, 0xC3, 0x3F, 0xC8, 0x0E, 0x01, 
-	0x1F, 0xC8, 0x10, 0x01, 0xE0, 0x04, 0x14, 0x09, 
-	0xB9, 0xC2, 0x1A, 0xC8, 0x00, 0x01, 0x96, 0x06, 
-	0x89, 0x02, 0x84, 0xE3, 0xE0, 0x16, 0x8F, 0x07, 
-	0x1C, 0xFF, 0x8C, 0x07, 0x00, 0x0A, 0x8D, 0x07, 
-	0x84, 0xE3, 0x8E, 0x07, 0x10, 0x00, 0x7C, 0x8F, 
-	0x44, 0x16, 0x4E, 0x06, 0xFC, 0x16, 0xA0, 0xC3, 
-	0xE2, 0x07, 0xE0, 0xC3, 0xE0, 0x07, 0xCE, 0x83, 
-	0x01, 0x14, 0xCE, 0xC3, 0x0F, 0xC8, 0x1A, 0x01, 
-	0x8C, 0x07, 0x94, 0xE3, 0x8D, 0x07, 0x00, 0x0A, 
-	0x8E, 0x07, 0xA4, 0xE3, 0x8C, 0x63, 0x7C, 0xCF, 
-	0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x04, 0x30, 0x09, 
-	0x20, 0x01, 0x42, 0x01, 0x00, 0x04, 0x02, 0x16, 
-	0x20, 0x07, 0x30, 0x09, 0x60, 0xC2, 0x62, 0x01, 
-	0xE0, 0x04, 0x62, 0x01, 0x8E, 0x07, 0x00, 0x80, 
-	0x8C, 0x07, 0x34, 0x09, 0x8D, 0x07, 0x06, 0x00, 
-	0x3E, 0xDF, 0x8E, 0x05, 0x0D, 0x06, 0xFC, 0x16, 
-	0xFE, 0xD3, 0xCF, 0x06, 0x8E, 0x05, 0xFE, 0xD3, 
-	0xCF, 0x06, 0x8C, 0x07, 0x34, 0x09, 0x09, 0xC8, 
-	0x62, 0x01, 0xC9, 0x04, 0x5C, 0xA3, 0x7C, 0xE2, 
-	0x5C, 0xA3, 0x7C, 0xE2, 0x5C, 0xA3, 0x7C, 0xE2, 
-	0x02, 0x13, 0xCD, 0x83, 0x09, 0x13, 0x20, 0x07, 
-	0x34, 0x09, 0x06, 0x10, 0x8F, 0x07, 0x19, 0xFF, 
-	0xCD, 0xA3, 0x0F, 0xC8, 0x04, 0x01, 0xFF, 0x10, 
-	0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0xE0, 0xC3, 
-	0xEE, 0x07, 0xE0, 0x43, 0x06, 0xE0, 0x0F, 0xC8, 
-	0x00, 0x01, 0x20, 0xC0, 0x04, 0xE0, 0xE0, 0x04, 
-	0xFE, 0x06, 0xD3, 0x04, 0xE0, 0x04, 0x04, 0x01, 
-	0x60, 0x04, 0x0C, 0xB8, 0x8C, 0x07, 0x00, 0x0A, 
-	0x8D, 0x07, 0x18, 0x00, 0x8E, 0x07, 0x3B, 0x59, 
-	0x0E, 0xCF, 0x4D, 0x06, 0xFD, 0x16, 0x5B, 0x04, 
-	0x93, 0x01, 0x00, 0x80, 0x20, 0x04, 0xC0, 0xE2, 
-	0x60, 0xD0, 0x98, 0x07, 0x1C, 0x13, 0x00, 0x03, 
-	0x02, 0x00, 0xA0, 0xC0, 0x46, 0x07, 0x12, 0xC8, 
-	0x46, 0x07, 0x02, 0x16, 0x93, 0x01, 0x20, 0x00, 
-	0x00, 0x03, 0x0F, 0x00, 0x20, 0x04, 0xE8, 0xE2, 
-	0x93, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x40, 
-	0x00, 0x01, 0xFE, 0x00, 0x49, 0x16, 0xC4, 0xC3, 
-	0x25, 0x16, 0xD3, 0xC3, 0xC5, 0x43, 0x0C, 0x16, 
-	0xE0, 0xC3, 0x98, 0x07, 0x03, 0x11, 0xE0, 0x02, 
-	0x98, 0x07, 0x51, 0x04, 0xE0, 0xC3, 0x78, 0x07, 
-	0x0A, 0x11, 0xE0, 0x02, 0x78, 0x07, 0x51, 0x04, 
-	0xD3, 0x11, 0x4F, 0x01, 0x00, 0x20, 0xE4, 0x13, 
-	0x4F, 0x01, 0x20, 0x00, 0xD1, 0x13, 0x05, 0x2C, 
-	0x41, 0xA0, 0x21, 0x04, 0xC0, 0xE2, 0x8B, 0x07, 
-	0x0C, 0xB8, 0x00, 0x01, 0x00, 0x40, 0x0F, 0x13, 
-	0xDD, 0xC3, 0x4F, 0x02, 0x0F, 0x00, 0x2F, 0xE1, 
-	0x14, 0xE0, 0x5B, 0x04, 0xE4, 0xC3, 0xC0, 0xE1, 
-	0xCF, 0x73, 0x2F, 0x41, 0x14, 0xE0, 0x6F, 0xC3, 
-	0xEC, 0xEA, 0x8B, 0x07, 0x0C, 0xB8, 0x4B, 0xC2, 
-	0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 0x08, 0x00, 
-	0xBD, 0xC0, 0xA0, 0xC3, 0xEA, 0x07, 0xE0, 0xC3, 
-	0xEC, 0x07, 0xA0, 0x06, 0x00, 0xBA, 0xC0, 0x01, 
-	0x00, 0x40, 0x02, 0xD8, 0x17, 0x01, 0x62, 0x02, 
-	0x80, 0xFF, 0xA0, 0x06, 0x54, 0xBA, 0x02, 0xC8, 
-	0x04, 0x01, 0x90, 0x03, 0x3F, 0x60, 0x59, 0x04, 
-	0xC0, 0xC3, 0xCF, 0x73, 0xEF, 0xC3, 0xC0, 0xE1, 
-	0xCF, 0x73, 0xAF, 0xC3, 0xDE, 0xEA, 0x9E, 0xC3, 
-	0x4E, 0x02, 0x0F, 0x00, 0x2E, 0x21, 0x14, 0xE0, 
-	0x08, 0x13, 0x2F, 0x40, 0x14, 0xE0, 0xCF, 0xA3, 
-	0x2F, 0x04, 0xF0, 0xE2, 0x40, 0x01, 0x00, 0x40, 
-	0xA4, 0x13, 0xC4, 0xC3, 0xC7, 0x16, 0x00, 0x01, 
-	0xFE, 0x00, 0xE6, 0x16, 0x9E, 0x10, 0x40, 0x01, 
-	0x00, 0x40, 0x05, 0x16, 0x20, 0xE0, 0x14, 0xE0, 
-	0x65, 0x02, 0x00, 0x58, 0x96, 0x10, 0x20, 0xD8, 
-	0xDE, 0x07, 0x17, 0x01, 0x8F, 0x07, 0x86, 0xFF, 
-	0x0F, 0xC8, 0x04, 0x01, 0xC0, 0x01, 0x00, 0x40, 
-	0x45, 0x02, 0xFF, 0xA7, 0x8A, 0x10, 0x20, 0xC3, 
-	0xFE, 0x06, 0x20, 0x27, 0x38, 0xE3, 0x07, 0x13, 
-	0x20, 0x23, 0x22, 0xE0, 0x1A, 0x13, 0x65, 0x02, 
-	0xFF, 0xDF, 0x20, 0x40, 0x14, 0xE0, 0x20, 0xE0, 
-	0x16, 0xE0, 0x0C, 0xC8, 0xE6, 0x08, 0x8D, 0x07, 
-	0xE2, 0x08, 0x58, 0x04, 0x20, 0x48, 0x08, 0xE0, 
-	0xFE, 0x06, 0x20, 0xC3, 0xE6, 0x08, 0x20, 0x27, 
-	0x38, 0xE3, 0x19, 0x16, 0x80, 0x03, 0x02, 0xC3,  
-	0x6C, 0xC2, 0x0A, 0x00, 0x99, 0x06, 0x60, 0x04,  
-	0x0C, 0xB8, 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 
-	0x01, 0x00, 0x8D, 0x07, 0x06, 0x06, 0xCE, 0x04, 
-	0xE0, 0xC3, 0x08, 0x06, 0x01, 0x13, 0x97, 0x06, 
-	0x20, 0xD8, 0x07, 0x06, 0x17, 0x01, 0x8B, 0x07, 
-	0x82, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0xA0, 0x06, 
-	0xB4, 0xBE, 0x60, 0x04, 0x0C, 0xB8, 0xA0, 0xC2, 
-	0xEE, 0x07, 0x8C, 0x07, 0x06, 0x00, 0x8D, 0x07, 
-	0xEE, 0x08, 0xA0, 0xC3, 0xE6, 0x07, 0xE0, 0xC3, 
-	0xE8, 0x07, 0x97, 0x06, 0xA0, 0xC2, 0xF4, 0x07, 
-	0x8D, 0x07, 0xF4, 0x08, 0xDD, 0x04, 0x8C, 0x07, 
-	0x02, 0x00, 0x97, 0x06, 0x8D, 0x07, 0x00, 0x80, 
-	0xA0, 0xC2, 0xEE, 0x08, 0x0A, 0x88, 0x0C, 0x06, 
-	0x14, 0x1B, 0x82, 0x07, 0xD0, 0xB9, 0xA0, 0xC3, 
-	0xF0, 0x08, 0xE0, 0xC3, 0xF2, 0x08, 0x8B, 0x07, 
-	0x0C, 0xE3, 0x8A, 0x02, 0x14, 0x00, 0x04, 0x1A, 
-	0x8B, 0x07, 0xBA, 0xEA, 0x2A, 0x02, 0xEC, 0xFF, 
-	0x8A, 0xA2, 0xCA, 0xA2, 0xDB, 0xC2, 0x01, 0x13, 
-	0x9B, 0x06, 0x20, 0xC8, 0xEE, 0x08, 0xF2, 0x08, 
-	0x20, 0xC8, 0x20, 0xE0, 0xEE, 0x08, 0x0D, 0xC8, 
-	0xF0, 0x08, 0x8D, 0x07, 0xEC, 0x08, 0x20, 0xE0, 
-	0x18, 0xE0, 0x65, 0x02, 0x00, 0x58, 0x58, 0x04, 
-	0x45, 0x02, 0xFF, 0xA7, 0x80, 0x03, 0x60, 0xC0, 
-	0xEE, 0x05, 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 
-	0x02, 0x01, 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 
-	0xEE, 0x05, 0xF9, 0x16, 0x39, 0x10, 0x60, 0xD0, 
-	0x03, 0x01, 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 
-	0x4C, 0xCC, 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 
-	0xB1, 0x07, 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 
-	0x00, 0x01, 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 
-	0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 
-	0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 0xEE, 0x05, 
-	0xF9, 0x16, 0x1E, 0x10, 0x60, 0xD0, 0x03, 0x01, 
-	0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 0x4C, 0xCC, 
-	0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 0xB1, 0x07, 
-	0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 0x00, 0x01, 
-	0xA0, 0x03, 0x60, 0xD0, 0x03, 0x01, 0x01, 0x13, 
-	0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 0x21, 0x02, 
-	0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 0x06, 0x00, 
-	0xF7, 0x16, 0x01, 0x88, 0xEE, 0x05, 0xF9, 0x16, 
-	0xCD, 0x04, 0x8A, 0x07, 0x00, 0x40, 0x20, 0xC3, 
-	0x00, 0x01, 0x0C, 0x01, 0x00, 0x80, 0x02, 0x13, 
-	0x8A, 0x07, 0x00, 0x20, 0xA0, 0xC3, 0x0E, 0x01, 
-	0xE0, 0xC3, 0x10, 0x01, 0xB0, 0x03, 0x20, 0xC3, 
-	0x58, 0x07, 0x20, 0x23, 0x04, 0xE0, 0x02, 0x13, 
-	0x60, 0x04, 0x8E, 0xB7, 0x60, 0x04, 0x8A, 0xA3, 
-	0x8D, 0x07, 0x00, 0x20, 0x20, 0x20, 0x0A, 0xE0, 
-	0x01, 0x16, 0x5B, 0x04, 0x0D, 0x02, 0x32, 0x0C, 
-	0x5D, 0xC2, 0x01, 0x11, 0xDD, 0x04, 0xCD, 0x05, 
-	0x0D, 0x88, 0x30, 0x0C, 0xF9, 0x16, 0x60, 0xC2, 
-	0x0A, 0x06, 0x8D, 0x07, 0x6A, 0x09, 0xA0, 0x06, 
-	0xF4, 0xBE, 0x09, 0x02, 0x48, 0x00, 0xE0, 0xC3, 
-	0x30, 0x09, 0x03, 0x16, 0xE0, 0x01, 0x6A, 0x09, 
-	0x10, 0x00, 0xE0, 0xC2, 0x6A, 0x09, 0x0F, 0x02, 
-	0x00, 0x01, 0xC9, 0x26, 0x02, 0x13, 0x60, 0x04, 
-	0x86, 0xBD, 0x09, 0x02, 0x00, 0x12, 0x4B, 0x01, 
-	0x10, 0x00, 0x02, 0x13, 0x09, 0x02, 0x00, 0x13, 
-	0x09, 0xD8, 0x2E, 0x09, 0x8F, 0x07, 0x00, 0x40, 
-	0x89, 0x07, 0x6C, 0x09, 0xCB, 0x04, 0xF9, 0xE2, 
-	0xF9, 0xE2, 0xF9, 0xE2, 0x07, 0x16, 0x8B, 0x07, 
-	0x34, 0x09, 0x8C, 0x07, 0x6C, 0x09, 0x3B, 0xCF, 
-	0x3B, 0xCF, 0x1B, 0xC7, 0x20, 0xC3, 0x6C, 0x09, 
-	0x19, 0x11, 0x8F, 0x07, 0x00, 0x20, 0x89, 0x07, 
-	0x7A, 0x09, 0xA0, 0x06, 0x3A, 0xBB, 0xA0, 0x06, 
-	0x3A, 0xBB, 0x12, 0x10, 0x4C, 0xCE, 0x5B, 0x04, 
-	0x19, 0xC3, 0x02, 0x16, 0x8C, 0x07, 0x1A, 0x00, 
-	0x4C, 0xC3, 0x2D, 0x02, 0xF8, 0xFF, 0x0A, 0x02, 
-	0x09, 0x00, 0x2D, 0x02, 0xFA, 0xFF, 0xF2, 0x13, 
-	0x0A, 0x06, 0xFB, 0x16, 0x60, 0x04, 0x86, 0xBD, 
-	0x8F, 0x07, 0x00, 0x10, 0xD9, 0xC2, 0xFA, 0x11, 
-	0x02, 0x16, 0x8B, 0x07, 0x00, 0x04, 0x4B, 0xC3, 
-	0x8D, 0x02, 0x20, 0x00, 0x02, 0x14, 0x0D, 0x02, 
-	0x20, 0x00, 0x8D, 0x02, 0x00, 0x04, 0x02, 0x12, 
-	0x0D, 0x02, 0x00, 0x04, 0x2D, 0x02, 0xF8, 0xFF, 
-	0x0D, 0xC8, 0x2C, 0x09, 0x2B, 0x02, 0xFF, 0x03, 
-	0x8B, 0x01, 0xFF, 0x03, 0x4B, 0xCE, 0x60, 0xC3, 
-	0x6A, 0x09, 0x60, 0x23, 0x18, 0xE0, 0x0C, 0x16, 
-	0x49, 0xC3, 0xDD, 0xC2, 0x0F, 0x02, 0x01, 0x01, 
-	0x8B, 0x01, 0x80, 0xC0, 0xD7, 0x16, 0x8F, 0x05, 
-	0xED, 0xC2, 0x02, 0x00, 0xD3, 0x16, 0x02, 0x10, 
-	0x8D, 0x07, 0xBA, 0xEA, 0x3D, 0xC8, 0xA8, 0x09, 
-	0x1D, 0xC8, 0xAA, 0x09, 0xCB, 0x04, 0xE0, 0x04, 
-	0xF8, 0x05, 0xE0, 0x04, 0x66, 0x09, 0x20, 0xC8, 
-	0x30, 0x0C, 0x80, 0x09, 0xA0, 0x07, 0x82, 0x09, 
-	0xFE, 0xDF, 0x8D, 0x07, 0xFE, 0xDF, 0xE0, 0xC3, 
-	0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x24, 0x16, 
-	0xE0, 0xC3, 0x30, 0x0C, 0x4F, 0x63, 0xFF, 0x04, 
-	0xFF, 0x04, 0x4D, 0x06, 0xFD, 0x16, 0x8D, 0x07, 
-	0xFE, 0xDF, 0x20, 0x04, 0xA2, 0xEA, 0xA0, 0xC3, 
-	0xA2, 0xEA, 0xEE, 0xC3, 0x12, 0x00, 0xAA, 0x16, 
-	0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x8C, 0x07, 
-	0x00, 0xE0, 0xAC, 0x09, 0x0D, 0x63, 0x0C, 0x13, 
-	0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x2D, 0x02, 
-	0x40, 0x00, 0x1D, 0x0A, 0x2D, 0x02, 0x32, 0x0C, 
-	0xBD, 0x07, 0xFF, 0x7F, 0x0C, 0x06, 0xFC, 0x16, 
-	0x20, 0xC3, 0x46, 0x04, 0x8C, 0x02, 0x80, 0x00, 
-	0x13, 0x1A, 0xAC, 0x02, 0x0C, 0xC8, 0x9A, 0x00, 
-	0xE0, 0x02, 0x80, 0x00, 0x88, 0x07, 0x80, 0x00, 
-	0x60, 0xC2, 0x46, 0x04, 0xA0, 0x06, 0x28, 0xAD, 
-	0x02, 0x10, 0x9D, 0x00, 0x05, 0x10, 0x9D, 0x00, 
-	0x8F, 0x07, 0x00, 0x08, 0x60, 0x04, 0x86, 0xBD, 
-	0x4B, 0x2D, 0x81, 0xC3, 0xC9, 0x05, 0x8F, 0x07, 
-	0x00, 0x10, 0x8E, 0x02, 0x02, 0x00, 0xF6, 0x11, 
-	0x8F, 0x07, 0x00, 0x04, 0xC9, 0x05, 0xD9, 0xC2, 
-	0xE0, 0x26, 0x26, 0xE0, 0x02, 0x16, 0x2B, 0x02, 
-	0x06, 0x00, 0x4B, 0xC6, 0x4B, 0xC3, 0xCB, 0x72, 
-	0x2E, 0x02, 0xFE, 0xFF, 0x8B, 0x83, 0xE6, 0x1B, 
-	0xCD, 0x06, 0x4D, 0x73, 0xCD, 0x82, 0xE2, 0x1B, 
-	0xE0, 0x04, 0x1A, 0x09, 0xE0, 0x04, 0x1C, 0x09, 
-	0x4D, 0xC3, 0x02, 0x13, 0x60, 0x66, 0x12, 0xE0, 
-	0xC9, 0x05, 0xCF, 0x04, 0x81, 0x2D, 0x01, 0xC8, 
-	0x6C, 0x01, 0xD4, 0x13, 0x0F, 0xC8, 0x00, 0xFC, 
-	0xC1, 0xC3, 0x0D, 0x06, 0xF7, 0x15, 0x0D, 0x02, 
-	0x36, 0x07, 0x0E, 0x02, 0x98, 0x08, 0x0C, 0x02, 
-	0x03, 0x00, 0x8D, 0xCB, 0x02, 0x00, 0x81, 0x2D, 
-	0x81, 0xCB, 0x06, 0x00, 0xC3, 0x13, 0xEE, 0x04, 
-	0x0C, 0x00, 0x2E, 0x02, 0x18, 0x00, 0x0C, 0x06, 
-	0xF4, 0x16, 0xE0, 0x04, 0x96, 0x08, 0x1F, 0x2E, 
-	0xB9, 0xC3, 0xD9, 0xC3, 0x89, 0x07, 0x12, 0x00, 
-	0x8D, 0x07, 0x3A, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 
-	0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, 
-	0x09, 0x16, 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 
-	0x20, 0xE8, 0x18, 0xE0, 0x98, 0x07, 0x20, 0xE8, 
-	0x12, 0xE0, 0x78, 0x07, 0x60, 0xC3, 0x6A, 0x09, 
-	0x60, 0x23, 0x1E, 0xE0, 0x03, 0x16, 0x20, 0x48, 
-	0xA4, 0xE3, 0x6A, 0x09, 0x60, 0x23, 0x22, 0xE0, 
-	0x06, 0x13, 0x60, 0x27, 0xA6, 0xE3, 0x03, 0x13, 
-	0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 0x20, 0x2D, 
-	0x00, 0x00, 0x8E, 0x07, 0x00, 0x00, 0xA0, 0x06, 
-	0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 0xA0, 0xC0, 
-	0x04, 0x08, 0xEF, 0xC3, 0x06, 0x00, 0x1B, 0x16, 
-	0xA0, 0xC3, 0x72, 0x09, 0xE0, 0xC3, 0x74, 0x09, 
-	0xA0, 0x06, 0xC2, 0xBD, 0xA0, 0xC3, 0x76, 0x09, 
-	0xE0, 0xC3, 0x78, 0x09, 0xA0, 0x06, 0xE0, 0xBD, 
-	0x20, 0xE0, 0x0A, 0xE0, 0x60, 0xC3, 0xD8, 0x07, 
-	0x60, 0x23, 0x16, 0xE0, 0x05, 0x16, 0xE0, 0x04, 
-	0x2E, 0x06, 0x60, 0x41, 0x04, 0xE0, 0x4D, 0x2E, 
-	0x8D, 0x07, 0x00, 0x80, 0x52, 0x04, 0xCF, 0x73, 
-	0x2F, 0x02, 0x00, 0x02, 0x4F, 0xC3, 0x52, 0x04, 
-	0x20, 0x20, 0x0A, 0xE0, 0x03, 0x13, 0x8D, 0x07, 
-	0x00, 0x10, 0x5B, 0x04, 0x20, 0x40, 0x0A, 0xE0, 
-	0x40, 0x02, 0xFF, 0xF0, 0x8E, 0x07, 0x02, 0x00, 
-	0xA0, 0x06, 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 
-	0xA0, 0xC0, 0x04, 0x08, 0xA0, 0x06, 0xB4, 0xBE, 
-	0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, 
-	0x66, 0x16, 0x20, 0x04, 0xB6, 0xEA, 0x63, 0x10, 
-	0x6E, 0x02, 0x00, 0x80, 0x8D, 0x07, 0x00, 0xC0, 
-	0x0D, 0xC8, 0xA6, 0x01, 0x0E, 0xC8, 0x72, 0x09, 
-	0x0F, 0xC8, 0x74, 0x09, 0x0E, 0xC8, 0xA8, 0x01, 
-	0x0F, 0xC8, 0xAA, 0x01, 0x12, 0x10, 0x8F, 0x01, 
-	0x01, 0x00, 0x8A, 0x07, 0x76, 0x09, 0xA0, 0xE3, 
-	0x4E, 0x09, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, 
-	0xE0, 0xE3, 0x50, 0x09, 0x8F, 0xE6, 0x8A, 0x07, 
-	0xAC, 0x01, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, 
-	0x8F, 0xE6, 0x20, 0x20, 0x0A, 0xE0, 0x3F, 0x13, 
-	0x8D, 0x07, 0x00, 0x10, 0x5B, 0x04, 0x20, 0x20, 
-	0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, 
-	0x5B, 0x04, 0x8E, 0xC3, 0x04, 0x13, 0xE0, 0x01, 
-	0x50, 0x09, 0x00, 0x01, 0x06, 0x10, 0xA0, 0x01, 
-	0x50, 0x09, 0x00, 0x01, 0xA0, 0x01, 0x78, 0x09, 
-	0x00, 0x01, 0xA0, 0xC3, 0x76, 0x09, 0xE0, 0xC3, 
-	0x78, 0x09, 0xA0, 0xE3, 0x4E, 0x09, 0xE0, 0xE3, 
-	0x50, 0x09, 0x0E, 0xC8, 0xAC, 0x01, 0x0F, 0xC8, 
-	0xAE, 0x01, 0x0E, 0xC8, 0x76, 0x09, 0x0F, 0xC8, 
-	0x78, 0x09, 0x19, 0x10, 0x6E, 0x02, 0x00, 0x80, 
-	0x0E, 0xC8, 0xA6, 0x01, 0x20, 0x20, 0x0A, 0xE0, 
-	0x12, 0x13, 0x0D, 0x02, 0x00, 0x10, 0x5B, 0x04, 
-	0x8D, 0x07, 0x28, 0x07, 0x89, 0x07, 0x0E, 0x00, 
-	0xA0, 0x06, 0xFA, 0xBE, 0x8D, 0x07, 0x28, 0x07, 
-	0xFD, 0x04, 0x8D, 0x02, 0x36, 0x07, 0xFC, 0x16, 
-	0x20, 0x48, 0x14, 0xE0, 0xFE, 0x06, 0x8D, 0x07, 
-	0x00, 0x80, 0x52, 0x04, 0xA0, 0xC2, 0xEE, 0x07, 
-	0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 0xF0, 0x08, 
-	0x97, 0x06, 0x7D, 0xC2, 0x5D, 0xC3, 0x60, 0x43, 
-	0x22, 0xE0, 0xA0, 0x06, 0xFA, 0xBE, 0xEF, 0x10, 
-	0x0E, 0xC8, 0x06, 0x06, 0x0F, 0xC8, 0x08, 0x06, 
-	0xEA, 0x10, 0xB0, 0x03, 0xA0, 0x01, 0x60, 0x07, 
-	0x26, 0x00, 0x40, 0x02, 0x00, 0xC0, 0xE0, 0x04, 
-	0x06, 0x06, 0x8C, 0x07, 0x10, 0x40, 0xCC, 0x44, 
-	0xE0, 0x04, 0xFE, 0x06, 0x85, 0x07, 0x40, 0x80, 
-	0x5B, 0x04, 0x02, 0xC8, 0x04, 0x08, 0x8F, 0x07, 
-	0xFA, 0x07, 0xCE, 0xCB, 0x02, 0x00, 0x8E, 0x07, 
-	0x36, 0x07, 0xCE, 0xCB, 0x04, 0x00, 0x8D, 0x07, 
-	0x30, 0x06, 0x8E, 0x07, 0x10, 0x00, 0x4D, 0x2C, 
-	0x5B, 0x04, 0xA0, 0xC2, 0xF2, 0x07, 0x02, 0x10, 
-	0xA0, 0xC2, 0xF8, 0x07, 0x0B, 0xC8, 0xEA, 0x08, 
-	0x09, 0xC3, 0x0A, 0x13, 0xA0, 0x06, 0x36, 0xBA, 
-	0xA0, 0xC2, 0x00, 0x01, 0xA0, 0xE2, 0x06, 0xE0, 
-	0x4C, 0xA3, 0xCC, 0xA3, 0x01, 0x17, 0x8E, 0x05, 
-	0x4C, 0x62, 0xE0, 0xC2, 0xEA, 0x08, 0x5B, 0x04, 
-	0x8D, 0x07, 0x00, 0x10, 0x20, 0x20, 0x0A, 0xE0, 
-	0x01, 0x13, 0x5B, 0x04, 0x0D, 0x02, 0x48, 0x00, 
-	0xE0, 0xC3, 0x30, 0x09, 0x02, 0x16, 0xCE, 0x01, 
-	0x10, 0x00, 0x8D, 0x27, 0x03, 0x13, 0x0D, 0x02, 
-	0x00, 0x01, 0x52, 0x04, 0x00, 0x03, 0x02, 0x00, 
-	0x60, 0xC3, 0x6A, 0x09, 0x4D, 0x02, 0x08, 0x80, 
-	0x4E, 0x02, 0xF7, 0x7F, 0x8D, 0xE3, 0xE0, 0xC3, 
-	0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x04, 0x13, 
-	0x8D, 0x07, 0x06, 0x00, 0x8D, 0x27, 0x02, 0x13, 
-	0xA0, 0xE3, 0x10, 0xE0, 0x0E, 0xC8, 0x6A, 0x09, 
-	0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x09, 0x13, 
-	0x0D, 0x02, 0x00, 0x12, 0x4E, 0x01, 0x10, 0x00, 
-	0x02, 0x13, 0x0D, 0x02, 0x00, 0x13, 0x0D, 0xD8, 
-	0x2E, 0x09, 0x60, 0xC3, 0x80, 0x01, 0x4E, 0x02, 
-	0x01, 0x00, 0x4D, 0x02, 0xFE, 0xFF, 0x4E, 0xE3, 
-	0x0D, 0xC8, 0x80, 0x01, 0x20, 0xD8, 0x40, 0xE2, 
-	0x2F, 0x09, 0x20, 0x01, 0x6A, 0x09, 0x06, 0x00, 
-	0x03, 0x13, 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 
-	0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x03, 0x13, 
-	0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, 0x00, 0x03, 
-	0x0F, 0x00, 0x60, 0x04, 0x88, 0xBE, 0x20, 0x20, 
-	0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, 
-	0x5B, 0x04, 0x09, 0x02, 0x08, 0x00, 0x0D, 0x02, 
-	0x58, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 0xA0, 0x07, 
-	0x02, 0x02, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x04, 
-	0xE0, 0xC3, 0x58, 0x09, 0x0F, 0x01, 0x00, 0x7C, 
-	0x01, 0x13, 0x52, 0x04, 0x8F, 0xC3, 0x4E, 0x02, 
-	0x0F, 0x00, 0xFB, 0x13, 0x8E, 0x02, 0x0F, 0x00, 
-	0xF8, 0x13, 0x0D, 0x02, 0x00, 0x40, 0x4F, 0xC2, 
-	0x49, 0x09, 0x49, 0x02, 0x3F, 0x00, 0x09, 0x01, 
-	0x01, 0x00, 0xEF, 0x16, 0x89, 0x02, 0x06, 0x00, 
-	0xEC, 0x1A, 0x89, 0x02, 0x20, 0x00, 0xE9, 0x14, 
-	0xC9, 0x06, 0x1F, 0x09, 0x4F, 0x02, 0x00, 0x40, 
-	0x4F, 0xE2, 0x69, 0x02, 0x00, 0x80, 0x09, 0xC8, 
-	0x58, 0x09, 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 
-	0x1F, 0x09, 0x09, 0x06, 0xFD, 0x16, 0x4F, 0x05, 
-	0x0D, 0x02, 0x00, 0x20, 0x60, 0xC2, 0x5A, 0x09, 
-	0xD4, 0x13, 0x4F, 0x26, 0xD2, 0x16, 0x0D, 0x02, 
-	0x00, 0x10, 0x60, 0xC2, 0x5C, 0x09, 0xCD, 0x13, 
-	0x4F, 0x26, 0xCB, 0x16, 0x0D, 0x02, 0x00, 0x30, 
-	0x20, 0x88, 0x5A, 0x09, 0x5C, 0x09, 0xC5, 0x13, 
-	0xE0, 0xC3, 0x5A, 0x09, 0x4E, 0xC2, 0x1F, 0x0A, 
-	0x09, 0x06, 0xFD, 0x16, 0xE0, 0xE3, 0x5E, 0x09, 
-	0x0F, 0xC8, 0x5A, 0x09, 0xE0, 0xC3, 0x5C, 0x09, 
-	0x4E, 0xC2, 0x1F, 0x0A, 0x09, 0x06, 0xFD, 0x16, 
-	0xE0, 0xE3, 0x5E, 0x09, 0x0F, 0xC8, 0x5C, 0x09, 
-	0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 0x1F, 0x0A, 
-	0x09, 0x06, 0xFD, 0x16, 0x0D, 0x02, 0x00, 0x08, 
-	0x60, 0xC2, 0x5E, 0x09, 0x4F, 0x26, 0xA5, 0x16, 
-	0x4F, 0x05, 0x0F, 0xC8, 0x5E, 0x09, 0x0F, 0x02, 
-	0x02, 0x02, 0x0E, 0x02, 0x03, 0x00, 0x60, 0xC3, 
-	0x40, 0x01, 0x0C, 0x02, 0xFE, 0xC0, 0xA0, 0x01, 
-	0x40, 0x01, 0x00, 0x04, 0xCF, 0x05, 0x09, 0x02, 
-	0x55, 0x55, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, 
-	0x09, 0x07, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, 
-	0x0E, 0x06, 0xF4, 0x16, 0xA0, 0x01, 0x40, 0x01, 
-	0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x09, 0x02, 
-	0x08, 0x00, 0x0E, 0x02, 0x58, 0x09, 0x0F, 0x02, 
-	0x02, 0x02, 0xFE, 0xCF, 0x49, 0x06, 0xFD, 0x16, 
-	0x60, 0x04, 0x88, 0xBE, 0xC9, 0xC7, 0x5F, 0x82, 
-	0x01, 0x16, 0x5B, 0x04, 0xA0, 0x01, 0x40, 0x01, 
-	0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x0D, 0x02, 
-	0x00, 0x01, 0x52, 0x04, 0x8D, 0x07, 0x00, 0x10, 
-	0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, 
-	0x00, 0x08, 0x20, 0x20, 0x10, 0xE0, 0x05, 0x13, 
-	0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, 
-	0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x10, 0xE0, 
-	0x20, 0x07, 0x9C, 0x08, 0x20, 0x07, 0xB4, 0x08, 
-	0x20, 0x07, 0xCC, 0x08, 0xA0, 0x07, 0xA2, 0x08, 
-	0x84, 0x02, 0xA0, 0x07, 0xBA, 0x08, 0x84, 0x02, 
-	0xA0, 0x07, 0xD2, 0x08, 0x84, 0x02, 0xA0, 0x07, 
-	0x04, 0x09, 0x00, 0x40, 0xE0, 0x04, 0x06, 0x09, 
-	0xE0, 0x04, 0x08, 0x09, 0x0E, 0xC8, 0x4C, 0x08, 
-	0x0F, 0xC8, 0x4E, 0x08, 0x0E, 0xC8, 0x8E, 0x08, 
-	0x0F, 0xC8, 0x90, 0x08, 0xE0, 0x04, 0x5A, 0x08, 
-	0xE0, 0x04, 0x60, 0x08, 0xE0, 0x02, 0x78, 0x07, 
-	0xE0, 0x04, 0x94, 0x08, 0x20, 0x40, 0x40, 0xE3, 
-	0x20, 0xE0, 0x0C, 0xE0, 0x60, 0x04, 0xBC, 0xC6, 
-	0x80, 0x01, 0x00, 0xF0, 0xC0, 0x01, 0x00, 0x40, 
-	0x10, 0x10, 0x80, 0x01, 0x00, 0xF0, 0x0D, 0x10, 
-	0xC0, 0x01, 0x00, 0xF0, 0x20, 0x40, 0x06, 0xE0, 
-	0x08, 0x10, 0xC0, 0x01, 0x00, 0xF0, 0x80, 0x01, 
-	0x00, 0x20, 0xE0, 0xC3, 0x94, 0x08, 0x01, 0x16, 
-	0x5B, 0x04, 0x4B, 0xC0, 0x20, 0x04, 0xDA, 0xEA, 
-	0x40, 0x01, 0x00, 0x20, 0xFB, 0x16, 0x51, 0x04, 
-	0xA0, 0xC2, 0xD8, 0x07, 0x4A, 0x01, 0x40, 0x00, 
-	0x01, 0x16, 0x5B, 0x04, 0xE0, 0x02, 0x78, 0x07, 
-	0x20, 0x20, 0x0C, 0xE0, 0xEF, 0x16, 0x43, 0xC2, 
-	0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 0x20, 0x2F, 
-	0x36, 0x07, 0x20, 0x40, 0x0C, 0xE0, 0xA0, 0x06, 
-	0xAC, 0xC1, 0xA0, 0xC3, 0x94, 0x08, 0xFB, 0x16, 
-	0xA0, 0x06, 0x3A, 0xC2, 0x8E, 0x07, 0x04, 0x09, 
-	0x9E, 0x07, 0x00, 0x80, 0x20, 0x20, 0x10, 0xE0, 
-	0x05, 0x16, 0x8F, 0x07, 0x4C, 0x08, 0xBF, 0xCF, 
-	0xBF, 0xCF, 0x9F, 0xC7, 0xA0, 0x06, 0x5A, 0xC2, 
-	0x20, 0xE8, 0x3C, 0xE3, 0x62, 0x07, 0xA0, 0x06, 
-	0x3A, 0xC2, 0x20, 0x48, 0x3C, 0xE3, 0x62, 0x07, 
-	0x20, 0x40, 0x40, 0xE3, 0x20, 0xE0, 0x04, 0xE0, 
-	0x20, 0x48, 0x10, 0xE0, 0x58, 0x07, 0x5B, 0x04, 
-	0x80, 0x01, 0x00, 0xF0, 0x20, 0xE0, 0x04, 0xE0, 
-	0x60, 0x01, 0x60, 0x07, 0x02, 0x00, 0x02, 0x13, 
-	0x9B, 0x06, 0xB8, 0x10, 0x20, 0xE8, 0x1E, 0xE0, 
-	0x58, 0x07, 0xB4, 0x10, 0x9B, 0x06, 0x80, 0x03, 
-	0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 0x00, 0x40, 
-	0x07, 0x16, 0x8D, 0x07, 0x00, 0x09, 0xA0, 0x06, 
-	0x68, 0xB8, 0xE0, 0x02, 0x78, 0x07, 0x5B, 0x04, 
-	0xC4, 0x01, 0x02, 0x00, 0xE0, 0x02, 0x78, 0x07, 
-	0x5B, 0x04, 0x0E, 0x68, 0x96, 0x08, 0xE9, 0x04, 
-	0x0C, 0x00, 0x11, 0x10, 0x0E, 0x02, 0x00, 0x23, 
-	0x4E, 0xDB, 0x01, 0x00, 0xCC, 0x01, 0x00, 0x04, 
-	0x4C, 0xD7, 0x1C, 0x10, 0x60, 0xC2, 0x5C, 0x07, 
-	0x20, 0x06, 0x94, 0x08, 0xA9, 0xC2, 0x08, 0x00, 
-	0xA9, 0xC3, 0x0C, 0x00, 0xEA, 0x16, 0x29, 0x07, 
-	0x04, 0x00, 0x69, 0x01, 0x0A, 0x00, 0x01, 0x00, 
-	0x2D, 0x13, 0x49, 0xC3, 0x2D, 0x02, 0x0E, 0x00, 
-	0x0A, 0xC3, 0x1D, 0xD3, 0x8C, 0x01, 0x00, 0x84, 
-	0xCC, 0x01, 0x00, 0x40, 0x0A, 0x01, 0x00, 0x5E, 
-	0xDD, 0x16, 0x4C, 0xC7, 0xA9, 0xC3, 0x10, 0x00, 
-	0xE9, 0xC3, 0x12, 0x00, 0x41, 0xCA, 0x10, 0x00, 
-	0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 0x8E, 0x05, 
-	0x8C, 0x07, 0x02, 0x00, 0xA0, 0xC2, 0xF6, 0x07, 
-	0xA0, 0x06, 0x00, 0xBA, 0x69, 0xC0, 0x10, 0x00, 
-	0x29, 0xC8, 0x14, 0x00, 0x06, 0x09, 0x29, 0xC8, 
-	0x16, 0x00, 0x08, 0x09, 0x69, 0x01, 0x0E, 0x00, 
-	0x00, 0x08, 0x04, 0x16, 0x90, 0x03, 0x7F, 0x00, 
-	0xA0, 0x06, 0x5A, 0xC2, 0x40, 0x01, 0x00, 0x40, 
-	0x01, 0x16, 0x51, 0x04, 0x60, 0x04, 0xBE, 0xC1, 
-	0xA9, 0xC3, 0x0C, 0x00, 0x0B, 0x13, 0x0E, 0x68, 
-	0x96, 0x08, 0xE9, 0x04, 0x0C, 0x00, 0x29, 0xC8, 
-	0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC3, 0x00, 0xFC, 
-	0x01, 0x13, 0x1E, 0x2E, 0x29, 0x07, 0x04, 0x00, 
-	0x5B, 0x04, 0x81, 0x07, 0x20, 0x20, 0x89, 0x07, 
-	0x4C, 0x08, 0x41, 0xCE, 0x63, 0xCE, 0x10, 0x00, 
-	0x63, 0xC6, 0x12, 0x00, 0xA0, 0x06, 0x54, 0xBA, 
-	0x43, 0xC2, 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 
-	0x20, 0xE0, 0x10, 0xE0, 0x60, 0x04, 0xEC, 0xC1, 
-	0x40, 0x01, 0x00, 0x04, 0xEA, 0x16, 0xA0, 0x06, 
-	0xAC, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 0x8C, 0x07, 
-	0x04, 0x00, 0x8D, 0x07, 0x4C, 0x08, 0xA0, 0xC3, 
-	0x8E, 0x08, 0xE0, 0xC3, 0x90, 0x08, 0xA0, 0x06, 
-	0x36, 0xBA, 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 
-	0x01, 0x00, 0x13, 0x16, 0xE0, 0xC2, 0x94, 0x08, 
-	0xEA, 0x16, 0x60, 0x04, 0xEC, 0xC1, 0xE0, 0xC3, 
-	0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 0x09, 0x16, 
-	0x60, 0x04, 0xEC, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 
-	0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 
-	0xD7, 0x13, 0xA0, 0xC2, 0xF0, 0x07, 0x20, 0xC3, 
-	0x7C, 0x09, 0x8D, 0x07, 0x4C, 0x08, 0x9D, 0xC3, 
-	0xA0, 0x06, 0x36, 0xBA, 0xC0, 0x06, 0x20, 0xD0, 
-	0x50, 0x08, 0xC0, 0x06, 0x40, 0x01, 0x00, 0x04, 
-	0x0A, 0x16, 0x40, 0x01, 0x80, 0x00, 0x07, 0x13, 
-	0x0E, 0xC8, 0x4C, 0x08, 0x0F, 0xC8, 0x4E, 0x08, 
-	0xA0, 0x06, 0xA2, 0xC1, 0xD8, 0x10, 0x0E, 0xC8, 
-	0x8E, 0x08, 0x0F, 0xC8, 0x90, 0x08, 0x40, 0x01, 
-	0x00, 0x04, 0x0C, 0x13, 0x40, 0x01, 0x20, 0x00, 
-	0x58, 0x16, 0x81, 0x07, 0x10, 0x20, 0x9F, 0x10, 
-	0xA0, 0x06, 0xAC, 0xC1, 0xA0, 0xC3, 0x8E, 0x08, 
-	0xE0, 0xC3, 0x90, 0x08, 0x83, 0x07, 0x98, 0x08, 
-	0x63, 0x07, 0x04, 0x00, 0x2D, 0x11, 0x83, 0x07, 
-	0xB0, 0x08, 0x63, 0x07, 0x04, 0x00, 0x28, 0x11, 
-	0x83, 0x07, 0xC8, 0x08, 0x63, 0x07, 0x04, 0x00, 
-	0x23, 0x11, 0xC3, 0x60, 0x60, 0xC2, 0x46, 0x07, 
-	0xE7, 0x13, 0x69, 0x01, 0x0E, 0x00, 0x00, 0x08, 
-	0xE3, 0x13, 0x00, 0x03, 0x02, 0x00, 0x19, 0xC8, 
-	0x46, 0x07, 0x03, 0x16, 0xA0, 0x01, 0x3A, 0x07, 
-	0x20, 0x00, 0x00, 0x03, 0x0F, 0x00, 0xC0, 0x01, 
-	0x00, 0xF0, 0x80, 0x01, 0x00, 0x20, 0x01, 0x02, 
-	0x06, 0xC4, 0x60, 0x04, 0x9A, 0xC2, 0x81, 0x07, 
-	0x80, 0x20, 0xE0, 0xC8, 0x8E, 0x08, 0x14, 0x00, 
-	0xE0, 0xC8, 0x90, 0x08, 0x16, 0x00, 0xC7, 0x10, 
-	0xE0, 0xC8, 0x50, 0x08, 0x0E, 0x00, 0xCE, 0xC8, 
-	0x10, 0x00, 0xCF, 0xC8, 0x12, 0x00, 0x40, 0x01, 
-	0x20, 0x00, 0xBB, 0x16, 0xE3, 0xC1, 0x06, 0x00, 
-	0xC7, 0xC8, 0x08, 0x00, 0x07, 0xC8, 0x6C, 0x01, 
-	0x07, 0xC8, 0xE0, 0x08, 0x08, 0x02, 0x02, 0xFC, 
-	0xB8, 0x07, 0x00, 0x81, 0xE0, 0xC1, 0xE8, 0x00, 
-	0x07, 0xCE, 0x20, 0xC8, 0x52, 0x08, 0x92, 0x08, 
-	0xDA, 0x13, 0xCE, 0xC8, 0x14, 0x00, 0xCF, 0xC8, 
-	0x16, 0x00, 0x80, 0x01, 0x00, 0x04, 0x82, 0x07, 
-	0x54, 0x08, 0x32, 0xC1, 0x08, 0x11, 0x72, 0xC1, 
-	0x92, 0xC1, 0x82, 0x07, 0x8A, 0x08, 0x04, 0xC1, 
-	0x07, 0x16, 0x60, 0x04, 0x8E, 0xC5, 0x72, 0xC1, 
-	0xB2, 0xC1, 0x84, 0x01, 0x00, 0x80, 0xF9, 0x13, 
-	0x04, 0x68, 0x92, 0x08, 0xC7, 0xC1, 0x37, 0x16, 
-	0x20, 0x98, 0x97, 0x08, 0x85, 0x09, 0x16, 0x16, 
-	0x81, 0x07, 0x40, 0x20, 0xE0, 0xC1, 0x94, 0x08, 
-	0x57, 0x13, 0xA0, 0x06, 0xAC, 0xC1, 0xF4, 0x10, 
-	0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 0x62, 0x07, 
-	0xE0, 0x26, 0x3A, 0xE3, 0x02, 0x13, 0xA0, 0x06, 
-	0x92, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 0x22, 0x10, 
-	0xA0, 0x06, 0x9C, 0xC1, 0x81, 0x2D, 0x01, 0xC2, 
-	0xFB, 0x13, 0xA0, 0x05, 0x96, 0x08, 0x23, 0xC8, 
-	0x08, 0x00, 0x6C, 0x01, 0xA0, 0x07, 0x02, 0xFC, 
-	0x00, 0x80, 0xC3, 0xC1, 0x27, 0x02, 0x06, 0x00, 
-	0xA0, 0x06, 0x0C, 0xB5, 0xA3, 0x05, 0x0C, 0x00, 
-	0x08, 0xC8, 0x6C, 0x01, 0x08, 0xC8, 0xE0, 0x08, 
-	0x08, 0x02, 0x02, 0xFC, 0xB8, 0x07, 0x00, 0x81, 
-	0xF8, 0xC1, 0x04, 0xC1, 0x37, 0x13, 0xE0, 0xD2, 
-	0x03, 0x01, 0xD2, 0x13, 0x0B, 0x02, 0x0A, 0x01, 
-	0xC4, 0xCE, 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 
-	0xFB, 0x04, 0x09, 0x02, 0x00, 0x04, 0x48, 0xA2, 
-	0xC9, 0xC6, 0x20, 0xA8, 0xE0, 0x08, 0x12, 0x01, 
-	0x20, 0xC8, 0xF2, 0x07, 0x00, 0x01, 0x47, 0xC2, 
-	0xC4, 0x81, 0x01, 0x14, 0x44, 0xC2, 0xC9, 0x61, 
-	0x09, 0xA2, 0x89, 0xA1, 0x01, 0x17, 0x85, 0x05, 
-	0x09, 0x61, 0xA8, 0x16, 0x82, 0x02, 0x8A, 0x08, 
-	0x05, 0x16, 0x40, 0x01, 0x10, 0x00, 0x12, 0x13, 
-	0x60, 0x04, 0xA6, 0xC3, 0x60, 0x04, 0xBC, 0xC4, 
-	0x60, 0x04, 0x40, 0xC3, 0x81, 0x07, 0x80, 0x20, 
-	0xFB, 0x10, 0x81, 0x07, 0x80, 0x20, 0xF8, 0x10, 
-	0x81, 0x07, 0x02, 0x20, 0xF5, 0x10, 0x81, 0x07, 
-	0x04, 0x20, 0xF2, 0x10, 0x23, 0xC8, 0x08, 0x00, 
-	0x6C, 0x01, 0x07, 0x05, 0xE0, 0xA1, 0xE8, 0x00, 
-	0x0C, 0x02, 0x04, 0xFC, 0x07, 0xCF, 0xE0, 0xC2, 
-	0x92, 0x08, 0xE8, 0x16, 0xE0, 0xD2, 0x03, 0x01, 
-	0x10, 0x16, 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 
-	0x62, 0x07, 0xE0, 0x26, 0x3A, 0xE3, 0x07, 0x13, 
-	0x90, 0x03, 0xC8, 0x2F, 0xA0, 0x06, 0x92, 0xC1, 
-	0xE0, 0xD2, 0x03, 0x01, 0x02, 0x16, 0xA0, 0x06, 
-	0x54, 0xBA, 0x23, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
-	0xA3, 0xC2, 0x0E, 0x00, 0x4A, 0x01, 0x00, 0x01, 
-	0x0B, 0x13, 0x0C, 0x02, 0x0E, 0xFC, 0x5C, 0xC2, 
-	0x49, 0x02, 0x00, 0x80, 0x0D, 0x02, 0x6C, 0x09, 
-	0x7D, 0xE2, 0x09, 0xCF, 0x3D, 0xCF, 0x3D, 0xCF, 
-	0x0C, 0x02, 0x00, 0xFC, 0x6C, 0xC3, 0x06, 0x00, 
-	0x4D, 0x02, 0xFF, 0xE0, 0x4A, 0x02, 0x00, 0x02, 
-	0x8A, 0xA2, 0x8A, 0xA2, 0x4A, 0xE3, 0x60, 0xE3,  
-	0x9E, 0x09, 0x0D, 0xCB, 0x06, 0x00, 0xCD, 0x06, 
-	0x0B, 0x02, 0x0F, 0x00, 0xEC, 0x82, 0x04, 0x00, 
-	0xAD, 0x11, 0xEC, 0xC3, 0x0E, 0x00, 0x11, 0x15, 
-	0x10, 0x13, 0x6C, 0xC2, 0x14, 0x00, 0x49, 0x02, 
-	0x00, 0x1F, 0xA7, 0x13, 0xC9, 0x06, 0x89, 0x02, 
-	0x12, 0x00, 0xA3, 0x1B, 0x49, 0x01, 0x01, 0x00, 
-	0xA0, 0x13, 0xC9, 0xA2, 0xEC, 0x82, 0x04, 0x00, 
-	0x9C, 0x11, 0x4D, 0xA3, 0x9D, 0x18, 0x14, 0x11, 
-	0x60, 0x01, 0x6A, 0x09, 0x00, 0x80, 0x18, 0x13, 
-	0x1D, 0x09, 0xCC, 0xA2, 0xEB, 0xC2, 0x08, 0x00, 
-	0x7B, 0x09, 0x4B, 0x02, 0x1E, 0x00, 0xA0, 0xC3, 
-	0xF0, 0x06, 0xAB, 0x23, 0x04, 0xE0, 0x8F, 0x16, 
-	0x60, 0x27, 0x3E, 0xE3, 0x8C, 0x16, 0x4D, 0xA3, 
-	0x4D, 0xA3, 0x4D, 0xA3, 0xCD, 0x06, 0x4D, 0x02, 
-	0x07, 0x00, 0x0D, 0x88, 0xEE, 0x06, 0x0A, 0x15, 
-	0x90, 0x03, 0xFF, 0x6F, 0x53, 0x2F, 0xA0, 0x05, 
-	0x94, 0x08, 0xC3, 0x04, 0xC0, 0x01, 0x00, 0x04, 
-	0x60, 0x04, 0xAA, 0xC3, 0x60, 0x01, 0x6A, 0x09, 
-	0x00, 0x80, 0xF2, 0x13, 0x01, 0x02, 0x08, 0x20, 
-	0x60, 0x04, 0xA2, 0xC5, 0x8D, 0x07, 0x00, 0x10, 
-	0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, 
-	0x00, 0x08, 0x20, 0x20, 0x0E, 0xE0, 0x05, 0x13, 
-	0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, 
-	0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x0E, 0xE0, 
-	0xA0, 0x07, 0xFA, 0x08, 0x00, 0x80, 0x0E, 0xC8,  
-	0xFA, 0x07, 0x0F, 0xC8, 0xFC, 0x07, 0x0E, 0xC8,  
-	0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xE0, 0x04,  
-	0x08, 0x08, 0xE0, 0x04, 0x0E, 0x08, 0xE0, 0x02,  
-	0x98, 0x07, 0x20, 0x40, 0x4C, 0xE3, 0x20, 0x07, 
-	0x2E, 0x06, 0x60, 0x04, 0x12, 0xCA, 0x00, 0x70, 
-	0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 0x0B, 0x10, 
-	0x20, 0xF0, 0x4B, 0xE3, 0x02, 0x10, 0x20, 0xF0, 
-	0x4A, 0xE3, 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 
-	0xE0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x20, 0xE8, 
-	0x46, 0xE3, 0x62, 0x07, 0x20, 0x04, 0xDA, 0xEA,  
-	0x40, 0x01, 0x00, 0x20, 0x04, 0x13, 0xFA, 0x10,  
-	0x40, 0x01, 0x00, 0x40, 0xF7, 0x16, 0x20, 0x07,  
-	0x2E, 0x06, 0x20, 0x50, 0x50, 0xE3, 0x51, 0x04, 
-	0xF1, 0x10, 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 
-	0x00, 0x40, 0x07, 0x16, 0x8D, 0x07, 0xF6, 0x08, 
-	0xA0, 0x06, 0x68, 0xB8, 0xE0, 0x02, 0x98, 0x07, 
-	0x5B, 0x04, 0xC4, 0x01, 0x04, 0x00, 0xE0, 0x02, 
-	0x98, 0x07, 0x5B, 0x04, 0x60, 0x01, 0x60, 0x07, 
-	0x04, 0x00, 0x06, 0x16, 0x20, 0xE8, 0x1C, 0xE0, 
-	0x58, 0x07, 0x80, 0x03, 0xE0, 0x02, 0x98, 0x07, 
-	0x20, 0xD8, 0xDC, 0x07, 0x17, 0x01, 0x8F, 0x07, 
-	0x8E, 0xFF, 0x0F, 0xC8, 0x04, 0x01, 0x20, 0xE8, 
-	0x06, 0xE0, 0x58, 0x07, 0x80, 0x01, 0x00, 0x80, 
-	0x5B, 0x04, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, 
-	0x03, 0x13, 0xDB, 0x2D, 0x03, 0xC8, 0x4A, 0x08, 
-	0x49, 0x01, 0x00, 0x01, 0x02, 0x16, 0x60, 0x04, 
-	0x52, 0xC9, 0xE0, 0xC0, 0xF8, 0x05, 0xFD, 0x13, 
-	0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 
-	0xF8, 0x05, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, 
-	0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x49, 0x01, 
-	0x00, 0x01, 0x4D, 0x16, 0x09, 0x01, 0x00, 0x5E, 
-	0x29, 0x16, 0x49, 0x01, 0x02, 0x00, 0x0B, 0x16, 
-	0x60, 0x01, 0x46, 0x08, 0x00, 0x02, 0x0A, 0x16, 
-	0x27, 0x02, 0x04, 0x00, 0x07, 0x88, 0x7E, 0x09, 
-	0x05, 0x12, 0x27, 0x02, 0xFC, 0xFF, 0xA0, 0x01, 
-	0x46, 0x08, 0x00, 0x02, 0xC7, 0xC1, 0x37, 0x15, 
-	0xD3, 0x2D, 0xE0, 0xC0, 0x4A, 0x08, 0x07, 0xA8, 
-	0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 0x0C, 0x15, 
-	0x20, 0xC8, 0x3C, 0x08, 0xFA, 0x07, 0x20, 0xC8, 
-	0x3E, 0x08, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, 
-	0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, 
-	0x60, 0x04, 0x52, 0xC9, 0xA0, 0x06, 0x54, 0xBA, 
-	0xD3, 0x2D, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, 
-	0x01, 0x13, 0xDB, 0x2D, 0x20, 0x88, 0x3E, 0x08, 
-	0x3A, 0x08, 0x0D, 0x16, 0x20, 0x88, 0x3C, 0x08, 
-	0x38, 0x08, 0x09, 0x16, 0xE0, 0x04, 0x44, 0x08, 
-	0x82, 0x07, 0x02, 0x08, 0x04, 0x61, 0xE0, 0x04, 
-	0x48, 0x08, 0x60, 0x04, 0x1E, 0xCA, 0x20, 0xC8, 
-	0x38, 0x08, 0xFA, 0x07, 0x20, 0xC8, 0x3A, 0x08, 
-	0xFC, 0x07, 0x60, 0x04, 0x12, 0xCA, 0x07, 0xA8, 
-	0x48, 0x08, 0x04, 0xC1, 0x1B, 0x16, 0x82, 0x02, 
-	0x38, 0x08, 0x0A, 0x16, 0x60, 0x01, 0xFC, 0x07, 
-	0x01, 0x00, 0x02, 0x16, 0xA0, 0x06, 0x6E, 0xCB, 
-	0xA0, 0x06, 0xFC, 0xCA, 0x80, 0x01, 0x10, 0x00, 
-	0x32, 0xC1, 0x07, 0x11, 0x72, 0xC1, 0x92, 0xC1, 
-	0x82, 0x07, 0x38, 0x08, 0x04, 0xC1, 0x06, 0x16, 
-	0xEA, 0x10, 0x72, 0xC1, 0xB2, 0xC1, 0x84, 0x01, 
-	0x00, 0x80, 0xE5, 0x13, 0xE0, 0xD2, 0x03, 0x01, 
-	0x34, 0x13, 0x0B, 0x02, 0x0A, 0x01, 0xC4, 0xCE, 
-	0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 0xFB, 0x04, 
-	0xC8, 0xC6, 0x03, 0xA8, 0x12, 0x01, 0x20, 0xC8, 
-	0xF8, 0x07, 0x00, 0x01, 0xC7, 0xC2, 0xC4, 0x81, 
-	0x01, 0x14, 0xC4, 0xC2, 0x0B, 0xA8, 0x44, 0x08, 
-	0x0B, 0x61, 0x0B, 0xA2, 0x8B, 0xA1, 0x01, 0x17, 
-	0x85, 0x05, 0xCB, 0x61, 0xC6, 0x16, 0x40, 0x01, 
-	0x40, 0x00, 0x15, 0x16, 0x87, 0x07, 0x20, 0x00, 
-	0xE0, 0x61, 0x44, 0x08, 0xC4, 0x81, 0x08, 0x1A, 
-	0x07, 0xA8, 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 
-	0x07, 0x61, 0x87, 0xA1, 0x01, 0x17, 0x85, 0x05, 
-	0x80, 0x01, 0x40, 0x00, 0x03, 0xC8, 0x6C, 0x01, 
-	0xE0, 0xC1, 0x04, 0xFC, 0xAC, 0x10, 0x60, 0x04, 
-	0xBC, 0xC7, 0x20, 0x01, 0x3A, 0x07, 0x00, 0x70, 
-	0x04, 0x13, 0xA0, 0x06, 0x28, 0xC7, 0x20, 0x07, 
-	0x2E, 0x06, 0xA0, 0x06, 0x54, 0xBA, 0xC1, 0x10, 
-	0xE0, 0xD2, 0x03, 0x01, 0x0A, 0x16, 0x20, 0x01, 
-	0x3A, 0x07, 0x00, 0x70, 0x04, 0x13, 0xA0, 0x06, 
-	0x28, 0xC7, 0x20, 0x07, 0x2E, 0x06, 0xA0, 0x06, 
-	0x54, 0xBA, 0x90, 0x03, 0xBF, 0x4F, 0xD3, 0x2D, 
-	0x60, 0x01, 0xFC, 0x07, 0x01, 0x00, 0x02, 0x16, 
-	0xA0, 0x06, 0x6E, 0xCB, 0x60, 0xD2, 0x46, 0x08, 
-	0x89, 0x01, 0x00, 0xF1, 0xC9, 0x01, 0x00, 0x70, 
-	0x40, 0x01, 0x10, 0x00, 0x1C, 0x13, 0x20, 0x88, 
-	0x3E, 0x08, 0x3A, 0x08, 0x04, 0x16, 0x20, 0x88, 
-	0x3C, 0x08, 0x38, 0x08, 0x14, 0x13, 0x89, 0x01, 
-	0x00, 0x10, 0x8D, 0x07, 0x44, 0x08, 0x9D, 0x07, 
-	0x00, 0x50, 0xA0, 0xC2, 0xF6, 0x07, 0x8C, 0x07, 
-	0x02, 0x00, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, 
-	0x3E, 0x08, 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 
-	0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x8D, 0x07, 
-	0x46, 0x08, 0x49, 0xC7, 0xA0, 0xC2, 0xF6, 0x07, 
-	0x8C, 0x07, 0x04, 0x00, 0xA0, 0xC3, 0x38, 0x08, 
-	0xE0, 0xC3, 0x3A, 0x08, 0xCC, 0xA3, 0x01, 0x17, 
-	0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x20, 0xC8, 
-	0x3C, 0x08, 0xFC, 0x08, 0x20, 0xC8, 0x3E, 0x08, 
-	0xFE, 0x08, 0x09, 0x01, 0x00, 0x0C, 0x0C, 0x13, 
-	0x49, 0x01, 0x00, 0x04, 0x05, 0x16, 0xA0, 0x06, 
-	0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0x04, 0x10, 
-	0x90, 0x03, 0x7F, 0x40, 0xA0, 0x06, 0x6C, 0xC7, 
-	0xC0, 0x01, 0x90, 0x00, 0xA0, 0x06, 0xFC, 0xCA, 
-	0x0B, 0xC8, 0x46, 0x08, 0xE0, 0xC2, 0x42, 0x07, 
-	0x2D, 0x13, 0xE0, 0xC2, 0x2E, 0x06, 0x2A, 0x13, 
-	0xE0, 0x02, 0x58, 0x07, 0x8F, 0x07, 0xBF, 0xFF, 
-	0x0F, 0x2C, 0xE0, 0x02, 0x98, 0x07, 0xE0, 0xC0, 
-	0x5C, 0x07, 0x03, 0xC8, 0x4A, 0x08, 0x03, 0xC8, 
-	0x6C, 0x01, 0xC3, 0xC2, 0xCB, 0xA2, 0xEB, 0xC2, 
-	0x32, 0x0C, 0x32, 0x13, 0x0B, 0xC8, 0x00, 0xFC, 
-	0x0B, 0xC3, 0x4B, 0xC3, 0x0B, 0xC8, 0x6C, 0x01, 
-	0xE0, 0xC2, 0x00, 0xFC, 0xFA, 0x16, 0x00, 0x03, 
-	0x02, 0x00, 0x20, 0xC8, 0xF8, 0x05, 0x00, 0xFC, 
-	0x02, 0x16, 0x0D, 0xC8, 0xFA, 0x05, 0x0C, 0xC8, 
-	0xF8, 0x05, 0x00, 0x03, 0x0F, 0x00, 0x03, 0xC8, 
-	0x6C, 0x01, 0x1A, 0x10, 0xA0, 0xC3, 0x2E, 0x06, 
-	0x03, 0x13, 0xE0, 0xC0, 0xF8, 0x05, 0x0D, 0x16, 
-	0x4F, 0x2E, 0xC0, 0x01, 0x00, 0x80, 0xA0, 0x01, 
-	0x62, 0x07, 0x00, 0x80, 0x8E, 0xC3, 0x03, 0x13, 
-	0xA0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x60, 0x04, 
-	0x4E, 0xC7, 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 
-	0x00, 0xFC, 0xF8, 0x05, 0x03, 0xC8, 0x4A, 0x08, 
-	0x60, 0x01, 0x6A, 0x09, 0x00, 0x04, 0x02, 0x13, 
-	0x60, 0x04, 0xE4, 0xC7, 0x8C, 0x07, 0x0E, 0x00, 
-	0x20, 0xC2, 0x0E, 0xFC, 0x0A, 0x15, 0x09, 0x13, 
-	0x20, 0xC2, 0x14, 0xFC, 0x48, 0x02, 0x00, 0x1F, 
-	0xC8, 0x06, 0x88, 0x02, 0x12, 0x00, 0xF0, 0x1B, 
-	0x08, 0xA3, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, 
-	0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x07, 0x83, 
-	0xE7, 0x1A, 0xCC, 0x61, 0x07, 0xC8, 0x04, 0xFC, 
-	0xCC, 0xC1, 0xC0, 0x01, 0x40, 0x00, 0x60, 0x04, 
-	0xF0, 0xC7, 0x4B, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 
-	0x20, 0xC3, 0x7A, 0x09, 0x8D, 0x07, 0xFA, 0x07, 
-	0x9D, 0xC3, 0xE0, 0xC3, 0xFC, 0x07, 0xA0, 0x06, 
-	0x00, 0xBA, 0x20, 0xC8, 0x3C, 0x08, 0x40, 0x08, 
-	0x20, 0xC8, 0x3E, 0x08, 0x42, 0x08, 0x0E, 0xC8, 
-	0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xC4, 0x04, 
-	0x82, 0x07, 0x02, 0x08, 0xE0, 0x04, 0x44, 0x08, 
-	0x40, 0x01, 0x80, 0x00, 0x06, 0x16, 0x0E, 0xC8, 
-	0x38, 0x08, 0x0F, 0xC8, 0x3A, 0x08, 0xE0, 0x04, 
-	0x48, 0x08, 0xA0, 0x06, 0x54, 0xBA, 0xE0, 0xC2, 
-	0xFE, 0x07, 0x0D, 0x11, 0x0E, 0xC8, 0xFA, 0x07, 
-	0x0F, 0xC8, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, 
-	0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, 
-	0xA0, 0x06, 0x32, 0xC7, 0xCB, 0x10, 0x80, 0x01, 
-	0x80, 0x00, 0x55, 0x04, 0x8B, 0xC0, 0xA0, 0xC2, 
-	0xF0, 0x07, 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 
-	0xFA, 0x07, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, 
-	0x3E, 0x08, 0xA0, 0x06, 0x36, 0xBA, 0x60, 0x01, 
-	0xFC, 0x07, 0x01, 0x00, 0x04, 0x13, 0xA0, 0x07, 
-	0xFA, 0x08, 0x00, 0x80, 0x52, 0x04, 0x60, 0x01, 
-	0x60, 0x07, 0x04, 0x00, 0x07, 0x16, 0x20, 0xD0, 
-	0x04, 0xE0, 0x20, 0xE8, 0x1A, 0xE0, 0x58, 0x07, 
-	0x60, 0x04, 0x3E, 0xC7, 0xA0, 0x07, 0xFA, 0x08, 
-	0x00, 0x40, 0x20, 0xC8, 0x3C, 0x08, 0xFC, 0x08, 
-	0x20, 0xC8, 0x3E, 0x08, 0xFE, 0x08, 0xA0, 0x06, 
-	0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0xD3, 0x10, 
-	0xAD, 0xC2, 0x02, 0x00, 0x6D, 0xC2, 0x00, 0x00, 
-	0x05, 0x16, 0xAA, 0x07, 0x02, 0x00, 0x36, 0x07, 
-	0x9A, 0x2C, 0x80, 0x03, 0xEA, 0x2C, 0x02, 0x00, 
-	0x41, 0xCB, 0x00, 0x00, 0x80, 0x03, 0x2D, 0xC3, 
-	0x18, 0x00, 0xAC, 0x07, 0x02, 0x00, 0x36, 0x07, 
-	0x20, 0x4B, 0x06, 0xEB, 0x0A, 0x00, 0x20, 0xEB, 
-	0x00, 0xEB, 0x0A, 0x00, 0x9C, 0x2E, 0x80, 0x03, 
-	0xA0, 0xC2, 0x22, 0xE0, 0x60, 0x04, 0x8A, 0xA3, 
-	0xED, 0xC0, 0x18, 0x00, 0xA0, 0x06, 0x3A, 0xCC, 
-	0x80, 0x03, 0x44, 0xC2, 0xC3, 0xC0, 0x02, 0x13, 
-	0xA0, 0x06, 0x3A, 0xCC, 0x19, 0xC3, 0x09, 0xCB, 
-	0x18, 0x00, 0xC9, 0x05, 0x19, 0xCB, 0x16, 0x00, 
-	0x4C, 0xC2, 0x2C, 0x02, 0x1A, 0x00, 0x0D, 0xCF, 
-	0x0E, 0xCF, 0x0F, 0xC7, 0x99, 0x00, 0x5B, 0x04, 
-	0x8C, 0x07, 0x0A, 0x09, 0x9C, 0xC2, 0xA0, 0x22, 
-	0x14, 0xE0, 0x06, 0x13, 0xA0, 0xC2, 0x58, 0x07, 
-	0xA0, 0x22, 0x20, 0xE0, 0x01, 0x16, 0x80, 0x03, 
-	0x03, 0xC1, 0xC3, 0x04, 0x8A, 0x07, 0x04, 0x00, 
-	0x84, 0xA2, 0x3A, 0xCF, 0x3A, 0xCF, 0x3A, 0xCF, 
-	0x3A, 0xCF, 0x3A, 0xCF, 0xE0, 0x02, 0x58, 0x07, 
-	0x8D, 0x07, 0x0A, 0x09, 0x0B, 0xC8, 0xC2, 0x07, 
-	0xA0, 0x06, 0x44, 0xB8, 0xE0, 0xC2, 0xC2, 0x07, 
-	0x20, 0xE0, 0x20, 0xE0, 0xE0, 0x02, 0xB8, 0x07, 
-	0x5B, 0x04, 0x2D, 0xC3, 0x18, 0x00, 0x8C, 0xC2, 
-	0x60, 0xC2, 0x6C, 0x01, 0x0A, 0xC8, 0x6C, 0x01, 
-	0xE0, 0xC2, 0x00, 0xFC, 0x02, 0x13, 0x8B, 0xC2, 
-	0xF9, 0x10, 0x09, 0xC8, 0x6C, 0x01, 0x8B, 0x07, 
-	0xF8, 0x05, 0x5B, 0xC2, 0x0C, 0x13, 0xCB, 0x05, 
-	0x5B, 0xC2, 0xCA, 0xC6, 0xE0, 0xC2, 0x6C, 0x01, 
-	0x09, 0xC8, 0x6C, 0x01, 0x0C, 0xC8, 0x00, 0xFC, 
-	0x0B, 0xC8, 0x6C, 0x01, 0x02, 0x10, 0xCC, 0xCE, 
-	0xCA, 0xC6, 0xA0, 0xC2, 0xE0, 0x00, 0xA0, 0x22, 
-	0x1A, 0xE0, 0x06, 0x16, 0x20, 0xE8, 0x04, 0xE0, 
-	0x3A, 0x07, 0x20, 0x48, 0x1A, 0xE0, 0xE0, 0x00, 
-	0x80, 0x03, 0xE0, 0xD3, 0xAB, 0xE3, 0xE0, 0x04, 
-	0x8E, 0x09, 0xE0, 0xC1, 0xA8, 0x06, 0x05, 0x16, 
-	0x07, 0x02, 0xA2, 0x06, 0xA0, 0x06, 0x38, 0xB5, 
-	0x0B, 0x16, 0xE0, 0xC1, 0xBA, 0x06, 0x23, 0x16, 
-	0x07, 0x02, 0xB4, 0x06, 0xA0, 0x06, 0x38, 0xB5, 
-	0x1E, 0x13, 0x07, 0x02, 0xB8, 0x06, 0x02, 0x10, 
-	0x07, 0x02, 0xA6, 0x06, 0x60, 0xC1, 0x02, 0xFC, 
-	0x25, 0xC8, 0x0C, 0x00, 0x02, 0xFC, 0xC5, 0xC9, 
-	0x0C, 0x00, 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xCD, 
-	0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xC5, 0xB7, 0x01, 
-	0x28, 0x00, 0x27, 0x02, 0xF4, 0xFF, 0xA7, 0x07, 
-	0x04, 0x00, 0x52, 0xCE, 0x20, 0xE8, 0x9E, 0x09, 
-	0x06, 0xFC, 0x97, 0x2E, 0xD2, 0x10, 0x00, 0x03, 
-	0x02, 0x00, 0xA0, 0x06, 0x50, 0xB5, 0x00, 0x03, 
-	0x0F, 0x00, 0x20, 0x2C, 0xF0, 0xED, 0xE0, 0x93, 
-	0xAB, 0xE3, 0x03, 0x16, 0x81, 0x02, 0x16, 0x00, 
-	0xC4, 0x16, 0x21, 0xC1, 0x10, 0xEB, 0x54, 0x04, 
-	0xE0, 0x93, 0x10, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 
-	0xA8, 0xE3, 0x0B, 0x10, 0xCF, 0xD3, 0x09, 0x16, 
-	0xA0, 0x23, 0x08, 0xE0, 0x06, 0x16, 0x84, 0x07, 
-	0x20, 0x00, 0x04, 0xE8, 0xD2, 0x06, 0xA0, 0xD2, 
-	0x0C, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0x04, 
-	0x70, 0xD1, 0x22, 0xC1, 0x04, 0x00, 0xE2, 0x04, 
-	0x02, 0x00, 0x54, 0x04, 0x02, 0xC8, 0x6C, 0x01, 
-	0x82, 0xA0, 0x22, 0xC8, 0x32, 0x0C, 0x00, 0xFC, 
-	0x02, 0x02, 0x00, 0xFC, 0xE0, 0x93, 0xAA, 0xE3, 
-	0x13, 0x16, 0xB0, 0x03, 0x20, 0x98, 0xAA, 0xE3, 
-	0x65, 0x06, 0x0D, 0x16, 0x8B, 0x07, 0x17, 0xFC, 
-	0xDB, 0xD2, 0x8B, 0x09, 0x8B, 0x02, 0x15, 0x00, 
-	0x7B, 0x1B, 0xEB, 0xD2, 0xC4, 0xEA, 0x06, 0x13, 
-	0x77, 0x15, 0x20, 0x07, 0xA0, 0x09, 0x74, 0x10, 
-	0xA0, 0x06, 0x02, 0xD0, 0xA0, 0x48, 0x04, 0xE0, 
-	0x0E, 0x00, 0x85, 0x02, 0x07, 0x00, 0x0E, 0x13, 
-	0x0E, 0x01, 0x03, 0x00, 0x0B, 0x13, 0xA0, 0x23, 
-	0x22, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 0x0E, 0xE0, 
-	0x02, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 0x8E, 0x01, 
-	0x03, 0x00, 0x5E, 0x10, 0x05, 0xC8, 0xFC, 0x06, 
-	0xC3, 0xC0, 0x57, 0x16, 0xA0, 0x43, 0x10, 0xE0, 
-	0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 0x0A, 0x16, 
-	0x22, 0x88, 0x10, 0x00, 0x6E, 0x09, 0x06, 0x16, 
-	0x22, 0x88, 0x12, 0x00, 0x70, 0x09, 0x02, 0x16, 
-	0xA0, 0xE3, 0x10, 0xE0, 0x85, 0x02, 0x09, 0x00, 
-	0x02, 0x13, 0xA0, 0x06, 0xB8, 0xD7, 0x45, 0xA1, 
-	0x65, 0xC1, 0xAC, 0xE3, 0x55, 0x04, 0x62, 0xC0, 
-	0x04, 0x00, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
-	0x82, 0x02, 0x48, 0x04, 0x02, 0x1B, 0xA0, 0x43, 
-	0x0C, 0xE0, 0x22, 0xC1, 0x0E, 0x00, 0x51, 0x04, 
-	0x42, 0xC0, 0xE1, 0x04, 0x02, 0x00, 0xA2, 0xC0, 
-	0x0C, 0x00, 0x22, 0xC1, 0x0A, 0x00, 0x20, 0x21, 
-	0x18, 0xE0, 0x07, 0x13, 0xA1, 0xC8, 0x0A, 0x00, 
-	0x0A, 0x00, 0xA1, 0xC8, 0x08, 0x00, 0x08, 0x00, 
-	0xE2, 0x10, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
-	0xA0, 0x06, 0x66, 0xD6, 0x60, 0x04, 0xB0, 0xCE, 
-	0x02, 0xC8, 0xD4, 0x06, 0x62, 0xC1, 0x02, 0x00, 
-	0x65, 0xC1, 0xD8, 0xE3, 0x55, 0x04, 0x0F, 0x10, 
-	0x0E, 0x10, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, 
-	0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 0xA2, 0xD8, 
-	0xA0, 0xE3, 0x0C, 0xE0, 0x20, 0xE8, 0x9E, 0x09, 
-	0x06, 0x04, 0xA0, 0x2E, 0xF4, 0x03, 0x60, 0x04, 
-	0xE4, 0xCC, 0xA0, 0x06, 0x26, 0xD5, 0x0C, 0x10, 
-	0xA0, 0x06, 0x66, 0xD6, 0x09, 0x10, 0xA0, 0x06, 
-	0x2A, 0xD8, 0x06, 0x10, 0xA0, 0x06, 0x66, 0xD6, 
-	0x03, 0xC8, 0x2A, 0x09, 0xA0, 0xD2, 0xAA, 0xE3, 
-	0xA0, 0x06, 0x6E, 0xCF, 0xA0, 0x92, 0x26, 0xE0, 
-	0x0C, 0x16, 0xE0, 0xD3, 0x26, 0xE0, 0xE0, 0x23, 
-	0x14, 0xE0, 0x0A, 0x13, 0x0A, 0xC1, 0xC4, 0x83, 
-	0x07, 0x13, 0xC4, 0xC3, 0x24, 0xC1, 0xDC, 0xE3, 
-	0x54, 0x04, 0xCA, 0x93, 0xDC, 0x13, 0xCA, 0xD3, 
-	0xB0, 0x03, 0x0F, 0xD8, 0x59, 0x06, 0x04, 0x71, 
-	0x24, 0xC1, 0xEC, 0xE3, 0x54, 0x04, 0xA0, 0x23, 
-	0x0C, 0xE0, 0xD1, 0x13, 0x4D, 0xC3, 0xCF, 0x13, 
-	0x4D, 0x01, 0x00, 0x04, 0x0B, 0x13, 0x86, 0x07, 
-	0x02, 0x00, 0x84, 0x07, 0x26, 0x00, 0x46, 0x23, 
-	0x03, 0x13, 0x44, 0x06, 0x86, 0xA1, 0xFB, 0x10, 
-	0x46, 0x43, 0xB3, 0x10, 0x84, 0x07, 0x18, 0x00, 
-	0x8D, 0x01, 0x00, 0x04, 0x85, 0x07, 0xF4, 0x03, 
-	0xF5, 0x04, 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 
-	0xA2, 0xD8, 0x20, 0xE8, 0x9C, 0x09, 0xFE, 0x03, 
-	0x20, 0xE8, 0x9E, 0x09, 0x06, 0x04, 0xA8, 0x10, 
-	0x85, 0x07, 0x1C, 0x07, 0x86, 0x07, 0x1A, 0x04, 
-	0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0xC6, 0x05, 
-	0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0x83, 0x07, 
-	0x00, 0x90, 0xA9, 0x10, 0x0B, 0xC3, 0x86, 0x07, 
-	0x00, 0x01, 0x85, 0x07, 0x00, 0x80, 0x20, 0xC1, 
-	0xD2, 0x06, 0x37, 0x13, 0xC4, 0x04, 0x60, 0xC0, 
-	0xD2, 0x06, 0x45, 0x20, 0x04, 0x13, 0x84, 0x05, 
-	0x15, 0x09, 0xF9, 0x16, 0x2E, 0x10, 0xCF, 0xD3, 
-	0x06, 0x16, 0xE0, 0x23, 0x14, 0xE0, 0x03, 0x16, 
-	0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0xE0, 0x04, 
-	0xD2, 0x06, 0x23, 0x10, 0x64, 0xD0, 0x1C, 0x07, 
-	0x46, 0xB0, 0x10, 0x18, 0x01, 0xD9, 0x1C, 0x07, 
-	0x60, 0x23, 0x20, 0xE0, 0x0B, 0x13, 0x81, 0x07, 
-	0x18, 0x00, 0x61, 0xC0, 0xFC, 0xE3, 0x11, 0x88, 
-	0xCE, 0xED, 0x04, 0x13, 0x08, 0x02, 0x18, 0x80, 
-	0xA0, 0x06, 0xDA, 0xD4, 0x64, 0xD0, 0x28, 0x07, 
-	0x46, 0xB0, 0x08, 0x18, 0x01, 0xD9, 0x28, 0x07, 
-	0x46, 0xB0, 0x04, 0x17, 0x83, 0x07, 0x40, 0x80, 
-	0xA0, 0x06, 0x2A, 0xD8, 0x05, 0x48, 0xD2, 0x06, 
-	0xCA, 0x16, 0x20, 0xC1, 0x32, 0x09, 0x01, 0x16, 
-	0x5C, 0x04, 0x04, 0x02, 0x07, 0x00, 0x20, 0x06, 
-	0x32, 0x09, 0x05, 0x02, 0x00, 0x01, 0xC7, 0x10, 
-	0x0B, 0xC3, 0xC5, 0x04, 0x42, 0xC0, 0xC7, 0x04, 
-	0x20, 0xC2, 0x6C, 0x01, 0xE1, 0xA1, 0x04, 0x00, 
-	0x11, 0xC8, 0x6C, 0x01, 0xFB, 0x16, 0x08, 0xC8, 
-	0x6C, 0x01, 0xC8, 0x04, 0xA0, 0x43, 0x1A, 0xE0, 
-	0x22, 0xC1, 0x0E, 0x00, 0x0D, 0x15, 0x0C, 0x13, 
-	0xA0, 0xE3, 0x1A, 0xE0, 0xA0, 0x06, 0x14, 0xD8, 
-	0x08, 0xC2, 0x48, 0x13, 0x88, 0x02, 0x12, 0x00, 
-	0x45, 0x1B, 0x20, 0x22, 0x22, 0xE0, 0x42, 0x13, 
-	0x02, 0xC1, 0x08, 0xA1, 0x08, 0x05, 0x28, 0x02, 
-	0xF2, 0xFF, 0x07, 0xA2, 0x83, 0x07, 0x01, 0x80, 
-	0x88, 0x02, 0x04, 0x00, 0x6E, 0x11, 0x64, 0xC2, 
-	0x16, 0x00, 0x49, 0xD2, 0x02, 0x16, 0x02, 0x81, 
-	0x31, 0x16, 0x09, 0x01, 0x00, 0xF0, 0x28, 0x16, 
-	0x49, 0xC1, 0x45, 0x71, 0xC3, 0x04, 0x85, 0x02, 
-	0x09, 0x00, 0x7C, 0x13, 0x83, 0x07, 0x02, 0x80, 
-	0xA4, 0xC1, 0x14, 0x00, 0x88, 0x81, 0x76, 0x16, 
-	0x83, 0x05, 0x85, 0x02, 0x15, 0x00, 0x13, 0x1B, 
-	0x83, 0x05, 0x49, 0x99, 0x30, 0xEB, 0x0A, 0x13, 
-	0x09, 0x98, 0x0E, 0xE0, 0x6B, 0x16, 0x25, 0x98, 
-	0x30, 0xEB, 0x0C, 0xE0, 0x67, 0x16, 0xE0, 0xC1, 
-	0xEC, 0x06, 0x64, 0x16, 0xC3, 0x04, 0x52, 0xC2, 
-	0x0F, 0x13, 0x83, 0x07, 0x09, 0x80, 0xE0, 0xC1, 
-	0x6A, 0x09, 0x47, 0x01, 0x00, 0x10, 0x5A, 0x16, 
-	0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0x06, 0xBE, 0xD6, 
-	0x60, 0x04, 0xB0, 0xCE, 0x60, 0x04, 0xBA, 0xCE, 
-	0x89, 0x07, 0x0E, 0x07, 0xC7, 0x04, 0xE5, 0xD1, 
-	0x46, 0xEB, 0x05, 0x13, 0xC7, 0x06, 0x27, 0x02, 
-	0x5C, 0xEB, 0x77, 0xCE, 0xFE, 0x15, 0x44, 0xC0, 
-	0x21, 0x02, 0x18, 0x00, 0x28, 0x02, 0xFC, 0xFF, 
-	0x36, 0x13, 0x91, 0xC1, 0x86, 0xD1, 0x1F, 0x13, 
-	0xC6, 0x06, 0x87, 0x07, 0x0E, 0x07, 0xF7, 0xC0, 
-	0x46, 0x02, 0xFF, 0xBF, 0x43, 0x02, 0xFF, 0x3F, 
-	0xA0, 0x91, 0xF5, 0xED, 0x09, 0x16, 0xB0, 0x03, 
-	0x20, 0x98, 0x0E, 0xE0, 0x5D, 0x06, 0x0F, 0x16, 
-	0x21, 0xC8, 0x02, 0x00, 0x0C, 0x07, 0x17, 0x10, 
-	0x47, 0x82, 0x0C, 0x1B, 0xC6, 0x90, 0xEB, 0x16, 
-	0x47, 0x06, 0xF7, 0x04, 0xB0, 0x03, 0x20, 0x98, 
-	0x5D, 0x06, 0x57, 0x06, 0x0C, 0x13, 0x83, 0x07, 
-	0x05, 0x80, 0x1C, 0x10, 0xD1, 0xC0, 0xE0, 0x20, 
-	0x16, 0xE0, 0x03, 0x16, 0x83, 0x07, 0x08, 0x80, 
-	0x15, 0x10, 0x60, 0x44, 0x26, 0xE0, 0x86, 0x71, 
-	0x46, 0xA0, 0x06, 0x62, 0x83, 0x07, 0x05, 0x80, 
-	0x08, 0xC2, 0xCB, 0x15, 0x0B, 0x16, 0xC3, 0x04, 
-	0x87, 0x07, 0x0E, 0x07, 0x77, 0xC0, 0x47, 0x82, 
-	0x05, 0x1B, 0x60, 0x20, 0x06, 0xE0, 0xFA, 0x16, 
-	0x83, 0x07, 0x07, 0x80, 0x5C, 0x04, 0xA0, 0x92, 
-	0x0E, 0xE0, 0x11, 0x16, 0x20, 0xC8, 0x20, 0xE0, 
-	0x08, 0x07, 0xE0, 0x04, 0x84, 0x01, 0x60, 0x05, 
-	0x02, 0x07, 0x4B, 0x13, 0x20, 0x48, 0x06, 0xE0, 
-	0x82, 0x01, 0xA0, 0x06, 0xD0, 0xD4, 0x83, 0x07, 
-	0x00, 0xC0, 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 
-	0x1E, 0xE0, 0x02, 0x07, 0xA0, 0xE3, 0x04, 0xE0, 
-	0x08, 0x02, 0x24, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
-	0x42, 0x10, 0x20, 0xC1, 0x84, 0x01, 0x44, 0x02, 
-	0x00, 0x88, 0x2A, 0x13, 0x04, 0x48, 0x84, 0x01, 
-	0x20, 0x06, 0x02, 0x07, 0xF1, 0x16, 0x60, 0x01, 
-	0x8E, 0x09, 0x00, 0x80, 0x15, 0x13, 0xA0, 0x23, 
-	0x22, 0xE0, 0x05, 0x16, 0xA0, 0x43, 0x22, 0xE0, 
-	0xA0, 0xD2, 0x0E, 0xE0, 0xCF, 0x10, 0xE0, 0x23, 
-	0x14, 0xE0, 0x04, 0x13, 0x20, 0x98, 0xA9, 0xE3, 
-	0x65, 0x06, 0x0C, 0x16, 0xA0, 0x92, 0x0E, 0xE0, 
-	0xC5, 0x13, 0xA0, 0xD2, 0xA8, 0xE3, 0xD3, 0x10, 
-	0x20, 0xC8, 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 
-	0x00, 0xC0, 0x04, 0x10, 0x83, 0x07, 0x02, 0x00, 
-	0x60, 0x04, 0xCA, 0xCE, 0x60, 0x04, 0xC0, 0xCE, 
-	0x20, 0xE8, 0x06, 0xE0, 0x82, 0x01, 0xA0, 0x06, 
-	0xD0, 0xD4, 0x20, 0x07, 0x02, 0x07, 0xA0, 0x43, 
-	0x04, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, 
-	0x20, 0x88, 0x20, 0xE0, 0x08, 0x07, 0x03, 0x16, 
-	0x20, 0xC8, 0x78, 0xEB, 0x08, 0x07, 0x60, 0x04, 
-	0xD2, 0xCE, 0x0E, 0x01, 0x03, 0x00, 0x16, 0x13, 
-	0xCF, 0xD3, 0x08, 0x16, 0xA0, 0x23, 0x20, 0xE0, 
-	0x03, 0x16, 0xA0, 0xD2, 0xA8, 0xE3, 0x02, 0x10, 
-	0xA0, 0xD2, 0x0E, 0xE0, 0x8E, 0x01, 0x03, 0x00, 
-	0x09, 0x10, 0x60, 0xC1, 0x84, 0x01, 0x60, 0x21, 
-	0x0A, 0xE0, 0x04, 0x16, 0x83, 0x07, 0x00, 0x84, 
-	0x60, 0x04, 0xCA, 0xCE, 0x20, 0xC8, 0x2E, 0xE0, 
-	0x84, 0x01, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, 
-	0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0xE3, 
-	0x20, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x93, 
-	0x26, 0xE0, 0x10, 0x16, 0xA0, 0x23, 0x08, 0xE0, 
-	0x0D, 0x16, 0xA0, 0x23, 0x06, 0xE0, 0x02, 0x13, 
-	0x60, 0xE3, 0x1C, 0xE0, 0x60, 0xE3, 0x18, 0xE0, 
-	0xA0, 0x43, 0x06, 0xE0, 0x08, 0x02, 0x3C, 0x80, 
-	0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 
-	0xA0, 0x92, 0xA8, 0xE3, 0x03, 0x13, 0xA0, 0x92, 
-	0xA9, 0xE3, 0x1E, 0x16, 0xE0, 0x23, 0x14, 0xE0, 
-	0x08, 0x13, 0x20, 0x98, 0xA9, 0xE3, 0x65, 0x06, 
-	0x04, 0x13, 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 
-	0xCA, 0xCE, 0xA0, 0xD2, 0x0E, 0xE0, 0x20, 0xC8, 
-	0x20, 0xE0, 0x08, 0x07, 0xA0, 0x27, 0x04, 0xE0, 
-	0x0B, 0x16, 0x20, 0xC8, 0x1E, 0xE0, 0x08, 0x07, 
-	0xE0, 0x93, 0xA8, 0xE3, 0x05, 0x16, 0xA0, 0x23, 
-	0x12, 0xE0, 0x02, 0x13, 0x20, 0x06, 0x08, 0x07, 
-	0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 
-	0x3E, 0x13, 0xB0, 0x03, 0x20, 0x98, 0x0E, 0xE0, 
-	0x6F, 0x06, 0x0F, 0x16, 0xCF, 0xD3, 0x37, 0x16, 
-	0xA0, 0xD2, 0xA8, 0xE3, 0x60, 0x04, 0xD2, 0xCE, 
-	0xA0, 0x92, 0x0C, 0xE0, 0x30, 0x16, 0xE0, 0x23, 
-	0x14, 0xE0, 0xF6, 0x13, 0x83, 0x07, 0x06, 0x00, 
-	0x07, 0x10, 0x83, 0x07, 0x05, 0x00, 0xE0, 0x93, 
-	0x0E, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x07, 0x00, 
-	0x60, 0x04, 0xCA, 0xCE, 0x60, 0xE3, 0x12, 0xE0, 
-	0xE0, 0x23, 0x14, 0xE0, 0x11, 0x13, 0x20, 0x98, 
-	0x0C, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 
-	0xA9, 0xE3, 0x65, 0x06, 0x14, 0x10, 0x60, 0x01, 
-	0x8E, 0x09, 0x00, 0x80, 0x10, 0x13, 0x20, 0xC1, 
-	0x84, 0x01, 0x20, 0x21, 0x06, 0xE0, 0xD2, 0x16, 
-	0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x07, 0x13, 
-	0x20, 0x48, 0x06, 0xE0, 0x84, 0x01, 0x08, 0x02, 
-	0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 
-	0xD2, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x20, 
-	0xFA, 0x16, 0x08, 0x02, 0x78, 0x80, 0xA0, 0x06, 
-	0xDA, 0xD4, 0x20, 0xC2, 0xA2, 0x09, 0x03, 0x13, 
-	0x20, 0x06, 0xA2, 0x09, 0x21, 0x13, 0x20, 0xC2, 
-	0xA4, 0x09, 0xED, 0x13, 0x20, 0x06, 0xA4, 0x09, 
-	0xEA, 0x16, 0xA0, 0x07, 0xA4, 0x09, 0x05, 0x00, 
-	0xCD, 0x01, 0x00, 0x04, 0xE4, 0x10, 0x60, 0x01, 
-	0x8E, 0x09, 0x80, 0x00, 0x3E, 0x13, 0x60, 0x01, 
-	0x8E, 0x09, 0x00, 0x10, 0x02, 0x16, 0xA0, 0x06, 
-	0xE6, 0xD5, 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x10, 
-	0xE0, 0x01, 0x8E, 0x09, 0x80, 0x00, 0x83, 0x07, 
-	0x00, 0xA8, 0xA0, 0x06, 0x2A, 0xD8, 0x16, 0x10, 
-	0x60, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x21, 0x13, 
-	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x10, 0xA0, 0x07, 
-	0x08, 0x07, 0x05, 0x00, 0x83, 0x07, 0x08, 0xA8, 
-	0xA0, 0x23, 0x04, 0xE0, 0x05, 0x16, 0x20, 0xC8,  
-	0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 0x08, 0xE8,  
-	0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x01, 0x8E, 0x09, 
-	0x00, 0x20, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x01, 
-	0xE0, 0x01, 0x82, 0x01, 0x00, 0x08, 0xA0, 0xD2, 
-	0x0E, 0xE0, 0x83, 0x07, 0x10, 0x80, 0x60, 0x04, 
-	0xC0, 0xCE, 0x08, 0x02, 0x78, 0x00, 0xA0, 0x06, 
-	0xDA, 0xD4, 0x83, 0x07, 0x00, 0x82, 0x60, 0x04, 
-	0xCA, 0xCE, 0x60, 0x04, 0xD2, 0xCE, 0x20, 0x06, 
-	0x90, 0x09, 0x07, 0x15, 0xA0, 0xD2, 0x10, 0xE0, 
-	0xCA, 0x06, 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 
-	0xF4, 0x10, 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 
-	0xDA, 0xD4, 0x20, 0xC2, 0x90, 0x09, 0x88, 0x02,  
-	0x96, 0x00, 0x0D, 0x1B, 0xEA, 0x16, 0x20, 0x48,  
-	0x08, 0xE0, 0x82, 0x01, 0xA0, 0x01, 0x8E, 0x09, 
-	0x00, 0x10, 0xA0, 0x06, 0xE6, 0xD5, 0x83, 0x07, 
-	0x00, 0x28, 0x60, 0x04, 0xC0, 0xCE, 0x60, 0x01, 
-	0x8E, 0x09, 0x00, 0x10, 0xDA, 0x16, 0x84, 0x07, 
-	0x04, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, 
-	0xB5, 0x07, 0x30, 0x06, 0xA0, 0x06, 0xA2, 0xD8, 
-	0xA0, 0x07, 0xF8, 0x03, 0x34, 0xD4, 0x60, 0x04, 
-	0xC0, 0xDB, 0xA0, 0x07, 0x90, 0x09, 0xF4, 0x01, 
-	0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
-	0x08, 0x02, 0x36, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 
-	0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x23, 
-	0x18, 0xE0, 0x06, 0x13, 0xA0, 0xE3, 0x18, 0xE0, 
-	0xE0, 0x2E, 0x00, 0x00, 0x41, 0xC0, 0xFA, 0x16, 
-	0xA0, 0x06, 0xE6, 0xD5, 0xB2, 0x10, 0x04, 0x02, 
-	0x64, 0x00, 0x04, 0x06, 0xFE, 0x16, 0x5B, 0x04, 
-	0xA0, 0xE3, 0x0A, 0xE0, 0x08, 0xC2, 0x02, 0x11, 
-	0xA0, 0x43, 0x0A, 0xE0, 0x20, 0x42, 0x04, 0xE0, 
-	0x28, 0x02, 0xFC, 0xE3, 0x58, 0xC0, 0x02, 0xC0, 
-	0x11, 0x88, 0xCE, 0xED, 0x03, 0x16, 0xD1, 0x2C, 
-	0x58, 0xC0, 0xD1, 0x04, 0x80, 0xC0, 0x0E, 0x01, 
-	0x00, 0x10, 0x0F, 0x13, 0x60, 0xCC, 0xCE, 0xED, 
-	0xC8, 0x05, 0x78, 0xCC, 0x03, 0x16, 0x41, 0x06, 
-	0x60, 0xCC, 0xD6, 0x06, 0x58, 0xC4, 0x02, 0x16, 
-	0x60, 0xC4, 0x00, 0x07, 0x21, 0x02, 0xFA, 0xFF, 
-	0x91, 0x2C, 0x5B, 0x04, 0x0B, 0xC3, 0xA0, 0x06, 
-	0xC2, 0xD5, 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 
-	0x05, 0x16, 0x62, 0xC2, 0x02, 0x00, 0x60, 0x26, 
-	0xA8, 0xE4, 0x0D, 0x16, 0x42, 0xC2, 0xC9, 0x05, 
-	0x60, 0xCE, 0xF2, 0xED, 0x60, 0xC6, 0x7C, 0xEB, 
-	0xA0, 0x06, 0x10, 0xD6, 0x18, 0xCA, 0x0A, 0x00, 
-	0x20, 0x46, 0x26, 0xE0, 0x04, 0x16, 0xA0, 0xC0, 
-	0x6C, 0x01, 0x12, 0x2E, 0x1D, 0x10, 0x12, 0xC1, 
-	0x05, 0x13, 0x60, 0xC1, 0x6C, 0x01, 0x14, 0x2E, 
-	0x05, 0xC8, 0x6C, 0x01, 0xD2, 0x04, 0x48, 0x06, 
-	0x84, 0x07, 0x02, 0x00, 0x48, 0xC1, 0xA0, 0xC0, 
-	0x6C, 0x01, 0x02, 0xC0, 0xA0, 0x06, 0xA2, 0xD8, 
-	0x60, 0xC5, 0x02, 0xFC, 0x07, 0x02, 0xA2, 0x06, 
-	0x25, 0x02, 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 
-	0x20, 0xC2, 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 
-	0x5C, 0x04, 0x42, 0xC2, 0x29, 0x02, 0x08, 0x00, 
-	0x39, 0xC2, 0x48, 0x02, 0x00, 0xC0, 0x88, 0x02, 
-	0x00, 0xC0, 0x08, 0x16, 0x60, 0x8E, 0x2E, 0xE0, 
-	0x05, 0x16, 0x60, 0x86, 0x2E, 0xE0, 0x02, 0x16, 
-	0xC8, 0x04, 0x5B, 0x04, 0x08, 0x07, 0x5B, 0x04, 
-	0x20, 0x88, 0x8E, 0xE1, 0x6C, 0x01, 0x02, 0x16,  
-	0x60, 0x04, 0xBA, 0xCE, 0x5B, 0x04, 0x88, 0x07,  
-	0xAE, 0x01, 0x20, 0xE8, 0x0E, 0xE0, 0x80, 0x01, 
-	0x08, 0x06, 0xFE, 0x16, 0x20, 0x48, 0x0E, 0xE0, 
-	0x80, 0x01, 0x5B, 0x04, 0xC2, 0x04, 0xA0, 0x23, 
-	0x0C, 0xE0, 0x10, 0x16, 0x20, 0x2F, 0x30, 0x06, 
-	0x82, 0x07, 0xDF, 0xFF, 0x02, 0x2C, 0x82, 0x02, 
-	0xF4, 0x03, 0x06, 0x13, 0xE2, 0x04, 0x02, 0x00, 
-	0xA2, 0xC0, 0x06, 0x00, 0x12, 0x2E, 0xF4, 0x10, 
-	0xA0, 0x43, 0x0C, 0xE0, 0x5B, 0x04, 0x42, 0xC2, 
-	0x88, 0x07, 0x0E, 0x00, 0x09, 0xA2, 0x29, 0x02, 
-	0x08, 0x00, 0x78, 0xCE, 0x78, 0xCE, 0x78, 0xCE, 
-	0x60, 0xCE, 0x6C, 0x09, 0x60, 0xCE, 0x6E, 0x09, 
-	0x60, 0xCE, 0x70, 0x09, 0xA0, 0x23, 0x1A, 0xE0, 
-	0x0F, 0x16, 0x58, 0xC2, 0x49, 0x02, 0x80, 0x1F, 
-	0x60, 0x2A, 0x14, 0xE0, 0xA0, 0xE8, 0x04, 0xE0, 
-	0x0E, 0x00, 0x09, 0xC6, 0x49, 0x02, 0x00, 0x1F, 
-	0xC9, 0x06, 0x09, 0xA2, 0x89, 0xA8, 0x04, 0x00, 
-	0x28, 0x02, 0x02, 0x00, 0x58, 0xC2, 0x49, 0x0A, 
-	0x49, 0x02, 0x00, 0xF0, 0x09, 0xD6, 0xE2, 0x04, 
-	0x06, 0x00, 0x5B, 0x04, 0x00, 0x07, 0x82, 0xC0, 
-	0x53, 0x13, 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0xC1, 
-	0x06, 0xFC, 0x46, 0x02, 0x0F, 0x00, 0x86, 0x02, 
-	0x01, 0x00, 0x3D, 0x12, 0x06, 0x88, 0xF2, 0x06, 
-	0x12, 0x16, 0x01, 0x02, 0x0E, 0xFC, 0x31, 0x88, 
-	0xF4, 0x06, 0x0D, 0x16, 0x31, 0x88, 0xF6, 0x06, 
-	0x0A, 0x16, 0x31, 0x88, 0xF8, 0x06, 0x07, 0x16, 
-	0x86, 0x02, 0x02, 0x00, 0x2C, 0x16, 0x20, 0x88, 
-	0x0A, 0x07, 0xFA, 0x06, 0x28, 0x13, 0x20, 0xC1, 
-	0x6A, 0x09, 0x44, 0x01, 0x00, 0x08, 0x06, 0x13, 
-	0x86, 0x02, 0x02, 0x00, 0x20, 0x16, 0x44, 0x01, 
-	0x80, 0x00, 0x1D, 0x16, 0x00, 0x07, 0xE0, 0x23, 
-	0x14, 0xE0, 0x19, 0x16, 0x82, 0x02, 0x43, 0x00, 
-	0x16, 0x13, 0x00, 0x02, 0x02, 0xFC, 0x40, 0xC0, 
-	0xB0, 0x01, 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 
-	0x01, 0x00, 0x07, 0x16, 0x60, 0xA0, 0x2C, 0x09, 
-	0x60, 0xCC, 0xEE, 0x05, 0x50, 0xC4, 0x20, 0xC4, 
-	0x2C, 0x09, 0x80, 0x07, 0x36, 0x07, 0x81, 0x07, 
-	0x40, 0x00, 0x40, 0x2C, 0xC0, 0x04, 0x84, 0x07, 
-	0xF2, 0x06, 0x06, 0xCD, 0x01, 0x02, 0x0E, 0xFC, 
-	0x31, 0xCD, 0x31, 0xCD, 0x31, 0xCD, 0x20, 0xC5, 
-	0x0A, 0x07, 0x00, 0xC0, 0x01, 0x13, 0x12, 0x2E, 
-	0xE0, 0x04, 0x6C, 0x01, 0x5B, 0x04, 0x60, 0x01, 
-	0x8A, 0x09, 0x00, 0x80, 0x12, 0x13, 0x0B, 0xC8, 
-	0x22, 0x09, 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 
-	0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x08, 0x02, 
-	0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xC2, 
-	0x22, 0x09, 0x5B, 0x04, 0x20, 0x48, 0xAC, 0xE4, 
-	0x80, 0x01, 0x20, 0x48, 0x7E, 0xEB, 0x82, 0x01, 
-	0x20, 0x48, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0x48, 
-	0x22, 0xE0, 0x78, 0x09, 0x60, 0x43, 0x18, 0xE0, 
-	0xA0, 0x43, 0x08, 0xE0, 0x60, 0x01, 0x8A, 0x09, 
-	0x00, 0x80, 0xEB, 0x13, 0x0B, 0xC3, 0x08, 0x02, 
-	0x42, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 0x5C, 0x04, 
-	0x0B, 0xC3, 0x20, 0xE8, 0x0E, 0xE0, 0x82, 0x01, 
-	0x20, 0xE8, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0xE8, 
-	0x22, 0xE0, 0x78, 0x09, 0xA0, 0xE3, 0x08, 0xE0, 
-	0x60, 0xE3, 0x18, 0xE0, 0xA0, 0x43, 0x06, 0xE0, 
-	0x08, 0x02, 0x3C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
-	0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
-	0x5C, 0x04, 0x0B, 0xC3, 0x83, 0x07, 0x00, 0x68, 
-	0xA0, 0x06, 0x2A, 0xD8, 0x83, 0x07, 0x10, 0x80, 
-	0xA0, 0x06, 0x2A, 0xD8, 0x5C, 0x04, 0x0B, 0xC3, 
-	0xA0, 0x06, 0x14, 0xD8, 0x02, 0xA2, 0x68, 0xC2, 
-	0x14, 0x00, 0x29, 0x02, 0xFC, 0xFF, 0x24, 0x13, 
-	0x28, 0x02, 0x18, 0x00, 0x87, 0x07, 0x0E, 0x00, 
-	0x81, 0x07, 0x0E, 0x07, 0xF1, 0x04, 0x47, 0x06, 
-	0xFD, 0x15, 0x58, 0xC0, 0xB0, 0x03, 0x01, 0x78, 
-	0x63, 0x06, 0x41, 0x02, 0x3F, 0x00, 0x0E, 0x13, 
-	0x81, 0x02, 0x1F, 0x00, 0x0B, 0x1B, 0x41, 0xA0, 
-	0x61, 0xC0, 0x86, 0xE4, 0xF8, 0xC1, 0xC7, 0x06, 
-	0xC7, 0x71, 0x47, 0x06, 0x78, 0xCC, 0x47, 0x06, 
-	0xFD, 0x15, 0x04, 0x10, 0x58, 0xC0, 0xC1, 0x06, 
-	0x41, 0x70, 0x01, 0xA2, 0x49, 0xC2, 0xE5, 0x15, 
-	0x5C, 0x04, 0xA0, 0x23, 0x1A, 0xE0, 0x02, 0x13, 
-	0xC8, 0x04, 0x5B, 0x04, 0x22, 0xC2, 0x14, 0x00, 
-	0x48, 0x02, 0x00, 0x1F, 0xC8, 0x06, 0x5B, 0x04, 
-	0x83, 0x02, 0x0F, 0x00, 0x17, 0x1B, 0xA0, 0xC1, 
-	0xD4, 0x06, 0x35, 0x13, 0x26, 0x02, 0x04, 0x00, 
-	0xA0, 0xCD, 0xCE, 0xED, 0x83, 0xC5, 0x04, 0x13, 
-	0x4A, 0xC2, 0x39, 0x0A, 0xC9, 0xE0, 0x83, 0xC5, 
-	0x86, 0x07, 0x36, 0x07, 0x87, 0x07, 0x10, 0x00, 
-	0x20, 0xC2, 0xD4, 0x06, 0xE0, 0x04, 0xD4, 0x06, 
-	0x46, 0x2C, 0x5B, 0x04, 0x60, 0xC0, 0xFE, 0x06, 
-	0x20, 0xC2, 0x6A, 0x09, 0x48, 0x02, 0x00, 0x60, 
-	0x20, 0x22, 0x06, 0xE0, 0x04, 0x16, 0x20, 0xE2, 
-	0x0A, 0xE0, 0x20, 0xE2, 0x18, 0xE0, 0x13, 0x0A, 
-	0x04, 0x18, 0x41, 0x05, 0x03, 0x48, 0xFE, 0x06, 
-	0x06, 0x10, 0x83, 0x02, 0x02, 0x00, 0x01, 0x16, 
-	0x13, 0x09, 0x03, 0xE8, 0xFE, 0x06, 0xC8, 0x40, 
-	0xC1, 0x40, 0x05, 0x13, 0x88, 0x07, 0x36, 0x07, 
-	0x89, 0x07, 0x00, 0x40, 0x48, 0x2C, 0x5B, 0x04, 
-	0xC9, 0x04, 0x24, 0xC1, 0x94, 0xEB, 0x84, 0xC1, 
-	0x86, 0x71, 0x86, 0xA1, 0x26, 0x02, 0x56, 0xEC, 
-	0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xC2, 0xEB, 
-	0x14, 0xD2, 0xC8, 0x09, 0x08, 0xA2, 0xB0, 0x03, 
-	0x34, 0xD8, 0x5F, 0x06, 0x47, 0x02, 0x0F, 0x00, 
-	0xC7, 0xA1, 0x28, 0xC2, 0x82, 0xEB, 0x58, 0x04, 
-	0x76, 0xCD, 0x47, 0x06, 0xFD, 0x16, 0x32, 0x10, 
-	0x36, 0xC2, 0x26, 0x10, 0x17, 0x09, 0x47, 0xA1, 
-	0x2D, 0x10, 0x17, 0x09, 0x47, 0x61, 0x2A, 0x10, 
-	0xA0, 0x43, 0x16, 0xE0, 0x5B, 0x04, 0xA0, 0x43, 
-	0x16, 0xE0, 0x49, 0xC2, 0x03, 0x16, 0x44, 0xC2, 
-	0x06, 0xC8, 0x22, 0x09, 0x27, 0xC1, 0x8E, 0xED, 
-	0x84, 0xC1, 0x86, 0x71, 0x26, 0x02, 0xC4, 0xED, 
-	0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xAA, 0xED, 
-	0xD3, 0x10, 0x09, 0xC1, 0xA0, 0xC1, 0x22, 0x09, 
-	0xC9, 0x04, 0x10, 0x10, 0x36, 0xC2, 0x78, 0xD5,  
-	0x60, 0x41, 0x22, 0xE0, 0xC5, 0x05, 0x0A, 0x10, 
-	0x78, 0xCD, 0x47, 0x06, 0xFD, 0x15, 0x06, 0x10, 
-	0xA0, 0x23, 0x16, 0xE0, 0xCD, 0x16, 0x49, 0xC2, 
-	0xEC, 0x16, 0xD6, 0x10, 0xA0, 0xE3, 0x16, 0xE0, 
-	0xBB, 0x10, 0x08, 0x02, 0x5A, 0x80, 0xA0, 0x06, 
-	0xDA, 0xD4, 0x44, 0x10, 0xA0, 0x92, 0x0C, 0xE0, 
-	0x15, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x14, 0x16, 
-	0x20, 0x48, 0xAC, 0xE4, 0x80, 0x01, 0xA0, 0x06, 
-	0x72, 0xD7, 0x20, 0xC8, 0x9E, 0x01, 0x9E, 0x01, 
-	0xE0, 0x2E, 0x01, 0x00, 0xA0, 0x43, 0x18, 0xE0, 
-	0xA0, 0xD2, 0x26, 0xE0, 0x83, 0x07, 0x10, 0x00, 
-	0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xD2, 0xCE, 
-	0x84, 0x07, 0x08, 0x00, 0x60, 0x04, 0x94, 0xCE, 
-	0x85, 0x07, 0x03, 0x02, 0x05, 0xC8, 0xCE, 0x06, 
-	0xA0, 0x43, 0x12, 0xE0, 0xE0, 0x04, 0xFA, 0x06, 
-	0xA0, 0x06, 0xA4, 0xD7, 0x08, 0x02, 0x48, 0x80, 
-	0xA0, 0x06, 0xDA, 0xD4, 0x17, 0x10, 0x60, 0x01, 
-	0x8E, 0x09, 0x00, 0x80, 0x02, 0x16, 0x60, 0x04, 
-	0x9C, 0xD4, 0xA0, 0x27, 0x2C, 0xE0, 0x04, 0x16, 
-	0x08, 0x02, 0x54, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
-	0x83, 0x07, 0x00, 0xA8, 0x20, 0x88, 0x08, 0x07, 
-	0x20, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x00, 0xE8, 
-	0xA0, 0x06, 0x2A, 0xD8, 0x08, 0x02, 0x36, 0x00, 
-	0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 0x0C, 0xE0, 
-	0x82, 0x01, 0xA0, 0x23, 0x18, 0xE0, 0x06, 0x13, 
-	0xA0, 0xE3, 0x18, 0xE0, 0xE0, 0x2E, 0x00, 0x00, 
-	0x41, 0xC0, 0xFA, 0x16, 0xA0, 0x06, 0xE6, 0xD5, 
-	0x82, 0xC0, 0x02, 0x13, 0x4F, 0x02, 0x80, 0xFF, 
-	0xC4, 0x04, 0x0F, 0xD1, 0xC4, 0x06, 0x60, 0x04, 
-	0x94, 0xCE, 0xA0, 0x06, 0x32, 0xDA, 0x08, 0x02, 
-	0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 0x20, 0xDA, 
-	0xA0, 0x06, 0xDA, 0xD4, 0x10, 0x10, 0xA0, 0x06, 
-	0x32, 0xDA, 0x20, 0xD1, 0xCE, 0x06, 0xE6, 0x13, 
-	0x20, 0x78, 0x12, 0xE0, 0xCE, 0x06, 0xE2, 0x10, 
-	0x20, 0xC1, 0x16, 0x04, 0x14, 0x0A, 0xC4, 0x06, 
-	0x0A, 0x91, 0x01, 0x16, 0x5B, 0x04, 0x60, 0x04, 
-	0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 0xAB, 0xE3, 
-	0x65, 0x06, 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 
-	0x60, 0xC1, 0x94, 0x09, 0x02, 0x13, 0x60, 0x04, 
-	0x22, 0xDE, 0x60, 0xD1, 0x0E, 0xE0, 0x3D, 0x10, 
-	0x85, 0x07, 0xBE, 0xEA, 0x35, 0xC8, 0x8A, 0x09, 
-	0x15, 0xC8, 0x8C, 0x09, 0x0B, 0x10, 0xE0, 0x04, 
-	0xA0, 0x09, 0x20, 0xD8, 0x2E, 0x09, 0xA6, 0x09, 
-	0x20, 0xC8, 0xA8, 0x09, 0x8A, 0x09, 0x20, 0xC8, 
-	0xAA, 0x09, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, 
-	0xCA, 0x04, 0xCD, 0x04, 0xCE, 0x04, 0xCF, 0x04, 
-	0xE0, 0x04, 0xA8, 0x06, 0xE0, 0x04, 0xBA, 0x06, 
-	0x84, 0x07, 0xA0, 0x01, 0x85, 0x07, 0x10, 0x00, 
-	0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, 
-	0xD8, 0x06, 0x85, 0x07, 0x34, 0x07, 0x44, 0x61, 
-	0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, 
-	0xC8, 0x00, 0x04, 0xC8, 0x00, 0x07, 0x84, 0x07, 
-	0xFF, 0x7F, 0x04, 0xC8, 0xF0, 0x06, 0x84, 0x07, 
-	0x06, 0x00, 0x04, 0xC8, 0xEE, 0x06, 0x85, 0x07, 
-	0x02, 0x0C, 0x20, 0xC1, 0x8A, 0x09, 0x01, 0x11, 
-	0xC5, 0x06, 0xB0, 0x03, 0x05, 0xD8, 0x65, 0x06, 
-	0x60, 0x04, 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 
-	0xAA, 0xE3, 0x65, 0x06, 0x79, 0x16, 0x60, 0xD1, 
-	0x10, 0xE0, 0xF3, 0x10, 0x60, 0xD1, 0xAB, 0xE3, 
-	0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0xE0, 0x01, 
-	0x80, 0x01, 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 
-	0x80, 0x01, 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 
-	0x2E, 0x09, 0xE3, 0x10, 0x20, 0xF8, 0x19, 0xEE, 
-	0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0xC6, 0x06, 
-	0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x20, 0xC8, 
-	0xC2, 0xEA, 0x90, 0x09, 0xE0, 0x2E, 0x00, 0x00, 
-	0xA0, 0x06, 0xE6, 0xD5, 0x20, 0xC8, 0x6C, 0x09, 
-	0xA0, 0x01, 0x20, 0xC8, 0x6E, 0x09, 0xA2, 0x01, 
-	0x20, 0xC8, 0x70, 0x09, 0xA4, 0x01, 0x20, 0xC8, 
-	0x6E, 0x09, 0xB0, 0x01, 0x20, 0xC8, 0x70, 0x09, 
-	0xB2, 0x01, 0x20, 0xC8, 0x70, 0x09, 0xCC, 0x06, 
-	0x20, 0xF8, 0x18, 0xEE, 0x80, 0x01, 0xB0, 0x03, 
-	0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0x20, 0x98, 
-	0xAA, 0xE3, 0x65, 0x06, 0x3A, 0x13, 0xE0, 0x01, 
-	0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x56, 0xDF, 
-	0xE0, 0xC2, 0x8A, 0x09, 0x05, 0x11, 0xA0, 0x01, 
-	0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x9A, 0xDF, 
-	0x98, 0x06, 0x08, 0x02, 0x12, 0x80, 0xA0, 0x06, 
-	0xDA, 0xD4, 0x84, 0x07, 0x0A, 0x00, 0x85, 0x07, 
-	0xF4, 0x03, 0x20, 0x88, 0xC6, 0x06, 0x20, 0xE0, 
-	0x08, 0x1B, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
-	0xA5, 0x13, 0x84, 0x07, 0x1C, 0x00, 0x85, 0x07, 
-	0xF8, 0x03, 0xA0, 0x06, 0xA2, 0xD8, 0x85, 0x07, 
-	0x42, 0xDC, 0x05, 0xC8, 0xF8, 0x03, 0x20, 0xC8, 
-	0xA0, 0x09, 0xA0, 0x09, 0x6C, 0x16, 0x20, 0xE8, 
-	0x9C, 0x09, 0xFE, 0x03, 0x20, 0xE8, 0x9E, 0x09, 
-	0x06, 0x04, 0xA0, 0x23, 0x0C, 0xE0, 0x32, 0x13, 
-	0xA0, 0xE3, 0x0C, 0xE0, 0xA0, 0x2E, 0xF4, 0x03, 
-	0x2D, 0x10, 0xA0, 0x06, 0x56, 0xDF, 0x60, 0x01, 
-	0x8E, 0x09, 0x00, 0x40, 0x08, 0x13, 0x08, 0x02, 
-	0x6C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x22, 0x10, 
-	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x40, 0x08, 0x02, 
-	0x60, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x84, 0x07, 
-	0x2A, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xA0, 0x06, 
-	0xA2, 0xD8, 0xD5, 0x10, 0xB0, 0x03, 0x20, 0x98, 
-	0xAA, 0xE3, 0x65, 0x06, 0x0F, 0x16, 0x20, 0x06, 
-	0x90, 0x09, 0x9A, 0x16, 0x60, 0x01, 0x8A, 0x09, 
-	0x00, 0x40, 0x39, 0x13, 0xE0, 0x04, 0x8A, 0x09, 
-	0xE0, 0x04, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, 
-	0x60, 0x04, 0x62, 0xDA, 0x60, 0x04, 0xB0, 0xCE, 
-	0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, 
-	0xF9, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x04, 0x16, 
-	0x20, 0x06, 0xC6, 0x06, 0x9A, 0x16, 0x0A, 0x10, 
-	0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, 
-	0xED, 0x16, 0x20, 0x06, 0xC8, 0x06, 0x02, 0x13, 
-	0x60, 0x04, 0x5A, 0xDB, 0x60, 0x01, 0x8E, 0x09, 
-	0x00, 0x01, 0x02, 0x16, 0xCE, 0x01, 0x03, 0x00, 
-	0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0x83, 0x07, 
-	0x00, 0x82, 0x07, 0x10, 0x83, 0x07, 0x01, 0x00, 
-	0xE0, 0x04, 0x8E, 0x09, 0x20, 0xE8, 0x0C, 0xE0, 
-	0x82, 0x01, 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x01, 
-	0x8A, 0x09, 0x00, 0x40, 0xC7, 0x16, 0x83, 0x07, 
-	0x0D, 0x00, 0xF2, 0x10, 0xB0, 0x03, 0x20, 0x98, 
-	0xAA, 0xE3, 0x65, 0x06, 0xC7, 0x16, 0x20, 0x88, 
-	0x98, 0x09, 0x20, 0xE0, 0xF0, 0x16, 0x22, 0xC8, 
-	0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 0x10, 0x00, 
-	0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, 0xE0, 0x06, 
-	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x08, 0x02, 
-	0x66, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB2, 0x10, 
-	0xA0, 0x07, 0x9A, 0x09, 0x5A, 0x00, 0xA0, 0x07, 
-	0xA2, 0x09, 0x19, 0x00, 0xA0, 0x07, 0xA4, 0x09, 
-	0x05, 0x00, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x20, 
-	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x08, 0x02, 
-	0x78, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB0, 0x03, 
-	0x20, 0x98, 0xAB, 0xE3, 0x65, 0x06, 0x9A, 0x16, 
-	0x08, 0x02, 0x72, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
-	0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x06, 
-	0xD0, 0xD5, 0x20, 0x06, 0x9A, 0x09, 0xBF, 0x13, 
-	0x84, 0x07, 0x2C, 0x00, 0x85, 0x07, 0xF4, 0x03, 
-	0xA0, 0x06, 0xA2, 0xD8, 0x60, 0x04, 0xC0, 0xDB, 
-	0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 0x82, 0x10, 
-	0x0E, 0x01, 0x03, 0x00, 0x0A, 0x13, 0x08, 0x02, 
-	0x0C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xE3, 
-	0x14, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, 
-	0x26, 0x10, 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 
-	0xE0, 0x2E, 0x01, 0x00, 0x60, 0xC1, 0x1E, 0x09, 
-	0x35, 0x0A, 0x05, 0xE8, 0x82, 0x01, 0x20, 0xC1, 
-	0x6A, 0x09, 0x04, 0x01, 0x06, 0x00, 0x06, 0x13, 
-	0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 0x20, 0xD8, 
-	0xD0, 0xE1, 0x83, 0x01, 0x20, 0x21, 0x22, 0xE0, 
-	0x03, 0x16, 0x20, 0xE8, 0x22, 0xE0, 0x80, 0x01, 
-	0x20, 0x21, 0x04, 0xE0, 0x04, 0x16, 0xA0, 0xE3, 
-	0x14, 0xE0, 0x60, 0x04, 0x0A, 0xD3, 0x08, 0x02, 
-	0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 
-	0x08, 0xE0, 0x82, 0x01, 0xE0, 0xC2, 0x8A, 0x09, 
-	0x02, 0x11, 0x60, 0x04, 0xB0, 0xCE, 0xA0, 0x01, 
-	0x8E, 0x09, 0x00, 0x04, 0x6B, 0x10, 0x20, 0xC8, 
-	0xAE, 0xE4, 0x86, 0x01, 0x08, 0x02, 0x00, 0x80, 
-	0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC2, 0x1E, 0x09, 
-	0x08, 0xA2, 0x08, 0x05, 0x28, 0xC8, 0x22, 0xE0, 
-	0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xC6, 0x06, 
-	0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x60, 0xE3, 
-	0x16, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x44, 0xC1, 
-	0x44, 0x02, 0x00, 0x5E, 0xF8, 0x16, 0x60, 0x25, 
-	0xA8, 0xE4, 0x0F, 0x16, 0x20, 0x06, 0xC6, 0x06, 
-	0xF2, 0x16, 0x20, 0x06, 0xCA, 0x06, 0x03, 0x13, 
-	0xA0, 0x05, 0xCC, 0x06, 0xE6, 0x10, 0xB0, 0x03, 
-	0x20, 0xD8, 0x0C, 0xE0, 0x65, 0x06, 0x60, 0x04, 
-	0xD2, 0xCE, 0x20, 0x06, 0xC8, 0x06, 0xE3, 0x16, 
-	0x20, 0x88, 0x70, 0x09, 0xCC, 0x06, 0x03, 0x16, 
-	0x83, 0x07, 0x08, 0x00, 0x02, 0x10, 0x83, 0x07, 
-	0x0C, 0x00, 0x60, 0x04, 0x8A, 0xDC, 0x60, 0x04, 
-	0xD2, 0xCE, 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x13, 
-	0x60, 0x23, 0x12, 0xE0, 0x06, 0x16, 0xB0, 0x03, 
-	0x20, 0xD8, 0xA9, 0xE3, 0x65, 0x06, 0x60, 0x04, 
-	0xD2, 0xCE, 0x08, 0x02, 0x00, 0x80, 0xA0, 0x06, 
-	0xDA, 0xD4, 0x60, 0x04, 0xB0, 0xCE, 0x08, 0x02, 
-	0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC8, 
-	0x1E, 0xE0, 0xC6, 0x06, 0x20, 0xC8, 0x1E, 0xE0, 
-	0xC8, 0x06, 0x60, 0xE3, 0x10, 0xE0, 0x60, 0x04, 
-	0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 0x30, 0x13, 
-	0x44, 0xC1, 0x44, 0x02, 0x00, 0x1E, 0xF5, 0x16, 
-	0x60, 0x25, 0xA8, 0xE4, 0x1D, 0x16, 0x20, 0x06, 
-	0xC8, 0x06, 0xEF, 0x16, 0x60, 0x01, 0x8E, 0x09, 
-	0x00, 0x80, 0x13, 0x16, 0x60, 0x01, 0x8E, 0x09, 
-	0x00, 0x01, 0x0C, 0x16, 0xA0, 0x01, 0x8E, 0x09, 
-	0x00, 0x01, 0xA0, 0x01, 0x8E, 0x09, 0x80, 0x00, 
-	0xA0, 0x43, 0x04, 0xE0, 0x83, 0x07, 0x18, 0x68, 
-	0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 0xAE, 0xE4, 
-	0x86, 0x01, 0xC2, 0x04, 0x60, 0x04, 0x2C, 0xE4, 
-	0x08, 0x02, 0x1E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
-	0x07, 0x10, 0x20, 0x06, 0xC6, 0x06, 0xCD, 0x16, 
-	0x83, 0x07, 0x09, 0x00, 0xA0, 0x06, 0x8A, 0xDC, 
-	0x60, 0x04, 0xB0, 0xCE, 0xCE, 0x04, 0xE0, 0x04, 
-	0x2A, 0x09, 0xE0, 0xD3, 0xAA, 0xE3, 0x8F, 0xC2, 
-	0x20, 0xC8, 0xB0, 0xE4, 0x86, 0x01, 0x20, 0x48, 
-	0x08, 0xE0, 0x82, 0x01, 0x86, 0x07, 0x05, 0x00, 
-	0x84, 0x07, 0x72, 0x06, 0x54, 0xC1, 0x01, 0x13, 
-	0xD4, 0x2C, 0x24, 0x02, 0x0A, 0x00, 0x06, 0x06, 
-	0xF9, 0x16, 0x08, 0x02, 0x2A, 0x80, 0xA0, 0x06, 
-	0xDA, 0xD4, 0x20, 0x2C, 0x1A, 0xE0, 0x60, 0x04, 
-	0x50, 0xCD, 0xA0, 0x06, 0x3E, 0xD7, 0xCD, 0x04, 
-	0xA0, 0x23, 0x1C, 0xE0, 0x0D, 0x13, 0x0E, 0x01, 
-	0x03, 0x00, 0x0A, 0x13, 0xA0, 0xE3, 0x1C, 0xE0, 
-	0xB0, 0x03, 0x20, 0xD8, 0x10, 0xE0, 0x65, 0x06, 
-	0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 0x08, 0x10, 
-	0x20, 0x2D, 0x01, 0x00, 0xE0, 0xC0, 0x2A, 0x09, 
-	0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0xD2, 0xAB, 0xE3, 
-	0x60, 0x04, 0xD2, 0xCE, 0xA0, 0x01, 0x80, 0x01, 
-	0x00, 0x01, 0xE0, 0x01, 0x80, 0x01, 0x00, 0xAC, 
-	0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 0xE0, 0x01, 
-	0x82, 0x01, 0x00, 0x08, 0x88, 0x07, 0xAE, 0x01, 
-	0x08, 0x06, 0xFE, 0x16, 0x60, 0x01, 0x8E, 0x09, 
-	0x00, 0x02, 0x03, 0x16, 0xA0, 0x01, 0x80, 0x01, 
-	0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 0x80, 0x01, 
-	0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 0x2E, 0x09, 
-	0xA0, 0x07, 0x9E, 0x09, 0x00, 0x10, 0x5B, 0x04, 
-	0x20, 0xD8, 0xA6, 0x09, 0x2E, 0x09, 0xE0, 0x01, 
-	0x80, 0x01, 0x00, 0x04, 0xE0, 0x01, 0x82, 0x01, 
-	0x00, 0x08, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 
-	0x20, 0xC2, 0x30, 0x09, 0x03, 0x13, 0xE0, 0x01, 
-	0x82, 0x01, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01, 
-	0x00, 0xA1, 0x20, 0xF8, 0x2E, 0x09, 0x80, 0x01, 
-	0x88, 0x07, 0xAE, 0x01, 0x08, 0x06, 0xFE, 0x16, 
-	0xA0, 0x01, 0x80, 0x01, 0x00, 0x0C, 0xE0, 0x04, 
-	0x9E, 0x01, 0xE0, 0x04, 0x9C, 0x09, 0xE0, 0x04, 
-	0x9E, 0x09, 0x5B, 0x04, 0x20, 0x01, 0xA8, 0x09, 
-	0x00, 0x80, 0x11, 0x13, 0xE0, 0x93, 0x26, 0xE0, 
-	0x0E, 0x16, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
-	0x0A, 0x13, 0x08, 0x02, 0x84, 0x80, 0x00, 0x00, 
-	0x00, 0xE0, 0xDC, 0x0F, 0xA0, 0x06, 0xDA, 0xD4, 
-	0x20, 0x48, 0x08, 0xE0, 0x82, 0x01, 0x02, 0x10, 
-	0x60, 0x04, 0x70, 0xDA, 0x60, 0x04, 0xBA, 0xCE, 
-	0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x19, 0x13, 
-	0x83, 0x07, 0x80, 0x80, 0xE0, 0x23, 0x14, 0xE0, 
-	0x02, 0x13, 0x83, 0x07, 0x0A, 0x00, 0x60, 0x04, 
-	0xC6, 0xCE, 0x20, 0xC1, 0x06, 0x06, 0x0D, 0x13, 
-	0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x09, 0x13, 
-	0x83, 0x07, 0x0B, 0x00, 0xE0, 0x23, 0x14, 0xE0, 
-	0x02, 0x16, 0x83, 0x07, 0x01, 0x80, 0x60, 0x04, 
-	0xC6, 0xCE, 0x83, 0x07, 0x0A, 0x80, 0x60, 0x04, 
-	0xB4, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
-	0x06, 0x16, 0xA0, 0x06, 0xA8, 0xE5, 0x47, 0x10, 
-	0xD0, 0x03, 0x60, 0x04, 0xB0, 0xD3, 0xE0, 0x93, 
-	0x0E, 0xE0, 0x5E, 0x13, 0xE0, 0x93, 0x10, 0xE0, 
-	0x17, 0x13, 0xE0, 0x23, 0x14, 0xE0, 0x04, 0x13,  
-	0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 0xC6, 0xCE, 
-	0x83, 0x07, 0x00, 0xA0, 0xA0, 0x06, 0x2A, 0xD8,  
-	0x83, 0x07, 0x00, 0x48, 0xA0, 0x06, 0x2A, 0xD8, 
-	0xA0, 0xD2, 0x10, 0xE0, 0x20, 0xC8, 0x1C, 0xE0, 
-	0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 
-	0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 0x4E, 0x80, 
-	0xA0, 0x06, 0xDA, 0xD4, 0xA0, 0x23, 0x1C, 0xE0, 
-	0x20, 0x13, 0x20, 0x88, 0x6C, 0x09, 0x0E, 0x07, 
-	0x1C, 0x16, 0x20, 0x88, 0x6E, 0x09, 0x10, 0x07, 
-	0x18, 0x16, 0x20, 0x88, 0x70, 0x09, 0x12, 0x07, 
-	0x14, 0x16, 0x20, 0x88, 0x0A, 0x07, 0x22, 0xE0, 
-	0x10, 0x13, 0x20, 0x06, 0xCA, 0x06, 0x38, 0x16, 
-	0xA0, 0xE3, 0x20, 0xE0, 0x06, 0x10, 0xE0, 0x23, 
-	0x14, 0xE0, 0xCA, 0x16, 0xA0, 0xE3, 0x22, 0xE0, 
-	0xC2, 0x04, 0xA0, 0xD2, 0xAA, 0xE3, 0x60, 0x04, 
-	0xBA, 0xCE, 0x20, 0xC8, 0x1C, 0xE0, 0xCA, 0x06, 
-	0xA0, 0x88, 0xDC, 0x06, 0x0E, 0x00, 0x10, 0x16, 
-	0xA0, 0x88, 0xDE, 0x06, 0x10, 0x00, 0x0C, 0x16, 
-	0xA0, 0x88, 0xE0, 0x06, 0x12, 0x00, 0x08, 0x16, 
-	0x20, 0x06, 0xCC, 0x06, 0x19, 0x16, 0x20, 0xE8, 
-	0x0E, 0xE0, 0x82, 0x01, 0xA0, 0xE3, 0x1E, 0xE0, 
-	0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 0x10, 0x10, 
-	0xA0, 0x23, 0x10, 0xE0, 0x08, 0x16, 0x64, 0xC1, 
-	0x06, 0x00, 0x60, 0x21, 0x0C, 0xE0, 0x08, 0x13, 
-	0xA0, 0xD2, 0xA8, 0xE3, 0x05, 0x10, 0x20, 0x88, 
-	0x0A, 0x07, 0x08, 0x07, 0x96, 0x12, 0x00, 0x10, 
-	0x60, 0x04, 0xBA, 0xCE, 0x60, 0x01, 0x8E, 0x09, 
-	0x00, 0x80, 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 
-	0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 
-	0xE0, 0x93, 0x0E, 0xE0, 0x50, 0x13, 0xE0, 0x93, 
-	0xA9, 0xE3, 0x4D, 0x13, 0xE0, 0x93, 0xA8, 0xE3, 
-	0x1C, 0x13, 0xA0, 0x06, 0xA4, 0xD7, 0xA0, 0x23, 
-	0x10, 0xE0, 0x45, 0x13, 0xA0, 0x23, 0x08, 0xE0, 
-	0x06, 0x16, 0x60, 0xE3, 0x1E, 0xE0, 0x20, 0xC8, 
-	0x22, 0xE0, 0x06, 0x07, 0x34, 0x10, 0xE0, 0x23, 
-	0x14, 0xE0, 0x31, 0x16, 0x60, 0xC1, 0x6A, 0x09, 
-	0x60, 0x21, 0x12, 0xE0, 0x2C, 0x16, 0xA0, 0x06, 
-	0x0E, 0xE2, 0x31, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 
-	0x2E, 0x10, 0xA0, 0xE3, 0x12, 0xE0, 0xA0, 0x06, 
-	0x0E, 0xE2, 0x64, 0xC1, 0x06, 0x00, 0x60, 0x21, 
-	0x0C, 0xE0, 0x25, 0x13, 0x20, 0x88, 0x0E, 0x07, 
-	0xDC, 0x06, 0x14, 0x16, 0x20, 0x88, 0x10, 0x07, 
-	0xDE, 0x06, 0x10, 0x16, 0x20, 0x88, 0x12, 0x07, 
-	0xE0, 0x06, 0x0C, 0x16, 0x20, 0x98, 0xCE, 0x06, 
-	0xCF, 0x06, 0x15, 0x13, 0x20, 0x06, 0xCE, 0x06, 
-	0x12, 0x16, 0x60, 0xE3, 0x1A, 0xE0, 0xA0, 0xD2, 
-	0x0C, 0xE0, 0x0D, 0x10, 0x60, 0xE3, 0x1E, 0xE0,  
-	0x20, 0xC8, 0x32, 0xE0, 0x06, 0x07, 0xA0, 0x06, 
-	0x3E, 0xD7, 0x08, 0x02, 0x48, 0x80, 0xA0, 0x06, 
-	0xDA, 0xD4, 0xA0, 0xD2, 0xA9, 0xE3, 0x60, 0x04, 
-	0xBA, 0xCE, 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 
-	0xC9, 0x1A, 0x0B, 0x1B, 0x22, 0x88, 0x10, 0x00, 
-	0x6E, 0x09, 0xC4, 0x1A, 0x06, 0x1B, 0x22, 0x88, 
-	0x12, 0x00, 0x70, 0x09, 0xBF, 0x1A, 0x01, 0x1B, 
-	0x5B, 0x04, 0x60, 0xC1, 0x6C, 0x01, 0x85, 0x02, 
-	0x43, 0x00, 0xE1, 0x13, 0xE0, 0x93, 0xA8, 0xE3, 
-	0xDE, 0x16, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, 
-	0x84, 0x07, 0x0E, 0x00, 0x42, 0xC1, 0xA0, 0xC0, 
-	0x6C, 0x01, 0x02, 0xC0, 0x25, 0x02, 0x48, 0x00, 
-	0x81, 0x07, 0x60, 0xE2, 0x83, 0x07, 0x14, 0xAE, 
-	0x60, 0x04, 0x9E, 0xE5, 0x02, 0x02, 0x00, 0xFC, 
-	0xCA, 0x10, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
-	0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 0xA0, 0x06, 
-	0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 0x20, 0x98, 
-	0x0E, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 
-	0xA8, 0xE3, 0x65, 0x06, 0xE0, 0x93, 0xA9, 0xE3, 
-	0x0D, 0x13, 0xA0, 0x23, 0x08, 0xE0, 0x19, 0x16, 
-	0xA0, 0x23, 0x10, 0xE0, 0x16, 0x13, 0x60, 0xE3, 
-	0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, 
-	0xA0, 0x06, 0x3E, 0xD7, 0xA0, 0x43, 0x18, 0xE0, 
-	0xE0, 0x2E, 0x01, 0x00, 0xA0, 0xD2, 0x26, 0xE0, 
-	0x83, 0x07, 0x10, 0x00, 0xA0, 0x06, 0x2A, 0xD8, 
-	0xE0, 0x23, 0x14, 0xE0, 0x02, 0x16, 0xA0, 0x06, 
-	0x18, 0xD7, 0xA0, 0x43, 0x2C, 0xE0, 0x20, 0xC8, 
-	0x20, 0xE0, 0x24, 0x09, 0x60, 0x04, 0xBA, 0xCE, 
-	0xA0, 0x06, 0xA8, 0xE5, 0x01, 0x10, 0x03, 0x10, 
-	0x20, 0x07, 0xA0, 0x09, 0x03, 0x10, 0xA0, 0x07, 
-	0xA2, 0x09, 0x19, 0x00, 0x60, 0x04, 0xBA, 0xCE, 
-	0xA0, 0x43, 0x0E, 0xE0, 0xA0, 0xC1, 0x24, 0x09, 
-	0x02, 0x13, 0x20, 0x06, 0x24, 0x09, 0xE0, 0x23, 
-	0x14, 0xE0, 0x03, 0x13, 0xA0, 0x23, 0x08, 0xE0, 
-	0x29, 0x16, 0x20, 0xC2, 0x8A, 0x09, 0xE4, 0x11, 
-	0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
-	0xA0, 0x23, 0x08, 0xE0, 0x1F, 0x16, 0xA0, 0x23, 
-	0x10, 0xE0, 0x0A, 0x16, 0x22, 0xC1, 0x02, 0x00, 
-	0x20, 0x25, 0xA8, 0xE4, 0x23, 0x16, 0x83, 0x07, 
-	0x20, 0x80, 0xA0, 0x06, 0x2A, 0xD8, 0x12, 0x10, 
-	0xA0, 0x06, 0x3E, 0xD7, 0xE0, 0x23, 0x14, 0xE0, 
-	0x02, 0x16, 0xA0, 0x06, 0x18, 0xD7, 0x60, 0xE3, 
-	0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, 
-	0xA0, 0x23, 0x08, 0xE0, 0x03, 0x16, 0xA0, 0x23, 
-	0x06, 0xE0, 0x51, 0x13, 0x20, 0x98, 0x0E, 0xE0, 
-	0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 0xA8, 0xE3, 
-	0x65, 0x06, 0x22, 0xC1, 0x02, 0x00, 0x20, 0x25, 
-	0xA8, 0xE4, 0x0E, 0x13, 0x83, 0x07, 0x20, 0x00, 
-	0xA0, 0x06, 0x2A, 0xD8, 0x22, 0xC8, 0x0E, 0x00, 
-	0xE6, 0x06, 0x22, 0xC8, 0x10, 0x00, 0xE8, 0x06, 
-	0x22, 0xC8, 0x12, 0x00, 0xEA, 0x06, 0x37, 0x10, 
-	0x22, 0x88, 0x0E, 0x00, 0xDC, 0x06, 0x08, 0x16, 
-	0x22, 0x88, 0x10, 0x00, 0xDE, 0x06, 0x04, 0x16, 
-	0x22, 0x88, 0x12, 0x00, 0xE0, 0x06, 0x0B, 0x13, 
-	0x22, 0xC8, 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 
-	0x10, 0x00, 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00,  
-	0xE0, 0x06, 0x60, 0xE3, 0x14, 0xE0, 0xA0, 0x23, 
-	0x0E, 0xE0, 0x08, 0x16, 0xA0, 0xC1, 0x24, 0x09, 
-	0x1A, 0x16, 0x86, 0x07, 0x00, 0x10, 0x06, 0xE8, 
-	0xD2, 0x06, 0x15, 0x10, 0xA0, 0xE3, 0x0E, 0xE0, 
-	0xA0, 0x23, 0x08, 0xE0, 0x09, 0x16, 0xA0, 0xE3, 
-	0x06, 0xE0, 0xE0, 0x04, 0xE6, 0x06, 0xE0, 0x04, 
-	0xE8, 0x06, 0xE0, 0x04, 0xEA, 0x06, 0x07, 0x10, 
-	0x08, 0x02, 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 
-	0x36, 0xD3, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 
-	0xBA, 0xCE, 0x20, 0x98, 0x65, 0x06, 0x10, 0xE0, 
-	0x03, 0x16, 0x20, 0xD8, 0x0E, 0xE0, 0x65, 0x06, 
-	0x60, 0x04, 0xBA, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 
-	0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 0x2E, 0x10, 
-	0xB0, 0x03, 0x20, 0x98, 0xA9, 0xE3, 0x6F, 0x06, 
-	0x19, 0x16, 0x24, 0xC2, 0x08, 0x00, 0x16, 0x11, 
-	0xE0, 0xE3, 0x14, 0xE0, 0x83, 0x07, 0x00, 0x00, 
-	0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x23, 0x14, 0xE0, 
-	0x04, 0x13, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, 
-	0xDA, 0xD4, 0x08, 0x02, 0x1E, 0x00, 0xA0, 0x06, 
-	0xDA, 0xD4, 0xA0, 0x23, 0x08, 0xE0, 0x02, 0x13, 
-	0xA0, 0x06, 0x18, 0xD7, 0x82, 0xC0, 0x02, 0x16, 
-	0x60, 0x04, 0xD2, 0xCE, 0x20, 0xE8, 0x1C, 0xEE, 
-	0xF0, 0x06, 0x20, 0x99, 0x0E, 0xE0, 0x16, 0x00, 
-	0x05, 0x16, 0xE0, 0x04, 0xEC, 0x06, 0x20, 0x48, 
-	0x14, 0xE0, 0xF0, 0x06, 0x83, 0x07, 0x01, 0x00, 
-	0x60, 0x04, 0xB4, 0xCE, 0x64, 0xC2, 0x14, 0x00, 
-	0x24, 0x02, 0x18, 0x00, 0xC4, 0xC1, 0xC2, 0x61, 
-	0x27, 0x02, 0xFC, 0xFF, 0x74, 0xC1, 0x85, 0xC1, 
-	0x45, 0x71, 0x85, 0x02, 0x27, 0x00, 0x46, 0x16, 
-	0x54, 0xC1, 0x45, 0x02, 0xCF, 0xFF, 0x42, 0x16, 
-	0xC8, 0x04, 0x64, 0xC1, 0x08, 0x00, 0x06, 0x15, 
-	0x05, 0x13, 0x24, 0xC2, 0x0E, 0x00, 0x48, 0x02, 
-	0x00, 0x1F, 0xC8, 0x06, 0x28, 0x02, 0x11, 0x00, 
-	0x04, 0xA2, 0x18, 0x98, 0x21, 0xEE, 0x32, 0x16, 
-	0x42, 0xC1, 0x25, 0x02, 0x04, 0x00, 0x47, 0x65, 
-	0x35, 0xC2, 0x74, 0xCD, 0x48, 0x06, 0xFD, 0x15, 
-	0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC1, 0x04, 0xC8, 
-	0x6C, 0x01, 0xA0, 0xC1, 0x00, 0xFC, 0x05, 0x13, 
-	0x20, 0xC8, 0x80, 0xEB, 0x02, 0xFC, 0x06, 0xC1, 
-	0xF6, 0x10, 0x20, 0xC8, 0x00, 0xEE, 0x02, 0xFC, 
-	0x02, 0xC8, 0x6C, 0x01, 0x81, 0x07, 0x08, 0xE5, 
-	0x04, 0xC0, 0x83, 0x07, 0x10, 0x02, 0x84, 0x07, 
-	0x0E, 0x00, 0x3B, 0x10, 0x84, 0x07, 0x0C, 0x00, 
-	0xE2, 0xC0, 0x08, 0x00, 0x05, 0x02, 0x00, 0xFC, 
-	0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x95, 0xC1, 
-	0x30, 0x13, 0xD5, 0x04, 0x16, 0x2E, 0x02, 0xC8, 
-	0x6C, 0x01, 0x2B, 0x10, 0xA0, 0xC8, 0x22, 0xEE, 
-	0x0E, 0x00, 0xA0, 0xC8, 0x24, 0xEE, 0x10, 0x00, 
-	0xA0, 0xC8, 0x26, 0xEE, 0x12, 0x00, 0x83, 0x07, 
-	0x06, 0x80, 0x60, 0x04, 0xB4, 0xCE, 0x60, 0x04, 
-	0xD2, 0xCE, 0x84, 0x07, 0x10, 0x00, 0x85, 0x07, 
-	0x34, 0x00, 0x09, 0x10, 0x84, 0x07, 0x12, 0x00, 
-	0x85, 0x07, 0x32, 0x00, 0x04, 0x10, 0x84, 0x07, 
-	0x14, 0x00, 0x85, 0x07, 0x38, 0x00, 0xA0, 0x06, 
-	0xC2, 0xD5, 0x85, 0xC8, 0x04, 0x00, 0xA0, 0x06, 
-	0x10, 0xD6, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, 
-	0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x48, 0x06, 
-	0x48, 0xC1, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, 
-	0xA2, 0x06, 0x60, 0xC5, 0x02, 0xFC, 0x25, 0x02, 
-	0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 0x20, 0xC2, 
-	0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 0x60, 0x04, 
-	0xB0, 0xCE, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, 
-	0xB4, 0x06, 0xEF, 0x10, 0x22, 0x88, 0x12, 0x00, 
-	0x70, 0x09, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, 
-	0x6E, 0x09, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, 
-	0x6C, 0x09, 0x0E, 0x13, 0x22, 0x88, 0x12, 0x00, 
-	0xE0, 0x06, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, 
-	0xDE, 0x06, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, 
-	0xDC, 0x06, 0x01, 0x13, 0xCB, 0x05, 0xCB, 0x05, 
-	0x5B, 0x04, 0x0B, 0xC3, 0x00, 0x03, 0x02, 0x00, 
-	0x82, 0x07, 0xC0, 0x00, 0x20, 0xC8, 0x0C, 0x00, 
-	0xC0, 0x00, 0x20, 0xC8, 0x0E, 0x00, 0xC2, 0x00, 
-	0x20, 0xC8, 0x10, 0x00, 0xC4, 0x00, 0x20, 0xC8, 
-	0x12, 0x00, 0xC6, 0x00, 0x20, 0xC8, 0x14, 0x00, 
-	0xC8, 0x00, 0x20, 0xC8, 0x16, 0x00, 0xCA, 0x00, 
-	0x20, 0xC8, 0x04, 0x00, 0xCC, 0x00, 0x20, 0xC8, 
-	0x06, 0x00, 0xCE, 0x00, 0x02, 0xC8, 0x0C, 0x00, 
-	0xA0, 0x07, 0x0E, 0x00, 0x7E, 0xE6, 0x02, 0xC8, 
-	0x10, 0x00, 0xA0, 0x07, 0x12, 0x00, 0x88, 0xE6, 
-	0x02, 0xC8, 0x14, 0x00, 0xA0, 0x07, 0x16, 0x00, 
-	0xB8, 0xE6, 0x02, 0xC8, 0x04, 0x00, 0xA0, 0x07, 
-	0x06, 0x00, 0xCE, 0xE6, 0x60, 0x01, 0x1C, 0x01, 
-	0x04, 0x00, 0x09, 0x16, 0xE0, 0x01, 0x40, 0x01, 
-	0x00, 0x08, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 
-	0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xA0, 0x06, 
-	0x8E, 0xE9, 0x05, 0x02, 0x00, 0x80, 0x05, 0xD8, 
-	0x80, 0x04, 0xC7, 0x04, 0x00, 0x03, 0x0F, 0x00, 
-	0x88, 0x07, 0x00, 0x10, 0x09, 0x02, 0x00, 0x20, 
-	0x8A, 0x07, 0xE6, 0xE6, 0x03, 0x02, 0x3E, 0xE6, 
-	0x5A, 0x04, 0x00, 0x03, 0x00, 0x00, 0x20, 0xD2, 
-	0x87, 0x01, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00, 
-	0x20, 0xC2, 0x8A, 0x01, 0x08, 0x02, 0x00, 0x1A, 
-	0x60, 0xC2, 0xAE, 0x00, 0x48, 0xDA, 0x80, 0x04, 
-	0x89, 0x05, 0x89, 0x02, 0x06, 0x00, 0x07, 0x15, 
-	0x88, 0x07, 0x00, 0x80, 0x48, 0xDA, 0x80, 0x04, 
-	0x09, 0xC8, 0xAE, 0x00, 0x80, 0x03, 0xE0, 0x02, 
-	0xA0, 0x00, 0x5C, 0x04, 0x00, 0x03, 0x00, 0x00, 
-	0x60, 0x01, 0x9C, 0x01, 0x20, 0x00, 0xE2, 0x13, 
-	0x20, 0xC2, 0x8C, 0x01, 0x08, 0x02, 0x00, 0x1C, 
-	0xE3, 0x10, 0x00, 0x03, 0x00, 0x00, 0x60, 0x01,  
-	0x40, 0x01, 0x00, 0x40, 0xEC, 0x16, 0xA0, 0x01,  
-	0x40, 0x01, 0x00, 0x40, 0x08, 0x02, 0x00, 0x02, 
-	0xD7, 0x10, 0xB3, 0xC0, 0x92, 0x06, 0xFD, 0x10, 
-	0xB3, 0xC0, 0x48, 0xC0, 0x72, 0xCC, 0x72, 0xCC, 
-	0x32, 0xC1, 0x44, 0xCC, 0x72, 0xDC, 0x04, 0x06, 
-	0xFD, 0x16, 0x5B, 0x04, 0x48, 0xC0, 0x02, 0x02, 
-	0xD0, 0xE9, 0x84, 0x07, 0x06, 0x00, 0xF6, 0x10, 
-	0x02, 0x02, 0x1E, 0xE6, 0x49, 0xC0, 0x84, 0x07, 
-	0x06, 0x00, 0xF0, 0x10, 0xB3, 0xC0, 0x32, 0xC1, 
-	0x01, 0x02, 0x01, 0x00, 0x44, 0xD0, 0xC1, 0x06, 
-	0x44, 0x02, 0xFF, 0x00, 0xE7, 0x10, 0x33, 0xC1, 
-	0x73, 0xC0, 0x44, 0xD1, 0x44, 0x02, 0xFF, 0x00, 
-	0x45, 0xDC, 0x04, 0x06, 0xFD, 0x16, 0x5A, 0x04, 
-	0xA0, 0x06, 0x0E, 0xE9, 0x33, 0xC8, 0x9E, 0x01, 
-	0x5A, 0x04, 0xA0, 0x06, 0x0C, 0xE7, 0x89, 0xC1, 
-	0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 
-	0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 0x66, 0x02,  
-	0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 0xC2, 0x04,  
-	0xC7, 0xC1, 0x03, 0x16, 0x02, 0x06, 0xFC, 0x16,  
-	0x4D, 0x10, 0x5A, 0x04, 0xA0, 0x06, 0x58, 0xE8, 
-	0x89, 0xC1, 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 
-	0x06, 0xC8, 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 
-	0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 
-	0x33, 0xC8, 0x9E, 0x01, 0xE8, 0x10, 0x33, 0x8A, 
-	0x02, 0x00, 0x38, 0x16, 0x73, 0x8A, 0x02, 0x00, 
-	0x35, 0x16, 0x5A, 0x04, 0x20, 0x8A, 0xCA, 0xE9, 
-	0x02, 0x00, 0x30, 0x16, 0x60, 0x8A, 0xCE, 0xE9, 
-	0x02, 0x00, 0x2C, 0x16, 0x82, 0x07, 0x74, 0xEA, 
-	0x01, 0x10, 0xB3, 0xC0, 0x04, 0x02, 0x80, 0x04, 
-	0x52, 0xD1, 0x03, 0x13, 0x32, 0x9D, 0x22, 0x16, 
-	0xFB, 0x10, 0x85, 0x07, 0x00, 0x80, 0x05, 0xD8, 
-	0x80, 0x04, 0xC7, 0x04, 0x5A, 0x04, 0x20, 0xC8, 
-	0xC0, 0x00, 0x0C, 0x00, 0x20, 0xC8, 0xC2, 0x00, 
-	0x0E, 0x00, 0x20, 0xC8, 0xC4, 0x00, 0x10, 0x00, 
-	0x20, 0xC8, 0xC6, 0x00, 0x12, 0x00, 0x20, 0xC8, 
-	0xC8, 0x00, 0x14, 0x00, 0x20, 0xC8, 0xCA, 0x00, 
-	0x16, 0x00, 0x20, 0xC8, 0xCC, 0x00, 0x04, 0x00, 
-	0x20, 0xC8, 0xCE, 0x00, 0x06, 0x00, 0x00, 0x03, 
-	0x0F, 0x00, 0xCC, 0x05, 0x5C, 0x04, 0xE0, 0x04, 
-	0x82, 0x01, 0x02, 0x02, 0x18, 0xE6, 0x32, 0xC8, 
-	0x82, 0x01, 0x32, 0xC8, 0x80, 0x01, 0xA0, 0x06, 
-	0x24, 0xE8, 0x12, 0xC8, 0x82, 0x01, 0xCA, 0xC2, 
-	0x84, 0x07, 0xD0, 0x07, 0xE0, 0x04, 0x84, 0x01, 
-	0x04, 0x06, 0xFC, 0x16, 0x20, 0xC1, 0x84, 0x01, 
-	0xE9, 0x16, 0x04, 0x02, 0x32, 0x00, 0x85, 0x07, 
-	0x00, 0x80, 0x05, 0xD8, 0x80, 0x04, 0xC7, 0x04, 
-	0x60, 0xC1, 0x86, 0x01, 0x04, 0x06, 0xFC, 0x16, 
-	0x20, 0xC1, 0x84, 0x01, 0x5B, 0x04, 0xB3, 0xC0, 
-	0xB3, 0xC4, 0x5B, 0x04, 0x48, 0xC0, 0xB3, 0xC0, 
-	0x73, 0xA0, 0x42, 0xC4, 0x5B, 0x04, 0x33, 0x88, 
-	0x84, 0x01, 0xE6, 0x16, 0x5A, 0x04, 0x89, 0xC1, 
-	0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 
-	0x8A, 0x01, 0x5B, 0x04, 0xC5, 0x04, 0xA0, 0x07, 
-	0x9C, 0x01, 0x40, 0x00, 0x60, 0x01, 0x9C, 0x01, 
-	0x40, 0x00, 0x03, 0x13, 0x05, 0x06, 0xF7, 0x16, 
-	0x5C, 0x04, 0x5B, 0x04, 0xA0, 0x06, 0xAC, 0xE8, 
-	0x60, 0xC0, 0x40, 0x01, 0x05, 0xC8, 0x40, 0x01, 
-	0x02, 0xC5, 0x01, 0xC8, 0x40, 0x01, 0x5A, 0x04, 
-	0xA0, 0x06, 0xAC, 0xE8, 0x08, 0xA1, 0xF4, 0x10, 
-	0xB3, 0xC0, 0x33, 0xC1, 0x60, 0xC1, 0x40, 0x01, 
-	0x85, 0x01, 0x00, 0x04, 0xC5, 0x01, 0x00, 0x10,  
-	0x5B, 0x04, 0x08, 0xC1, 0x09, 0xC2, 0x44, 0xC2, 
-	0x5B, 0x04, 0x05, 0x02, 0xC8, 0x00, 0x05, 0x06, 
-	0xFE, 0x16, 0x5B, 0x04, 0x33, 0xC1, 0x03, 0xC0, 
-	0xC4, 0xC0, 0x5B, 0x04, 0xC0, 0xC0, 0x5B, 0x04, 
-	0xE0, 0x94, 0x9E, 0x01, 0xC2, 0x16, 0xC3, 0x05, 
-	0x5B, 0x04, 0x73, 0xC0, 0xA0, 0x06, 0x26, 0xE9, 
-	0x2D, 0x02, 0x08, 0x00, 0x85, 0x07, 0x08, 0x00, 
-	0x71, 0x9F, 0xB7, 0x16, 0x05, 0x06, 0xFC, 0x16, 
-	0x5A, 0x04, 0x02, 0x02, 0x24, 0xE6, 0x60, 0x04, 
-	0x10, 0xE7, 0xE9, 0x8C, 0x04, 0x00, 0xAD, 0x16, 
-	0x5B, 0x04, 0x20, 0xC1, 0x80, 0x01, 0x85, 0x07, 
-	0xD0, 0x07, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x04, 
-	0x45, 0x06, 0xFE, 0x16, 0x04, 0xC8, 0x80, 0x01, 
-	0x5B, 0x04, 0x33, 0xC1, 0x48, 0xC3, 0x04, 0xC1, 
-	0x04, 0x13, 0x2D, 0x02, 0x00, 0x04, 0x04, 0x06, 
-	0xFC, 0x16, 0x5B, 0x04, 0x8D, 0xC3, 0xA0, 0x06, 
-	0x26, 0xE9, 0x8D, 0xC1, 0xA6, 0x09, 0x66, 0x02, 
-	0x40, 0x00, 0x86, 0xC7, 0x5A, 0x04, 0x8D, 0xC1, 
-	0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 
-	0x8A, 0x01, 0x5B, 0x04, 0x8D, 0xC1, 0xA6, 0x09, 
-	0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 
-	0x5B, 0x04, 0x4D, 0xC0, 0x04, 0x02, 0x28, 0x00, 
-	0x85, 0x07, 0x00, 0x55, 0x60, 0x04, 0x34, 0xE7, 
-	0x4D, 0xC0, 0xB3, 0xC0, 0x32, 0xC1, 0x60, 0x04, 
-	0xF8, 0xE6, 0x33, 0xC1, 0x60, 0x01, 0x1C, 0x01, 
-	0x04, 0x00, 0x01, 0x16, 0x5B, 0x04, 0xC4, 0xC0, 
-	0x5B, 0x04, 0x89, 0x07, 0x66, 0xE5, 0x39, 0xC2, 
-	0x07, 0x13, 0x39, 0xC6, 0x39, 0x86, 0x25, 0x16, 
-	0x39, 0xC6, 0x39, 0x86, 0x22, 0x16, 0xF7, 0x10, 
-	0x02, 0x02, 0xAC, 0xE9, 0xC4, 0x04, 0xC5, 0x04, 
-	0x39, 0xC2, 0x02, 0x13, 0x60, 0x04, 0xE8, 0xE9, 
-	0x02, 0x02, 0xBA, 0xE9, 0xC4, 0x04, 0x39, 0xC2, 
-	0x03, 0x13, 0x79, 0xC1, 0x60, 0x04, 0xE8, 0xE9, 
-	0x02, 0x02, 0xCA, 0xE9, 0xC5, 0x04, 0x39, 0xC2, 
-	0x03, 0x13, 0x39, 0xC1, 0x60, 0x04, 0xE8, 0xE9, 
-	0x79, 0xC0, 0xB9, 0xC0, 0x81, 0x60, 0xC2, 0x05, 
-	0x12, 0x09, 0xF1, 0x04, 0x02, 0x06, 0xFD, 0x16, 
-	0x5B, 0x04, 0x5C, 0x04, 0x01, 0x02, 0xAA, 0xAA, 
-	0x01, 0xC6, 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 
-	0xF8, 0x16, 0x01, 0x02, 0x14, 0x00, 0x01, 0x06, 
-	0xFE, 0x16, 0x01, 0x02, 0x55, 0x55, 0x01, 0xC6, 
-	0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 0xED, 0x16, 
-	0x52, 0x04, 0xE0, 0x02, 0xA0, 0x00, 0x88, 0x07, 
-	0xC0, 0x00, 0x09, 0x02, 0x62, 0xEA, 0x84, 0x07, 
-	0x2A, 0xE6, 0x05, 0x02, 0x01, 0x00, 0x8B, 0xC2, 
-	0xCC, 0x04, 0xA0, 0x06, 0x6C, 0xEA, 0x60, 0x2C, 
-	0x01, 0x00, 0x99, 0x06, 0xA0, 0x2C, 0x02, 0x00, 
-	0x99, 0x06, 0x20, 0x2D, 0x04, 0x00, 0x99, 0x06, 
-	0x20, 0x2E, 0x08, 0x00, 0x99, 0x06, 0xA0, 0x2F, 
-	0x10, 0x00, 0x8C, 0x05, 0x09, 0x16, 0x80, 0xCC, 
-	0x81, 0xC4, 0x83, 0x07, 0xB0, 0xEA, 0x88, 0xC0, 
-	0x02, 0x04, 0x8C, 0x05, 0x01, 0x16, 0x33, 0x10, 
-	0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x8C, 0x05, 
-	0xFB, 0x16, 0x80, 0xCC, 0x81, 0xC4, 0x15, 0x0A, 
-	0xB4, 0xC0, 0x12, 0xC0, 0x88, 0xCC, 0x52, 0xC0, 
-	0xB4, 0xC4, 0x42, 0x06, 0x5B, 0x04, 0x2D, 0x07, 
-	0x18, 0x00, 0x41, 0x8B, 0x0A, 0x00, 0xEC, 0x16, 
-	0xC1, 0x82, 0xEA, 0x16, 0xC2, 0x02, 0x42, 0x02, 
-	0x00, 0x02, 0xE6, 0x16, 0x80, 0x03, 0x81, 0x07, 
-	0x01, 0x00, 0xF1, 0x10, 0x01, 0x02, 0x02, 0x00, 
-	0xEE, 0x10, 0x01, 0x02, 0x04, 0x00, 0xEB, 0x10, 
-	0x01, 0x02, 0x08, 0x00, 0xE8, 0x10, 0x01, 0x02, 
-	0x10, 0x00, 0xE5, 0x10, 0xA1, 0x02, 0x41, 0x8B, 
-	0x10, 0x00, 0x02, 0x13, 0x60, 0x04, 0x5C, 0xEA, 
-	0x2D, 0x07, 0x18, 0x00, 0x80, 0x03, 0x09, 0x02, 
-	0x00, 0x08, 0x03, 0x02, 0x04, 0x00, 0xC7, 0x04, 
-	0xA0, 0x06, 0xDC, 0xEB, 0x60, 0x01, 0x1C, 0x01, 
-	0x04, 0x00, 0x1C, 0x16, 0xA0, 0x01, 0x40, 0x01, 
-	0x00, 0x08, 0xE0, 0x01, 0x40, 0x01, 0x00, 0x10, 
-	0x04, 0x02, 0x01, 0x00, 0x44, 0xCE, 0xC4, 0x06, 
-	0x44, 0xC6, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x10, 
-	0x49, 0x06, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 
-	0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xE0, 0x01, 
-	0x40, 0x01, 0x00, 0x08, 0xA0, 0x06, 0x7A, 0xEC, 
-	0xA0, 0x06, 0x7A, 0xEC, 0xC7, 0x05, 0x04, 0x02, 
-	0xE4, 0xE4, 0xE0, 0x04, 0xD0, 0x03, 0x74, 0xC1, 
-	0xB4, 0xC1, 0x86, 0x05, 0x1C, 0x13, 0xE0, 0x02, 
-	0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0xC0, 
-	0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC1, 0x40, 0xC1, 
-	0x80, 0xC1, 0xC0, 0xC1, 0x00, 0xC2, 0x40, 0xC2, 
-	0x80, 0xC2, 0xC0, 0xC2, 0x00, 0xC3, 0x40, 0xC3, 
-	0x80, 0xC3, 0xC0, 0xC3, 0xA0, 0x04, 0xAA, 0x00, 
-	0xD0, 0x03, 0xD0, 0x03, 0x3F, 0x10, 0x85, 0x05, 
-	0x85, 0x81, 0xE1, 0x13, 0xE4, 0x10, 0xC7, 0x05, 
-	0x05, 0x02, 0xFF, 0x7F, 0x45, 0xA1, 0xD0, 0x03, 
-	0xD0, 0x03, 0x34, 0x10, 0xC0, 0xCC, 0xC1, 0xC4, 
-	0x03, 0x02, 0x28, 0x00, 0xA0, 0x06, 0xDC, 0xEB, 
-	0xE0, 0x01, 0x42, 0x01, 0x00, 0x10, 0xC7, 0x05, 
-	0xD0, 0x03, 0xD0, 0x03, 0x27, 0x10, 0xC7, 0x05, 
-	0xA0, 0xC1, 0x4A, 0x01, 0xA0, 0x07, 0x4A, 0x01, 
-	0x00, 0x0E, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x02, 
-	0x20, 0x07, 0x44, 0x01, 0x60, 0xC1, 0x44, 0x01, 
-	0x85, 0x02, 0x00, 0xFF, 0x17, 0x16, 0xE0, 0x01, 
-	0x40, 0x01, 0x00, 0x22, 0x05, 0x02, 0xC0, 0x00, 
-	0x05, 0x06, 0xD0, 0x03, 0xFD, 0x16, 0x60, 0xC1, 
-	0x46, 0x01, 0x85, 0x02, 0x00, 0xFF, 0x0A, 0x13, 
-	0x05, 0x02, 0x93, 0x33, 0x05, 0x06, 0x00, 0x10, 
-	0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 
-	0xD0, 0x03, 0xF8, 0x16, 0x51, 0x10, 0x06, 0xC8, 
-	0x4A, 0x01, 0xC0, 0xCC, 0xC1, 0xC4, 0x4B, 0x10, 
-	0x13, 0xC0, 0xC8, 0xCC, 0x53, 0xC0, 0x02, 0x02, 
-	0xEC, 0xEB, 0xC2, 0xC4, 0x43, 0x06, 0x5B, 0x04, 
-	0x60, 0xC0, 0xAE, 0x00, 0xC4, 0x02, 0x44, 0x02, 
-	0x0F, 0x00, 0x44, 0x88, 0xCA, 0xE4, 0x3C, 0x16, 
-	0x81, 0x02, 0x08, 0x00, 0x27, 0x13, 0x21, 0xC1, 
-	0xDC, 0xE4, 0x14, 0xC1, 0x21, 0x21, 0xBA, 0xE4, 
-	0x33, 0x16, 0x21, 0xC1, 0xC2, 0xE4, 0x81, 0x02, 
-	0x00, 0x00, 0x0B, 0x13, 0x0D, 0x02, 0xA0, 0x00, 
-	0x84, 0x83, 0x09, 0x13, 0xC4, 0x05, 0x84, 0x83, 
-	0x06, 0x13, 0xC4, 0x05, 0x84, 0x83, 0x03, 0x13, 
-	0x23, 0x10, 0x0E, 0x81, 0x21, 0x16, 0x21, 0xC1, 
-	0xDC, 0xE4, 0x21, 0x45, 0xBA, 0xE4, 0xE0, 0x01, 
-	0x42, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, 
-	0x00, 0x10, 0xA1, 0xC3, 0xD4, 0xE4, 0x0F, 0x02, 
-	0x2F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x40, 0x01, 
-	0x00, 0x02, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 
-	0x6D, 0xC0, 0x0A, 0x00, 0x09, 0x13, 0x81, 0x02, 
-	0x5C, 0x12, 0x06, 0x1B, 0x0E, 0x02, 0xD2, 0xEB, 
-	0x0F, 0x02, 0x0F, 0x00, 0x80, 0x03, 0xCA, 0x05, 
-	0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x59, 0xCE, 
-	0x20, 0x88, 0xE4, 0xE4, 0xE4, 0xE4, 0xF8, 0x10, 
-	0xC1, 0x04, 0x48, 0x62, 0x89, 0x05, 0xA0, 0xC0, 
-	0x6C, 0x01, 0x08, 0xC8, 0x6C, 0x01, 0x03, 0x02, 
-	0x00, 0xFC, 0x04, 0x02, 0x00, 0x02, 0x73, 0xA0, 
-	0x04, 0x06, 0xFD, 0x16, 0x88, 0x05, 0x09, 0x06, 
-	0xF4, 0x16, 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x86, 
-	0x02, 0x16, 0xD0, 0x03, 0xCB, 0x05, 0x5B, 0x04, 
-	0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, 
-	0x38, 0x38, 0x42, 0x20, 0x20, 0x59, 0x49, 0x54, 
-	0x4B, 0xC2, 0xA8, 0x02, 0x98, 0x00, 0x83, 0x07, 
-	0x02, 0x00, 0x28, 0x02, 0x08, 0x00, 0x23, 0xC6, 
-	0x36, 0xE5, 0x48, 0x06, 0xC4, 0xC0, 0x73, 0x0A, 
-	0x65, 0x17, 0xA0, 0x06, 0xAA, 0xED, 0xC8, 0xC1, 
-	0xC7, 0x05, 0x03, 0x02, 0xA5, 0x00, 0xB0, 0x03, 
-	0xF8, 0xCD, 0xF8, 0xCD, 0xA6, 0x02, 0x06, 0x62, 
-	0x88, 0x02, 0x0A, 0x00, 0x57, 0x16, 0x03, 0x29, 
-	0x55, 0x16, 0x05, 0x29, 0xC4, 0x80, 0x52, 0x16, 
-	0x15, 0x09, 0x50, 0x17, 0x15, 0x09, 0x4E, 0x18, 
-	0x85, 0x02, 0x29, 0x00, 0x4B, 0x16, 0xC6, 0x05, 
-	0x96, 0x00, 0x03, 0x07, 0xC4, 0x04, 0x45, 0x06, 
-	0x95, 0x00, 0x44, 0x05, 0x43, 0x16, 0x44, 0x81, 
-	0x41, 0x16, 0x00, 0x03, 0x05, 0x00, 0xC4, 0x02, 
-	0x00, 0x03, 0x0A, 0x00, 0x44, 0x02, 0x0F, 0x00, 
-	0x84, 0x02, 0x05, 0x00, 0x37, 0x16, 0xC4, 0x02, 
-	0x00, 0x03, 0x0F, 0x00, 0x44, 0x02, 0x0F, 0x00, 
-	0x84, 0x02, 0x0A, 0x00, 0x2F, 0x16, 0x04, 0x02, 
-	0xFE, 0xFF, 0x2C, 0x13, 0x2B, 0x15, 0x2A, 0x1A, 
-	0x84, 0x05, 0x28, 0x12, 0x27, 0x15, 0x26, 0x1A, 
-	0x25, 0x18, 0x84, 0x05, 0x23, 0x16, 0x22, 0x1B, 
-	0x21, 0x17, 0x84, 0x05, 0x1F, 0x13, 0x1E, 0x1A, 
-	0x1D, 0x11, 0x04, 0x06, 0x1B, 0x16, 0xA5, 0x02, 
-	0xC5, 0xC1, 0x25, 0x02, 0x06, 0x00, 0x03, 0x02, 
-	0xA5, 0xA5, 0x83, 0xC1, 0x95, 0x00, 0x03, 0x38, 
-	0x94, 0x00, 0x83, 0x02, 0x2E, 0x6B, 0x0E, 0x16, 
-	0x84, 0x02, 0x59, 0x1C, 0x0B, 0x16, 0x24, 0x02, 
-	0x69, 0x00, 0x95, 0x00, 0x03, 0x3C, 0x94, 0x00, 
-	0x83, 0x81, 0x04, 0x16, 0x84, 0x02, 0x69, 0x00, 
-	0x01, 0x16, 0xC9, 0x05, 0x59, 0x04, 0xC3, 0xD0, 
-	0xFD, 0x13, 0x01, 0x1C, 0xFB, 0x10, 0xE0, 0x90, 
-	0x3D, 0xE5, 0xF8, 0x16, 0xC3, 0x06, 0xC3, 0xD0, 
-	0xF5, 0x1C, 0xF4, 0x16, 0xE0, 0x90, 0x3A, 0xE5, 
-	0xF1, 0x16, 0x5B, 0x04, 0x0B, 0xC3, 0x09, 0x02, 
-	0x3E, 0xE5, 0xA0, 0x06, 0x92, 0xE9, 0xCC, 0x05, 
-	0x5C, 0x04, 0x88, 0x07, 0x00, 0xA0, 0x89, 0x07, 
-	0xFE, 0xFF, 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 
-	0x02, 0xE0, 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 
-	0x88, 0x07, 0x00, 0x90, 0x89, 0x07, 0xFE, 0x9F, 
-	0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 0x78, 0xE0, 
-	0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 0xA0, 0x06, 
-	0xC4, 0xEC, 0x00, 0x00, 0xE6, 0x10, 0xE5, 0x10, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 
-	0x00, 0x08, 0x11, 0xE3, 0x6C, 0xCC, 0x00, 0x80, 
-	0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 
-	0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0xFF, 
-	0xFF, 0x00, 0xF0, 0xFF, 0x00, 0xF0, 0x0F, 0x00,  
-	0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00,  
-	0xC3, 0x00, 0xE7, 0xE7, 0xF3, 0xE7, 0xF1, 0xF1, 
-	0x43, 0x28, 0x20, 0x29, 0x4F, 0x43, 0x59, 0x50, 
-	0x49, 0x52, 0x48, 0x47, 0x20, 0x54, 0x42, 0x49, 
-	0x20, 0x4D, 0x39, 0x31, 0x33, 0x38, 0x34, 0x2C, 
-	0x35, 0x2C, 0x36, 0x2C, 0x43, 0x28, 0x20, 0x29, 
-	0x4F, 0x43, 0x59, 0x50, 0x49, 0x52, 0x48, 0x47, 
-	0x20, 0x54, 0x49, 0x54, 0x31, 0x20, 0x38, 0x39, 
-	0x2D, 0x33, 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 
-	0x38, 0x39, 0x00, 0x00, 0x61, 0x9B, 0xC4, 0xEC, 
-	0x0E, 0xEA, 0xDE, 0xE5, 0xC8, 0xED, 0x00, 0x00, 
-	0xC4, 0x00, 0xB8, 0xAF, 0x4A, 0x06, 0x50, 0x06, 
-	0x4C, 0x06, 0xDC, 0xCC, 0x4E, 0x06, 0x0F, 0x00, 
-	0x32, 0x06, 0x01, 0x00, 0x50, 0x07, 0x58, 0x07, 
-	0x52, 0x07, 0x70, 0xB5, 0x54, 0x07, 0x0F, 0x00, 
-	0x38, 0x07, 0x01, 0x00, 0xBA, 0x00, 0xA0, 0x00, 
-	0xBC, 0x00, 0xD6, 0xED, 0xBE, 0x00, 0x0F, 0x00, 
-	0x5E, 0x07, 0x3A, 0x07, 0x62, 0x07, 0x40, 0x80, 
-	0x64, 0x07, 0x54, 0xBA, 0x66, 0x07, 0x36, 0xBA, 
-	0x68, 0x07, 0x40, 0xB8, 0x98, 0x07, 0x00, 0x80, 
-	0x78, 0x07, 0x00, 0x80, 0xE2, 0x08, 0x04, 0x00, 
-	0xE4, 0x08, 0x01, 0x00, 0xEC, 0x08, 0x08, 0x00, 
-	0xF6, 0x08, 0x0A, 0x00, 0xF8, 0x08, 0x06, 0x00, 
-	0x00, 0x09, 0x0C, 0x00, 0x02, 0x09, 0x04, 0x00, 
-	0xAE, 0x01, 0x00, 0x00, 0x1E, 0x09, 0x00, 0x00, 
-	0x66, 0x09, 0x00, 0x00, 0x0C, 0x06, 0x13, 0x00, 
-	0x0A, 0x06, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x00, 
-	0x86, 0xA3, 0xE0, 0x00, 0xE6, 0xA2, 0xE0, 0x00, 
-	0x86, 0xA3, 0xE0, 0x00, 0x02, 0xA5, 0xE0, 0x00, 
-	0x5E, 0xA6, 0xE0, 0x00, 0x66, 0xA9, 0xE0, 0x00, 
-	0x12, 0xA4, 0xC0, 0x00, 0x22, 0xA4, 0xE0, 0x00, 
-	0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, 
-	0x74, 0xA4, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, 
-	0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, 
-	0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, 
-	0xDE, 0xAF, 0xC0, 0x00, 0x48, 0xB0, 0xC0, 0x00, 
-	0x84, 0xB0, 0xC0, 0x00, 0xF4, 0xB0, 0xC0, 0x00, 
-	0x76, 0xB1, 0xE0, 0x00, 0xE4, 0xB2, 0xE0, 0x00, 
-	0x8A, 0xB2, 0xE0, 0x00, 0xF4, 0xB3, 0xE0, 0x00, 
-	0x7C, 0xB3, 0xE0, 0x00, 0xC6, 0xAA, 0xC0, 0x00, 
-	0x36, 0xAB, 0xC0, 0x00, 0x90, 0xAB, 0xC0, 0x00, 
-	0xC2, 0xAB, 0xC0, 0x00, 0xEA, 0xAA, 0xC0, 0x00, 
-	0x80, 0xA3, 0xC0, 0x00, 0x80, 0xA3, 0x00, 0x3F, 
-	0x00, 0x7F, 0x00, 0x5E, 0x30, 0x00, 0x28, 0x00, 
-	0x43, 0x00, 0xB6, 0xA6, 0xB6, 0xA6, 0x1C, 0xA5, 
-	0x14, 0xA5, 0x46, 0xA5, 0x46, 0xA5, 0x62, 0xA5, 
-	0xB6, 0xA6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, 
-	0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, 
-	0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 
-	0x14, 0x00, 0x0E, 0x10, 0x0C, 0x0C, 0x0A, 0x0A, 
-	0x0A, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 
-	0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,  
-	0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
-	0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,  
-	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
-	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
-	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
-	0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x98, 0x07, 0x7E, 0xCA, 0x58, 0x07, 
-	0xF8, 0xB8, 0x58, 0x07, 0xFE, 0xB7, 0x58, 0x07, 
-	0x68, 0xB9, 0x58, 0x07, 0xD0, 0xB8, 0x98, 0x07, 
-	0x5A, 0xC7, 0x98, 0x07, 0x52, 0xC7, 0x78, 0x07, 
-	0xC2, 0xC1, 0x58, 0x07, 0x30, 0xB9, 0x98, 0x07, 
-	0x38, 0xCA, 0x78, 0x07, 0x96, 0xC2, 0x58, 0x07, 
-	0x6A, 0xC7, 0x58, 0x07, 0xE0, 0xB8, 0x58, 0x07, 
-	0x1E, 0xB9, 0x58, 0x07, 0xE2, 0xB9, 0x98, 0x07, 
-	0xAE, 0xCB, 0x98, 0x07, 0x8E, 0xC7, 0x78, 0x07, 
-	0x56, 0xC2, 0xB8, 0x07, 0x14, 0xCC, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xA2, 0xBA, 0x16, 0xC1, 
-	0xCA, 0xC1, 0xD6, 0xC6, 0x8A, 0xBD, 0xC2, 0xBD, 
-	0xE0, 0xBD, 0x6A, 0xBE, 0x8E, 0xBE, 0xAA, 0xBE, 
-	0x22, 0xBF, 0x22, 0xBF, 0x56, 0xBE, 0xC8, 0xBF, 
-	0x10, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 
-	0x00, 0x0C, 0x01, 0x0F, 0xFF, 0xFE, 0x00, 0x58, 
-	0x00, 0x0E, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x70, 
-	0x40, 0x80, 0x00, 0x5E, 0xA0, 0xC0, 0xDF, 0xFF, 
-	0x00, 0x18, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x50, 
-	0x00, 0x60, 0x00, 0x70, 0x00, 0x0C, 0x06, 0x00, 
-	0x00, 0x00, 0x84, 0xE3, 0xE6, 0x07, 0xF4, 0x07, 
-	0x08, 0x00, 0x00, 0x00, 0x8A, 0xE3, 0xEA, 0x07, 
-	0xF4, 0x07, 0x06, 0x00, 0x40, 0x00, 0x00, 0x0A, 
-	0xE6, 0x07, 0xEE, 0x07, 0x08, 0x00, 0x40, 0x00, 
-	0x06, 0x0A, 0xEA, 0x07, 0xEE, 0x07, 0x00, 0x00, 
-	0xE2, 0xC1, 0x8B, 0xD4, 0xFF, 0xFF, 0xD7, 0xD1, 
-	0xD9, 0xC5, 0xD4, 0xC3, 0x3B, 0x59, 0x34, 0x09, 
-	0xFC, 0x05, 0x6C, 0x09, 0xD8, 0x06, 0x06, 0x04, 
-	0xBA, 0xEA, 0x30, 0x09, 0x48, 0x04, 0x80, 0x08, 
-	0x06, 0x00, 0x0A, 0x06, 0x0E, 0x0C, 0xBA, 0xCE, 
-	0x2E, 0xE0, 0x56, 0xE0, 0x50, 0xE1, 0x66, 0xE2, 
-	0xEC, 0xE2, 0x4C, 0xE3, 0xFE, 0xE3, 0xBA, 0xCE, 
-	0x80, 0xE4, 0x10, 0xE4, 0x14, 0xE0, 0x1C, 0xE4, 
-	0x1C, 0xE4, 0x46, 0xE5, 0x50, 0xE5, 0x5A, 0xE5, 
-	0xBA, 0xCE, 0xA6, 0xDC, 0xBA, 0xCE, 0x44, 0xDA, 
-	0xE6, 0xDF, 0x70, 0xDA, 0xDE, 0xDE, 0xB0, 0xCE, 
-	0x16, 0xDB, 0x3A, 0xDD, 0xB8, 0xDD, 0x34, 0xDE, 
-	0x58, 0xDE, 0x16, 0xDB, 0xDA, 0xDC, 0x08, 0xCF, 
-	0xB0, 0xCE, 0xA8, 0xD9, 0x8A, 0xD9, 0x44, 0xD9, 
-	0xB0, 0xCE, 0xEA, 0xDE, 0xB0, 0xCE, 0x72, 0x06, 
-	0xF6, 0xD2, 0x08, 0x07, 0x72, 0x06, 0x54, 0xD2, 
-	0xF4, 0x01, 0x72, 0x06, 0x34, 0xD2, 0x08, 0x07, 
-	0x7C, 0x06, 0x5A, 0xDC, 0x04, 0x00, 0x7C, 0x06, 
-	0x78, 0xD2, 0x00, 0x00, 0x7C, 0x06, 0xCC, 0xDE, 
-	0xFA, 0x00, 0x86, 0x06, 0xAC, 0xD1, 0x05, 0x00, 
-	0x90, 0x06, 0x1C, 0xDF, 0x28, 0x00, 0x90, 0x06, 
-	0x50, 0xD3, 0x04, 0x01, 0x90, 0x06, 0x00, 0x00, 
-	0x02, 0x00, 0x90, 0x06, 0x80, 0xD2, 0xBC, 0x02, 
-	0x9A, 0x06, 0x06, 0xD3, 0xDC, 0x05, 0x9A, 0x06, 
-	0xAA, 0xD2, 0x64, 0x00, 0x9A, 0x06, 0x0A, 0xD3, 
-	0x14, 0x00, 0x9A, 0x06, 0xE2, 0xE0, 0x40, 0x06, 
-	0x9A, 0x06, 0x12, 0xD3, 0x64, 0x00, 0x7C, 0x06, 
-	0x16, 0xDC, 0x04, 0x00, 0x7C, 0x06, 0xE6, 0xDA,  
-	0x16, 0x00, 0x7C, 0x06, 0xFA, 0xDB, 0x05, 0x00, 
-	0x7C, 0x06, 0x00, 0xDD, 0x14, 0x00, 0x9A, 0x06, 
-	0x7C, 0xD3, 0x14, 0x00, 0x9A, 0x06, 0x38, 0xD4, 
-	0x02, 0x00, 0x7C, 0x06, 0x0C, 0xE0, 0x19, 0x00, 
-	0x00, 0x00, 0x0A, 0x07, 0x0E, 0x07, 0x04, 0x07, 
-	0xD8, 0x06, 0x00, 0x07, 0xF0, 0x06, 0xEE, 0x06, 
-	0xEC, 0x06, 0x0C, 0x07, 0xE6, 0x06, 0x18, 0x07, 
-	0x92, 0x09, 0x94, 0x09, 0x96, 0x09, 0x98, 0x09, 
-	0x00, 0x50, 0xCC, 0x00, 0x03, 0x00, 0x00, 0x84, 
-	0x00, 0xA8, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x80, 
-	0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, 
-	0x00, 0x40, 0x00, 0x10, 0x82, 0xEC, 0x48, 0xEB, 
-	0x62, 0xEB, 0x7C, 0xEB, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0xEA, 0xEB, 
-	0x52, 0xEB, 0x68, 0xEB, 0x82, 0xEB, 0x40, 0x01, 
-	0x42, 0x01, 0x42, 0x01, 0x42, 0x01, 0x00, 0x00, 
-	0x7F, 0x00, 0xA0, 0x00, 0xFF, 0x00, 0x10, 0x02, 
-	0x1F, 0x02, 0x30, 0x02, 0x3F, 0x02, 0x50, 0x02, 
-	0x5F, 0x02, 0x70, 0x02, 0x7F, 0x02, 0x90, 0x02, 
-	0x9F, 0x02, 0xB0, 0x02, 0xBF, 0x02, 0xD0, 0x02, 
-	0xDF, 0x02, 0xE1, 0x02, 0xFF, 0x02, 0x01, 0x03, 
-	0x7F, 0x03, 0x81, 0x03, 0x8F, 0x03, 0x91, 0x03, 
-	0x9F, 0x03, 0xA1, 0x03, 0xAF, 0x03, 0xB1, 0x03, 
-	0xBF, 0x03, 0xC1, 0x03, 0xCF, 0x03, 0xE1, 0x03, 
-	0xFF, 0x03, 0xC0, 0x07, 0xFF, 0x07, 0x00, 0x0C, 
-	0xFF, 0x0F, 0x00, 0x30, 0xFF, 0x37, 0xFF, 0xFF, 
-	0xFF, 0xFF, 0xBC, 0xFE, 0x07, 0x00, 0x5E, 0x02, 
-	0x00, 0x01, 0xFF, 0xBA, 0x80, 0xBA, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x0A, 0x01, 
-	0x0E, 0x01, 0x10, 0x01, 0x14, 0x01, 0x00, 0x00, 
-	0x12, 0x01, 0x00, 0xF8, 0x16, 0x01, 0x00, 0xFF, 
-	0x00, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x1C, 0x01, 
-	0x82, 0x01, 0x66, 0x96, 0x66, 0x96, 0x55, 0x55, 
-	0x00, 0x00, 0x82, 0x01, 0x2A, 0x8A, 0x2A, 0x8A, 
-	0x18, 0xC9, 0x18, 0xC9, 0x86, 0x01, 0xAA, 0xA2, 
-	0x1E, 0xA0, 0x55, 0x55, 0x1E, 0x54, 0x8A, 0x01, 
-	0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 
-	0x8C, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 
-	0x00, 0x00, 0x8E, 0x01, 0x00, 0x50, 0x00, 0x00, 
-	0x00, 0xA8, 0x00, 0x00, 0x90, 0x01, 0x00, 0x50, 
-	0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x92, 0x01, 
-	0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 
-	0x94, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 
-	0x00, 0x00, 0x96, 0x01, 0x00, 0x50, 0x00, 0x00, 
-	0x00, 0xA8, 0x00, 0x00, 0x98, 0x01, 0x00, 0x50, 
-	0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x9A, 0x01, 
-	0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 
-	0x9C, 0x01, 0x55, 0x55, 0xC0, 0x7F, 0xAA, 0xAA, 
-	0xC0, 0x7F, 0x00, 0x00, 0xA2, 0x01, 0xA4, 0x01, 
-	0xA8, 0x01, 0xAA, 0x01, 0xAE, 0x01, 0xB0, 0x01, 
-	0xB2, 0x01, 0x80, 0x01, 0x00, 0x00, 0x88, 0x01, 
-	0x00, 0xFF, 0x9E, 0x01, 0xFF, 0x00, 0xA0, 0x01, 
-	0x00, 0x80, 0xAC, 0x01, 0x00, 0x80, 0x00, 0x00, 
-	0xA6, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01, 
-	0xBC, 0x01, 0x00, 0x88, 0x00, 0x06, 0x00, 0xC8, 
-	0x00, 0x00, 0x00, 0x80, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x80, 0x02, 0x00, 0x44, 0x00, 0x92, 0xEA, 
-	0x48, 0x00, 0x98, 0xEA, 0x50, 0x00, 0x9E, 0xEA, 
-	0x60, 0x00, 0xA4, 0xEA, 0x78, 0x00, 0xAA, 0xEA, 
-	0x0A, 0xE8, 0x18, 0xE7, 0x3C, 0xEA, 0x2A, 0xE7, 
-	0x14, 0x55, 0xA0, 0x01, 0xEC, 0xE6, 0xD0, 0xE9, 
-	0x46, 0xE7, 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 
-	0x00, 0x00, 0x1E, 0x00, 0x46, 0xE7, 0x92, 0xE7, 
-	0x00, 0x41, 0x01, 0x41, 0xB6, 0xE7, 0x73, 0xEA, 
-	0x18, 0xE7, 0x48, 0xEA, 0xEC, 0xE6, 0x04, 0xEA, 
-	0x56, 0xE7, 0x62, 0xE7, 0xB6, 0xE7, 0x6E, 0xEA, 
-	0x62, 0xE8, 0x00, 0x00, 0x36, 0xE8, 0xEC, 0xE6, 
-	0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 0x36, 0xE8, 
-	0x62, 0xE8, 0x00, 0x00, 0xEC, 0xE6, 0xF0, 0xE9, 
-	0x0C, 0xE7, 0x4A, 0xE7, 0x62, 0xE7, 0x36, 0xE8, 
-	0xEC, 0xE6, 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 
-	0x36, 0xE8, 0x62, 0xE8, 0x00, 0x20, 0x2A, 0xE7, 
-	0x14, 0x55, 0xA0, 0x01, 0x18, 0xE7, 0x50, 0xEA, 
-	0xEC, 0xE6, 0xD0, 0xE9, 0x58, 0xE8, 0x50, 0x55, 
-	0x0C, 0x00, 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 
-	0x00, 0x00, 0xB6, 0xE7, 0x75, 0xEA, 0x00, 0xE7, 
-	0x58, 0xE8, 0x55, 0x55, 0x0C, 0x00, 0x56, 0xE7, 
-	0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 0xFF, 0xFF, 
-	0x08, 0x00, 0x58, 0xE8, 0x02, 0x10, 0x06, 0x00, 
-	0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 
-	0xB6, 0xE7, 0x80, 0xEA, 0x00, 0xE7, 0x58, 0xE8, 
-	0x00, 0xC0, 0x08, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 
-	0x0A, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 0x0C, 0x00, 
-	0x58, 0xE8, 0x0D, 0x10, 0x06, 0x00, 0x46, 0xE7, 
-	0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 0xB6, 0xE7, 
-	0x74, 0xEA, 0x62, 0xE8, 0x08, 0x20, 0x00, 0xE7, 
-	0x52, 0xE8, 0x82, 0x01, 0x02, 0xC9, 0x46, 0xE7, 
-	0xB6, 0xE7, 0x80, 0xEA, 0x62, 0xE8, 0x34, 0x20, 
-	0x00, 0xE7, 0x58, 0xE8, 0x00, 0x10, 0x06, 0x00, 
-	0x46, 0xE7, 0xC6, 0xE8, 0xB6, 0xE7, 0x78, 0xEA, 
-	0x52, 0xE8, 0x9C, 0x01, 0x40, 0x00, 0x18, 0xE7, 
-	0x50, 0xEA, 0x2A, 0xE7, 0xFF, 0x00, 0x80, 0x07, 
-	0x26, 0xE9, 0x03, 0x00, 0x66, 0xE9, 0x74, 0xE9, 
-	0x12, 0xEA, 0x38, 0xE9, 0x00, 0x00, 0x74, 0xE9, 
-	0x1C, 0xEA, 0x38, 0xE9, 0x04, 0x00, 0x74, 0xE9, 
-	0x24, 0xEA, 0x38, 0xE9, 0x07, 0x00, 0x74, 0xE9, 
-	0x2C, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x74, 0xE9, 
-	0x34, 0xEA, 0x38, 0xE9, 0x02, 0x00, 0x74, 0xE9, 
-	0x34, 0xEA, 0x38, 0xE9, 0x06, 0x00, 0x74, 0xE9, 
-	0x34, 0xEA, 0x38, 0xE9, 0x05, 0x00, 0x74, 0xE9, 
-	0x34, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x4A, 0xE9, 
-	0x26, 0xE9, 0x03, 0x00, 0x58, 0xE9, 0x62, 0xE7, 
-	0xE6, 0xE8, 0xD8, 0xE9, 0x01, 0x00, 0xE6, 0xE8, 
-	0x25, 0xEA, 0x02, 0x00, 0xE6, 0xE8, 0x2F, 0xEA, 
-	0x06, 0x00, 0xE6, 0xE8, 0x3A, 0xEA, 0x05, 0x00, 
-	0xB6, 0xE7, 0x74, 0xEA, 0x36, 0xE8, 0xEC, 0xE6, 
-	0xD0, 0xE9, 0x56, 0xE7, 0xC6, 0xE8, 0x0C, 0xE7, 
-	0x92, 0xE7, 0x00, 0x01, 0x00, 0x80, 0xB6, 0xE7, 
-	0x78, 0xEA, 0x00, 0xE7, 0xFE, 0xE8, 0x52, 0xE8, 
-	0x80, 0x01, 0x41, 0x8E, 0x4A, 0xE7, 0x92, 0xE7, 
-	0x00, 0x01, 0x01, 0x1B, 0x06, 0xE9, 0xE4, 0xFF, 
-	0xB6, 0xE7, 0x7C, 0xEA, 0xBE, 0xE8, 0x18, 0xE7, 
-	0x56, 0xEA, 0x0C, 0xE7, 0x6A, 0xE8, 0x3C, 0xE7, 
-	0x00, 0xE0, 0xC6, 0xE8, 0xB6, 0xE7, 0x86, 0xEA, 
-	0x3C, 0xE7, 0x00, 0xE8, 0x62, 0xE7, 0xB6, 0xE7, 
-	0x85, 0xEA, 0x3C, 0xE7, 0x00, 0x08, 0xC6, 0xE8, 
-	0xB6, 0xE7, 0x86, 0xEA, 0x3C, 0xE7, 0x00, 0xF8, 
-	0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, 
-	0x80, 0x01, 0x00, 0x02, 0x3C, 0xE7, 0x00, 0xE0, 
-	0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, 
-	0x84, 0x01, 0x00, 0x00, 0x62, 0xE8, 0x34, 0x00, 
-	0x3C, 0xE7, 0x00, 0x00, 0xC6, 0xE8, 0x62, 0xE8, 
-	0x34, 0x60, 0x0E, 0xE9, 0x52, 0xE8, 0x84, 0x01, 
-	0x00, 0x00, 0xB6, 0xE7, 0x86, 0xEA, 0x52, 0xE8, 
-	0x82, 0x01, 0x00, 0xC8, 0x3C, 0xE7, 0x00, 0xE0, 
-	0xC6, 0xE8, 0x3C, 0xE7, 0x00, 0x10, 0xC6, 0xE8, 
-	0x62, 0xE8, 0x34, 0x60, 0x52, 0xE8, 0x80, 0x01, 
-	0x00, 0x06, 0x3C, 0xE7, 0x10, 0x00, 0x78, 0xE8, 
-	0x36, 0xE8, 0x52, 0xE8, 0x84, 0x01, 0x00, 0x00, 
-	0x62, 0xE8, 0x34, 0x00, 0xEC, 0xE6, 0xD0, 0xE9, 
-	0x18, 0xE7, 0x5C, 0xEA, 0xD0, 0xE8, 0x92, 0xE9, 
-	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xF0, 
-	0x06, 0x00, 0x00, 0xC7, 0xA0, 0xE7, 0xDC, 0xE8, 
-	0x00, 0xE0, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 
-	0x40, 0xD0, 0x06, 0x00, 0x00, 0xE0, 0xA0, 0xE7, 
-	0xDC, 0xE8, 0x00, 0xC0, 0x00, 0xE7, 0x0C, 0xE7, 
-	0x70, 0xE7, 0x40, 0x90, 0x06, 0x00, 0x00, 0xA0, 
-	0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x80, 0x00, 0xE7, 
-	0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x50, 0x06, 0x00, 
-	0x00, 0x60, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x40, 
-	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x10, 
-	0x06, 0x00, 0x00, 0x20, 0xA0, 0xE7, 0xDC, 0xE8,  
-	0x00, 0x00, 0xD0, 0xE8, 0x92, 0xE9, 0x00, 0xE7,  
-	0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xD0, 0x06, 0x00, 
-	0x00, 0xA6, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0xC0, 
-	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x90, 
-	0x06, 0x00, 0x00, 0xC0, 0xA0, 0xE7, 0xDC, 0xE8, 
-	0x00, 0x80, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 
-	0x40, 0x50, 0x06, 0x00, 0x00, 0x40, 0xA0, 0xE7, 
-	0xDC, 0xE8, 0x00, 0x40, 0x00, 0xE7, 0x0C, 0xE7, 
-	0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 0x00, 0x60, 
-	0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 0x7E, 0xE9, 
-	0x90, 0xE9, 0x18, 0xE7, 0x62, 0xEA, 0xEC, 0xE6, 
-	0xD0, 0xE9, 0xA4, 0xE8, 0x55, 0x55, 0x16, 0x00, 
-	0x46, 0xE7, 0x92, 0xE7, 0x00, 0x00, 0x00, 0x00, 
-	0xB6, 0xE7, 0x8B, 0xEA, 0x0A, 0xE8, 0x18, 0xE7, 
-	0x62, 0xEA, 0x58, 0xE8, 0x55, 0x55, 0x16, 0x00, 
-	0x00, 0xE7, 0x46, 0xE7, 0xA0, 0xE7, 0x2A, 0xE7, 
-	0xFF, 0x00, 0x00, 0x08, 0x2A, 0xE7, 0xFF, 0x00, 
-	0x00, 0x0C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x10,  
-	0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x14, 0x2A, 0xE7, 
-	0xFF, 0x00, 0x00, 0x18, 0x2A, 0xE7, 0xFF, 0x00, 
-	0x00, 0x1C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x20, 
-	0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x24, 0x2A, 0xE7, 
-	0xFF, 0x00, 0x00, 0x28, 0x2A, 0xE7, 0xFF, 0x00, 
-	0x00, 0x2C, 0xD2, 0xE7, 0x00, 0xE7, 0x0C, 0xE7, 
-	0x70, 0xE7, 0x40, 0x30, 0x06, 0x00, 0x00, 0x01, 
-	0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x20, 0x00, 0xE7, 
-	0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 
-	0x00, 0x43, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 
-	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xB0, 
-	0x06, 0x00, 0x00, 0x85, 0xA0, 0xE7, 0xDC, 0xE8, 
-	0x00, 0xA0, 0xD8, 0xE8, 0x00, 0x01, 0x03, 0x01, 
-	0x01, 0x01, 0x00, 0x00, 0x00, 0x81, 0x1A, 0x00, 
-	0x40, 0x10, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
-	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x72, 0x82, 
-	0x4A, 0xA9, 0xA5, 0x5A, 0xDA, 0xE7, 0x03, 0x09, 
-	0x11, 0x9D, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 
-	0xD8, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x81, 
-	0x04, 0x00, 0xD8, 0x90, 0xD8, 0xB4, 0x00, 0x00, 
-	0x00, 0x81, 0x08, 0x00, 0xD8, 0x90, 0x46, 0x16, 
-	0x00, 0x40, 0xD8, 0xB4, 0x08, 0x00, 0x00, 0x00, 
-	0x00, 0x80, 0x13, 0x00, 0x40, 0x10, 0x16, 0x00, 
-	0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x15, 0x00, 
-	0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x15, 0x00, 
-	0x00, 0x00, 0x00, 0x81, 0x0F, 0x00, 0x06, 0x00, 
-	0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x0A, 0x80, 
-	0x40, 0x9E, 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 
-	0x0F, 0x00, 0x06, 0x80, 0x40, 0xFE, 0x00, 0xCC, 
-	0x00, 0x00, 0x04, 0x80, 0x40, 0x8E, 0x00, 0xC9, 
-	0x04, 0x80, 0x00, 0x06, 0x00, 0xCC, 0x04, 0x80, 
-	0x40, 0x0A, 0x00, 0xC8, 0x0A, 0x80, 0x40, 0x8A, 
-	0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 0x0F, 0x00, 
-	0x0A, 0x08, 0x80, 0x1C, 0x0A, 0x00, 0x1C, 0x1A, 
-	0x00, 0x80, 0x1C, 0x0C, 0x00, 0x80, 0x1C, 0x1A, 
-	0x00, 0x80, 0x1A, 0x0E, 0x80, 0x1C, 0x04, 0x00, 
-	0x00, 0x80, 0x80, 0x02, 0x02, 0x00, 0x00, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 
-	0x40, 0x00, 0x00, 0x00, 0x58, 0x07, 0x0C, 0xB8, 
-	0x16, 0xE0, 0xE2, 0x08, 0xEC, 0x08, 0xF6, 0x08, 
-	0x16, 0xE0, 0x00, 0x09, 0x0A, 0x09, 0x00, 0x00, 
-	0x00, 0x00, 0xE2, 0x08, 0x00, 0x00, 0xEC, 0x08, 
-	0xF6, 0x08, 0x00, 0x09, 0x00, 0x00, 0xB8, 0x07, 
-	0xCA, 0xCB, 0x80, 0x02, 0xB8, 0x07, 0xE8, 0xCB, 
-	0x84, 0xFF, 0xB8, 0x07, 0x0A, 0xCC, 0xB8, 0x07, 
-	0x84, 0xCC, 0x6E, 0xCD, 0x62, 0xCD, 0x88, 0xCD, 
-	0x90, 0xCE, 0x84, 0xCD, 0x92, 0xCE, 0x92, 0xCE, 
-	0x92, 0xCE, 0x8C, 0xCD, 0x96, 0xCD, 0x38, 0xCE, 
-	0x82, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 
-	0x92, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x08, 0x00, 0x08, 0x01, 0x05, 0x08, 
-	0x08, 0x08, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, 
-	0x00, 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0x04, 
-	0x0A, 0x08, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x00, 
-	0x04, 0x41, 0x06, 0x0B, 0x08, 0xC2, 0x00, 0xE6, 
-	0x00, 0xE7, 0x04, 0x06, 0x04, 0x07, 0x04, 0x03, 
-	0x06, 0x04, 0x04, 0x05, 0x04, 0x88, 0x04, 0xCF, 
-	0x04, 0xCD, 0x03, 0x00, 0x05, 0x00, 0x1C, 0x00, 
-	0x00, 0x0C, 0x00, 0x80, 0xD2, 0xD8, 0xDA, 0xD8, 
-	0x1E, 0xD9, 0xDE, 0xD8, 0xEA, 0xD8, 0xF0, 0xD8, 
-	0x14, 0xD9, 0xE4, 0xD8, 0x32, 0xD9, 0x00, 0x06, 
-	0x00, 0x00, 0x03, 0x07, 0x0A, 0x0E, 0x0F, 0x14, 
-	0x26, 0x2A, 0x52, 0x42, 0x50, 0x48, 0x5D, 0x4D, 
-	0x62, 0x62, 0x6D, 0x57, 0x46, 0x39, 0x1A, 0x1D, 
-	0x7C, 0x76, 0x1F, 0x23, 0x15, 0x1D, 0x74, 0x6F, 
-	0x84, 0x7C, 0x8B, 0x82, 0x92, 0x89, 0x00, 0x00, 
-	0x32, 0x2F, 0x3F, 0x34, 0x32, 0x01, 0x01, 0x57, 
-	0x32, 0x11, 0x81, 0x51, 0x02, 0x56, 0x03, 0x55, 
-	0x54, 0x11, 0x56, 0x81, 0x55, 0x02, 0x54, 0x02, 
-	0x56, 0x81, 0x01, 0x76, 0x02, 0x34, 0x02, 0x55, 
-	0x81, 0x54, 0x02, 0x58, 0x02, 0x55, 0x81, 0x54, 
-	0x02, 0x58, 0x11, 0x12, 0x02, 0x52, 0x58, 0x83, 
-	0x52, 0x05, 0x83, 0x04, 0x02, 0x58, 0x08, 0x55, 
-	0x58, 0x83, 0x55, 0x02, 0x81, 0x02, 0x05, 0x58, 
-	0x03, 0x52, 0x5C, 0x15, 0x53, 0x5B, 0x52, 0x87, 
-	0x11, 0x03, 0x41, 0x51, 0x78, 0x51, 0x34, 0x11, 
-	0x81, 0x11, 0x20, 0x31, 0x54, 0x57, 0x01, 0x53, 
-	0x5A, 0x12, 0x81, 0x51, 0x20, 0x31, 0x5B, 0x57, 
-	0x01, 0x5A, 0x01, 0x11, 0x51, 0x11, 0x31, 0x81, 
-	0x57, 0x20, 0x15, 0x01, 0x13, 0x01, 0x11, 0x01, 
-	0x11, 0x11, 0x81, 0x51, 0x05, 0x58, 0x02, 0x52, 
-	0x5B, 0x54, 0x5D, 0x81, 0x52, 0x05, 0x54, 0x02, 
-	0x58, 0x81, 0x50, 0x02, 0x13, 0x03, 0x58, 0x81, 
-	0x50, 0x02, 0x11, 0x03, 0x81, 0x54, 0x72, 0x5D, 
-	0x50, 0x03, 0x13, 0x03, 0x13, 0x01, 0x40, 0x54, 
-	0x0E, 0x00, 0x20, 0x06, 0x56, 0x06, 0x0C, 0xDA, 
-	0x24, 0x00, 0x02, 0x10, 0x16, 0x00, 0x02, 0x00, 
-	0x01, 0x04, 0x08, 0x07, 0x0C, 0xDA, 0x20, 0x00, 
-	0x03, 0x10, 0x12, 0x00, 0x03, 0x00, 0x4E, 0xD9, 
-	0x14, 0x8E, 0x20, 0x00, 0x04, 0x10, 0x12, 0x00, 
-	0x04, 0x00, 0xD2, 0xCE, 0x20, 0x00, 0x05, 0xE0, 
-	0x12, 0x00, 0x05, 0x00, 0xD2, 0xCE, 0x20, 0x00, 
-	0x06, 0xE0, 0x12, 0x00, 0x06, 0x00, 0xE8, 0xDD, 
-	0x12, 0x00, 0x01, 0xE0, 0x6C, 0x09, 0xCC, 0x06, 
-	0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x30, 0x06, 
-	0x42, 0xDC, 0xF0, 0x05, 0x00, 0xE0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xE2, 0x05, 0x08, 0x00, 
-	0x26, 0xFF, 0xDC, 0x05, 0x00, 0x00, 0x30, 0x06, 
-	0xF8, 0xDB, 0x1E, 0x00, 0x01, 0xE0, 0x10, 0x00, 
-	0x11, 0x30, 0x0C, 0x04, 0x01, 0x00, 0x0E, 0x04, 
-	0x02, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x32, 0xDD, 0x12, 0x00, 0x01, 0xE0, 
-	0x04, 0x00, 0x13, 0x30, 0x74, 0xDE, 0x3E, 0x00, 
-	0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, 
-	0x30, 0x00, 0x20, 0x50, 0x23, 0x0C, 0xFC, 0x05, 
-	0x52, 0x06, 0x56, 0x06, 0x00, 0x00, 0x00, 0x81, 
-	0x16, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 
-	0x10, 0x00, 0x08, 0x00, 0x2A, 0x40, 0x2A, 0x04, 
-	0x56, 0x06, 0x26, 0x00, 0x19, 0xED, 0x2B, 0x06, 
-	0x72, 0x09, 0x22, 0x00, 0x24, 0x00, 0x2F, 0xED, 
-	0x23, 0x0C, 0xFC, 0x05, 0x28, 0x08, 0x34, 0x09, 
-	0x29, 0x08, 0x58, 0x07, 0x78, 0x07, 0x98, 0x07, 
-	0x23, 0x00, 0x2A, 0x00, 0x3D, 0xED, 0x06, 0x04, 
-	0xF0, 0x06, 0x07, 0x04, 0xEE, 0x06, 0x24, 0x00, 
-	0xD2, 0xCE, 0x34, 0x00, 0x00, 0xE0, 0x00, 0xC0, 
-	0x00, 0x00, 0x10, 0x00, 0x26, 0x00, 0x25, 0x40, 
-	0xD2, 0xCE, 0x20, 0x00, 0x00, 0xE0, 0x00, 0xC0, 
-	0x00, 0x00, 0x10, 0x00, 0x12, 0x00, 0x26, 0x40, 
-	0xD2, 0xCE, 0x1A, 0x00, 0x00, 0xE0, 0x0C, 0x00, 
-	0x27, 0x60, 0x0A, 0x08, 0xE6, 0x06, 0xD2, 0xCE, 
-	0x24, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x28, 0x60, 
-	0x30, 0x04, 0x06, 0x07, 0x52, 0xCF, 0x00, 0x81, 
-	0x30, 0x00, 0x00, 0xE0, 0x22, 0x00, 0x29, 0x60, 
-	0x2D, 0x08, 0x1C, 0x07, 0x2E, 0x08, 0x22, 0x07, 
-	0x00, 0x00, 0x08, 0x02, 0x06, 0x01, 0x14, 0x06, 
-	0x18, 0x08, 0x20, 0x0C, 0x26, 0x0E, 0x30, 0x0F, 
-	0x34, 0x11, 0x3E, 0x12, 0x42, 0x14, 0x46, 0x16, 
-	0x1C, 0x0A, 0x4A, 0x18, 0x13, 0x03, 0x11, 0x83, 
-	0x01, 0x11, 0x11, 0x81, 0x12, 0x81, 0x13, 0x01, 
-	0x52, 0x83, 0x81, 0x85, 0x85, 0x11, 0x12, 0x81, 
-	0x12, 0x81, 0x19, 0x81, 0x60, 0x85, 0x00, 0xC0, 
-	0x00, 0x00, 0x08, 0x00, 0x6C, 0x09, 0x00, 0x00, 
-	0x30, 0x06, 0x08, 0xE5, 0x54, 0x06, 0x50, 0x06, 
-	0x38, 0x02, 0x21, 0x04, 0x1E, 0x09, 0x0B, 0x06, 
-	0xD8, 0x06, 0x02, 0x08, 0xDC, 0x06, 0x00, 0xC0, 
-	0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x41, 0x00, 
-	0x14, 0xAE, 0x00, 0x00, 0x00, 0x81, 0x09, 0x04, 
-	0x0C, 0x07, 0x41, 0x00, 0x41, 0x00, 0x14, 0x02, 
-	0x00, 0x00, 0x00, 0x81, 0x0B, 0x06, 0xD8, 0x06, 
-	0x2C, 0x06, 0x76, 0x09, 0x22, 0x14, 0x3A, 0x09, 
-	0x41, 0x00, 0x41, 0x00, 0x54, 0x02, 0x00, 0x00, 
-	0x00, 0x81, 0xD8, 0x06, 0x00, 0x84, 0x00, 0x48, 
-	0xFC, 0xFF, 0x09, 0x00, 0x00, 0xC0, 0x00, 0x00, 
-	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x20, 0x00, 
-	0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, 
-	0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 0x38, 0x39, 
-	0x54, 0x20, 0x78, 0x65, 0x73, 0x61, 0x49, 0x20, 
-	0x73, 0x6E, 0x72, 0x74, 0x6D, 0x75, 0x6E, 0x65, 
-	0x73, 0x74, 0x28, 0x0A, 0x29, 0x43, 0x39, 0x31, 
-	0x33, 0x38, 0x34, 0x2C, 0x35, 0x2C, 0x36, 0x2C, 
-	0x49, 0x20, 0x4D, 0x42, 0x43, 0x20, 0x72, 0x6F, 
-	0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x34, 0x90, 
-	0x00, 0x00, 0xFA, 0xFF, 0x01, 0x00, 0xB8, 0xFF, 
-	0x00, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0x80, 0x00, 
-	0x3E, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00  
-};
-#endif /* CONFIG_SKTR */
diff -u --recursive --new-file v2.3.21/linux/drivers/net/tokenring/tms380tr.c linux/drivers/net/tokenring/tms380tr.c
--- v2.3.21/linux/drivers/net/tokenring/tms380tr.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/tokenring/tms380tr.c	Thu Oct 14 14:22:09 1999
@@ -0,0 +1,2749 @@
+/*
+ *  tms380tr.c: A network driver for Texas Instruments TMS380-based
+ *              Token Ring Adapters.
+ *
+ *  Originally sktr.c: Written 1997 by Christoph Goos
+ *
+ *  A fine result of the Linux Systems Network Architecture Project.
+ *  http://www.linux-sna.org
+ *
+ *  This software may be used and distributed according to the terms
+ *  of the GNU Public License, incorporated herein by reference.
+ *
+ *  This device driver works with the following TMS380 adapters:
+ *	- SysKonnect TR4/16(+) ISA	(SK-4190)
+ *	- SysKonnect TR4/16(+) PCI	(SK-4590)
+ *	- SysKonnect TR4/16 PCI		(SK-4591)
+ *      - Compaq TR 4/16 PCI
+ *      - Thomas-Conrad TC4048 4/16 PCI
+ *      - Any ISA or PCI adapter using only the TMS380 chipset
+ *
+ *  Sources:
+ *  	- The hardware related parts of this driver are take from
+ *  	  the SysKonnect Token Ring driver for Windows NT.
+ *  	- I used the IBM Token Ring driver 'ibmtr.c' as a base for this
+ *  	  driver, as well as the 'skeleton.c' driver by Donald Becker.
+ *  	- Also various other drivers in the linux source tree were taken
+ *  	  as samples for some tasks.
+ *      - TI TMS380 Second-Generation Token Ring User's Guide
+ *      - TI datasheets for respective chips
+ *	- David Hein at Texas Instruments 
+ *
+ *  Maintainer(s):
+ *    JS        Jay Schulist            jschlst@samba.anu.edu.au
+ *    CG	Christoph Goos		cgoos@syskonnect.de
+ *    AF        Adam Fritzler           mid@auk.cx
+ *
+ *  Modification History:
+ *	29-Aug-97	CG	Created
+ *	04-Apr-98	CG	Fixed problems caused by tok_timer_check
+ *	10-Apr-98	CG	Fixed lockups at cable disconnection
+ *	27-May-98	JS	Formated to Linux Kernel Format
+ *	31-May-98	JS	Hacked in PCI support
+ *	16-Jun-98	JS	Modulized for multiple cards with one driver
+ *         Sep-99       AF      Renamed to tms380tr (supports more than SK's)
+ *      23-Sep-99       AF      Added Compaq and Thomas-Conrad PCI support
+ *                              Fixed a bug causing double copies on PCI
+ *                              Fixed for new multicast stuff (2.2/2.3)
+ *	25-Sep-99	AF	Uped TPL_NUM from 3 to 9
+ *				Removed extraneous 'No free TPL'
+ *
+ *  To do:
+ *    1. Selectable 16 Mbps or 4Mbps
+ *    2. Multi/Broadcast packet handling (this may have fixed itself)
+ *
+ */
+
+static const char *version = "tms380tr.c: v1.03 29/09/1999 by Christoph Goos, Adam Fritzler\n";
+
+#ifdef MODULE
+#include <linux/module.h>
+#include <linux/version.h>
+#endif
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/fcntl.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+#include <linux/ioport.h>
+#include <linux/in.h>
+#include <linux/malloc.h>
+#include <linux/string.h>
+#include <linux/time.h>
+#include <asm/system.h>
+#include <asm/bitops.h>
+#include <asm/io.h>
+#include <asm/dma.h>
+#include <asm/irq.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/pci.h>
+
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include <linux/trdevice.h>
+
+#include "tms380tr.h"		/* Our Stuff */
+#include "tms380tr_microcode.h"	/* TI microcode for COMMprocessor */
+
+/* A zero-terminated list of I/O addresses to be probed. */
+static unsigned int tms380tr_portlist[] __initdata = {
+	0x0A20, 0x1A20, 0x0B20, 0x1B20, 0x0980, 0x1980, 0x0900, 0x1900,
+	0
+};
+
+/* A zero-terminated list of IRQs to be probed. 
+ * Used again after initial probe for tms380tr_chipset_init, called from tms380tr_open.
+ */
+static unsigned short tms380tr_irqlist[] = {
+	3, 5, 9, 10, 11, 12, 15,
+	0
+};
+
+/* A zero-terminated list of DMAs to be probed. */
+static int tms380tr_dmalist[] __initdata = {
+	5, 6, 7,
+	0
+};
+
+/* 
+ * Table used for card detection and type determination.
+ */
+struct cardinfo_table  cardinfo[] = {
+  { 0, 0, 0, 
+    "Unknown TMS380 Token Ring Adapter"},
+  { TMS_ISA, 0, 0, 
+    "SK NET TR 4/16 ISA"},
+  { TMS_PCI, PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_TOKENRING, 
+    "Compaq 4/16 TR PCI"},
+  { TMS_PCI, PCI_VENDOR_ID_SK, PCI_DEVICE_ID_SK_TR, 
+    "SK NET TR 4/16 PCI"},
+  { TMS_PCI, PCI_VENDOR_ID_TCONRAD, PCI_DEVICE_ID_TCONRAD_TOKENRING,
+    "Thomas-Conrad TC4048 PCI 4/16"},
+  { 0, 0, 0, NULL}
+};
+
+/* Use 0 for production, 1 for verification, 2 for debug, and
+ * 3 for very verbose debug.
+ */
+#ifndef TMS380TR_DEBUG
+#define TMS380TR_DEBUG 0
+#endif
+static unsigned int tms380tr_debug = TMS380TR_DEBUG;
+
+/* The number of low I/O ports used by the tokencard. */
+#define TMS380TR_IO_EXTENT 32
+
+/* Index to functions, as function prototypes.
+ * Alphabetical by function name.
+ */
+
+/* "B" */
+static int      tms380tr_bringup_diags(struct net_device *dev);
+/* "C" */
+static void	tms380tr_cancel_tx_queue(struct net_local* tp);
+static int 	tms380tr_chipset_init(struct net_device *dev);
+static void 	tms380tr_chk_irq(struct net_device *dev);
+static unsigned char tms380tr_chk_frame(struct net_device *dev, unsigned char *Addr);
+static void 	tms380tr_chk_outstanding_cmds(struct net_device *dev);
+static void 	tms380tr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr);
+static unsigned char tms380tr_chk_ssb(struct net_local *tp, unsigned short IrqType);
+static int 	tms380tr_close(struct net_device *dev);
+static void 	tms380tr_cmd_status_irq(struct net_device *dev);
+/* "D" */
+static void 	tms380tr_disable_interrupts(struct net_device *dev);
+#if TMS380TR_DEBUG > 0
+static void 	tms380tr_dump(unsigned char *Data, int length);
+#endif
+/* "E" */
+static void 	tms380tr_enable_interrupts(struct net_device *dev);
+static void 	tms380tr_exec_cmd(struct net_device *dev, unsigned short Command);
+static void 	tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue);
+/* "F" */
+/* "G" */
+static struct enet_statistics *tms380tr_get_stats(struct net_device *dev);
+/* "H" */
+static void 	tms380tr_hardware_send_packet(struct net_device *dev,
+			struct net_local* tp);
+/* "I" */
+static int 	tms380tr_init_adapter(struct net_device *dev);
+static int 	tms380tr_init_card(struct net_device *dev);
+static void 	tms380tr_init_ipb(struct net_local *tp);
+static void 	tms380tr_init_net_local(struct net_device *dev);
+static void 	tms380tr_init_opb(struct net_local *tp);
+static void 	tms380tr_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static int 	tms380tr_isa_chk_card(struct net_device *dev, int ioaddr, struct cardinfo_table **outcard);
+static int      tms380tr_isa_chk_ioaddr(int ioaddr);
+/* "O" */
+static int 	tms380tr_open(struct net_device *dev);
+static void	tms380tr_open_adapter(struct net_device *dev);
+/* "P" */
+static int 	tms380tr_pci_chk_card(struct net_device *dev, struct cardinfo_table **outcard);
+int 		tms380tr_probe(struct net_device *dev);
+static int 	tms380tr_probe1(struct net_device *dev, int ioaddr);
+/* "R" */
+static void 	tms380tr_rcv_status_irq(struct net_device *dev);
+static void 	tms380tr_read_addr(struct net_device *dev, unsigned char *Address);
+static int 	tms380tr_read_ptr(struct net_device *dev);
+static void 	tms380tr_read_ram(struct net_device *dev, unsigned char *Data,
+			unsigned short Address, int Length);
+static int 	tms380tr_reset_adapter(struct net_device *dev);
+static void 	tms380tr_reset_interrupt(struct net_device *dev);
+static void 	tms380tr_ring_status_irq(struct net_device *dev);
+/* "S" */
+static int 	tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev);
+static void 	tms380tr_set_multicast_list(struct net_device *dev);
+/* "T" */
+static void 	tms380tr_timer_chk(unsigned long data);
+static void 	tms380tr_timer_end_wait(unsigned long data);
+static void 	tms380tr_tx_status_irq(struct net_device *dev);
+/* "U" */
+static void 	tms380tr_update_rcv_stats(struct net_local *tp,
+			unsigned char DataPtr[], unsigned int Length);
+/* "W" */
+static void 	tms380tr_wait(unsigned long time);
+static void 	tms380tr_write_rpl_status(RPL *rpl, unsigned int Status);
+static void 	tms380tr_write_tpl_status(TPL *tpl, unsigned int Status);
+
+/*
+ * Check for a network adapter of this type, and return '0' if one exists.
+ * If dev->base_addr == 0, probe all likely locations.
+ * If dev->base_addr == 1, always return failure.
+ */
+int __init tms380tr_probe(struct net_device *dev)
+{
+	int i;
+	int base_addr = dev ? dev->base_addr : 0;
+
+	if(base_addr > 0x1ff)    /* Check a single specified location. */
+		return (tms380tr_probe1(dev, base_addr));
+	else if(base_addr != 0)  /* Don't probe at all. */
+		return (-ENXIO);
+
+	for(i = 0; tms380tr_portlist[i]; i++)
+	{
+		int ioaddr = tms380tr_portlist[i];
+		if(check_region(ioaddr, TMS380TR_IO_EXTENT))
+			continue;
+		if(tms380tr_probe1(dev, ioaddr))
+		{
+#ifndef MODULE
+                        tr_freedev(dev);
+#endif
+                }
+		else
+			return (0);
+	}
+
+	return (-ENODEV);
+}
+
+struct cardinfo_table * __init tms380tr_pci_getcardinfo(unsigned short vendor, 
+							unsigned short device)
+{
+	int cur;
+	
+	for (cur = 1; cardinfo[cur].name != NULL; cur++) {
+		if (cardinfo[cur].type == 2) /* PCI */
+		{
+			if ((cardinfo[cur].vendor_id == vendor) && (cardinfo[cur].device_id == device))
+				return &cardinfo[cur];
+		}
+	}
+	
+	return NULL;
+}
+
+/*
+ * Detect and setup the PCI SysKonnect TR cards in slot order.
+ */
+static int __init tms380tr_pci_chk_card(struct net_device *dev, 
+					struct cardinfo_table **outcard)
+{
+	static int pci_index = 0;
+	unsigned char pci_bus, pci_device_fn;
+	struct cardinfo_table *card;
+	int i;
+
+	if(!pci_present())
+		return (-1);	/* No PCI present. */
+
+	for(; pci_index < 0xff; pci_index++)
+	{
+		unsigned int pci_irq_line;
+		struct pci_dev *pdev;
+		unsigned short pci_command, new_command, vendor, device;
+		unsigned int pci_ioaddr;
+
+		if(pcibios_find_class(PCI_CLASS_NETWORK_TOKEN_RING << 8,
+			pci_index, &pci_bus, &pci_device_fn)
+			!= PCIBIOS_SUCCESSFUL)
+		{
+			break;
+		}
+
+		pcibios_read_config_word(pci_bus, pci_device_fn,
+						PCI_VENDOR_ID, &vendor);
+		pcibios_read_config_word(pci_bus, pci_device_fn,
+						PCI_DEVICE_ID, &device);
+
+		pdev		= pci_find_slot(pci_bus, pci_device_fn);
+		pci_irq_line 	= pdev->irq;
+		pci_ioaddr 	= pdev->resource[0].start;
+
+		pcibios_read_config_word(pci_bus, pci_device_fn,
+						PCI_COMMAND, &pci_command);
+
+		/* Remove I/O space marker in bit 0. */
+		pci_ioaddr &= ~3;
+
+		if (!(card = tms380tr_pci_getcardinfo(vendor, device)))
+			return -ENODEV;
+		
+		if(check_region(pci_ioaddr, TMS380TR_IO_EXTENT))
+			continue;
+		request_region(pci_ioaddr, TMS380TR_IO_EXTENT, card->name);
+		if(request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ,
+				card->name, dev))
+			return (-ENODEV); /* continue; ?? */
+
+		new_command = (pci_command|PCI_COMMAND_MASTER|PCI_COMMAND_IO);
+
+		if(pci_command != new_command)
+		{
+			printk("The PCI BIOS has not enabled this"
+				"device! Updating PCI command %4.4x->%4.4x.\n",
+			  	pci_command, new_command);
+			pcibios_write_config_word(pci_bus, pci_device_fn,
+				PCI_COMMAND, new_command);
+		}
+
+		/* At this point we have found a valid PCI TR card. */
+		dev->base_addr	= pci_ioaddr;
+		dev->irq 	= pci_irq_line;
+		dev->dma	= 0;
+
+		dev->addr_len = 6;
+		tms380tr_read_addr(dev, (unsigned char*)dev->dev_addr);
+		
+		printk("%s: %s found at %#4x, IRQ %d, ring station ",
+		       dev->name, card->name, pci_ioaddr, dev->irq);
+		printk("%2.2x", dev->dev_addr[0]);
+		for (i = 1; i < 6; i++)
+			printk(":%2.2x", dev->dev_addr[i]);
+		printk(".\n");
+
+		if (outcard)
+			*outcard = card;
+
+		return (0);
+	}
+
+	return (-1);
+}
+
+/*
+ * Detect and setup the ISA SysKonnect TR cards.
+ */
+static int __init tms380tr_isa_chk_card(struct net_device *dev, int ioaddr,
+					struct cardinfo_table **outcard)
+{
+	int i, err;
+	unsigned long flags;
+	struct cardinfo_table *card = NULL;
+
+	err = tms380tr_isa_chk_ioaddr(ioaddr);
+	if(err < 0)
+		return (-ENODEV);
+
+        if(virt_to_bus((void*)((unsigned long)dev->priv+sizeof(struct net_local)))
+		> ISA_MAX_ADDRESS)
+        {
+                printk("%s: Memory not accessible for DMA\n", dev->name);
+                kfree(dev->priv);
+                return (-EAGAIN);
+        }
+
+	/* FIXME */
+	card = &cardinfo[1];
+
+        /* Grab the region so that no one else tries to probe our ioports. */
+        request_region(ioaddr, TMS380TR_IO_EXTENT, card->name);
+        dev->base_addr = ioaddr;
+
+        /* Autoselect IRQ and DMA if dev->irq == 0 */
+        if(dev->irq == 0)
+        {
+                for(i = 0; tms380tr_irqlist[i] != 0; i++)
+                {
+                        dev->irq = tms380tr_irqlist[i];
+                        err = request_irq(dev->irq, &tms380tr_interrupt, 0, card->name, dev);
+                        if(!err)
+				break;
+                }
+
+                if(tms380tr_irqlist[i] == 0)
+                {
+                        printk("%s: AutoSelect no IRQ available\n", dev->name);
+                        return (-EAGAIN);
+                }
+        }
+        else
+        {
+                err = request_irq(dev->irq, &tms380tr_interrupt, 0, card->name, dev);
+		if(err)
+                {
+                        printk("%s: Selected IRQ not available\n", dev->name);
+                        return (-EAGAIN);
+                }
+        }
+
+        /* Always allocate the DMA channel after IRQ and clean up on failure */
+        if(dev->dma == 0)
+        {
+                for(i = 0; tms380tr_dmalist[i] != 0; i++)
+                {
+			dev->dma = tms380tr_dmalist[i];
+                        err = request_dma(dev->dma, card->name);
+                        if(!err)
+                                break;
+                }
+
+                if(dev->dma == 0)
+                {
+                        printk("%s: AutoSelect no DMA available\n", dev->name);
+                        free_irq(dev->irq, NULL);
+                        return (-EAGAIN);
+                }
+        }
+        else
+        {
+                err = request_dma(dev->dma, card->name);
+                if(err)
+                {
+                        printk("%s: Selected DMA not available\n", dev->name);
+                        free_irq(dev->irq, NULL);
+                        return (-EAGAIN);
+                }
+        }
+
+	flags=claim_dma_lock();
+	disable_dma(dev->dma);
+        set_dma_mode(dev->dma, DMA_MODE_CASCADE);
+        enable_dma(dev->dma);
+        release_dma_lock(flags);
+
+	printk("%s: %s found at %#4x, using IRQ %d and DMA %d.\n",
+                dev->name, card->name, ioaddr, dev->irq, dev->dma);
+
+	if (outcard)
+		*outcard = card;
+
+	return (0);
+}
+
+static int __init tms380tr_probe1(struct net_device *dev, int ioaddr)
+{
+	static unsigned version_printed = 0;
+	struct net_local *tp;
+	int err;
+	struct cardinfo_table *card = NULL;
+
+	if(tms380tr_debug && version_printed++ == 0)
+		printk(KERN_INFO "%s", version);
+
+#ifndef MODULE
+	dev = init_trdev(dev, 0);
+	if(dev == NULL)
+		return (-ENOMEM);
+#endif
+
+	err = tms380tr_pci_chk_card(dev, &card);
+	if(err < 0)
+	{
+		err = tms380tr_isa_chk_card(dev, ioaddr, &card);
+		if(err < 0)
+			return (-ENODEV);
+	}
+
+	/* Setup this devices private information structure */
+	tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA);
+	if(tp == NULL)
+		return (-ENOMEM);
+	memset(tp, 0, sizeof(struct net_local));
+	init_waitqueue_head(&tp->wait_for_tok_int);
+	tp->CardType = card;
+	
+	dev->priv		= tp;
+	dev->init               = tms380tr_init_card;
+        dev->open               = tms380tr_open;
+        dev->stop               = tms380tr_close;
+        dev->hard_start_xmit    = tms380tr_send_packet;
+        dev->get_stats          = tms380tr_get_stats;
+        dev->set_multicast_list = &tms380tr_set_multicast_list;
+
+        return (0);
+}
+
+/* Dummy function */
+static int __init tms380tr_init_card(struct net_device *dev)
+{
+	if(tms380tr_debug > 3)
+		printk("%s: tms380tr_init_card\n", dev->name);
+
+	return (0);
+}
+
+/*
+ * This function tests if an adapter is really installed at the
+ * given I/O address. Return negative if no adapter at IO addr.
+ */
+static int __init tms380tr_isa_chk_ioaddr(int ioaddr)
+{
+	unsigned char old, chk1, chk2;
+
+	old = inb(ioaddr + SIFADR);	/* Get the old SIFADR value */
+
+	chk1 = 0;	/* Begin with check value 0 */
+	do {
+		/* Write new SIFADR value */
+		outb(chk1, ioaddr + SIFADR);
+
+		/* Read, invert and write */
+		chk2 = inb(ioaddr + SIFADD);
+		chk2 ^= 0x0FE;
+		outb(chk2, ioaddr + SIFADR);
+
+		/* Read, invert and compare */
+		chk2 = inb(ioaddr + SIFADD);
+		chk2 ^= 0x0FE;
+
+		if(chk1 != chk2)
+			return (-1);	/* No adapter */
+
+		chk1 -= 2;
+	} while(chk1 != 0);	/* Repeat 128 times (all byte values) */
+
+    	/* Restore the SIFADR value */
+	outb(old, ioaddr + SIFADR);
+
+	return (0);
+}
+
+/*
+ * Open/initialize the board. This is called sometime after
+ * booting when the 'ifconfig' program is run.
+ *
+ * This routine should set everything up anew at each open, even
+ * registers that "should" only need to be set once at boot, so that
+ * there is non-reboot way to recover if something goes wrong.
+ */
+static int tms380tr_open(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	int err;
+	
+	/* Reset the hardware here. Don't forget to set the station address. */
+	err = tms380tr_chipset_init(dev);
+	if(err)
+	{
+		printk(KERN_INFO "%s: Chipset initialization error\n", 
+			dev->name);
+		return (-1);
+	}
+
+	init_timer(&tp->timer);
+	tp->timer.expires	= jiffies + 30*HZ;
+	tp->timer.function	= tms380tr_timer_end_wait;
+	tp->timer.data		= (unsigned long)dev;
+	tp->timer.next		= NULL;
+	tp->timer.prev		= NULL;
+	add_timer(&tp->timer);
+
+	printk(KERN_INFO "%s: Adapter RAM size: %dK\n", 
+	       dev->name, tms380tr_read_ptr(dev));
+	tms380tr_enable_interrupts(dev);
+	tms380tr_open_adapter(dev);
+
+	dev->tbusy = 0;
+	dev->interrupt = 0;
+	dev->start = 0;
+
+	/* Wait for interrupt from hardware. If interrupt does not come,
+	 * there will be a timeout from the timer.
+	 */
+	tp->Sleeping = 1;
+	interruptible_sleep_on(&tp->wait_for_tok_int);
+	del_timer(&tp->timer);
+
+	/* If AdapterVirtOpenFlag is 1, the adapter is now open for use */
+	if(tp->AdapterVirtOpenFlag == 0)
+	{
+	  tms380tr_disable_interrupts(dev);
+	  return (-1);
+	}
+
+	dev->start = 1;
+
+	tp->StartTime = jiffies;
+
+	/* Start function control timer */
+	tp->timer.expires	= jiffies + 2*HZ;
+	tp->timer.function	= tms380tr_timer_chk;
+	tp->timer.data		= (unsigned long)dev;
+	add_timer(&tp->timer);
+	
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+
+	return (0);
+}
+
+/*
+ * Timeout function while waiting for event
+ */
+static void tms380tr_timer_end_wait(unsigned long data)
+{
+	struct net_device *dev = (struct net_device*)data;
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	if(tp->Sleeping)
+	{
+		tp->Sleeping = 0;
+		wake_up_interruptible(&tp->wait_for_tok_int);
+	}
+
+	return;
+}
+
+/*
+ * Initialize the chipset
+ */
+static int tms380tr_chipset_init(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned char PosReg, Tmp;
+	int i, err;
+
+	tms380tr_init_ipb(tp);
+	tms380tr_init_opb(tp);
+	tms380tr_init_net_local(dev);
+
+	/* Set pos register: selects irq and dma channel.
+	 * Only for ISA bus adapters.
+	 */
+	if(dev->dma > 0)
+	{
+		PosReg = 0;
+		for(i = 0; tms380tr_irqlist[i] != 0; i++)
+		{
+			if(tms380tr_irqlist[i] == dev->irq)
+				break;
+		}
+
+		/* Choose default cycle time, 500 nsec   */
+		PosReg |= CYCLE_TIME << 2;
+		PosReg |= i << 4;
+		i = dev->dma - 5;
+		PosReg |= i;
+
+		if(tp->DataRate == SPEED_4)
+			PosReg |= LINE_SPEED_BIT;
+		else
+			PosReg &= ~LINE_SPEED_BIT;
+
+		outb(PosReg, dev->base_addr + POSREG);
+		Tmp = inb(dev->base_addr + POSREG);
+		if((Tmp & ~CYCLE_TIME) != (PosReg & ~CYCLE_TIME))
+			printk(KERN_INFO "%s: POSREG error\n", dev->name);
+	}
+
+	err = tms380tr_reset_adapter(dev);
+	if(err < 0)
+		return (-1);
+
+	err = tms380tr_bringup_diags(dev);
+	if(err < 0)
+		return (-1);
+
+	err = tms380tr_init_adapter(dev);
+	if(err < 0)
+		return (-1);
+
+	return (0);
+}
+
+/*
+ * Initializes the net_local structure.
+ */
+static void tms380tr_init_net_local(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	int i;
+
+	tp->scb.CMD	= 0;
+	tp->scb.Parm[0] = 0;
+	tp->scb.Parm[1] = 0;
+
+	tp->ssb.STS	= 0;
+	tp->ssb.Parm[0] = 0;
+	tp->ssb.Parm[1] = 0;
+	tp->ssb.Parm[2] = 0;
+
+	tp->CMDqueue	= 0;
+
+	tp->AdapterOpenFlag	= 0;
+	tp->AdapterVirtOpenFlag = 0;
+	tp->ScbInUse		= 0;
+	tp->OpenCommandIssued	= 0;
+	tp->ReOpenInProgress	= 0;
+	tp->HaltInProgress	= 0;
+	tp->TransmitHaltScheduled = 0;
+	tp->LobeWireFaultLogged	= 0;
+	tp->LastOpenStatus	= 0;
+	tp->MaxPacketSize	= DEFAULT_PACKET_SIZE;
+
+	skb_queue_head_init(&tp->SendSkbQueue);
+	tp->QueueSkb = MAX_TX_QUEUE;
+
+	/* Create circular chain of transmit lists */
+	for (i = 0; i < TPL_NUM; i++)
+	{
+		tp->Tpl[i].NextTPLAddr = htonl((unsigned long) virt_to_bus(&tp->Tpl[(i+1) % TPL_NUM]));
+		tp->Tpl[i].Status	= 0;
+		tp->Tpl[i].FrameSize	= 0;
+		tp->Tpl[i].FragList[0].DataCount	= 0;
+		tp->Tpl[i].FragList[0].DataAddr		= 0;
+		tp->Tpl[i].NextTPLPtr	= &tp->Tpl[(i+1) % TPL_NUM];
+		tp->Tpl[i].MData	= NULL;
+		tp->Tpl[i].TPLIndex	= i;
+		tp->Tpl[i].BusyFlag	= 0;
+	}
+
+	tp->TplFree = tp->TplBusy = &tp->Tpl[0];
+
+	/* Create circular chain of receive lists */
+	for (i = 0; i < RPL_NUM; i++)
+	{
+		tp->Rpl[i].NextRPLAddr = htonl((unsigned long) virt_to_bus(&tp->Rpl[(i+1) % RPL_NUM]));
+		tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
+		tp->Rpl[i].FrameSize = 0;
+		tp->Rpl[i].FragList[0].DataCount = SWAPB(tp->MaxPacketSize);
+
+		/* Alloc skb and point adapter to data area */
+		tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize);
+
+		/* skb == NULL ? then use local buffer */
+		if(tp->Rpl[i].Skb == NULL)
+		{
+			tp->Rpl[i].SkbStat = SKB_UNAVAILABLE;
+			tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i]));
+			tp->Rpl[i].MData = tp->LocalRxBuffers[i];
+		}
+		else	/* SKB != NULL */
+		{
+			tp->Rpl[i].Skb->dev = dev;
+			skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize);
+
+			/* data unreachable for DMA ? then use local buffer */
+			if(tp->CardType->type == TMS_ISA && virt_to_bus(tp->Rpl[i].Skb->data) + tp->MaxPacketSize > ISA_MAX_ADDRESS)
+			{
+				tp->Rpl[i].SkbStat = SKB_DATA_COPY;
+				tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i]));
+				tp->Rpl[i].MData = tp->LocalRxBuffers[i];
+			}
+			else	/* DMA directly in skb->data */
+			{
+				tp->Rpl[i].SkbStat = SKB_DMA_DIRECT;
+				tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->Rpl[i].Skb->data));
+				tp->Rpl[i].MData = tp->Rpl[i].Skb->data;
+			}
+		}
+
+		tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM];
+		tp->Rpl[i].RPLIndex = i;
+	}
+
+	tp->RplHead = &tp->Rpl[0];
+	tp->RplTail = &tp->Rpl[RPL_NUM-1];
+	tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
+
+	return;
+}
+
+/*
+ * Initializes the initialisation parameter block.
+ */
+static void tms380tr_init_ipb(struct net_local *tp)
+{
+	tp->ipb.Init_Options	= BURST_MODE;
+	tp->ipb.CMD_Status_IV	= 0;
+	tp->ipb.TX_IV		= 0;
+	tp->ipb.RX_IV		= 0;
+	tp->ipb.Ring_Status_IV	= 0;
+	tp->ipb.SCB_Clear_IV	= 0;
+	tp->ipb.Adapter_CHK_IV	= 0;
+	tp->ipb.RX_Burst_Size	= BURST_SIZE;
+	tp->ipb.TX_Burst_Size	= BURST_SIZE;
+	tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES;
+	tp->ipb.SCB_Addr	= 0;
+	tp->ipb.SSB_Addr	= 0;
+
+	return;
+}
+
+/*
+ * Initializes the open parameter block.
+ */
+static void tms380tr_init_opb(struct net_local *tp)
+{
+	unsigned long Addr;
+	unsigned short RplSize    = RPL_SIZE;
+	unsigned short TplSize    = TPL_SIZE;
+	unsigned short BufferSize = BUFFER_SIZE;
+
+	tp->ocpl.OPENOptions 	 = 0;
+	tp->ocpl.OPENOptions 	|= ENABLE_FULL_DUPLEX_SELECTION;
+	tp->ocpl.FullDuplex 	 = 0;
+	tp->ocpl.FullDuplex 	|= OPEN_FULL_DUPLEX_OFF;
+
+	/* Fixme: If mac address setable:
+	 * for (i=0; i<LENGTH_OF_ADDRESS; i++)
+	 *	mac->Vam->ocpl.NodeAddr[i] = mac->CurrentAddress[i];
+	 */
+
+	tp->ocpl.GroupAddr	 = 0;
+	tp->ocpl.FunctAddr	 = 0;
+	tp->ocpl.RxListSize	 = SWAPB(RplSize);
+	tp->ocpl.TxListSize	 = SWAPB(TplSize);
+	tp->ocpl.BufSize	 = SWAPB(BufferSize);
+	tp->ocpl.Reserved	 = 0;
+	tp->ocpl.TXBufMin	 = TX_BUF_MIN;
+	tp->ocpl.TXBufMax	 = TX_BUF_MAX;
+
+	Addr = htonl(virt_to_bus(tp->ProductID));
+
+	tp->ocpl.ProdIDAddr[0]	 = LOWORD(Addr);
+	tp->ocpl.ProdIDAddr[1]	 = HIWORD(Addr);
+
+	return;
+}
+
+/*
+ * Send OPEN command to adapter
+ */
+static void tms380tr_open_adapter(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	if(tp->OpenCommandIssued)
+		return;
+
+	tp->OpenCommandIssued = 1;
+	tms380tr_exec_cmd(dev, OC_OPEN);
+
+	return;
+}
+
+/*
+ * Clear the adapter's interrupt flag. Clear system interrupt enable
+ * (SINTEN): disable adapter to system interrupts.
+ */
+static void tms380tr_disable_interrupts(struct net_device *dev)
+{
+	outb(0, dev->base_addr + SIFACL);
+
+	return;
+}
+
+/*
+ * Set the adapter's interrupt flag. Set system interrupt enable
+ * (SINTEN): enable adapter to system interrupts.
+ */
+static void tms380tr_enable_interrupts(struct net_device *dev)
+{
+	outb(ACL_SINTEN, dev->base_addr + SIFACL);
+
+	return;
+}
+
+/*
+ * Put command in command queue, try to execute it.
+ */
+static void tms380tr_exec_cmd(struct net_device *dev, unsigned short Command)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	tp->CMDqueue |= Command;
+	tms380tr_chk_outstanding_cmds(dev);
+
+	return;
+}
+
+/*
+ * Gets skb from system, queues it and checks if it can be sent
+ */
+static int tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	if(dev->tbusy)
+	{
+		/*
+		 * If we get here, some higher level has decided we are broken.
+		 * There should really be a "kick me" function call instead.
+		 *
+		 * Resetting the token ring adapter takes a long time so just
+		 * fake transmission time and go on trying. Our own timeout
+		 * routine is in tms380tr_timer_chk()
+		 */
+		dev->tbusy 	 = 0;
+		dev->trans_start = jiffies;
+		return (1);
+	}
+
+	/*
+	 * If some higher layer thinks we've missed an tx-done interrupt we
+	 * are passed NULL.
+	 */
+	if(skb == NULL)
+		return (0);
+
+	/*
+	 * Block a timer-based transmit from overlapping. This could better be
+	 * done with atomic_swap(1, dev->tbusy), but set_bit() works as well.
+	 */
+	if(test_and_set_bit(0, (void*)&dev->tbusy) != 0)
+	{
+		printk("%s: Transmitter access conflict.\n", dev->name);
+		return (1);
+	}
+
+	if(tp->QueueSkb == 0)
+		return (1);	/* Return with tbusy set: queue full */
+
+	tp->QueueSkb--;
+	skb_queue_tail(&tp->SendSkbQueue, skb);
+	tms380tr_hardware_send_packet(dev, tp);
+	if(tp->QueueSkb > 0)
+		dev->tbusy = 0;
+
+	return (0);
+}
+
+/*
+ * Move frames from internal skb queue into adapter tx queue
+ */
+static void tms380tr_hardware_send_packet(struct net_device *dev, struct net_local* tp)
+{
+	TPL *tpl;
+	short length;
+	unsigned char *buf, *newbuf;
+	struct sk_buff *skb;
+	int i;
+    
+	for(;;)
+	{
+		/* Try to get a free TPL from the chain.
+		 *
+		 * NOTE: We *must* always leave one unused TPL in the chain, 
+		 * because otherwise the adapter might send frames twice.
+		 */
+		if(tp->TplFree->NextTPLPtr->BusyFlag)	/* No free TPL */
+		{
+			if (tms380tr_debug > 0)
+				printk(KERN_INFO "%s: No free TPL\n", dev->name);
+			return;
+		}
+
+		/* Send first buffer from queue */
+		skb = skb_dequeue(&tp->SendSkbQueue);
+		if(skb == NULL)
+			return;
+
+		tp->QueueSkb++;
+		/* Is buffer reachable for Busmaster-DMA? */
+		if(tp->CardType->type == TMS_ISA && virt_to_bus((void*)(((long) skb->data) + skb->len))
+			> ISA_MAX_ADDRESS)
+		{
+			/* Copy frame to local buffer */
+			i 	= tp->TplFree->TPLIndex;
+			length 	= skb->len;
+			buf 	= tp->LocalTxBuffers[i];
+			memcpy(buf, skb->data, length);
+			newbuf 	= buf;
+		}
+		else
+		{
+			/* Send direct from skb->data */
+			length = skb->len;
+			newbuf = skb->data;
+		}
+
+		/* Source address in packet? */
+		tms380tr_chk_src_addr(newbuf, dev->dev_addr);
+
+		tp->LastSendTime	= jiffies;
+		tpl 			= tp->TplFree;	/* Get the "free" TPL */
+		tpl->BusyFlag 		= 1;		/* Mark TPL as busy */
+		tp->TplFree 		= tpl->NextTPLPtr;
+    
+		/* Save the skb for delayed return of skb to system */
+		tpl->Skb = skb;
+		tpl->FragList[0].DataCount = (unsigned short) SWAPB(length);
+		tpl->FragList[0].DataAddr  = htonl(virt_to_bus(newbuf));
+
+		/* Write the data length in the transmit list. */
+		tpl->FrameSize 	= (unsigned short) SWAPB(length);
+		tpl->MData 	= newbuf;
+
+		/* Transmit the frame and set the status values. */
+		tms380tr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME
+					| TX_END_FRAME | TX_PASS_SRC_ADDR
+					| TX_FRAME_IRQ);
+
+		/* Let adapter send the frame. */
+		tms380tr_exec_sifcmd(dev, CMD_TX_VALID);
+	}
+
+	return;
+}
+
+/*
+ * Write the given value to the 'Status' field of the specified TPL.
+ * NOTE: This function should be used whenever the status of any TPL must be
+ * modified by the driver, because the compiler may otherwise change the
+ * order of instructions such that writing the TPL status may be executed at
+ * an undesireable time. When this function is used, the status is always
+ * written when the function is called.
+ */
+static void tms380tr_write_tpl_status(TPL *tpl, unsigned int Status)
+{
+	tpl->Status = Status;
+}
+
+static void tms380tr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr)
+{
+	unsigned char SRBit;
+
+	if((((unsigned long)frame[8]) & ~0x80) != 0)	/* Compare 4 bytes */
+		return;
+	if((unsigned short)frame[12] != 0)		/* Compare 2 bytes */
+		return;
+
+	SRBit = frame[8] & 0x80;
+	memcpy(&frame[8], hw_addr, 6);
+	frame[8] |= SRBit;
+
+	return;
+}
+
+/*
+ * The timer routine: Check if adapter still open and working, reopen if not. 
+ */
+static void tms380tr_timer_chk(unsigned long data)
+{
+	struct net_device *dev = (struct net_device*)data;
+	struct net_local *tp = (struct net_local*)dev->priv;
+
+	if(tp->HaltInProgress)
+		return;
+
+	tms380tr_chk_outstanding_cmds(dev);
+	if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies)
+		&& (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy))
+	{
+		/* Anything to send, but stalled to long */
+		tp->LastSendTime = jiffies;
+		tms380tr_exec_cmd(dev, OC_CLOSE);	/* Does reopen automatically */
+	}
+
+	tp->timer.expires = jiffies + 2*HZ;
+	add_timer(&tp->timer);
+
+	if(tp->AdapterOpenFlag || tp->ReOpenInProgress)
+		return;
+	tp->ReOpenInProgress = 1;
+	tms380tr_open_adapter(dev);
+
+	return;
+}
+
+/*
+ * The typical workload of the driver: Handle the network interface interrupts.
+ */
+static void tms380tr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct net_device *dev = dev_id;
+	struct net_local *tp;
+	int ioaddr;
+	unsigned short irq_type;
+
+	if(dev == NULL)
+	{
+		printk("%s: irq %d for unknown device.\n", dev->name, irq);
+		return;
+	}
+
+	dev->interrupt = 1;
+
+	ioaddr = dev->base_addr;
+	tp = (struct net_local *)dev->priv;
+
+	irq_type = inw(ioaddr + SIFSTS);
+
+	while(irq_type & STS_SYSTEM_IRQ)
+	{
+		irq_type &= STS_IRQ_MASK;
+
+		if(!tms380tr_chk_ssb(tp, irq_type))
+		{
+			printk(KERN_INFO "%s: DATA LATE occurred\n", dev->name);
+			break;
+		}
+
+		switch(irq_type)
+		{
+			case STS_IRQ_RECEIVE_STATUS:
+				tms380tr_reset_interrupt(dev);
+				tms380tr_rcv_status_irq(dev);
+				break;
+
+			case STS_IRQ_TRANSMIT_STATUS:
+				/* Check if TRANSMIT.HALT command is complete */
+				if(tp->ssb.Parm[0] & COMMAND_COMPLETE)
+				{
+					tp->TransmitCommandActive = 0;
+					tp->TransmitHaltScheduled = 0;
+
+					/* Issue a new transmit command. */
+					tms380tr_exec_cmd(dev, OC_TRANSMIT);
+				}
+
+				tms380tr_reset_interrupt(dev);
+				tms380tr_tx_status_irq(dev);
+				break;
+
+			case STS_IRQ_COMMAND_STATUS:
+				/* The SSB contains status of last command
+				 * other than receive/transmit.
+				 */
+				tms380tr_cmd_status_irq(dev);
+				break;
+
+			case STS_IRQ_SCB_CLEAR:
+				/* The SCB is free for another command. */
+				tp->ScbInUse = 0;
+				tms380tr_chk_outstanding_cmds(dev);
+				break;
+
+			case STS_IRQ_RING_STATUS:
+				tms380tr_ring_status_irq(dev);
+				break;
+
+			case STS_IRQ_ADAPTER_CHECK:
+				tms380tr_chk_irq(dev);
+				break;
+
+			default:
+				printk(KERN_INFO "Unknown Token Ring IRQ\n");
+				break;
+		}
+
+		/* Reset system interrupt if not already done. */
+		if(irq_type != STS_IRQ_TRANSMIT_STATUS
+			&& irq_type != STS_IRQ_RECEIVE_STATUS)
+		{
+			tms380tr_reset_interrupt(dev);
+		}
+
+		irq_type = inw(ioaddr + SIFSTS);
+	}
+
+	dev->interrupt = 0;
+
+	return;
+}
+
+/*
+ *  Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command.
+ */
+static void tms380tr_reset_interrupt(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	SSB *ssb = &tp->ssb;
+
+	/*
+	 * [Workaround for "Data Late"]
+	 * Set all fields of the SSB to well-defined values so we can
+	 * check if the adapter has written the SSB.
+	 */
+
+	ssb->STS	= (unsigned short) -1;
+	ssb->Parm[0] 	= (unsigned short) -1;
+	ssb->Parm[1] 	= (unsigned short) -1;
+	ssb->Parm[2] 	= (unsigned short) -1;
+
+	/* Free SSB by issuing SSB_CLEAR command after reading IRQ code
+	 * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts.
+	 */
+	tms380tr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ);
+
+	return;
+}
+
+/*
+ * Check if the SSB has actually been written by the adapter.
+ */
+static unsigned char tms380tr_chk_ssb(struct net_local *tp, unsigned short IrqType)
+{
+	SSB *ssb = &tp->ssb;	/* The address of the SSB. */
+
+	/* C 0 1 2 INTERRUPT CODE
+	 * - - - - --------------
+	 * 1 1 1 1 TRANSMIT STATUS
+	 * 1 1 1 1 RECEIVE STATUS
+	 * 1 ? ? 0 COMMAND STATUS
+	 * 0 0 0 0 SCB CLEAR
+	 * 1 1 0 0 RING STATUS
+	 * 0 0 0 0 ADAPTER CHECK
+	 *
+	 * 0 = SSB field not affected by interrupt
+	 * 1 = SSB field is affected by interrupt
+	 *
+	 * C = SSB ADDRESS +0: COMMAND
+	 * 0 = SSB ADDRESS +2: STATUS 0
+	 * 1 = SSB ADDRESS +4: STATUS 1
+	 * 2 = SSB ADDRESS +6: STATUS 2
+	 */
+
+	/* Check if this interrupt does use the SSB. */
+
+	if(IrqType != STS_IRQ_TRANSMIT_STATUS
+		&& IrqType != STS_IRQ_RECEIVE_STATUS
+		&& IrqType != STS_IRQ_COMMAND_STATUS
+		&& IrqType != STS_IRQ_RING_STATUS)
+	{
+		return (1);	/* SSB not involved. */
+	}
+
+	/* Note: All fields of the SSB have been set to all ones (-1) after it
+	 * has last been used by the software (see DriverIsr()).
+	 *
+	 * Check if the affected SSB fields are still unchanged.
+	 */
+
+	if(ssb->STS == (unsigned short) -1)
+		return (0);	/* Command field not yet available. */
+	if(IrqType == STS_IRQ_COMMAND_STATUS)
+		return (1);	/* Status fields not always affected. */
+	if(ssb->Parm[0] == (unsigned short) -1)
+		return (0);	/* Status 1 field not yet available. */
+	if(IrqType == STS_IRQ_RING_STATUS)
+		return (1);	/* Status 2 & 3 fields not affected. */
+
+	/* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */
+	if(ssb->Parm[1] == (unsigned short) -1)
+		return (0);	/* Status 2 field not yet available. */
+	if(ssb->Parm[2] == (unsigned short) -1)
+		return (0);	/* Status 3 field not yet available. */
+
+	return (1);	/* All SSB fields have been written by the adapter. */
+}
+
+/*
+ * Evaluates the command results status in the SSB status field.
+ */
+static void tms380tr_cmd_status_irq(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned short ssb_cmd, ssb_parm_0;
+	unsigned short ssb_parm_1;
+	char *open_err = "Open error -";
+	char *code_err = "Open code -";
+
+	/* Copy the ssb values to local variables */
+	ssb_cmd    = tp->ssb.STS;
+	ssb_parm_0 = tp->ssb.Parm[0];
+	ssb_parm_1 = tp->ssb.Parm[1];
+
+	if(ssb_cmd == OPEN)
+	{
+		tp->Sleeping = 0;
+		if(!tp->ReOpenInProgress)
+	    		wake_up_interruptible(&tp->wait_for_tok_int);
+
+		tp->OpenCommandIssued = 0;
+		tp->ScbInUse = 0;
+
+		if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION)
+		{
+			/* Success, the adapter is open. */
+			tp->LobeWireFaultLogged	= 0;
+			tp->AdapterOpenFlag 	= 1;
+			tp->AdapterVirtOpenFlag = 1;
+			tp->TransmitCommandActive = 0;
+			tms380tr_exec_cmd(dev, OC_TRANSMIT);
+			tms380tr_exec_cmd(dev, OC_RECEIVE);
+
+			if(tp->ReOpenInProgress)
+				tp->ReOpenInProgress = 0;
+
+			return;
+		}
+		else 	/* The adapter did not open. */
+		{
+	    		if(ssb_parm_0 & NODE_ADDR_ERROR)
+				printk(KERN_INFO "%s: Node address error\n",
+					dev->name);
+	    		if(ssb_parm_0 & LIST_SIZE_ERROR)
+				printk(KERN_INFO "%s: List size error\n",
+					dev->name);
+	    		if(ssb_parm_0 & BUF_SIZE_ERROR)
+				printk(KERN_INFO "%s: Buffer size error\n",
+					dev->name);
+	    		if(ssb_parm_0 & TX_BUF_COUNT_ERROR)
+				printk(KERN_INFO "%s: Tx buffer count error\n",
+					dev->name);
+	    		if(ssb_parm_0 & INVALID_OPEN_OPTION)
+				printk(KERN_INFO "%s: Invalid open option\n",
+					dev->name);
+	    		if(ssb_parm_0 & OPEN_ERROR)
+			{
+				/* Show the open phase. */
+				switch(ssb_parm_0 & OPEN_PHASES_MASK)
+				{
+					case LOBE_MEDIA_TEST:
+						if(!tp->LobeWireFaultLogged)
+						{
+							tp->LobeWireFaultLogged = 1;
+							printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err);
+		    				}
+						tp->ReOpenInProgress	= 1;
+						tp->AdapterOpenFlag 	= 0;
+						tp->AdapterVirtOpenFlag = 1;
+						tms380tr_open_adapter(dev);
+						return;
+
+					case PHYSICAL_INSERTION:
+						printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err);
+						break;
+
+					case ADDRESS_VERIFICATION:
+						printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err);
+						break;
+
+					case PARTICIPATION_IN_RING_POLL:
+						printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err);
+						break;
+
+					case REQUEST_INITIALISATION:
+						printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err);
+						break;
+
+					case FULLDUPLEX_CHECK:
+						printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err);
+						break;
+
+					default:
+						printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err);
+						break;
+				}
+
+				/* Show the open errors. */
+				switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK)
+				{
+					case OPEN_FUNCTION_FAILURE:
+						printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_FUNCTION_FAILURE;
+						break;
+
+					case OPEN_SIGNAL_LOSS:
+						printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_SIGNAL_LOSS;
+						break;
+
+					case OPEN_TIMEOUT:
+						printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_TIMEOUT;
+						break;
+
+					case OPEN_RING_FAILURE:
+						printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_RING_FAILURE;
+						break;
+
+					case OPEN_RING_BEACONING:
+						printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_RING_BEACONING;
+						break;
+
+					case OPEN_DUPLICATE_NODEADDR:
+						printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_DUPLICATE_NODEADDR;
+						break;
+
+					case OPEN_REQUEST_INIT:
+						printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_REQUEST_INIT;
+						break;
+
+					case OPEN_REMOVE_RECEIVED:
+						printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_REMOVE_RECEIVED;
+						break;
+
+					case OPEN_FULLDUPLEX_SET:
+						printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_FULLDUPLEX_SET;
+						break;
+
+					default:
+						printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err);
+						tp->LastOpenStatus =
+							OPEN_FUNCTION_FAILURE;
+						break;
+				}
+			}
+
+			tp->AdapterOpenFlag 	= 0;
+			tp->AdapterVirtOpenFlag = 0;
+
+			return;
+		}
+	}
+	else
+	{
+		if(ssb_cmd != READ_ERROR_LOG)
+			return;
+
+		/* Add values from the error log table to the MAC
+		 * statistics counters and update the errorlogtable
+		 * memory.
+		 */
+		tp->MacStat.line_errors += tp->errorlogtable.Line_Error;
+		tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error;
+		tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error;
+		tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error;
+		tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error;
+		tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error;
+		tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error;
+		tp->MacStat.token_errors += tp->errorlogtable.Token_Error;
+		tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error;
+		tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error;
+		tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters;
+		tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error;
+		tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error;
+	}
+
+	return;
+}
+
+/*
+ * The inverse routine to tms380tr_open().
+ */
+static int tms380tr_close(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	dev->tbusy = 1;
+	dev->start = 0;
+
+	del_timer(&tp->timer);
+
+	/* Flush the Tx and disable Rx here. */
+
+	tp->HaltInProgress 	= 1;
+	tms380tr_exec_cmd(dev, OC_CLOSE);
+	tp->timer.expires	= jiffies + 1*HZ;
+	tp->timer.function 	= tms380tr_timer_end_wait;
+	tp->timer.data 		= (unsigned long)dev;
+	add_timer(&tp->timer);
+
+	tms380tr_enable_interrupts(dev);
+
+	tp->Sleeping = 1;
+	interruptible_sleep_on(&tp->wait_for_tok_int);
+	tp->TransmitCommandActive = 0;
+    
+	del_timer(&tp->timer);
+	tms380tr_disable_interrupts(dev);
+   
+	if(dev->dma > 0) 
+	{
+		unsigned long flags=claim_dma_lock();
+		disable_dma(dev->dma);
+		release_dma_lock(flags);
+	}
+	
+	outw(0xFF00, dev->base_addr + SIFCMD);
+	if(dev->dma > 0)
+		outb(0xff, dev->base_addr + POSREG);
+
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+
+	tms380tr_cancel_tx_queue(tp);
+
+	return (0);
+}
+
+/*
+ * Get the current statistics. This may be called with the card open
+ * or closed.
+ */
+static struct enet_statistics *tms380tr_get_stats(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	return ((struct enet_statistics *)&tp->MacStat);
+}
+
+/*
+ * Set or clear the multicast filter for this adapter.
+ */
+static void tms380tr_set_multicast_list(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+        unsigned int OpenOptions;
+	
+        OpenOptions = tp->ocpl.OPENOptions &
+                ~(PASS_ADAPTER_MAC_FRAMES
+		  | PASS_ATTENTION_FRAMES
+		  | PASS_BEACON_MAC_FRAMES
+		  | COPY_ALL_MAC_FRAMES
+		  | COPY_ALL_NON_MAC_FRAMES);
+	
+        tp->ocpl.FunctAddr = 0;
+	
+        if(dev->flags & IFF_PROMISC)
+                /* Enable promiscuous mode */
+                OpenOptions |= COPY_ALL_NON_MAC_FRAMES |
+			COPY_ALL_MAC_FRAMES;
+        else
+        {
+                if(dev->flags & IFF_ALLMULTI)
+                {
+                        /* Disable promiscuous mode, use normal mode. */
+                        tp->ocpl.FunctAddr = 0xFFFFFFFF;
+			
+                }
+                else
+                {
+                        int i;
+                        struct dev_mc_list *mclist = dev->mc_list;
+                        for (i=0; i< dev->mc_count; i++)
+                        {
+                                ((char *)(&tp->ocpl.FunctAddr))[0] |=
+					mclist->dmi_addr[2];
+                                ((char *)(&tp->ocpl.FunctAddr))[1] |=
+					mclist->dmi_addr[3];
+                                ((char *)(&tp->ocpl.FunctAddr))[2] |=
+					mclist->dmi_addr[4];
+                                ((char *)(&tp->ocpl.FunctAddr))[3] |=
+					mclist->dmi_addr[5];
+                                mclist = mclist->next;
+                        }
+                }
+                tms380tr_exec_cmd(dev, OC_SET_FUNCT_ADDR);
+        }
+	
+        tp->ocpl.OPENOptions = OpenOptions;
+        tms380tr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS);
+        return;
+}
+
+/*
+ * Wait for some time (microseconds)
+ */
+static void tms380tr_wait(unsigned long time)
+{
+#if 0
+	long tmp;
+	
+	tmp = jiffies + time/(1000000/HZ);
+	do {
+  		current->state 		= TASK_INTERRUPTIBLE;
+		tmp = schedule_timeout(tmp);
+	} while(time_after(tmp, jiffies));
+#else
+	udelay(time);
+#endif
+	return;
+}
+
+/*
+ * Write a command value to the SIFCMD register
+ */
+static void tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue)
+{
+	int ioaddr = dev->base_addr;
+	unsigned short cmd;
+	unsigned short SifStsValue;
+	unsigned long loop_counter;
+
+	WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER);
+	cmd = (unsigned short)WriteValue;
+	loop_counter = 0,5 * 800000;
+	do {
+		SifStsValue = inw(ioaddr + SIFSTS);
+	} while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--);
+	outw(cmd, ioaddr + SIFCMD);
+
+	return;
+}
+
+/*
+ * Processes adapter hardware reset, halts adapter and downloads firmware,
+ * clears the halt bit.
+ */
+static int tms380tr_reset_adapter(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned short *fw_ptr = (unsigned short *)&tms380tr_code;
+	unsigned short count, c;
+	int ioaddr = dev->base_addr;
+
+	/* Hardware adapter reset */
+	outw(ACL_ARESET, ioaddr + SIFACL);
+	tms380tr_wait(40);
+	
+	c = inw(ioaddr + SIFACL);
+	tms380tr_wait(20);
+
+	if(dev->dma == 0)	/* For PCI adapters */
+	{
+		c &= ~(ACL_SPEED4 | ACL_SPEED16);	/* Clear bits */
+		if(tp->DataRate == SPEED_4)
+			c |= ACL_SPEED4;		/* Set 4Mbps */
+		else
+			c |= ACL_SPEED16;		/* Set 16Mbps */
+	}
+
+	/* In case a command is pending - forget it */
+	tp->ScbInUse = 0;
+
+	c &= ~ACL_ARESET;		/* Clear adapter reset bit */
+	c |=  ACL_CPHALT;		/* Halt adapter CPU, allow download */
+	c &= ~ACL_PSDMAEN;		/* Clear pseudo dma bit */
+	outw(c, ioaddr + SIFACL);
+	tms380tr_wait(40);
+
+	/* Download firmware via DIO interface: */
+	do {
+		/* Download first address part */
+		outw(*fw_ptr, ioaddr + SIFADX);
+		fw_ptr++;
+
+		/* Download second address part */
+		outw(*fw_ptr, ioaddr + SIFADD);
+		fw_ptr++;
+
+		if((count = *fw_ptr) != 0)	/* Load loop counter */
+		{
+			fw_ptr++;	/* Download block data */
+			for(; count > 0; count--)
+			{
+				outw(*fw_ptr, ioaddr + SIFINC);
+				fw_ptr++;
+			}
+		}
+		else	/* Stop, if last block downloaded */
+		{
+			c = inw(ioaddr + SIFACL);
+			c &= (~ACL_CPHALT | ACL_SINTEN);
+
+			/* Clear CPHALT and start BUD */
+			outw(c, ioaddr + SIFACL);
+			return (1);
+		}
+	} while(count == 0);
+
+	return (-1);
+}
+
+/*
+ * Starts bring up diagnostics of token ring adapter and evaluates
+ * diagnostic results.
+ */
+static int tms380tr_bringup_diags(struct net_device *dev)
+{
+	int loop_cnt, retry_cnt;
+	unsigned short Status;
+	int ioaddr = dev->base_addr;
+
+	tms380tr_wait(HALF_SECOND);
+	tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET);
+	tms380tr_wait(HALF_SECOND);
+
+	retry_cnt = BUD_MAX_RETRIES;	/* maximal number of retrys */
+
+	do {
+		retry_cnt--;
+		if(tms380tr_debug > 3)
+			printk(KERN_INFO "BUD-Status: ");
+		loop_cnt = BUD_MAX_LOOPCNT;	/* maximum: three seconds*/
+		do {			/* Inspect BUD results */
+			loop_cnt--;
+			tms380tr_wait(HALF_SECOND);
+			Status = inw(ioaddr + SIFSTS);
+			Status &= STS_MASK;
+
+			if(tms380tr_debug > 3)
+				printk(KERN_INFO " %04X \n", Status);
+			/* BUD successfully completed */
+			if(Status == STS_INITIALIZE)
+				return (1);
+		/* Unrecoverable hardware error, BUD not completed? */
+		} while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST))
+			!= (STS_ERROR | STS_TEST)));
+
+		/* Error preventing completion of BUD */
+		if(retry_cnt > 0)
+		{
+			printk(KERN_INFO "%s: Adapter Software Reset.\n", 
+				dev->name);
+			tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET);
+			tms380tr_wait(HALF_SECOND);
+		}
+	} while(retry_cnt > 0);
+
+	Status = inw(ioaddr + SIFSTS);
+	Status &= STS_ERROR_MASK;	/* Hardware error occurred! */
+
+	printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n",
+		dev->name, Status);
+
+	return (-1);
+}
+
+/*
+ * Copy initialisation data to adapter memory, beginning at address
+ * 1:0A00; Starting DMA test and evaluating result bits.
+ */
+static int tms380tr_init_adapter(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B};
+	const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7,
+						0xC5, 0xD9, 0xC3, 0xD4};
+	void *ptr = (void *)&tp->ipb;
+	unsigned short *ipb_ptr = (unsigned short *)ptr;
+	unsigned char *cb_ptr = (unsigned char *) &tp->scb;
+	unsigned char *sb_ptr = (unsigned char *) &tp->ssb;
+	unsigned short Status;
+	int i, loop_cnt, retry_cnt;
+	int ioaddr = dev->base_addr;
+
+	/* Normalize: byte order low/high, word order high/low! (only IPB!) */
+	tp->ipb.SCB_Addr = SWAPW(virt_to_bus(&tp->scb));
+	tp->ipb.SSB_Addr = SWAPW(virt_to_bus(&tp->ssb));
+
+	/* Maximum: three initialization retries */
+	retry_cnt = INIT_MAX_RETRIES;
+
+	do {
+		retry_cnt--;
+
+		/* Transfer initialization block */
+		outw(0x0001, ioaddr + SIFADX);
+
+		/* To address 0001:0A00 of adapter RAM */
+		outw(0x0A00, ioaddr + SIFADD);
+
+		/* Write 11 words to adapter RAM */
+		for(i = 0; i < 11; i++)
+			outw(ipb_ptr[i], ioaddr + SIFINC);
+
+		/* Execute SCB adapter command */
+		tms380tr_exec_sifcmd(dev, CMD_EXECUTE);
+
+		loop_cnt = INIT_MAX_LOOPCNT;	/* Maximum: 11 seconds */
+
+		/* While remaining retries, no error and not completed */
+		do {
+			Status = 0;
+			loop_cnt--;
+			tms380tr_wait(HALF_SECOND);
+
+			/* Mask interesting status bits */
+			Status = inw(ioaddr + SIFSTS);
+			Status &= STS_MASK;
+		} while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0)
+			&& ((Status & STS_ERROR) == 0) && (loop_cnt != 0));
+
+		if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0)
+		{
+			/* Initialization completed without error */
+			i = 0;
+			do {	/* Test if contents of SCB is valid */
+				if(SCB_Test[i] != *(cb_ptr + i))
+					/* DMA data error: wrong data in SCB */
+					return (-1);
+				i++;
+			} while(i < 6);
+
+			i = 0;
+			do {	/* Test if contents of SSB is valid */
+				if(SSB_Test[i] != *(sb_ptr + i))
+					/* DMA data error: wrong data in SSB */
+					return (-1);
+				i++;
+			} while (i < 8);
+
+			return (1);	/* Adapter successfully initialized */
+		}
+		else
+		{
+			if((Status & STS_ERROR) != 0)
+			{
+				/* Initialization error occurred */
+				Status = inw(ioaddr + SIFSTS);
+				Status &= STS_ERROR_MASK;
+				/* ShowInitialisationErrorCode(Status); */
+				return (-1); /* Unrecoverable error */
+			}
+			else
+			{
+				if(retry_cnt > 0)
+				{
+					/* Reset adapter and try init again */
+					tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET);
+					tms380tr_wait(HALF_SECOND);
+				}
+			}
+		}
+	} while(retry_cnt > 0);
+
+	return (-1);
+}
+
+/*
+ * Check for outstanding commands in command queue and tries to execute
+ * command immediately. Corresponding command flag in command queue is cleared.
+ */
+static void tms380tr_chk_outstanding_cmds(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned long Addr = 0;
+	unsigned char i = 0;
+
+	if(tp->CMDqueue == 0)
+		return;		/* No command execution */
+
+	/* If SCB in use: no command */
+	if(tp->ScbInUse == 1)
+		return;
+
+	/* Check if adapter is opened, avoiding COMMAND_REJECT
+	 * interrupt by the adapter!
+	 */
+	if(tp->AdapterOpenFlag == 0)
+	{
+		if(tp->CMDqueue & OC_OPEN)
+		{
+			/* Execute OPEN command	*/
+			tp->CMDqueue ^= OC_OPEN;
+
+			/* Copy the 18 bytes of the product ID */
+			while((tp->CardType->name[i] != '\0') 
+			      && (i < PROD_ID_SIZE))
+			{
+				tp->ProductID[i] = tp->CardType->name[i];
+				i++;
+			}
+
+			Addr = htonl(virt_to_bus(&tp->ocpl));
+			tp->scb.Parm[0] = LOWORD(Addr);
+			tp->scb.Parm[1] = HIWORD(Addr);
+			tp->scb.CMD = OPEN;
+		}
+		else
+			/* No OPEN command queued, but adapter closed. Note:
+			 * We'll try to re-open the adapter in DriverPoll()
+			 */
+			return;		/* No adapter command issued */
+	}
+	else
+	{
+		/* Adapter is open; evaluate command queue: try to execute
+		 * outstanding commands (depending on priority!) CLOSE
+		 * command queued
+		 */
+		if(tp->CMDqueue & OC_CLOSE)
+		{
+			tp->CMDqueue ^= OC_CLOSE;
+			tp->AdapterOpenFlag = 0;
+			tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */
+			tp->scb.Parm[1] = 0; /* but should be set to zero! */
+			tp->scb.CMD = CLOSE;
+			if(!tp->HaltInProgress)
+				tp->CMDqueue |= OC_OPEN; /* re-open adapter */
+			else
+				tp->CMDqueue = 0;	/* no more commands */
+		}
+		else
+		{
+			if(tp->CMDqueue & OC_RECEIVE)
+			{
+				tp->CMDqueue ^= OC_RECEIVE;
+				Addr = htonl(virt_to_bus(tp->RplHead));
+				tp->scb.Parm[0] = LOWORD(Addr);
+				tp->scb.Parm[1] = HIWORD(Addr);
+				tp->scb.CMD = RECEIVE;
+			}
+			else
+			{
+				if(tp->CMDqueue & OC_TRANSMIT_HALT)
+				{
+					/* NOTE: TRANSMIT.HALT must be checked 
+					 * before TRANSMIT.
+					 */
+					tp->CMDqueue ^= OC_TRANSMIT_HALT;
+					tp->scb.CMD = TRANSMIT_HALT;
+
+					/* Parm[0] and Parm[1] are ignored
+					 * but should be set to zero!
+					 */
+					tp->scb.Parm[0] = 0;
+					tp->scb.Parm[1] = 0;
+				}
+				else
+				{
+					if(tp->CMDqueue & OC_TRANSMIT)
+					{
+						/* NOTE: TRANSMIT must be 
+						 * checked after TRANSMIT.HALT
+						 */
+						if(tp->TransmitCommandActive)
+						{
+							if(!tp->TransmitHaltScheduled)
+							{
+								tp->TransmitHaltScheduled = 1;
+								tms380tr_exec_cmd(dev, OC_TRANSMIT_HALT) ;
+							}
+							tp->TransmitCommandActive = 0;
+							return;
+						}
+
+						tp->CMDqueue ^= OC_TRANSMIT;
+						tms380tr_cancel_tx_queue(tp);
+						Addr = htonl(virt_to_bus(tp->TplBusy));
+						tp->scb.Parm[0] = LOWORD(Addr);
+						tp->scb.Parm[1] = HIWORD(Addr);
+						tp->scb.CMD = TRANSMIT;
+						tp->TransmitCommandActive = 1;
+					}
+					else
+					{
+						if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS)
+						{
+							tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS;
+							tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/
+							tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION;
+							tp->scb.Parm[1] = 0; /* is ignored but should be zero */
+							tp->scb.CMD = MODIFY_OPEN_PARMS;
+						}
+						else
+						{
+							if(tp->CMDqueue & OC_SET_FUNCT_ADDR)
+							{
+								tp->CMDqueue ^= OC_SET_FUNCT_ADDR;
+								tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr);
+								tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr);
+								tp->scb.CMD = SET_FUNCT_ADDR;
+							}
+							else
+							{
+								if(tp->CMDqueue & OC_SET_GROUP_ADDR)
+								{
+									tp->CMDqueue ^= OC_SET_GROUP_ADDR;
+									tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr);
+									tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr);
+									tp->scb.CMD = SET_GROUP_ADDR;
+								}
+								else
+								{
+									if(tp->CMDqueue & OC_READ_ERROR_LOG)
+									{
+										tp->CMDqueue ^= OC_READ_ERROR_LOG;
+										Addr = htonl(virt_to_bus(&tp->errorlogtable));
+										tp->scb.Parm[0] = LOWORD(Addr);
+										tp->scb.Parm[1] = HIWORD(Addr);
+										tp->scb.CMD = READ_ERROR_LOG;
+									}
+									else
+									{
+										printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n");
+										tp->CMDqueue = 0;
+										return;
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	tp->ScbInUse = 1;	/* Set semaphore: SCB in use. */
+
+	/* Execute SCB and generate IRQ when done. */
+	tms380tr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST);
+
+	return;
+}
+
+/*
+ * IRQ conditions: signal loss on the ring, transmit or receive of beacon
+ * frames (disabled if bit 1 of OPEN option is set); report error MAC
+ * frame transmit (disabled if bit 2 of OPEN option is set); open or short
+ * circuit fault on the lobe is detected; remove MAC frame received;
+ * error counter overflow (255); opened adapter is the only station in ring.
+ * After some of the IRQs the adapter is closed!
+ */
+static void tms380tr_ring_status_irq(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	tp->CurrentRingStatus = SWAPB(tp->ssb.Parm[0]);
+
+	/* First: fill up statistics */
+	if(tp->ssb.Parm[0] & SIGNAL_LOSS)
+	{
+		printk(KERN_INFO "%s: Signal Loss\n", dev->name);
+		tp->MacStat.line_errors++;
+	}
+
+	/* Adapter is closed, but initialized */
+	if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT)
+	{
+		printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n", 
+			dev->name);
+		tp->MacStat.line_errors++;
+	}
+
+	if(tp->ssb.Parm[0] & RING_RECOVERY)
+		printk(KERN_INFO "%s: Ring Recovery\n", dev->name);
+
+	/* Counter overflow: read error log */
+	if(tp->ssb.Parm[0] & COUNTER_OVERFLOW)
+	{
+		printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
+		tms380tr_exec_cmd(dev, OC_READ_ERROR_LOG);
+	}
+
+	/* Adapter is closed, but initialized */
+	if(tp->ssb.Parm[0] & REMOVE_RECEIVED)
+		printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n", 
+			dev->name);
+
+	/* Adapter is closed, but initialized */
+	if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR)
+		printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n", 
+			dev->name);
+
+	if(tp->ssb.Parm[0] & HARD_ERROR)
+		printk(KERN_INFO "%s: Hard Error\n", dev->name);
+
+	if(tp->ssb.Parm[0] & SOFT_ERROR)
+		printk(KERN_INFO "%s: Soft Error\n", dev->name);
+
+	if(tp->ssb.Parm[0] & TRANSMIT_BEACON)
+		printk(KERN_INFO "%s: Transmit Beacon\n", dev->name);
+
+	if(tp->ssb.Parm[0] & SINGLE_STATION)
+		printk(KERN_INFO "%s: Single Station\n", dev->name);
+
+	/* Check if adapter has been closed */
+	if(tp->ssb.Parm[0] & ADAPTER_CLOSED)
+	{
+		printk(KERN_INFO "%s: Adapter closed (Reopening)," 
+			"QueueSkb %d, CurrentRingStat %x\n",
+			dev->name, tp->QueueSkb, tp->CurrentRingStatus);
+		tp->AdapterOpenFlag = 0;
+		tms380tr_open_adapter(dev);
+	}
+
+	return;
+}
+
+/*
+ * Issued if adapter has encountered an unrecoverable hardware
+ * or software error.
+ */
+static void tms380tr_chk_irq(struct net_device *dev)
+{
+	int i;
+	unsigned short AdapterCheckBlock[4];
+	unsigned short ioaddr = dev->base_addr;
+	struct net_local *tp = (struct net_local *)dev->priv;
+
+	tp->AdapterOpenFlag = 0;	/* Adapter closed now */
+
+	/* Page number of adapter memory */
+	outw(0x0001, ioaddr + SIFADX);
+	/* Address offset */
+	outw(CHECKADDR, ioaddr + SIFADR);
+
+	/* Reading 8 byte adapter check block. */
+	for(i = 0; i < 4; i++)
+		AdapterCheckBlock[i] = inw(ioaddr + SIFINC);
+
+	if(tms380tr_debug > 3)
+	{
+		printk("%s: AdapterCheckBlock: ", dev->name);
+		for (i = 0; i < 4; i++)
+			printk("%04X", AdapterCheckBlock[i]);
+		printk("\n");
+	}
+
+	switch(AdapterCheckBlock[0])
+	{
+		case DIO_PARITY:
+			printk(KERN_INFO "%s: DIO parity error\n", dev->name);
+			break;
+
+		case DMA_READ_ABORT:
+			printk(KERN_INFO "%s DMA read operation aborted:\n",
+				dev->name);
+			switch (AdapterCheckBlock[1])
+			{
+				case 0:
+					printk(KERN_INFO "Timeout\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2],
+						AdapterCheckBlock[3]);
+					break;
+
+				case 1:
+					printk(KERN_INFO "Parity error\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2], 
+						AdapterCheckBlock[3]);
+					break;
+
+				case 2: 
+					printk(KERN_INFO "Bus error\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2], 
+						AdapterCheckBlock[3]);
+					break;
+
+				default:
+					printk(KERN_INFO "Unknown error.\n");
+					break;
+			}
+			break;
+
+		case DMA_WRITE_ABORT:
+			printk(KERN_INFO "%s: DMA write operation aborted: \n",
+				dev->name);
+			switch (AdapterCheckBlock[1])
+			{
+				case 0: 
+					printk(KERN_INFO "Timeout\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2], 
+						AdapterCheckBlock[3]);
+					break;
+
+				case 1: 
+					printk(KERN_INFO "Parity error\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2], 
+						AdapterCheckBlock[3]);
+					break;
+
+				case 2: 
+					printk(KERN_INFO "Bus error\n");
+					printk(KERN_INFO "Address: %04X %04X\n",
+						AdapterCheckBlock[2], 
+						AdapterCheckBlock[3]);
+					break;
+
+				default:
+					printk(KERN_INFO "Unknown error.\n");
+					break;
+			}
+			break;
+
+		case ILLEGAL_OP_CODE:
+			printk("%s: Illegal operation code in firmware\n",
+				dev->name);
+			/* Parm[0-3]: adapter internal register R13-R15 */
+			break;
+
+		case PARITY_ERRORS:
+			printk("%s: Adapter internal bus parity error\n",
+				dev->name);
+			/* Parm[0-3]: adapter internal register R13-R15 */
+			break;
+
+		case RAM_DATA_ERROR:
+			printk("%s: RAM data error\n", dev->name);
+			/* Parm[0-1]: MSW/LSW address of RAM location. */
+			break;
+
+		case RAM_PARITY_ERROR:
+			printk("%s: RAM parity error\n", dev->name);
+			/* Parm[0-1]: MSW/LSW address of RAM location. */
+			break;
+
+		case RING_UNDERRUN:
+			printk("%s: Internal DMA underrun detected\n",
+				dev->name);
+			break;
+
+		case INVALID_IRQ:
+			printk("%s: Unrecognized interrupt detected\n",
+				dev->name);
+			/* Parm[0-3]: adapter internal register R13-R15 */
+			break;
+
+		case INVALID_ERROR_IRQ:
+			printk("%s: Unrecognized error interrupt detected\n",
+				dev->name);
+			/* Parm[0-3]: adapter internal register R13-R15 */
+			break;
+
+		case INVALID_XOP:
+			printk("%s: Unrecognized XOP request detected\n",
+				dev->name);
+			/* Parm[0-3]: adapter internal register R13-R15 */
+			break;
+
+		default:
+			printk("%s: Unknown status", dev->name);
+			break;
+	}
+
+	if(tms380tr_chipset_init(dev) == 1)
+	{
+		/* Restart of firmware successful */
+		tp->AdapterOpenFlag = 1;
+	}
+
+	return;
+}
+
+/*
+ * Internal adapter pointer to RAM data are copied from adapter into
+ * host system.
+ */
+static int tms380tr_read_ptr(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned short adapterram;
+
+	tms380tr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr,
+			ADAPTER_INT_PTRS, 16);
+	tms380tr_read_ram(dev, (unsigned char *)&adapterram,
+			(unsigned short)SWAPB(tp->intptrs.AdapterRAMPtr), 2);
+
+	return SWAPB(adapterram);
+}
+
+/*
+ * Reads a number of bytes from adapter to system memory.
+ */
+static void tms380tr_read_ram(struct net_device *dev, unsigned char *Data,
+				unsigned short Address, int Length)
+{
+	int i;
+	unsigned short old_sifadx, old_sifadr, InWord;
+	unsigned short ioaddr = dev->base_addr;
+
+	/* Save the current values */
+	old_sifadx = inw(ioaddr + SIFADX);
+	old_sifadr = inw(ioaddr + SIFADR);
+
+	/* Page number of adapter memory */
+	outw(0x0001, ioaddr + SIFADX);
+	/* Address offset in adapter RAM */
+	outw(Address, ioaddr + SIFADR);
+
+	/* Copy len byte from adapter memory to system data area. */
+	i = 0;
+	for(;;)
+	{
+		InWord = inw(ioaddr + SIFINC);
+
+		*(Data + i) = HIBYTE(InWord);	/* Write first byte */
+		if(++i == Length)		/* All is done break */
+			break;
+
+		*(Data + i) = LOBYTE(InWord);	/* Write second byte */
+		if (++i == Length)		/* All is done break */
+			break;
+	}
+
+	/* Restore original values */
+	outw(old_sifadx, ioaddr + SIFADX);
+	outw(old_sifadr, ioaddr + SIFADR);
+
+	return;
+}
+
+/*
+ * Reads MAC address from adapter ROM.
+ */
+static void tms380tr_read_addr(struct net_device *dev, unsigned char *Address)
+{
+	int i, In;
+	unsigned short ioaddr = dev->base_addr;
+
+	/* Address: 0000:0000 */
+	outw(0, ioaddr + SIFADX);
+	outw(0, ioaddr + SIFADR);
+
+	/* Read six byte MAC address data */
+	for(i = 0; i < 6; i++)
+	{
+		In = inw(ioaddr + SIFINC);
+		*(Address + i) = (unsigned char)(In >> 8);
+	}
+
+	return;
+}
+
+/*
+ * Cancel all queued packets in the transmission queue.
+ */
+static void tms380tr_cancel_tx_queue(struct net_local* tp)
+{
+	TPL *tpl;
+	struct sk_buff *skb;
+
+	/*
+	 * NOTE: There must not be an active TRANSMIT command pending, when
+	 * this function is called.
+	 */
+	if(tp->TransmitCommandActive)
+		return;
+
+	for(;;)
+	{
+		tpl = tp->TplBusy;
+		if(!tpl->BusyFlag)
+			break;
+		/* "Remove" TPL from busy list. */
+		tp->TplBusy = tpl->NextTPLPtr;
+		tms380tr_write_tpl_status(tpl, 0);	/* Clear VALID bit */
+		tpl->BusyFlag = 0;		/* "free" TPL */
+
+		printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl);
+
+		dev_kfree_skb(tpl->Skb);
+	}
+
+	for(;;)
+	{
+		skb = skb_dequeue(&tp->SendSkbQueue);
+		if(skb == NULL)
+			break;
+		tp->QueueSkb++;
+		dev_kfree_skb(skb);
+	}
+
+	return;
+}
+
+/*
+ * This function is called whenever a transmit interrupt is generated by the
+ * adapter. For a command complete interrupt, it is checked if we have to
+ * issue a new transmit command or not.
+ */
+static void tms380tr_tx_status_irq(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned char HighByte, HighAc, LowAc;
+	TPL *tpl;
+
+	/* NOTE: At this point the SSB from TRANSMIT STATUS is no longer
+	 * available, because the CLEAR SSB command has already been issued.
+	 *
+	 * Process all complete transmissions.
+	 */
+
+	for(;;)
+	{
+		tpl = tp->TplBusy;
+		if(!tpl->BusyFlag || (tpl->Status
+			& (TX_VALID | TX_FRAME_COMPLETE))
+			!= TX_FRAME_COMPLETE)
+		{
+			break;
+		}
+
+		/* "Remove" TPL from busy list. */
+		tp->TplBusy = tpl->NextTPLPtr ;
+
+		/* Check the transmit status field only for directed frames*/
+		if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0)
+		{
+			HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status);
+			HighAc   = GET_FRAME_STATUS_HIGH_AC(HighByte);
+			LowAc    = GET_FRAME_STATUS_LOW_AC(HighByte);
+
+			if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED))
+			{
+				printk(KERN_INFO "%s: (DA=%08lX not recognized)",
+					dev->name,
+					*(unsigned long *)&tpl->MData[2+2]);
+			}
+			else
+			{
+				if(tms380tr_debug > 3)
+					printk("%s: Directed frame tx'd\n", 
+						dev->name);
+			}
+		}
+		else
+		{
+			if(!DIRECTED_FRAME(tpl))
+			{
+				if(tms380tr_debug > 3)
+					printk("%s: Broadcast frame tx'd\n",
+						dev->name);
+			}
+		}
+
+                tp->MacStat.tx_packets++;
+		dev_kfree_skb(tpl->Skb);
+		tpl->BusyFlag = 0;	/* "free" TPL */
+	}
+
+	dev->tbusy = 0;
+	if(tp->QueueSkb < MAX_TX_QUEUE)
+		tms380tr_hardware_send_packet(dev, tp);
+
+	return;
+}
+
+/*
+ * Called if a frame receive interrupt is generated by the adapter.
+ * Check if the frame is valid and indicate it to system.
+ */
+static void tms380tr_rcv_status_irq(struct net_device *dev)
+{
+	struct net_local *tp = (struct net_local *)dev->priv;
+	unsigned char *ReceiveDataPtr;
+	struct sk_buff *skb;
+	unsigned int Length, Length2;
+	RPL *rpl;
+	RPL *SaveHead;
+
+	/* NOTE: At this point the SSB from RECEIVE STATUS is no longer
+	 * available, because the CLEAR SSB command has already been issued.
+	 *
+	 * Process all complete receives.
+	 */
+
+	for(;;)
+	{
+		rpl = tp->RplHead;
+		if(rpl->Status & RX_VALID)
+			break;		/* RPL still in use by adapter */
+
+		/* Forward RPLHead pointer to next list. */
+		SaveHead = tp->RplHead;
+		tp->RplHead = rpl->NextRPLPtr;
+
+		/* Get the frame size (Byte swap for Intel).
+		 * Do this early (see workaround comment below)
+		 */
+		Length = (unsigned short)SWAPB(rpl->FrameSize);
+
+		/* Check if the Frame_Start, Frame_End and
+		 * Frame_Complete bits are set.
+		 */
+		if((rpl->Status & VALID_SINGLE_BUFFER_FRAME)
+			== VALID_SINGLE_BUFFER_FRAME)
+		{
+			ReceiveDataPtr = rpl->MData;
+
+			/* Workaround for delayed write of FrameSize on ISA
+			 * (FrameSize is false but valid-bit is reset)
+			 * Frame size is set to zero when the RPL is freed.
+			 * Length2 is there because there have also been
+			 * cases where the FrameSize was partially written
+			 */
+			Length2 = (unsigned short)SWAPB(rpl->FrameSize);
+
+			if(Length == 0 || Length != Length2)
+			{
+				tp->RplHead = SaveHead;
+				break;	/* Return to tms380tr_interrupt */
+			}
+
+			/* Drop frames sent by myself */
+			if(tms380tr_chk_frame(dev, rpl->MData))
+			{
+				printk(KERN_INFO "%s: Received my own frame\n",
+					dev->name);
+				if(rpl->Skb != NULL)
+					dev_kfree_skb(rpl->Skb);
+			}
+			else
+			{
+			  tms380tr_update_rcv_stats(tp,ReceiveDataPtr,Length);
+			  
+			  if(tms380tr_debug > 3)
+			    printk("%s: Packet Length %04X (%d)\n",
+				   dev->name, Length, Length);
+			  
+				/* Indicate the received frame to system the
+				 * adapter does the Source-Routing padding for 
+				 * us. See: OpenOptions in tms380tr_init_opb()
+				 */
+				skb = rpl->Skb;
+				if(rpl->SkbStat == SKB_UNAVAILABLE)
+				{
+					/* Try again to allocate skb */
+					skb = dev_alloc_skb(tp->MaxPacketSize);
+					if(skb == NULL)
+					{
+						/* Update Stats ?? */
+					}
+					else
+					{
+						skb->dev	= dev;
+						skb_put(skb, tp->MaxPacketSize);
+						rpl->SkbStat 	= SKB_DATA_COPY;
+						ReceiveDataPtr 	= rpl->MData;
+					}
+				}
+
+				if(rpl->SkbStat == SKB_DATA_COPY
+					|| rpl->SkbStat == SKB_DMA_DIRECT)
+				{
+					if(rpl->SkbStat == SKB_DATA_COPY)
+						memmove(skb->data, ReceiveDataPtr, Length);
+
+					/* Deliver frame to system */
+					rpl->Skb = NULL;
+					skb_trim(skb,Length);
+					skb->protocol = tr_type_trans(skb,dev);
+					netif_rx(skb);
+				}
+			}
+		}
+		else	/* Invalid frame */
+		{
+			if(rpl->Skb != NULL)
+				dev_kfree_skb(rpl->Skb);
+
+			/* Skip list. */
+			if(rpl->Status & RX_START_FRAME)
+				/* Frame start bit is set -> overflow. */
+				tp->MacStat.rx_errors++;
+		}
+
+		/* Allocate new skb for rpl */
+		rpl->Skb = dev_alloc_skb(tp->MaxPacketSize);
+
+		/* skb == NULL ? then use local buffer */
+		if(rpl->Skb == NULL)
+		{
+			rpl->SkbStat = SKB_UNAVAILABLE;
+			rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex]));
+			rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
+		}
+		else	/* skb != NULL */
+		{
+			rpl->Skb->dev = dev;
+			skb_put(rpl->Skb, tp->MaxPacketSize);
+
+			/* Data unreachable for DMA ? then use local buffer */
+			if(tp->CardType->type == TMS_ISA && virt_to_bus(rpl->Skb->data) + tp->MaxPacketSize
+			   > ISA_MAX_ADDRESS)
+			{
+				rpl->SkbStat = SKB_DATA_COPY;
+				rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex]));
+				rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
+			}
+			else
+			{
+				/* DMA directly in skb->data */
+				rpl->SkbStat = SKB_DMA_DIRECT;
+				rpl->FragList[0].DataAddr = htonl(virt_to_bus(rpl->Skb->data));
+				rpl->MData = rpl->Skb->data;
+			}
+		}
+
+		rpl->FragList[0].DataCount = SWAPB(tp->MaxPacketSize);
+		rpl->FrameSize = 0;
+
+		/* Pass the last RPL back to the adapter */
+		tp->RplTail->FrameSize = 0;
+
+		/* Reset the CSTAT field in the list. */
+		tms380tr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ);
+
+		/* Current RPL becomes last one in list. */
+		tp->RplTail = tp->RplTail->NextRPLPtr;
+
+		/* Inform adapter about RPL valid. */
+		tms380tr_exec_sifcmd(dev, CMD_RX_VALID);
+	}
+
+	return;
+}
+
+/*
+ * This function should be used whenever the status of any RPL must be
+ * modified by the driver, because the compiler may otherwise change the
+ * order of instructions such that writing the RPL status may be executed
+ * at an undesireable time. When this function is used, the status is
+ * always written when the function is called.
+ */
+static void tms380tr_write_rpl_status(RPL *rpl, unsigned int Status)
+{
+	rpl->Status = Status;
+
+	return;
+}
+
+/*
+ * The function updates the statistic counters in mac->MacStat.
+ * It differtiates between directed and broadcast/multicast ( ==functional)
+ * frames.
+ */
+static void tms380tr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[],
+					unsigned int Length)
+{
+	tp->MacStat.rx_packets++;
+	tp->MacStat.rx_bytes += Length;
+	
+	/* Test functional bit */
+	if(DataPtr[2] & GROUP_BIT)
+		tp->MacStat.multicast++;
+
+	return;
+}
+
+/*
+ * Check if it is a frame of myself. Compare source address with my current
+ * address in reverse direction, and mask out the TR_RII.
+ */
+static unsigned char tms380tr_chk_frame(struct net_device *dev, unsigned char *Addr)
+{
+	int i;
+
+	for(i = 5; i > 0; i--)
+	{
+		if(Addr[8 + i] != dev->dev_addr[i])
+			return (0);
+	}
+
+	/* Mask out RIF bit. */
+	if((Addr[8] & ~TR_RII) != (unsigned char)(dev->dev_addr[0]))
+		return (0);
+
+	return (1);  /* It is my frame. */
+}
+
+#if TMS380TR_DEBUG > 0
+/*
+ * Dump Packet (data)
+ */
+static void tms380tr_dump(unsigned char *Data, int length)
+{
+        int i, j;
+
+        for (i = 0, j = 0; i < length / 8; i++, j += 8)
+        {
+		printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n",
+			Data[j+0],Data[j+1],Data[j+2],Data[j+3],
+                        Data[j+4],Data[j+5],Data[j+6],Data[j+7]);
+        }
+
+        return;
+}
+#endif
+
+#ifdef MODULE
+
+static struct net_device* dev_tms380tr[TMS380TR_MAX_ADAPTERS];
+static int io[TMS380TR_MAX_ADAPTERS]	= { 0, 0 };
+static int irq[TMS380TR_MAX_ADAPTERS] 	= { 0, 0 };
+static int mem[TMS380TR_MAX_ADAPTERS] 	= { 0, 0 };
+
+MODULE_PARM(io,  "1-" __MODULE_STRING(TMS380TR_MAX_ADAPTERS) "i");
+MODULE_PARM(irq, "1-" __MODULE_STRING(TMS380TR_MAX_ADAPTERS) "i");
+MODULE_PARM(mem, "1-" __MODULE_STRING(TMS380TR_MAX_ADAPTERS) "i");
+
+int init_module(void)
+{
+	int i;
+
+	for(i = 0; i < TMS380TR_MAX_ADAPTERS; i++)
+	{
+                irq[i] = 0;
+                mem[i] = 0;
+                dev_tms380tr[i] = NULL;
+                dev_tms380tr[i] = init_trdev(dev_tms380tr[i], 0);
+                if(dev_tms380tr[i] == NULL)
+                        return (-ENOMEM);
+
+		dev_tms380tr[i]->base_addr = io[i];
+                dev_tms380tr[i]->irq       = irq[i];
+                dev_tms380tr[i]->mem_start = mem[i];
+                dev_tms380tr[i]->init      = &tms380tr_probe;
+
+                if(register_trdev(dev_tms380tr[i]) != 0)
+		{
+                        kfree_s(dev_tms380tr[i], sizeof(struct net_device));
+                        dev_tms380tr[i] = NULL;
+                        if(i == 0)
+			{
+                                printk("tms380tr: register_trdev() returned non-zero.\n");
+                                return (-EIO);
+                        }
+			else
+                                return (0);
+                }
+        }
+
+        return (0);
+}
+
+void cleanup_module(void)
+{
+	int i;
+
+        for(i = 0; i < TMS380TR_MAX_ADAPTERS; i++)
+	{
+		if(dev_tms380tr[i])
+		{
+			unregister_trdev(dev_tms380tr[i]);
+			release_region(dev_tms380tr[i]->base_addr, TMS380TR_IO_EXTENT);
+			if(dev_tms380tr[i]->irq)
+				free_irq(dev_tms380tr[i]->irq, dev_tms380tr[i]);
+			if(dev_tms380tr[i]->dma > 0)
+				free_dma(dev_tms380tr[i]->dma);
+			if(dev_tms380tr[i]->priv)
+				kfree_s(dev_tms380tr[i]->priv, sizeof(struct net_local));
+			kfree_s(dev_tms380tr[i], sizeof(struct net_device));
+			dev_tms380tr[i] = NULL;
+                }
+	}
+}
+#endif /* MODULE */
diff -u --recursive --new-file v2.3.21/linux/drivers/net/tokenring/tms380tr.h linux/drivers/net/tokenring/tms380tr.h
--- v2.3.21/linux/drivers/net/tokenring/tms380tr.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/tokenring/tms380tr.h	Thu Oct 14 14:22:09 1999
@@ -0,0 +1,1109 @@
+/* tms380tr.h: TI TMS380 Token Ring driver for Linux
+ *
+ * Authors:
+ * - Christoph Goos <cgoos@syskonnect.de>
+ */
+
+#ifndef __LINUX_TMS380TR_H
+#define __LINUX_TMS380TR_H
+
+#ifdef __KERNEL__
+
+#define TMS380TR_MAX_ADAPTERS 7
+
+#define SEND_TIMEOUT 10*HZ
+
+#define TR_RCF_LONGEST_FRAME_MASK 0x0070
+#define TR_RCF_FRAME4K 0x0030
+
+/*------------------------------------------------------------------*/
+/*  Bit order for adapter communication with DMA		    */
+/*  --------------------------------------------------------------  */
+/*  Bit  8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7|  */
+/*  --------------------------------------------------------------  */
+/*  The bytes in a word must be byte swapped. Also, if a double	    */
+/*  word is used for storage, then the words, as well as the bytes, */
+/*  must be swapped. 						    */
+/*  Bit order for adapter communication with DIO 		    */
+/*  --------------------------------------------------------------  */
+/*  Bit  0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15|  */
+/*  --------------------------------------------------------------  */
+/*------------------------------------------------------------------*/
+
+/* Swap bytes of a word.                        */
+#define SWAPB(x) (((unsigned short)((x) << 8)) | ((unsigned short)((x) >> 8)))
+
+/* Swap words of a long.                        */
+#define SWAPW(x) (((x) << 16) | ((x) >> 16))
+
+/* Get the low byte of a word.                      */
+#define LOBYTE(w)       ((unsigned char)(w))
+
+/* Get the high byte of a word.                     */
+#define HIBYTE(w)       ((unsigned char)((unsigned short)(w) >> 8))
+
+/* Get the low word of a long.                      */
+#define LOWORD(l)       ((unsigned short)(l))
+
+/* Get the high word of a long.                     */
+#define HIWORD(l)       ((unsigned short)((unsigned long)(l) >> 16))
+
+
+
+/* Token ring adapter I/O addresses for normal mode. */
+#define SIFDAT      		0L	/* SIF/DMA data. */
+#define SIFINC      		2L  	/* IO Word data with auto increment. */
+#define SIFINH      		3L  	/* IO Byte data with auto increment. */
+#define SIFADR      		4L  	/* SIF/DMA Address. */
+#define SIFCMD      		6L  	/* SIF Command. */
+#define SIFSTS      		6L  	/* SIF Status. */
+#define SIFACL      		8L  	/* SIF Adapter Control Register. */
+#define SIFADD      		10L 	/* SIF/DMA Address. */
+#define SIFADX      		12L
+#define DMALEN      		14L 	/* SIF DMA length. */
+#define POSREG      		16L 	/* Adapter Program Option Select (POS)
+			 		 * Register: base IO address + 16 byte.
+			 		 */
+#define POSREG_2    		24L 	/* only for TR4/16+ adapter
+			 		 * base IO address + 24 byte.
+			 		 */
+
+
+/* SIFCMD command codes (high-low) */
+#define CMD_INTERRUPT_ADAPTER   0x8000  /* Cause internal adapter interrupt */
+#define CMD_ADAPTER_RESET   	0x4000  /* Hardware reset of adapter */
+#define CMD_SSB_CLEAR		0x2000  /* Acknowledge to adapter to
+					 * system interrupts.
+					 */
+#define CMD_EXECUTE		0x1000	/* Execute SCB command */
+#define CMD_SCB_REQUEST		0x0800  /* Request adapter to interrupt
+					 * system when SCB is available for
+					 * another command.
+					 */
+#define CMD_RX_CONTINUE		0x0400  /* Continue receive after odd pointer
+					 * stop. (odd pointer receive method)
+					 */
+#define CMD_RX_VALID		0x0200  /* Now actual RPL is valid. */
+#define CMD_TX_VALID		0x0100  /* Now actual TPL is valid. (valid
+					 * bit receive/transmit method)
+					 */
+#define CMD_SYSTEM_IRQ		0x0080  /* Adapter-to-attached-system
+					 * interrupt is reset.
+					 */
+#define CMD_CLEAR_SYSTEM_IRQ	0x0080	/* Clear SYSTEM_INTERRUPT bit.
+					 * (write: 1=ignore, 0=reset)
+					 */
+#define EXEC_SOFT_RESET		0xFF00  /* adapter soft reset. (restart
+					 * adapter after hardware reset)
+					 */
+
+
+/* ACL commands (high-low) */
+#define ACL_SWHLDA		0x0800  /* Software hold acknowledge. */
+#define ACL_SWDDIR		0x0400  /* Data transfer direction. */
+#define ACL_SWHRQ		0x0200  /* Pseudo DMA operation. */
+#define ACL_PSDMAEN		0x0100  /* Enable pseudo system DMA. */
+#define ACL_ARESET		0x0080  /* Adapter hardware reset command.
+					 * (held in reset condition as
+					 * long as bit is set)
+					 */
+#define ACL_CPHALT		0x0040  /* Communication processor halt.
+					 * (can only be set while ACL_ARESET
+					 * bit is set; prevents adapter
+					 * processor from executing code while
+					 * downloading firmware)
+					 */
+#define ACL_BOOT		0x0020
+#define ACL_SINTEN		0x0008  /* System interrupt enable/disable
+					 * (1/0): can be written if ACL_ARESET
+					 * is zero.
+					 */
+#define ACL_SPEED4		0x0003
+#define ACL_SPEED16		0x0001
+#define PS_DMA_MASK		(ACL_SWHRQ | ACL_PSDMAEN)
+
+
+/* SIFSTS register return codes (high-low) */
+#define STS_SYSTEM_IRQ		0x0080	/* Adapter-to-attached-system
+					 * interrupt is valid.
+					 */
+#define STS_INITIALIZE		0x0040  /* INITIALIZE status. (ready to
+					 * initialize)
+					 */
+#define STS_TEST		0x0020  /* TEST status. (BUD not completed) */
+#define STS_ERROR		0x0010  /* ERROR status. (unrecoverable
+					 * HW error occurred)
+					 */
+#define STS_MASK		0x00F0  /* Mask interesting status bits. */
+#define STS_ERROR_MASK		0x000F  /* Get Error Code by masking the
+					 * interrupt code bits.
+					 */
+#define ADAPTER_INT_PTRS	0x0A00  /* Address offset of adapter internal
+					 * pointers 01:0a00 (high-low) have to
+					 * be read after init and before open.
+					 */
+
+
+/* Interrupt Codes (only MAC IRQs) */
+#define STS_IRQ_ADAPTER_CHECK   0x0000  /* unrecoverable hardware or
+					 * software error.
+					 */ 
+#define STS_IRQ_RING_STATUS     0x0004  /* SSB is updated with ring status. */
+#define STS_IRQ_SCB_CLEAR       0x0006  /* SCB clear, following an
+					 * SCB_REQUEST IRQ.
+					 */
+#define STS_IRQ_COMMAND_STATUS  0x0008  /* SSB is updated with command 
+					 * status.
+					 */ 
+#define STS_IRQ_RECEIVE_STATUS  0x000A  /* SSB is updated with receive
+					 * status.
+					 */
+#define STS_IRQ_TRANSMIT_STATUS 0x000C  /* SSB is updated with transmit
+                                         * status
+					 */
+#define STS_IRQ_MASK            0x000F  /* = STS_ERROR_MASK. */
+
+
+/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */
+#define COMMAND_COMPLETE        0x0080  /* TRANSMIT command completed
+                                         * (avoid this!) issue another transmit
+					 * to send additional frames.
+					 */
+#define FRAME_COMPLETE          0x0040  /* Frame has been transmitted;
+					 * INTERRUPT_FRAME bit was set in the
+					 * CSTAT request; indication of possibly
+					 * more than one frame transmissions!
+					 * SSB.Parm[0-1]: 32 bit pointer to
+					 * TPL of last frame.
+					 */
+#define LIST_ERROR              0x0020  /* Error in one of the TPLs that
+					 * compose the frame; TRANSMIT
+					 * terminated; Parm[1-2]: 32 bit pointer
+					 * to TPL which starts the error
+					 * frame; error details in bits 8-13.
+					 * (14?)
+					 */
+#define FRAME_SIZE_ERROR        0x8000  /* FRAME_SIZE does not equal the sum of
+					 * the valid DATA_COUNT fields;
+					 * FRAME_SIZE less than header plus
+					 * information field. (15 bytes +
+					 * routing field) Or if FRAME_SIZE
+					 * was specified as zero in one list.
+					 */
+#define TX_THRESHOLD            0x4000  /* FRAME_SIZE greater than (BUFFER_SIZE
+					 * - 9) * TX_BUF_MAX.
+					 */
+#define ODD_ADDRESS             0x2000  /* Odd forward pointer value is
+					 * read on a list without END_FRAME
+					 * indication.
+					 */
+#define FRAME_ERROR             0x1000  /* START_FRAME bit is (not) anticipated,
+					 * but (not) set.
+					 */
+#define ACCESS_PRIORITY_ERROR   0x0800  /* Access priority requested has not
+					 * been allowed.
+					 */
+#define UNENABLED_MAC_FRAME     0x0400  /* MAC frame has source class of zero
+					 * or MAC frame PCF ATTN field is
+					 * greater than one.
+					 */
+#define ILLEGAL_FRAME_FORMAT    0x0200  /* Bit 0 or FC field was set to one. */
+
+
+/*
+ * Since we need to support some functions even if the adapter is in a
+ * CLOSED state, we have a (pseudo-) command queue which holds commands
+ * that are outstandig to be executed.
+ *
+ * Each time a command completes, an interrupt occurs and the next
+ * command is executed. The command queue is actually a simple word with 
+ * a bit for each outstandig command. Therefore the commands will not be
+ * executed in the order they have been queued.
+ *
+ * The following defines the command code bits and the command queue:
+ */
+#define OC_OPEN                 0x0001	/* OPEN command */
+#define OC_TRANSMIT             0x0002  /* TRANSMIT command */
+#define OC_TRANSMIT_HALT        0x0004  /* TRANSMIT_HALT command */
+#define OC_RECEIVE              0x0008  /* RECEIVE command */
+#define OC_CLOSE                0x0010  /* CLOSE command */
+#define OC_SET_GROUP_ADDR       0x0020  /* SET_GROUP_ADDR command */
+#define OC_SET_FUNCT_ADDR       0x0040  /* SET_FUNCT_ADDR command */
+#define OC_READ_ERROR_LOG       0x0080  /* READ_ERROR_LOG command */
+#define OC_READ_ADAPTER         0x0100  /* READ_ADAPTER command */
+#define OC_MODIFY_OPEN_PARMS    0x0400  /* MODIFY_OPEN_PARMS command */
+#define OC_RESTORE_OPEN_PARMS   0x0800  /* RESTORE_OPEN_PARMS command */
+#define OC_SET_FIRST_16_GROUP   0x1000  /* SET_FIRST_16_GROUP command */
+#define OC_SET_BRIDGE_PARMS     0x2000  /* SET_BRIDGE_PARMS command */
+#define OC_CONFIG_BRIDGE_PARMS  0x4000  /* CONFIG_BRIDGE_PARMS command */
+
+#define OPEN			0x0300  /* C: open command. S: completion. */
+#define TRANSMIT		0x0400  /* C: transmit command. S: completion
+					 * status. (reject: COMMAND_REJECT if
+					 * adapter not opened, TRANSMIT already
+					 * issued or address passed in the SCB
+					 * not word aligned)
+					 */
+#define TRANSMIT_HALT		0x0500  /* C: interrupt TX TPL chain; if no
+					 * TRANSMIT command issued, the command
+					 * is ignored. (completion with TRANSMIT
+					 * status (0x0400)!)
+					 */
+#define RECEIVE			0x0600  /* C: receive command. S: completion
+					 * status. (reject: COMMAND_REJECT if
+					 * adapter not opened, RECEIVE already
+					 * issued or address passed in the SCB 
+					 * not word aligned)
+					 */
+#define CLOSE			0x0700  /* C: close adapter. S: completion.
+					 * (COMMAND_REJECT if adapter not open)
+					 */
+#define SET_GROUP_ADDR		0x0800  /* C: alter adapter group address after
+					 * OPEN.  S: completion. (COMMAND_REJECT
+					 * if adapter not open)
+					 */
+#define SET_FUNCT_ADDR		0x0900  /* C: alter adapter functional address
+					 * after OPEN. S: completion.
+					 * (COMMAND_REJECT if adapter not open)
+					 */
+#define READ_ERROR_LOG		0x0A00  /* C: read adapter error counters.
+					 * S: completion. (command ignored
+					 * if adapter not open!)
+					 */
+#define READ_ADAPTER		0x0B00  /* C: read data from adapter memory.
+					 * (important: after init and before
+					 * open!) S: completion. (ADAPTER_CHECK
+					 * interrupt if undefined storage area
+					 * read)
+					 */
+#define MODIFY_OPEN_PARMS	0x0D00  /* C: modify some adapter operational
+					 * parameters. (bit correspondend to
+					 * WRAP_INTERFACE is ignored)
+					 * S: completion. (reject: 
+					 * COMMAND_REJECT)
+					 */
+#define RESTORE_OPEN_PARMS	0x0E00  /* C: modify some adapter operational
+					 * parameters. (bit correspondend
+					 * to WRAP_INTERFACE is ignored)
+					 * S: completion. (reject:
+					 * COMMAND_REJECT)
+					 */
+#define SET_FIRST_16_GROUP	0x0F00  /* C: alter the first two bytes in
+					 * adapter group address.
+					 * S: completion. (reject:
+					 * COMMAND_REJECT)
+					 */
+#define SET_BRIDGE_PARMS	0x1000  /* C: values and conditions for the
+					 * adapter hardware to use when frames
+					 * are copied for forwarding.
+					 * S: completion. (reject:
+					 * COMMAND_REJECT)
+					 */
+#define CONFIG_BRIDGE_PARMS 0x1100	/* C: ..
+					 * S: completion. (reject:
+					 * COMMAND_REJECT)
+					 */
+
+#define SPEED_4         4
+#define SPEED_16        16	/* Default transmission speed  */
+
+
+/* Initialization Parameter Block (IPB); word alignment necessary! */
+#define BURST_SIZE      0x0018  /* Default burst size */
+#define BURST_MODE      0x9F00  /* Burst mode enable */
+#define DMA_RETRIES     0x0505  /* Magic DMA retry number... */
+
+#define CYCLE_TIME      3	/* Default AT-bus cycle time: 500 ns
+				 * (later adapter version: fix  cycle time!)
+				 */
+#define LINE_SPEED_BIT	0x80
+
+/* Macro definition for the wait function. */
+#define ONE_SECOND_TICKS	1000000
+#define HALF_SECOND		(ONE_SECOND_TICKS / 2)
+#define ONE_SECOND		(ONE_SECOND_TICKS)
+#define TWO_SECONDS		(ONE_SECOND_TICKS * 2)
+#define THREE_SECONDS		(ONE_SECOND_TICKS * 3)
+#define FOUR_SECONDS		(ONE_SECOND_TICKS * 4)
+#define FIVE_SECONDS		(ONE_SECOND_TICKS * 5)
+
+#define BUFFER_SIZE 2048	/* Buffers on Adapter */
+
+#pragma pack(1)
+typedef struct {
+	unsigned short Init_Options;	/* Initialize with burst mode;
+					 * LLC disabled. (MAC only)
+					 */
+
+	/* Interrupt vectors the adapter places on attached system bus. */
+	unsigned char CMD_Status_IV;	/* Interrupt vector: command status. */
+	unsigned char TX_IV;     	/* Interrupt vector: transmit. */
+	unsigned char RX_IV;     	/* Interrupt vector: receive. */
+	unsigned char Ring_Status_IV;	/* Interrupt vector: ring status. */
+	unsigned char SCB_Clear_IV;  	/* Interrupt vector: SCB clear. */
+	unsigned char Adapter_CHK_IV;	/* Interrupt vector: adapter check. */
+
+	unsigned short RX_Burst_Size;	/* Max. number of transfer cycles. */
+	unsigned short TX_Burst_Size;	/* During DMA burst; even value! */
+	unsigned short DMA_Abort_Thrhld; /* Number of DMA retries. */
+
+	unsigned long SCB_Addr;	/* SCB address: even, word aligned, high-low. */
+	unsigned long SSB_Addr;	/* SSB address: even, word aligned, high-low. */
+} IPB, *IPB_Ptr;
+#pragma pack()
+
+/*
+ * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to
+ * be reopened)
+ */
+#define BUFFER_SIZE	2048		/* Buffers on Adapter. */
+#define TPL_SIZE	8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */
+#define RPL_SIZE	14		/* (with TI firmware v2.26 handling
+					 * up to nine fragments possible)
+					 */
+#define TX_BUF_MIN      20		/* ??? (Stephan: calculation with */
+#define TX_BUF_MAX      40		/* BUFFER_SIZE and MAX_FRAME_SIZE) ??? 
+					 */
+#define DISABLE_EARLY_TOKEN_RELEASE 0x1000
+
+/* OPEN Options (high-low) */
+#define WRAP_INTERFACE		0x0080	/* Inserting omitted for test
+					 * purposes; transmit data appears
+					 * as receive data. (usefull for
+					 * testing; change: CLOSE necessary)
+					 */
+#define DISABLE_HARD_ERROR	0x0040  /* On HARD_ERROR & TRANSMIT_BEACON
+					 * no RING.STATUS interrupt.
+					 */
+#define DISABLE_SOFT_ERROR	0x0020  /* On SOFT_ERROR, no RING.STATUS
+					 * interrupt.
+					 */
+#define PASS_ADAPTER_MAC_FRAMES 0x0010  /* Passing unsupported MAC frames
+					 * to system.
+					 */
+#define PASS_ATTENTION_FRAMES   0x0008  /* All changed attention MAC frames are
+					 * passed to the system.
+					 */
+#define PAD_ROUTING_FIELD	0x0004  /* Routing field is padded to 18
+					 * bytes.
+					 */
+#define FRAME_HOLD		0x0002  /* Adapter waits for entire frame before
+					 * initiating DMA transfer; otherwise:
+					 * DMA transfer initiation if internal
+					 * buffer filled.
+					 */
+#define CONTENDER		0x0001  /* Adapter participates in the monitor
+					 * contention process.
+					 */
+#define PASS_BEACON_MAC_FRAMES  0x8000  /* Adapter passes beacon MAC frames
+					 * to the system.
+					 */
+#define EARLY_TOKEN_RELEASE 	0x1000  /* Only valid in 16 Mbps operation;
+					 * 0 = ETR. (no effect in 4 Mbps
+					 * operation)
+					 */
+#define COPY_ALL_MAC_FRAMES	0x0400  /* All MAC frames are copied to
+					 * the system. (after OPEN: duplicate
+					 * address test (DAT) MAC frame is 
+					 * first received frame copied to the
+					 * system)
+					 */
+#define COPY_ALL_NON_MAC_FRAMES	0x0200  /* All non MAC frames are copied to
+					 * the system.
+					 */
+#define PASS_FIRST_BUF_ONLY	0x0100  /* Passes only first internal buffer
+					 * of each received frame; FrameSize
+					 * of RPLs must contain internal
+					 * BUFFER_SIZE bits for promiscous mode.
+					 */
+#define ENABLE_FULL_DUPLEX_SELECTION 0x2000 /* Enable the use of full-duplex
+					 * settings with bits in byte 22 in
+					 * ocpl. (new feature in firmware
+					 * version 3.09)
+					 */
+
+/* Full-duplex settings */
+#define OPEN_FULL_DUPLEX_OFF	0x0000
+#define OPEN_FULL_DUPLEX_ON	0x00c0
+#define OPEN_FULL_DUPLEX_AUTO	0x0080
+
+#define PROD_ID_SIZE	18	/* Length of product ID. */
+
+#define TX_FRAG_NUM	3	 /* Number of fragments used in one TPL. */
+#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more
+				  * fragments following.
+				  */
+
+#define ISA_MAX_ADDRESS 0x00ffffff
+
+#pragma pack(1)
+typedef struct {
+	unsigned short OPENOptions;
+	unsigned char NodeAddr[6];	/* Adapter node address; use ROM 
+					 * address
+					 */
+	unsigned long GroupAddr;	/* Multicast: high order
+					 * bytes = 0xC000
+					 */
+	unsigned long FunctAddr;	/* High order bytes = 0xC000 */
+	unsigned short RxListSize;	/* RPL size: 0 (=26), 14, 20 or
+					 * 26 bytes read by the adapter.
+					 * (Depending on the number of 
+					 * fragments/list)
+					 */
+	unsigned short TxListSize;	/* TPL size */
+	unsigned short BufSize;		/* Is automatically rounded up to the
+					 * nearest nK boundary.
+					 */
+	unsigned short FullDuplex;
+	unsigned short Reserved;
+	unsigned char TXBufMin;		/* Number of adapter buffers reserved
+					 * for transmission a minimum of 2
+					 * buffers must be allocated.
+					 */
+	unsigned char TXBufMax;		/* Maximum number of adapter buffers
+					 * for transmit; a minimum of 2 buffers
+					 * must be available for receive.
+					 * Default: 6
+					 */
+	unsigned short ProdIDAddr[2];	/* Pointer to product ID. */
+} OPB, *OPB_Ptr;
+#pragma pack()
+
+/*
+ * SCB: adapter commands enabled by the host system started by writing
+ * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO
+ * register. (special case: | CMD_SYSTEM_IRQ for initialization)
+ */
+#pragma pack(1)
+typedef struct {
+	unsigned short CMD;	/* Command code */
+	unsigned short Parm[2];	/* Pointer to Command Parameter Block */
+} SCB;	/* System Command Block (32 bit physical address; big endian)*/
+#pragma pack()
+
+/*
+ * SSB: adapter command return status can be evaluated after COMMAND_STATUS
+ * adapter to system interrupt after reading SSB, the availability of the SSB
+ * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR
+ * in the SIFCMD IO register.
+ */
+#pragma pack(1)
+typedef struct {
+	unsigned short STS;	/* Status code */
+	unsigned short Parm[3];	/* Parameter or pointer to Status Parameter
+				 * Block.
+				 */
+} SSB;	/* System Status Block (big endian - physical address)  */
+#pragma pack()
+
+typedef struct {
+	unsigned short BurnedInAddrPtr;	/* Pointer to adapter burned in
+					 * address. (BIA)
+					 */
+	unsigned short SoftwareLevelPtr;/* Pointer to software level data. */
+	unsigned short AdapterAddrPtr;	/* Pointer to adapter addresses. */
+	unsigned short AdapterParmsPtr;	/* Pointer to adapter parameters. */
+	unsigned short MACBufferPtr;	/* Pointer to MAC buffer. (internal) */
+	unsigned short LLCCountersPtr;	/* Pointer to LLC counters.  */
+	unsigned short SpeedFlagPtr;	/* Pointer to data rate flag.
+					 * (4/16 Mbps)
+					 */
+	unsigned short AdapterRAMPtr;	/* Pointer to adapter RAM found. (KB) */
+} INTPTRS;	/* Adapter internal pointers */
+
+#pragma pack(1)
+typedef struct {
+	unsigned char Line_Error;	/* Line error: code violation in
+					 * frame or in a token, or FCS error.
+					 */
+	unsigned char Internal_Error;	/* IBM specific. (Reserved_1) */
+	unsigned char Burst_Error;
+	unsigned char ARI_FCI_Error;	/* ARI/FCI bit zero in AMP or
+					 * SMP MAC frame.
+					 */
+	unsigned char AbortDelimeters;	/* IBM specific. (Reserved_2) */
+	unsigned char Reserved_3;
+	unsigned char Lost_Frame_Error;	/* Receive of end of transmitted
+					 * frame failed.
+					 */
+	unsigned char Rx_Congest_Error;	/* Adapter in repeat mode has not
+					 * enough buffer space to copy incoming
+					 * frame.
+					 */
+	unsigned char Frame_Copied_Error;/* ARI bit not zero in frame
+					 * addressed to adapter.
+					 */
+	unsigned char Frequency_Error;	/* IBM specific. (Reserved_4) */
+	unsigned char Token_Error;	/* (active only in monitor station) */
+	unsigned char Reserved_5;
+	unsigned char DMA_Bus_Error;	/* DMA bus errors not exceeding the
+					 * abort thresholds.
+					 */
+	unsigned char DMA_Parity_Error;	/* DMA parity errors not exceeding
+					 * the abort thresholds.
+					 */
+} ERRORTAB;	/* Adapter error counters */
+#pragma pack()
+
+
+/*--------------------- Send and Receive definitions -------------------*/
+#pragma pack(1)
+typedef struct {
+	unsigned short DataCount;	/* Value 0, even and odd values are
+					 * permitted; value is unaltered most
+					 * significant bit set: following
+					 * fragments last fragment: most
+					 * significant bit is not evaluated.
+					 * (???)
+					 */
+	unsigned long DataAddr;		/* Pointer to frame data fragment;
+					 * even or odd.
+					 */
+} Fragment;
+#pragma pack()
+
+#define MAX_FRAG_NUMBERS    9	/* Maximal number of fragments possible to use
+				 * in one RPL/TPL. (depending on TI firmware 
+				 * version)
+				 */
+#define MAX_TX_QUEUE	    10	/* Maximal number of skb's queued in driver. */
+
+/*
+ * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504
+ * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176,
+ * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide
+ * Page 2-27.
+ */
+#define HEADER_SIZE		(1 + 1 + 6 + 6)
+#define SRC_SIZE		18
+#define MIN_DATA_SIZE		516
+#define DEFAULT_DATA_SIZE	4472
+#define MAX_DATA_SIZE		17800
+
+#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE)
+#define MIN_PACKET_SIZE     (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE)
+#define MAX_PACKET_SIZE     (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE)
+
+/*
+ * Macros to deal with the frame status field.
+ */
+#define AC_NOT_RECOGNIZED	0x00
+#define GROUP_BIT		0x80
+#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8))
+#define GET_FRAME_STATUS_HIGH_AC(Fs)	  ((unsigned char)(((Fs) & 0xC0) >> 6))
+#define GET_FRAME_STATUS_LOW_AC(Fs)       ((unsigned char)(((Fs) & 0x0C) >> 2))
+#define DIRECTED_FRAME(Context)           (!((Context)->MData[2] & GROUP_BIT))
+
+
+/*--------------------- Send Functions ---------------------------------*/
+/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */
+
+#define TX_VALID		0x0080	/* R: set via TRANSMIT.VALID interrupt.
+					 * C: always reset to zero!
+					 */
+#define TX_FRAME_COMPLETE	0x0040	/* R: must be reset to zero.
+					 * C: set to one.
+					 */
+#define TX_START_FRAME		0x0020  /* R: start of a frame: 1 
+					 * C: unchanged.
+					 */
+#define TX_END_FRAME		0x0010  /* R: end of a frame: 1
+					 * C: unchanged.
+					 */
+#define TX_FRAME_IRQ		0x0008  /* R: request interrupt generation
+					 * after transmission.
+					 * C: unchanged.
+					 */
+#define TX_ERROR		0x0004  /* R: reserved.
+					 * C: set to one if Error occurred.
+					 */
+#define TX_INTERFRAME_WAIT	0x0004
+#define TX_PASS_CRC		0x0002  /* R: set if CRC value is already
+					 * calculated. (valid only in
+					 * FRAME_START TPL)
+					 * C: unchanged.
+					 */
+#define TX_PASS_SRC_ADDR	0x0001  /* R: adapter uses explicit frame
+					 * source address and does not overwrite
+					 * with the adapter node address.
+					 * (valid only in FRAME_START TPL)
+					 *
+					 * C: unchanged.
+					 */
+#define TX_STRIP_FS		0xFF00  /* R: reserved.
+					 * C: if no Transmission Error,
+					 * field contains copy of FS byte after
+					 * stripping of frame.
+					 */
+
+/*
+ * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL,
+ * but possibly multiple TPLs for one frame) the length of the TPLs has to be
+ * initialized in the OPL. (OPEN parameter list)
+ */
+#define TPL_NUM		3	/* Number of Transmit Parameter Lists.
+				 * !! MUST BE >= 3 !!
+				 */
+
+#pragma pack(1)
+typedef struct s_TPL TPL;
+
+struct s_TPL {	/* Transmit Parameter List (align on even word boundaries) */
+	unsigned long NextTPLAddr;	/* Pointer to next TPL in chain; if
+					 * pointer is odd: this is the last
+					 * TPL. Pointing to itself can cause
+					 * problems!
+					 */
+	volatile unsigned short Status;	/* Initialized by the adapter:
+					 * CSTAT_REQUEST important: update least
+					 * significant bit first! Set by the
+					 * adapter: CSTAT_COMPLETE status.
+					 */
+	unsigned short FrameSize;	/* Number of bytes to be transmitted
+					 * as a frame including AC/FC,
+					 * Destination, Source, Routing field
+					 * not including CRC, FS, End Delimiter
+					 * (valid only if START_FRAME bit in 
+					 * CSTAT nonzero) must not be zero in
+					 * any list; maximum value: (BUFFER_SIZE
+					 * - 8) * TX_BUF_MAX sum of DataCount
+					 * values in FragmentList must equal
+					 * Frame_Size value in START_FRAME TPL!
+					 * frame data fragment list.
+					 */
+
+	/* TPL/RPL size in OPEN parameter list depending on maximal
+	 * numbers of fragments used in one parameter list.
+	 */
+	Fragment FragList[TX_FRAG_NUM];	/* Maximum: nine frame fragments in one
+					 * TPL actual version of firmware: 9
+					 * fragments possible.
+					 */
+#pragma pack()
+
+	/* Special proprietary data and precalculations */
+
+	TPL *NextTPLPtr;		/* Pointer to next TPL in chain. */
+	unsigned char *MData;
+	struct sk_buff *Skb;
+	unsigned char TPLIndex;
+	volatile unsigned char BusyFlag;/* Flag: TPL busy? */
+};
+
+/* ---------------------Receive Functions-------------------------------*
+ * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values.
+ * (high-low)
+ */
+#define RX_VALID		0x0080	/* R: set; tell adapter with
+					 * RECEIVE.VALID interrupt.
+					 * C: reset to zero.
+					 */
+#define RX_FRAME_COMPLETE	0x0040  /* R: must be reset to zero,
+					 * C: set to one.
+					 */
+#define RX_START_FRAME		0x0020  /* R: must be reset to zero.
+					 * C: set to one on the list.
+					 */
+#define RX_END_FRAME		0x0010  /* R: must be reset to zero.
+					 * C: set to one on the list
+					 * that ends the frame.
+					 */
+#define RX_FRAME_IRQ		0x0008  /* R: request interrupt generation
+					 * after receive.
+					 * C: unchanged.
+					 */
+#define RX_INTERFRAME_WAIT	0x0004  /* R: after receiving a frame:
+					 * interrupt and wait for a
+					 * RECEIVE.CONTINUE.
+					 * C: unchanged.
+					 */
+#define RX_PASS_CRC		0x0002  /* R: if set, the adapter includes
+					 * the CRC in data passed. (last four 
+					 * bytes; valid only if FRAME_START is
+					 * set)
+					 * C: set, if CRC is included in
+					 * received data.
+					 */
+#define RX_PASS_SRC_ADDR	0x0001  /* R: adapter uses explicit frame
+					 * source address and does not
+					 * overwrite with the adapter node
+					 * address. (valid only if FRAME_START
+					 * is set)
+					 * C: unchanged.
+					 */
+#define RX_RECEIVE_FS		0xFC00  /* R: reserved; must be reset to zero.
+					 * C: on lists with START_FRAME, field
+					 * contains frame status field from
+					 * received frame; otherwise cleared.
+					 */
+#define RX_ADDR_MATCH		0x0300  /* R: reserved; must be reset to zero.
+					 * C: address match code mask.
+					 */ 
+#define RX_STATUS_MASK		0x00FF  /* Mask for receive status bits. */
+
+#define RX_INTERN_ADDR_MATCH    0x0100  /* C: internally address match. */
+#define RX_EXTERN_ADDR_MATCH    0x0200  /* C: externally matched via
+					 * XMATCH/XFAIL interface.
+					 */
+#define RX_INTEXT_ADDR_MATCH    0x0300  /* C: internally and externally
+					 * matched.
+					 */
+#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */
+
+/* Constants for Command Status Interrupt.
+ * COMMAND_REJECT status field bit functions (SSB.Parm[0])
+ */
+#define ILLEGAL_COMMAND		0x0080	/* Set if an unknown command
+					 * is issued to the adapter
+					 */
+#define ADDRESS_ERROR		0x0040  /* Set if any address field in
+					 * the SCB is odd. (not word aligned)
+					 */
+#define ADAPTER_OPEN		0x0020  /* Command issued illegal with
+					 * open adapter.
+					 */
+#define ADAPTER_CLOSE		0x0010  /* Command issued illegal with
+					 * closed adapter.
+					 */
+#define SAME_COMMAND		0x0008  /* Command issued with same command
+					 * already executing.
+					 */
+
+/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */
+#define NODE_ADDR_ERROR		0x0040  /* Wrong address or BIA read
+					 * zero address.
+					 */
+#define LIST_SIZE_ERROR		0x0020  /* If List_Size value not in 0,
+					 * 14, 20, 26.
+					 */
+#define BUF_SIZE_ERROR		0x0010  /* Not enough available memory for
+					 * two buffers.
+					 */
+#define TX_BUF_COUNT_ERROR	0x0004  /* Remaining receive buffers less than
+					 * two.
+					 */
+#define OPEN_ERROR		0x0002	/* Error during ring insertion; more
+					 * information in bits 8-15.
+					 */
+
+/* Standard return codes */
+#define GOOD_COMPLETION		0x0080  /* =OPEN_SUCCESSFULL */
+#define INVALID_OPEN_OPTION	0x0001  /* OPEN options are not supported by
+					 * the adapter.
+					 */
+
+/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB)            */
+#define OPEN_PHASES_MASK            0xF000  /* Check only the bits 8-11. */
+#define LOBE_MEDIA_TEST             0x1000
+#define PHYSICAL_INSERTION          0x2000
+#define ADDRESS_VERIFICATION        0x3000
+#define PARTICIPATION_IN_RING_POLL  0x4000
+#define REQUEST_INITIALISATION      0x5000
+#define FULLDUPLEX_CHECK            0x6000
+
+/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */
+#define OPEN_ERROR_CODES_MASK	0x0F00  /* Check only the bits 12-15. */
+#define OPEN_FUNCTION_FAILURE   0x0100  /* Unable to transmit to itself or
+					 * frames received before insertion.
+					 */
+#define OPEN_SIGNAL_LOSS	0x0200	/* Signal loss condition detected at
+					 * receiver.
+					 */
+#define OPEN_TIMEOUT		0x0500	/* Insertion timer expired before
+					 * logical insertion.
+					 */
+#define OPEN_RING_FAILURE	0x0600	/* Unable to receive own ring purge
+					 * MAC frames.
+					 */
+#define OPEN_RING_BEACONING	0x0700	/* Beacon MAC frame received after
+					 * ring insertion.
+					 */
+#define OPEN_DUPLICATE_NODEADDR	0x0800  /* Other station in ring found
+					 * with the same address.
+					 */
+#define OPEN_REQUEST_INIT	0x0900	/* RPS present but does not respond. */
+#define OPEN_REMOVE_RECEIVED    0x0A00  /* Adapter received a remove adapter
+					 * MAC frame.
+					 */
+#define OPEN_FULLDUPLEX_SET	0x0D00	/* Got this with full duplex on when
+					 * trying to connect to a normal ring.
+					 */
+
+/* SET_BRIDGE_PARMS return codes: */
+#define BRIDGE_INVALID_MAX_LEN  0x4000  /* MAX_ROUTING_FIELD_LENGTH odd,
+					 * less than 6 or > 30.
+					 */
+#define BRIDGE_INVALID_SRC_RING 0x2000  /* SOURCE_RING number zero, too large
+					 * or = TARGET_RING.
+					 */
+#define BRIDGE_INVALID_TRG_RING 0x1000  /* TARGET_RING number zero, too large
+					 * or = SOURCE_RING.
+					 */
+#define BRIDGE_INVALID_BRDGE_NO 0x0800  /* BRIDGE_NUMBER too large. */
+#define BRIDGE_INVALID_OPTIONS  0x0400  /* Invalid bridge options. */
+#define BRIDGE_DIAGS_FAILED     0x0200  /* Diagnostics of TMS380SRA failed. */
+#define BRIDGE_NO_SRA           0x0100  /* The TMS380SRA does not exist in HW
+					 * configuration.
+					 */
+
+/*
+ * Bring Up Diagnostics error codes.
+ */
+#define BUD_INITIAL_ERROR       0x0
+#define BUD_CHECKSUM_ERROR      0x1
+#define BUD_ADAPTER_RAM_ERROR   0x2
+#define BUD_INSTRUCTION_ERROR   0x3
+#define BUD_CONTEXT_ERROR       0x4
+#define BUD_PROTOCOL_ERROR      0x5
+#define BUD_INTERFACE_ERROR	0x6
+
+/* BUD constants */
+#define BUD_MAX_RETRIES         3
+#define BUD_MAX_LOOPCNT         6
+#define BUD_TIMEOUT             3000
+
+/* Initialization constants */
+#define INIT_MAX_RETRIES        3	/* Maximum three retries. */
+#define INIT_MAX_LOOPCNT        22      /* Maximum loop counts. */
+
+/* RING STATUS field values (high/low) */
+#define SIGNAL_LOSS             0x0080  /* Loss of signal on the ring
+					 * detected.
+					 */
+#define HARD_ERROR              0x0040  /* Transmitting or receiving beacon
+					 * frames.
+					 */
+#define SOFT_ERROR              0x0020  /* Report error MAC frame
+					 * transmitted.
+					 */
+#define TRANSMIT_BEACON         0x0010  /* Transmitting beacon frames on the
+					 * ring.
+					 */
+#define LOBE_WIRE_FAULT         0x0008  /* Open or short circuit in the
+					 * cable to concentrator; adapter
+					 * closed.
+					 */
+#define AUTO_REMOVAL_ERROR      0x0004  /* Lobe wrap test failed, deinserted;
+					 * adapter closed.
+					 */
+#define REMOVE_RECEIVED         0x0001  /* Received a remove ring station MAC
+					 * MAC frame request; adapter closed.
+					 */
+#define COUNTER_OVERFLOW        0x8000  /* Overflow of one of the adapters
+					 * error counters; READ.ERROR.LOG.
+					 */
+#define SINGLE_STATION          0x4000  /* Adapter is the only station on the
+					 * ring.
+					 */
+#define RING_RECOVERY           0x2000  /* Claim token MAC frames on the ring;
+					 * reset after ring purge frame.
+					 */
+
+#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\
+                        REMOVE_RECEIVED)
+
+/* Adapter_check_block.Status field bit assignments: */
+#define DIO_PARITY              0x8000  /* Adapter detects bad parity
+					 * through direct I/O access.
+					 */
+#define DMA_READ_ABORT          0x4000  /* Aborting DMA read operation
+					 * from system Parm[0]: 0=timeout,
+					 * 1=parity error, 2=bus error;
+					 * Parm[1]: 32 bit pointer to host
+					 * system address at failure.
+					 */
+#define DMA_WRITE_ABORT         0x2000  /* Aborting DMA write operation
+					 * to system. (parameters analogous to
+					 * DMA_READ_ABORT)
+					 */
+#define ILLEGAL_OP_CODE         0x1000  /* Illegal operation code in the
+					 * the adapters firmware Parm[0]-2:
+					 * communications processor registers
+					 * R13-R15.
+					 */
+#define PARITY_ERRORS           0x0800  /* Adapter detects internal bus
+					 * parity error.
+					 */
+#define RAM_DATA_ERROR          0x0080  /* Valid only during RAM testing;
+					 * RAM data error Parm[0-1]: 32 bit
+					 * pointer to RAM location.
+					 */
+#define RAM_PARITY_ERROR        0x0040  /* Valid only during RAM testing;
+					 * RAM parity error Parm[0-1]: 32 bit
+					 * pointer to RAM location.
+					 */
+#define RING_UNDERRUN           0x0020  /* Internal DMA underrun when
+					 * transmitting onto ring.
+					 */
+#define INVALID_IRQ             0x0008  /* Unrecognized interrupt generated
+					 * internal to adapter Parm[0-2]:
+					 * adapter register R13-R15.
+					 */
+#define INVALID_ERROR_IRQ       0x0004  /* Unrecognized error interrupt
+					 * generated Parm[0-2]: adapter register
+					 * R13-R15.
+					 */
+#define INVALID_XOP             0x0002  /* Unrecognized XOP request in
+					 * communication processor Parm[0-2]:
+					 * adapter register R13-R15.
+					 */
+#define CHECKADDR               0x05E0  /* Adapter check status information
+					 * address offset.
+					 */
+#define ROM_PAGE_0              0x0000  /* Adapter ROM page 0. */
+
+/*
+ * RECEIVE.STATUS interrupt result SSB values: (high-low)
+ * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0])
+ */
+#define RX_COMPLETE             0x0080  /* SSB.Parm[0]; SSB.Parm[1]: 32
+					 * bit pointer to last RPL.
+					 */
+#define RX_SUSPENDED            0x0040  /* SSB.Parm[0]; SSB.Parm[1]: 32
+					 * bit pointer to RPL with odd
+					 * forward pointer.
+					 */
+
+/* Valid receive CSTAT: */
+#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \
+			       RX_FRAME_COMPLETE)
+#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \
+				   RX_FRAME_COMPLETE)
+
+typedef enum SKB_STAT SKB_STAT;
+enum SKB_STAT {
+	SKB_UNAVAILABLE,
+	SKB_DMA_DIRECT,
+	SKB_DATA_COPY
+};
+
+/* Receive Parameter List (RPL) The length of the RPLs has to be initialized 
+ * in the OPL. (OPEN parameter list)
+ */
+#define RPL_NUM		3
+
+#define RX_FRAG_NUM     1	/* Maximal number of used fragments in one RPL.
+				 * (up to firmware v2.24: 3, now: up to 9)
+				 */
+
+#pragma pack(1)
+typedef struct s_RPL RPL;
+struct s_RPL {	/* Receive Parameter List */
+	unsigned long NextRPLAddr;	/* Pointer to next RPL in chain
+					 * (normalized = physical 32 bit
+					 * address) if pointer is odd: this
+					 * is last RPL. Pointing to itself can
+					 * cause problems!
+					 */
+	volatile unsigned short Status;	/* Set by creation of Receive Parameter
+					 * List RECEIVE_CSTAT_COMPLETE set by
+					 * adapter in lists that start or end
+					 * a frame.
+					 */
+	volatile unsigned short FrameSize; /* Number of bytes received as a
+					 * frame including AC/FC, Destination,
+					 * Source, Routing field not including 
+					 * CRC, FS (Frame Status), End Delimiter
+					 * (valid only if START_FRAME bit in 
+					 * CSTAT nonzero) must not be zero in
+					 * any list; maximum value: (BUFFER_SIZE
+					 * - 8) * TX_BUF_MAX sum of DataCount
+					 * values in FragmentList must equal
+					 * Frame_Size value in START_FRAME TPL!
+					 * frame data fragment list
+					 */
+
+	/* TPL/RPL size in OPEN parameter list depending on maximal numbers
+	 * of fragments used in one parameter list.
+	 */
+	Fragment FragList[RX_FRAG_NUM];	/* Maximum: nine frame fragments in
+					 * one TPL. Actual version of firmware:
+					 * 9 fragments possible.
+					 */
+#pragma pack()
+
+	/* Special proprietary data and precalculations. */
+	RPL *NextRPLPtr;	/* Logical pointer to next RPL in chain. */
+	unsigned char *MData;
+	struct sk_buff *Skb;
+	SKB_STAT SkbStat;
+	int RPLIndex;
+};
+
+#define TMS_ISA 1
+#define TMS_PCI 2
+struct cardinfo_table {
+	int type; /* 1 = ISA, 2 = PCI */
+	int vendor_id;
+	int device_id;
+	char *name;
+};
+
+/* Information that need to be kept for each board. */
+typedef struct net_local {
+#pragma pack(1)
+	IPB ipb;	/* Initialization Parameter Block. */
+	SCB scb;	/* System Command Block: system to adapter 
+			 * communication.
+			 */
+	SSB ssb;	/* System Status Block: adapter to system 
+			 * communication.
+			 */
+	OPB ocpl;	/* Open Options Parameter Block. */
+
+	ERRORTAB errorlogtable;	/* Adapter statistic error counters.
+				 * (read from adapter memory)
+				 */
+	unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */
+#pragma pack()
+
+	TPL Tpl[TPL_NUM];
+	TPL *TplFree;
+	TPL *TplBusy;
+	unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE];
+
+	RPL Rpl[RPL_NUM];
+	RPL *RplHead;
+	RPL *RplTail;
+	unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE];
+
+	int DataRate;
+	unsigned char ScbInUse;
+	unsigned short CMDqueue;
+
+	unsigned long AdapterOpenFlag:1;
+	unsigned long AdapterVirtOpenFlag:1;
+	unsigned long OpenCommandIssued:1;
+	unsigned long TransmitCommandActive:1;
+	unsigned long TransmitHaltScheduled:1;
+	unsigned long HaltInProgress:1;
+	unsigned long LobeWireFaultLogged:1;
+	unsigned long ReOpenInProgress:1;
+	unsigned long Sleeping:1;
+
+	unsigned long LastOpenStatus;
+	unsigned short CurrentRingStatus;
+	unsigned long MaxPacketSize;
+	
+	unsigned long StartTime;
+	unsigned long LastSendTime;
+
+	struct sk_buff_head SendSkbQueue;
+	unsigned short QueueSkb;
+
+	struct tr_statistics MacStat;	/* MAC statistics structure */
+
+	struct cardinfo_table *CardType;
+
+	struct timer_list timer;
+
+	wait_queue_head_t  wait_for_tok_int;
+
+	INTPTRS intptrs;	/* Internal adapter pointer. Must be read
+				 * before OPEN command.
+				 */
+} NET_LOCAL;
+
+#endif	/* __KERNEL__ */
+#endif	/* __LINUX_TMS380TR_H */
diff -u --recursive --new-file v2.3.21/linux/drivers/net/tokenring/tms380tr_microcode.h linux/drivers/net/tokenring/tms380tr_microcode.h
--- v2.3.21/linux/drivers/net/tokenring/tms380tr_microcode.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/net/tokenring/tms380tr_microcode.h	Thu Oct 14 14:22:09 1999
@@ -0,0 +1,3622 @@
+/*
+ * The firmware this driver downloads into the tokenring card is a
+ * separate program and is not GPL'd source code, even though the Linux
+ * side driver and the routine that loads this data into the card are.
+ *
+ * This firmware is licensed to you strictly for use in conjunction
+ * with the use of SysKonnect TokenRing adapters. There is no
+ * waranty expressed or implied about its fitness for any purpose.
+ */
+
+/* tms380tr_microcode.h: TI TMS380 Token Ring driver COMMprocessor microcode
+ *
+ * Notes:
+ *  - Loaded from tms380tr_reset_adapter upon adapter reset.
+ *
+ * This microcode is loaded into the TMS380 COMMprocessor during adapter
+ * initialization.  It is copyright Texas Instruments and contains
+ * intellectual property of both TI and their contractors.  
+ *
+ * TMS380 COMMprocessor Microcode Version 3.11 for Token Ring.
+ *
+ * Available from TI in COFF format (EAGLECAF.OUT).
+ *
+ */
+
+#include <linux/config.h>
+
+#if defined(CONFIG_TMS380TR) || defined(CONFIG_TMS380TR_MODULE)
+
+unsigned char tms380tr_code[] = {
+	0x00, 0x00, 0x00, 0xA0, 0x00, 0x20, 0x68, 0x54,
+	0x73, 0x69, 0x63, 0x20, 0x64, 0x6F, 0x20, 0x65,
+	0x73, 0x69, 0x72, 0x20, 0x6C, 0x65, 0x61, 0x65,
+	0x65, 0x73, 0x20, 0x64, 0x6E, 0x75, 0x65, 0x64,
+	0x20, 0x72, 0x69, 0x6C, 0x65, 0x63, 0x63, 0x6E,
+	0x20, 0x65, 0x6E, 0x4F, 0x79, 0x6C, 0x20, 0x2C,
+	0x6C, 0x41, 0x20, 0x6C, 0x69, 0x72, 0x68, 0x67,
+	0x73, 0x74, 0x72, 0x20, 0x73, 0x65, 0x72, 0x65,
+	0x65, 0x76, 0x2E, 0x64, 0x60, 0x01, 0x42, 0x01,
+	0x00, 0x08, 0x08, 0x16, 0xB0, 0x03, 0xE0, 0x04,
+	0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xFF, 0xFF,
+	0xFC, 0x13, 0x80, 0x03, 0xA0, 0x07, 0x42, 0x01,
+	0x00, 0x08, 0x20, 0x07, 0x00, 0x00, 0xE0, 0x04,
+	0x00, 0x01, 0x8B, 0x07, 0x00, 0x3D, 0x60, 0x01,
+	0x42, 0x01, 0x80, 0x00, 0x09, 0x13, 0x8B, 0x07,
+	0x00, 0x2D, 0x20, 0xC0, 0x4E, 0x01, 0x80, 0x02,
+	0x41, 0x0F, 0x02, 0x11, 0x8B, 0x07, 0x00, 0x3D,
+	0x0B, 0xC8, 0x4A, 0x01, 0x00, 0x02, 0x00, 0x90,
+	0xA0, 0x09, 0x00, 0xC8, 0x66, 0x01, 0xE0, 0x02,
+	0xA0, 0x00, 0xA0, 0x07, 0x04, 0x01, 0x20, 0x00,
+	0xA0, 0x01, 0x40, 0x01, 0x00, 0xFE, 0x20, 0x48,
+	0x2A, 0xE0, 0x42, 0x01, 0xE0, 0x04, 0x02, 0x01,
+	0xE0, 0x04, 0x60, 0x09, 0xE0, 0x04, 0x82, 0x01,
+	0x60, 0x01, 0x1C, 0x01, 0x04, 0x00, 0x03, 0x16,
+	0xE0, 0x01, 0x40, 0x01, 0x00, 0x0C, 0xA0, 0x06,
+	0xBC, 0xA1, 0xA0, 0x07, 0x04, 0x01, 0x2D, 0x00,
+	0x20, 0xC2, 0x00, 0xE0, 0x88, 0x02, 0x11, 0xE3,
+	0x14, 0x16, 0xA0, 0x07, 0x04, 0x01, 0x2E, 0x00,
+	0x60, 0x01, 0x42, 0x01, 0x00, 0x03, 0x0D, 0x16,
+	0xA0, 0x07, 0x04, 0x01, 0x21, 0x00, 0x88, 0x07,
+	0x00, 0xA0, 0x89, 0x07, 0xFE, 0xFF, 0xA8, 0x09,
+	0xA9, 0x09, 0x8A, 0x07, 0x02, 0xE0, 0xA0, 0x06,
+	0x84, 0xEC, 0x56, 0x10, 0x88, 0x07, 0x00, 0x90,
+	0x89, 0x07, 0xFE, 0x9F, 0xA8, 0x09, 0xA9, 0x09,
+	0x8A, 0x07, 0x78, 0xE0, 0xA0, 0x06, 0x84, 0xEC,
+	0x4B, 0x10, 0xA0, 0x05, 0x04, 0x01, 0x88, 0x07,
+	0x08, 0x00, 0x89, 0x07, 0x7A, 0x00, 0x00, 0x03,
+	0x01, 0x00, 0xA0, 0x06, 0xD2, 0xAC, 0x40, 0x10,
+	0xA0, 0x06, 0xBC, 0xA1, 0xE0, 0x02, 0xF4, 0x03,
+	0x88, 0x07, 0xA0, 0x00, 0x89, 0x07, 0xFE, 0x00,
+	0xA0, 0x06, 0xD2, 0xAC, 0x35, 0x10, 0xE0, 0x02,
+	0xA0, 0x00, 0xE0, 0x04, 0x7E, 0x01, 0xC8, 0x04,
+	0x09, 0x02, 0xF2, 0x03, 0x48, 0x62, 0xE0, 0xC1,
+	0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04,
+	0x18, 0xCE, 0x09, 0x06, 0xFD, 0x16, 0xA0, 0x01,
+	0x40, 0x01, 0x00, 0x40, 0x07, 0xC8, 0x40, 0x01,
+	0x88, 0x07, 0xF4, 0x03, 0x89, 0x07, 0xFE, 0x3F,
+	0xA0, 0x06, 0xD2, 0xAC, 0x19, 0x10, 0xE0, 0x02,
+	0xA0, 0x00, 0xA0, 0x06, 0xFA, 0xAD, 0x14, 0x10,
+	0x08, 0xC8, 0x44, 0x04, 0x09, 0xC8, 0x46, 0x04,
+	0xA0, 0x06, 0x28, 0xAD, 0x0D, 0x10, 0x81, 0x07,
+	0x7C, 0xE0, 0xB1, 0xC0, 0x26, 0x13, 0x01, 0xC8,
+	0xE0, 0x00, 0xA0, 0x05, 0x04, 0x01, 0x92, 0x06,
+	0x03, 0x10, 0x60, 0xC0, 0xE0, 0x00, 0xF5, 0x10,
+	0xE0, 0x01, 0x04, 0x01, 0x10, 0x00, 0xB0, 0x03,
+	0xFF, 0x10, 0xA0, 0x01, 0x04, 0x01, 0x00, 0x80,
+	0x80, 0x03, 0x80, 0x07, 0xA0, 0x00, 0xC2, 0x04,
+	0x80, 0xCC, 0x81, 0x07, 0xAA, 0xA1, 0x82, 0x02,
+	0x1E, 0x00, 0x02, 0x16, 0x81, 0x07, 0xB4, 0xA1,
+	0x81, 0xC4, 0x81, 0x8C, 0xE9, 0x16, 0x82, 0x02,
+	0x7C, 0x00, 0xF2, 0x16, 0x00, 0x03, 0x0F, 0x00,
+	0x5B, 0x04, 0x81, 0x07, 0x08, 0xE1, 0x82, 0x07,
+	0x04, 0x00, 0xE0, 0x04, 0x80, 0x01, 0xE0, 0x04,
+	0x82, 0x01, 0x91, 0xC4, 0xB1, 0x8C, 0xD8, 0x16,
+	0x82, 0x02, 0x7C, 0x00, 0xFA, 0x16, 0x20, 0xC8,
+	0x04, 0xE0, 0x82, 0x01, 0x20, 0xE8, 0x0C, 0xE0,
+	0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0x80, 0x01,
+	0x81, 0x07, 0x86, 0xE0, 0xB1, 0xC0, 0x07, 0x13,
+	0xB1, 0xC4, 0xFC, 0x10, 0xA0, 0x07, 0x04, 0x01,
+	0x2E, 0x00, 0x60, 0x04, 0xAA, 0xA1, 0x81, 0x07,
+	0x34, 0xE0, 0x82, 0x07, 0xFC, 0x05, 0x83, 0x07,
+	0x0A, 0x00, 0xB1, 0xCC, 0x43, 0x06, 0xFD, 0x16,
+	0x02, 0x02, 0x00, 0x06, 0x60, 0xD0, 0x4E, 0x01,
+	0xED, 0x13, 0x21, 0x02, 0x00, 0xF7, 0x21, 0x02,
+	0x00, 0xC0, 0x81, 0xDC, 0x60, 0xD0, 0x4F, 0x01,
+	0xC1, 0xC0, 0x41, 0x09, 0x21, 0x02, 0x00, 0xF0,
+	0x81, 0xDC, 0x43, 0x02, 0x00, 0x0F, 0x23, 0x02,
+	0x00, 0xF0, 0x83, 0xDC, 0x01, 0x02, 0x32, 0x0C,
+	0xA0, 0xC0, 0x44, 0x04, 0xE0, 0xC0, 0x46, 0x04,
+	0x03, 0xC1, 0x02, 0x61, 0x84, 0x05, 0x04, 0xC8,
+	0x48, 0x04, 0x03, 0xC1, 0x84, 0x05, 0x04, 0xA1,
+	0x01, 0xA1, 0x04, 0xC8, 0x30, 0x0C, 0x03, 0xC1,
+	0x84, 0x05, 0xF1, 0x04, 0x04, 0x06, 0xFD, 0x16,
+	0x08, 0x02, 0x00, 0xA0, 0xA8, 0x09, 0x60, 0xC2,
+	0x30, 0x0C, 0x29, 0x02, 0xFF, 0x03, 0xA9, 0x09,
+	0x29, 0x02, 0x40, 0x00, 0x80, 0x07, 0x00, 0x90,
+	0xA0, 0x09, 0x8A, 0x07, 0xFE, 0x9F, 0x2A, 0x02,
+	0xFF, 0x03, 0xAA, 0x09, 0x01, 0x02, 0x32, 0x0C,
+	0x05, 0x02, 0x00, 0x00, 0x03, 0xC1, 0x84, 0x05,
+	0x11, 0x07, 0xC1, 0x05, 0x85, 0x05, 0x04, 0x06,
+	0x0B, 0x13, 0x85, 0x80, 0xF9, 0x1A, 0x05, 0x80,
+	0xF8, 0x1A, 0x85, 0x82, 0xF5, 0x1A, 0x05, 0x82,
+	0xF4, 0x1A, 0x45, 0x82, 0xF1, 0x1A, 0xF1, 0x10,
+	0x20, 0x2D, 0x02, 0x00, 0x60, 0x01, 0x40, 0x01,
+	0x00, 0x40, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x08,
+	0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 0x48, 0x10,
+	0x60, 0x01, 0x42, 0x01, 0x00, 0x80, 0x06, 0x16,
+	0x8A, 0x07, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01,
+	0x00, 0x80, 0x3E, 0x10, 0x60, 0x01, 0x02, 0x01,
+	0x00, 0x10, 0x0A, 0x16, 0x60, 0x01, 0x00, 0x01,
+	0x00, 0x04, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x80,
+	0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0x30, 0x10,
+	0x60, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0A, 0x16,
+	0x60, 0x01, 0x00, 0x01, 0x00, 0x04, 0x06, 0x16,
+	0xA0, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0D, 0x02,
+	0x01, 0x00, 0x0D, 0x10, 0x60, 0x01, 0x02, 0x01,
+	0x00, 0x04, 0x16, 0x16, 0x60, 0x01, 0x00, 0x01,
+	0x00, 0x08, 0x12, 0x16, 0xA0, 0x01, 0x02, 0x01,
+	0x00, 0x04, 0x0D, 0x02, 0x02, 0x00, 0xA0, 0xC3,
+	0x0E, 0x01, 0xE0, 0xC3, 0x10, 0x01, 0x8A, 0x07,
+	0x00, 0x20, 0x60, 0x01, 0x00, 0x01, 0x00, 0x80,
+	0x0B, 0x13, 0x8A, 0x07, 0x00, 0x40, 0x08, 0x10,
+	0x8A, 0x07, 0x04, 0x00, 0x05, 0x10, 0x8A, 0x07,
+	0x02, 0x00, 0x02, 0x10, 0x8A, 0x07, 0x08, 0x00,
+	0x00, 0x03, 0x00, 0x00, 0xE0, 0x04, 0x82, 0x01,
+	0x8B, 0x07, 0xE0, 0x05, 0xCA, 0xCE, 0xCD, 0xCE,
+	0xCE, 0xCE, 0xCF, 0xC6, 0x20, 0xC3, 0x58, 0x07,
+	0x20, 0x23, 0x04, 0xE0, 0x12, 0x13, 0x8B, 0x07,
+	0x18, 0xFF, 0x8A, 0x02, 0x00, 0x80, 0x0A, 0x13,
+	0x8B, 0x05, 0xCD, 0xA2, 0x8A, 0x02, 0x00, 0x40,
+	0x05, 0x13, 0x8A, 0x02, 0x00, 0x20, 0x02, 0x13,
+	0x8B, 0x07, 0x1D, 0xFF, 0x0B, 0xC8, 0x04, 0x01,
+	0x0D, 0x10, 0x20, 0xD3, 0x05, 0x01, 0xFD, 0x11,
+	0x20, 0xD8, 0xDF, 0x07, 0x17, 0x01, 0x8B, 0x07,
+	0x80, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0x20, 0xE8,
+	0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x04, 0x01,
+	0xE0, 0x22, 0x86, 0xE1, 0xFB, 0x16, 0xE0, 0x02,
+	0xA0, 0x00, 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8,
+	0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01,
+	0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0xA0, 0x01,
+	0x40, 0x01, 0x00, 0xF6, 0x60, 0x04, 0x90, 0xA0,
+	0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, 0x02, 0x01,
+	0xFF, 0xDF, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03,
+	0x00, 0x03, 0x02, 0x00, 0x09, 0x07, 0xA0, 0xC2,
+	0x04, 0x01, 0x8A, 0x01, 0x80, 0x00, 0x4A, 0x52,
+	0x89, 0xD2, 0x0A, 0xC8, 0x04, 0x01, 0xA0, 0xD2,
+	0x04, 0x01, 0xF9, 0x16, 0x49, 0x05, 0x89, 0x01,
+	0x00, 0x80, 0x49, 0x01, 0x00, 0x40, 0x0E, 0x13,
+	0x09, 0xF8, 0x3A, 0x07, 0x60, 0xC2, 0x36, 0x07,
+	0x03, 0x16, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03,
+	0xE0, 0x04, 0x36, 0x07, 0x54, 0x04, 0x90, 0x03,
+	0xFF, 0xFF, 0x80, 0x03, 0x60, 0x22, 0x86, 0xE1,
+	0xC2, 0x13, 0xE0, 0x04, 0x82, 0x01, 0x60, 0x04,
+	0xE0, 0xA3, 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07,
+	0x62, 0x09, 0xE8, 0x03, 0xC9, 0x04, 0xA0, 0xC1,
+	0x34, 0x06, 0x04, 0x16, 0xA0, 0x06, 0x50, 0xB5,
+	0xE0, 0x04, 0x20, 0x09, 0x86, 0x07, 0xE8, 0x05,
+	0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 0x20, 0xC2,
+	0x84, 0x01, 0x20, 0x48, 0x08, 0xE0, 0x84, 0x01,
+	0x20, 0x22, 0x08, 0xE0, 0x08, 0x13, 0x60, 0x01,
+	0xAE, 0x01, 0x01, 0x00, 0x04, 0x16, 0xE0, 0x01,
+	0x34, 0x06, 0x00, 0x80, 0x06, 0x10, 0x20, 0xC2,
+	0x32, 0x09, 0x06, 0x13, 0xE0, 0x01, 0x34, 0x06,
+	0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x09, 0x07,
+	0xA0, 0x05, 0xEE, 0x05, 0x20, 0x06, 0xEC, 0x05,
+	0x02, 0x16, 0x16, 0xC2, 0x03, 0x16, 0x49, 0xC2,
+	0x12, 0x16, 0x80, 0x03, 0x98, 0xC5, 0xE8, 0xC1,
+	0x02, 0x00, 0xE0, 0xE9, 0x14, 0xE0, 0x04, 0x00,
+	0xD7, 0x04, 0x27, 0x02, 0x08, 0x00, 0xA0, 0x06,
+	0xE6, 0xB4, 0x16, 0xC2, 0x04, 0x13, 0x28, 0xC8,
+	0x08, 0x00, 0xEC, 0x05, 0xEF, 0x13, 0x54, 0x04,
+	0x00, 0x03, 0x02, 0x00, 0xE0, 0xC1, 0x86, 0x01,
+	0x47, 0x02, 0x0E, 0x00, 0xA7, 0xC2, 0x90, 0xE1,
+	0x5A, 0x04, 0x8A, 0x07, 0x00, 0xA0, 0x0A, 0xC8,
+	0x86, 0x01, 0xC7, 0xA1, 0x27, 0x02, 0x98, 0xE1,
+	0x37, 0xE8, 0x34, 0x06, 0x17, 0xE8, 0xD2, 0x06,
+	0xE0, 0x04, 0x30, 0x06, 0x60, 0x04, 0xF2, 0xA9,
+	0x0A, 0xE8, 0xD2, 0x06, 0xE0, 0x01, 0x34, 0x06,
+	0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x20, 0xE0,
+	0x18, 0xE0, 0x5B, 0x04, 0xA0, 0x05, 0x20, 0x09,
+	0x20, 0x88, 0x20, 0x09, 0x16, 0xE0, 0xE5, 0x1A,
+	0xE0, 0x04, 0x20, 0x09, 0xA0, 0x06, 0xD0, 0xD5,
+	0x80, 0x03, 0xA0, 0x05, 0x32, 0x09, 0x80, 0x03,
+	0x01, 0xC3, 0xFB, 0x13, 0x60, 0x01, 0x6A, 0x09,
+	0x01, 0x00, 0x78, 0x13, 0xA0, 0x05, 0x32, 0x09,
+	0x75, 0x10, 0x41, 0xC0, 0x06, 0x13, 0x01, 0xC8,
+	0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x01, 0x11,
+	0x7B, 0x10, 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00,
+	0x79, 0x16, 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01,
+	0x41, 0xC0, 0x04, 0x13, 0x01, 0xC8, 0x8A, 0x01,
+	0x01, 0xC8, 0x18, 0x09, 0x86, 0x07, 0x43, 0x00,
+	0x06, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x02, 0xFC,    
+	0x17, 0xC2, 0x60, 0x04, 0xFA, 0xA6, 0xE0, 0x04, 
+	0x18, 0x09, 0xC7, 0x61, 0x08, 0x07, 0x60, 0x01, 
+	0x06, 0xFC, 0x40, 0x00, 0x02, 0x13, 0x08, 0x02, 
+	0x01, 0x00, 0x09, 0x10, 0x4C, 0xC2, 0x20, 0xC3, 
+	0x00, 0xFC, 0x2A, 0x13, 0x0C, 0xC8, 0x6C, 0x01, 
+	0xE0, 0xC2, 0x02, 0xFC, 0x1B, 0x11, 0x4B, 0x01, 
+	0x00, 0x01, 0xF4, 0x16, 0xC8, 0x22, 0x12, 0x13, 
+	0xCB, 0x01, 0x00, 0x40, 0x0B, 0xC8, 0x02, 0xFC, 
+	0x0D, 0x10, 0xE0, 0xC1, 0x18, 0x09, 0x01, 0xC3, 
+	0x21, 0x13, 0x4C, 0xC2, 0x15, 0x13, 0x0C, 0xC8, 
+	0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x06, 0x11, 
+	0xCC, 0x81, 0xD5, 0x13, 0x4C, 0xC2, 0x20, 0xC3, 
+	0x00, 0xFC, 0xF4, 0x10, 0x09, 0xC8, 0x6C, 0x01, 
+	0xE0, 0xC2, 0x02, 0xFC, 0x1E, 0x16, 0xA0, 0x07, 
+	0x02, 0xFC, 0x00, 0x80, 0x09, 0xC3, 0x19, 0x10, 
+	0x09, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 
+	0x05, 0x16, 0xA0, 0x07, 0x02, 0xFC, 0x00, 0x80, 
+	0x09, 0xC3, 0x0F, 0x10, 0xE0, 0xC2, 0x02, 0x0C, 
+	0x01, 0x11, 0x1E, 0x10, 0x20, 0xD8, 0x00, 0xE2, 
+	0x83, 0x01, 0x8B, 0x09, 0x8B, 0x09, 0x8B, 0x09,  
+	0x8B, 0x09, 0xA0, 0x07, 0x8A, 0x01, 0x43, 0x00,  
+	0x13, 0x10, 0x0C, 0xC8, 0x8A, 0x01, 0x0C, 0xC8,  
+	0x18, 0x09, 0x0E, 0x10, 0x00, 0x03, 0x02, 0x00, 
+	0xE0, 0xC0, 0x6C, 0x01, 0x20, 0xC3, 0x8A, 0x01,  
+	0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x81, 0x13,  
+	0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0xB9, 0x13, 
+	0x01, 0x83, 0x31, 0x16, 0x03, 0xC8, 0x6C, 0x01, 
+	0x40, 0x01, 0x10, 0x00, 0x14, 0x16, 0xE0, 0xC2, 
+	0x2E, 0x06, 0x11, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 
+	0x0E, 0x13, 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 
+	0x80, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x36, 0x07, 
+	0x06, 0x13, 0xE0, 0x04, 0x36, 0x07, 0x80, 0x01, 
+	0x20, 0x00, 0x60, 0x04, 0xF2, 0xA9, 0x40, 0x01, 
+	0x20, 0x00, 0xF9, 0x13, 0x90, 0x03, 0xFF, 0x11, 
+	0x80, 0x03, 0x08, 0x01, 0x00, 0x04, 0x19, 0x16,  
+	0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 0x15, 0x16,  
+	0x88, 0x01, 0x00, 0x1A, 0xC8, 0x01, 0x00, 0x01, 
+	0xC8, 0xC5, 0x0F, 0x10, 0xE0, 0x04, 0x18, 0x09, 
+	0xC0, 0x01, 0x04, 0x00, 0x15, 0x10, 0x81, 0xC1, 
+	0x01, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x00, 0xFC, 
+	0x77, 0xC0, 0x17, 0xC2, 0x48, 0x01, 0x00, 0x18, 
+	0xE4, 0x13, 0x40, 0x01, 0x40, 0x00, 0x15, 0x16, 
+	0x80, 0x01, 0x45, 0x00, 0x46, 0xC1, 0x20, 0xD0, 
+	0x07, 0xFC, 0x60, 0x81, 0x18, 0x09, 0xE6, 0x13, 
+	0xE0, 0xC2, 0x08, 0xFC, 0x08, 0x11, 0xE0, 0xC2, 
+	0x0E, 0xFC, 0x07, 0x15, 0x06, 0x13, 0xE0, 0xC2, 
+	0x14, 0xFC, 0x03, 0x15, 0x02, 0x13, 0xC0, 0x01, 
+	0x01, 0x00, 0x48, 0x01, 0x00, 0x01, 0x11, 0x13, 
+	0x40, 0x01, 0x80, 0x40, 0x69, 0x13, 0x60, 0x04, 
+	0x66, 0xA6, 0x48, 0x01, 0x01, 0x00, 0x03, 0x16, 
+	0x40, 0x01, 0x00, 0x40, 0x0B, 0x16, 0xC8, 0x01, 
+	0x00, 0x40, 0xA0, 0x05, 0x32, 0x09, 0xC8, 0xC5, 
+	0x05, 0x10, 0xC0, 0x01, 0x40, 0x00, 0x40, 0x01, 
+	0x04, 0x00, 0xEF, 0x13, 0xB7, 0x01, 0x20, 0x00, 
+	0xD7, 0xC2, 0xC4, 0x62, 0x0B, 0x05, 0x2B, 0x02, 
+	0xFC, 0xFF, 0xCB, 0xC5, 0x02, 0x15, 0x46, 0x81, 
+	0x6A, 0x13, 0x08, 0x01, 0x00, 0x5E, 0x67, 0x16, 
+	0x08, 0x01, 0x88, 0x00, 0x13, 0x16, 0x86, 0x02, 
+	0x43, 0x00, 0x25, 0x16, 0x40, 0x01, 0x00, 0x40, 
+	0x0B, 0x13, 0x08, 0x01, 0x03, 0x00, 0x08, 0x13, 
+	0x84, 0xC2, 0x2A, 0x02, 0xD8, 0xFF, 0x06, 0xC8, 
+	0x6C, 0x01, 0x0A, 0x68, 0x04, 0xFC, 0x73, 0x10, 
+	0x60, 0x04, 0xD2, 0xA8, 0x40, 0x01, 0x01, 0x00, 
+	0xEA, 0x13, 0x08, 0x01, 0x02, 0x00, 0xE7, 0x16, 
+	0x48, 0x01, 0x01, 0x00, 0xE4, 0x16, 0x40, 0x01, 
+	0x00, 0x40, 0x04, 0x16, 0x60, 0x01, 0xA8, 0x09, 
+	0x80, 0x00, 0xDD, 0x13, 0x8A, 0x07, 0x80, 0x00, 
+	0xA0, 0x06, 0x32, 0xA5, 0xD8, 0x10, 0x00, 0xC0, 
+	0xE7, 0x11, 0x60, 0xC2, 0x6A, 0x09, 0x40, 0x01, 
+	0x00, 0x40, 0x0A, 0x13, 0x48, 0x01, 0x01, 0x00, 
+	0x34, 0x13, 0x48, 0x01, 0x02, 0x00, 0x0A, 0x13, 
+	0x49, 0x01, 0x04, 0x00, 0xD9, 0x16, 0x06, 0x10, 
+	0x49, 0x01, 0x02, 0x00, 0x03, 0x13, 0x08, 0x01, 
+	0x03, 0x00, 0x6E, 0x13, 0x49, 0x01, 0x01, 0x00, 
+	0x12, 0x13, 0x40, 0x01, 0x80, 0x40, 0x01, 0x16, 
+	0x46, 0xC1, 0xE0, 0x04, 0x00, 0xFC, 0x87, 0x07, 
+	0xF8, 0x05, 0x17, 0xC2, 0x14, 0x13, 0xC7, 0x05, 
+	0x17, 0xC8, 0x6C, 0x01, 0x05, 0xC8, 0x00, 0xFC,  
+	0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x07, 0x02, 
+	0x02, 0xFC, 0xE0, 0xA1, 0x2C, 0x09, 0xE0, 0xCD,  
+	0xEE, 0x05, 0xE0, 0xC5, 0x04, 0xFC, 0x20, 0xC8, 
+	0x2C, 0x09, 0x04, 0xFC, 0xE2, 0x10, 0xC5, 0xCD, 
+	0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x60, 0x04, 
+	0xB6, 0xA8, 0x06, 0xC8, 0x6C, 0x01, 0x85, 0x81, 
+	0x1A, 0x13, 0xE0, 0xC2, 0x04, 0xFC, 0x17, 0x15, 
+	0x86, 0xC2, 0x8A, 0xA2, 0xAA, 0xC1, 0x32, 0x0C, 
+	0x06, 0xC8, 0x6C, 0x01, 0x0B, 0xA8, 0x04, 0xFC, 
+	0x1A, 0x09, 0x0A, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 
+	0x02, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 0x06, 0xC8, 
+	0x6C, 0x01, 0x0B, 0xC8, 0x02, 0xFC, 0xA0, 0x06, 
+	0x3E, 0xB4, 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 
+	0x00, 0xFC, 0xA0, 0x01, 0x02, 0xFC, 0x02, 0x00, 
+	0x87, 0x07, 0x30, 0x06, 0xE7, 0x01, 0x04, 0x00, 
+	0x40, 0x00, 0xD7, 0x04, 0x27, 0x02, 0x0C, 0x00, 
+	0x05, 0xC2, 0x60, 0x01, 0x6A, 0x09, 0x04, 0x00, 
+	0x03, 0x16, 0xE0, 0x01, 0x02, 0xFC, 0x20, 0x00, 
+	0xA0, 0x06, 0xFC, 0xB4, 0xC0, 0x01, 0x20, 0x00, 
+	0x60, 0x04, 0x66, 0xA6, 0x48, 0x01, 0x00, 0x18, 
+	0x03, 0x13, 0x48, 0x01, 0x00, 0x10, 0x02, 0x16, 
+	0xA0, 0x05, 0x32, 0x09, 0x86, 0x02, 0x43, 0x00, 
+	0x03, 0x13, 0x40, 0x01, 0x80, 0x40, 0x98, 0x13, 
+	0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC,  
+	0x85, 0xC2, 0xA0, 0x06, 0x3E, 0xB4, 0x20, 0x06, 
+	0x62, 0x09, 0xE6, 0x16, 0xA0, 0x06, 0xD0, 0xD5, 
+	0xE3, 0x10, 0xA0, 0xC2, 0xF6, 0x05, 0x56, 0x16, 
+	0x19, 0xC8, 0xF0, 0x05, 0xA9, 0xC2, 0x0A, 0x00, 
+	0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 0x0A, 0xD8, 
+	0x80, 0x01, 0x29, 0xC8, 0x06, 0x00, 0x8C, 0x01, 
+	0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 0x09, 0xC8, 
+	0xF4, 0x05, 0x46, 0x10, 0x29, 0xC8, 0x06, 0x00, 
+	0x6C, 0x01, 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 
+	0x20, 0xC8, 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 
+	0x12, 0xFC, 0xB2, 0x01, 0xA0, 0xF2, 0x2E, 0x09, 
+	0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x80, 0x01, 
+	0x00, 0xC4, 0xE1, 0x10, 0x47, 0x01, 0x08, 0x00, 
+	0x06, 0x16, 0xA8, 0xC2, 0x06, 0x00, 0xA0, 0x06, 
+	0x3E, 0xB4, 0xE8, 0x04, 0x06, 0x00, 0x07, 0x01, 
+	0x20, 0x00, 0x31, 0x13, 0xE8, 0x04, 0x02, 0x00, 
+	0x3B, 0x10, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x06, 
+	0x3E, 0xB4, 0x29, 0x10, 0x00, 0x03, 0x02, 0x00, 
+	0x20, 0xC2, 0x8C, 0x01, 0xE0, 0xC0, 0x6C, 0x01, 
+	0x20, 0xC2, 0xF4, 0x05, 0x28, 0xC8, 0x08, 0x00, 
+	0x6C, 0x01, 0xE8, 0xC1, 0x0A, 0x00, 0x20, 0xC3, 
+	0x02, 0xFC, 0x8C, 0x01, 0x20, 0x00, 0x0C, 0xC8, 
+	0x02, 0xFC, 0x0C, 0x01, 0x00, 0xFE, 0x3B, 0x16, 
+	0x47, 0x01, 0x40, 0x00, 0x50, 0x13, 0x60, 0xC2, 
+	0xF0, 0x05, 0xA7, 0x16, 0xE0, 0x04, 0xF4, 0x05, 
+	0x0C, 0xCA, 0x08, 0x00, 0x47, 0x01, 0x80, 0x00, 
+	0xC9, 0x16, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
+	0xA0, 0xC2, 0x00, 0xFC, 0xD2, 0x16, 0xE8, 0xC1, 
+	0x02, 0x00, 0xD7, 0xC2, 0x0F, 0x16, 0x27, 0x02, 
+	0x10, 0x00, 0xD8, 0x04, 0x57, 0xC2, 0x0E, 0x13, 
+	0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, 
+	0x03, 0xC8, 0x6C, 0x01, 0x0D, 0x11, 0x90, 0x03, 
+	0xFF, 0x11, 0x80, 0x03, 0xD7, 0x04, 0xC3, 0x01, 
+	0x00, 0x80, 0xED, 0x10, 0xE7, 0x01, 0xF4, 0xFF, 
+	0x20, 0x00, 0xC8, 0xCD, 0xC8, 0xC5, 0xF0, 0x10, 
+	0x90, 0x03, 0xF8, 0x11, 0xE0, 0x02, 0xC0, 0x00, 
+	0x60, 0xC3, 0xFA, 0x00, 0xA0, 0xC3, 0xFC, 0x00, 
+	0xE0, 0xC3, 0xFE, 0x00, 0x54, 0x04, 0xE8, 0xC2, 
+	0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x0C, 0xC3, 
+	0x33, 0x11, 0x20, 0x23, 0x0A, 0xE0, 0x45, 0x13, 
+	0x20, 0x23, 0x10, 0xE0, 0x46, 0x13, 0x20, 0x23, 
+	0x0E, 0xE0, 0x13, 0x13, 0xE0, 0x21, 0x16, 0xE0, 
+	0xB6, 0x16, 0x20, 0x23, 0x06, 0xE0, 0x03, 0x16, 
+	0x20, 0x27, 0xA8, 0xE4, 0x0A, 0x13, 0xE8, 0xC2, 
+	0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x4C, 0x01, 
+	0x88, 0x00, 0xA9, 0x16, 0x0C, 0x01, 0x44, 0x00, 
+	0xA6, 0x16, 0x20, 0x06, 0x16, 0x09, 0xA3, 0x13, 
+	0x0A, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x04, 0xE0, 
+	0x02, 0xFC, 0x0B, 0xC8, 0x6C, 0x01, 0xA0, 0x07, 
+	0x02, 0xFC, 0x00, 0x81, 0x20, 0xC3, 0x80, 0x01, 
+	0xA0, 0x01, 0x80, 0x01, 0x00, 0xC4, 0x0C, 0xC8, 
+	0x80, 0x01, 0x0A, 0xC8, 0x8C, 0x01, 0xAC, 0x10, 
+	0x0A, 0xC2, 0x0F, 0x13, 0x08, 0xC8, 0x6C, 0x01, 
+	0xA0, 0xC2, 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 
+	0x20, 0x23, 0x12, 0xE0, 0xF5, 0x16, 0x0B, 0xC8, 
+	0x6C, 0x01, 0x0C, 0xC8, 0x02, 0xFC, 0x60, 0x04, 
+	0x72, 0xA9, 0x8A, 0x07, 0x00, 0x04, 0x60, 0x04, 
+	0x8A, 0xA3, 0x8A, 0x07, 0x20, 0x00, 0x60, 0x04, 
+	0x8A, 0xA3, 0x8A, 0x07, 0x00, 0x02, 0x20, 0x27, 
+	0x0E, 0xE0, 0x04, 0x16, 0xA0, 0x06, 0x32, 0xA5, 
+	0xC3, 0x01, 0x00, 0x80, 0xA8, 0xC2, 0x06, 0x00, 
+	0x60, 0x04, 0x98, 0xA9, 0x00, 0x03, 0x02, 0x00, 
+	0xC0, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x2E, 0x06, 
+	0x08, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 0x05, 0x13, 
+	0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 0x80, 0x01, 
+	0x10, 0x00, 0x90, 0x03, 0xFF, 0x7F, 0x80, 0x03, 
+	0x00, 0x03, 0x02, 0x00, 0x20, 0xC2, 0xF6, 0x05, 
+	0x20, 0xE2, 0xF4, 0x05, 0x0E, 0x16, 0x20, 0xD8, 
+	0x2E, 0x09, 0x80, 0x01, 0x2B, 0xC8, 0x06, 0x00, 
+	0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 
+	0x0B, 0xC8, 0xF4, 0x05, 0x90, 0x03, 0xFF, 0xFF, 
+	0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 0xDB, 0x04, 
+	0x57, 0xC2, 0x05, 0x16, 0xCB, 0xCD, 0xCB, 0xC5, 
+	0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0xC7, 0x05, 
+	0x57, 0xC2, 0x4B, 0xC6, 0xCB, 0xC5, 0x90, 0x03, 
+	0xFF, 0xFF, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 
+	0x0B, 0xC2, 0x20, 0xC3, 0xF4, 0x05, 0x0F, 0x13, 
+	0xA8, 0xC2, 0x0A, 0x00, 0x4A, 0x01, 0x10, 0x00, 
+	0x16, 0x16, 0xA0, 0x22, 0x04, 0xE0, 0x1A, 0x16, 
+	0x08, 0xC3, 0xA0, 0x06, 0x36, 0xAC, 0x0C, 0xC2, 
+	0x20, 0xC3, 0xF4, 0x05, 0x13, 0x16, 0x68, 0x01, 
+	0x0A, 0x00, 0x10, 0x00, 0x03, 0x13, 0xE0, 0xC2, 
+	0xF6, 0x05, 0x05, 0x16, 0xA0, 0x06, 0x78, 0xAC, 
+	0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 
+	0xF0, 0x05, 0xA0, 0x06, 0xE6, 0xB4, 0x90, 0x03, 
+	0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 
+	0xA0, 0x06, 0x2C, 0xB5, 0x80, 0x03, 0x00, 0x03, 
+	0x02, 0x00, 0x87, 0x07, 0xF0, 0x05, 0xCB, 0xC2, 
+	0x08, 0x16, 0xA0, 0x06, 0x36, 0xAC, 0x20, 0x07, 
+	0xF6, 0x05, 0x60, 0xCB, 0xF4, 0x05, 0x02, 0x00, 
+	0x80, 0x03, 0xE0, 0x04, 0xF6, 0x05, 0x20, 0xC2, 
+	0xF4, 0x05, 0x05, 0x16, 0x17, 0xC2, 0x03, 0x13, 
+	0xD8, 0xC5, 0xA0, 0x06, 0x78, 0xAC, 0x80, 0x03, 
+	0x00, 0x03, 0x02, 0x00, 0x0B, 0xC3, 0xA0, 0x06, 
+	0x36, 0xAC, 0x8C, 0xC2, 0xCC, 0xC1, 0x27, 0x02, 
+	0x10, 0x00, 0x88, 0x07, 0xF0, 0x05, 0x88, 0xC1, 
+	0x18, 0xC2, 0x26, 0x13, 0xA8, 0x82, 0x02, 0x00, 
+	0xFA, 0x16, 0xE8, 0xC2, 0x0A, 0x00, 0xE0, 0x22, 
+	0x1E, 0xE0, 0xF5, 0x16, 0x98, 0xC5, 0xE0, 0x22, 
+	0x1C, 0xE0, 0x0B, 0x16, 0x28, 0xC8, 0x06, 0x00, 
+	0xF4, 0x00, 0xE0, 0x02, 0xE0, 0x00, 0xA0, 0x06, 
+	0x3E, 0xB4, 0xE0, 0x02, 0xC0, 0x00, 0xE8, 0x04, 
+	0x06, 0x00, 0xE0, 0x22, 0x18, 0xE0, 0xE4, 0x13, 
+	0x20, 0xEA, 0x22, 0xE0, 0x0A, 0x00, 0xA0, 0xEA, 
+	0x18, 0xE0, 0x04, 0x00, 0xDA, 0x04, 0xA0, 0x06, 
+	0xE6, 0xB4, 0x47, 0x06, 0x06, 0xC2, 0xD8, 0x10, 
+	0x06, 0xC8, 0xF2, 0x05, 0x60, 0xCB, 0xF4, 0x05, 
+	0x02, 0x00, 0x54, 0x04, 0x20, 0xC2, 0xF4, 0x05, 
+	0x13, 0x13, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, 
+	0x8B, 0x0B, 0x8B, 0x0B, 0x60, 0x01, 0x9C, 0x01, 
+	0x00, 0x40, 0x0A, 0x16, 0x60, 0xC2, 0x6C, 0x01, 
+	0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC2, 
+	0x02, 0xFC, 0x03, 0x11, 0x09, 0xC8, 0x6C, 0x01, 
+	0x5B, 0x04, 0x09, 0xC8, 0x6C, 0x01, 0x4B, 0xC2, 
+	0x87, 0x07, 0xF0, 0x05, 0xA0, 0x06, 0x2C, 0xB5, 
+	0xE0, 0x04, 0xF4, 0x05, 0x59, 0x04, 0xA8, 0xC2, 
+	0x0A, 0x00, 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 
+	0x0A, 0xD8, 0x80, 0x01, 0x28, 0xC8, 0x06, 0x00, 
+	0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 
+	0x08, 0xC8, 0xF4, 0x05, 0x5B, 0x04, 0x20, 0xC3, 
+	0x6C, 0x01, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
+	0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 0x20, 0xC8, 
+	0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 0x12, 0xFC, 
+	0xB2, 0x01, 0x0C, 0xC8, 0x6C, 0x01, 0xA0, 0xF2, 
+	0x2E, 0x09, 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 
+	0x80, 0x01, 0x00, 0xC4, 0xDD, 0x10, 0x48, 0xC0, 
+	0x89, 0xC0, 0x81, 0x60, 0xC2, 0x05, 0x5B, 0x04, 
+	0x0B, 0xC3, 0xA0, 0x06, 0xC8, 0xAC, 0x41, 0xCC, 
+	0x42, 0x06, 0xFD, 0x16, 0xA0, 0x06, 0xC8, 0xAC, 
+	0x01, 0xC1, 0x44, 0x8C, 0x12, 0x16, 0xC4, 0x05, 
+	0x42, 0x06, 0xFB, 0x16, 0x04, 0x02, 0x0E, 0xAD, 
+	0x03, 0x02, 0x01, 0x01, 0x94, 0x06, 0x03, 0x02, 
+	0x5A, 0x5A, 0x94, 0x06, 0x43, 0x05, 0x94, 0x06, 
+	0x03, 0x07, 0x94, 0x06, 0xC3, 0x04, 0x94, 0x06, 
+	0xCC, 0x05, 0x5C, 0x04, 0xCB, 0xC1, 0xA0, 0x06, 
+	0xC8, 0xAC, 0x43, 0xCC, 0x42, 0x06, 0xFD, 0x16, 
+	0xA0, 0x06, 0xC8, 0xAC, 0x43, 0x8C, 0xF5, 0x16, 
+	0x42, 0x06, 0xFC, 0x16, 0x57, 0x04, 0x8B, 0xC2, 
+	0x08, 0xC0, 0x49, 0xC1, 0x85, 0x05, 0x80, 0x02, 
+	0x40, 0x00, 0x03, 0x11, 0x80, 0x02, 0x4F, 0x00, 
+	0x45, 0x12, 0x01, 0x02, 0xC8, 0xAC, 0xA1, 0x09, 
+	0x01, 0x80, 0x40, 0x13, 0x01, 0x02, 0xF8, 0xAD, 
+	0xA1, 0x09, 0x01, 0x80, 0x3B, 0x13, 0x60, 0xC0, 
+	0x06, 0x00, 0xA1, 0x09, 0x01, 0x80, 0x36, 0x13, 
+	0x81, 0x05, 0x01, 0x80, 0x33, 0x13, 0x4A, 0xC0, 
+	0xA1, 0x09, 0x01, 0x80, 0x2F, 0x13, 0x00, 0xC8, 
+	0x6A, 0x01, 0x80, 0x02, 0x80, 0x00, 0x17, 0x14, 
+	0x01, 0x02, 0x00, 0xF8, 0xA0, 0xC1, 0x40, 0x01, 
+	0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 0x02, 0x02, 
+	0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0xB1, 0xCC, 
+	0x43, 0x06, 0xFD, 0x16, 0xA0, 0x01, 0x40, 0x01, 
+	0x00, 0x40, 0x08, 0x02, 0x10, 0xF8, 0x06, 0xC8, 
+	0x40, 0x01, 0x00, 0xC0, 0x02, 0x13, 0x08, 0x02, 
+	0x00, 0xF8, 0x09, 0x02, 0xFE, 0xFB, 0xA0, 0x06, 
+	0xD2, 0xAC, 0x25, 0x10, 0x80, 0x02, 0x80, 0x00, 
+	0x09, 0x14, 0x01, 0x02, 0x00, 0xF8, 0x02, 0x02, 
+	0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0x72, 0xCC, 
+	0x43, 0x06, 0xFD, 0x16, 0x80, 0x05, 0x80, 0x02, 
+	0x80, 0x00, 0x04, 0x12, 0x60, 0x01, 0x04, 0x01, 
+	0x20, 0x00, 0x05, 0x13, 0x40, 0x81, 0xAB, 0x16, 
+	0x80, 0x02, 0x80, 0x00, 0x0B, 0x14, 0xA0, 0x07, 
+	0x6A, 0x01, 0x7E, 0x00, 0x02, 0x02, 0x00, 0x10, 
+	0x03, 0x02, 0x00, 0x04, 0xC1, 0x04, 0x81, 0xCC, 
+	0x43, 0x06, 0xFD, 0x16, 0xCA, 0x05, 0x5A, 0x04, 
+	0x00, 0x02, 0xEA, 0xAD, 0x01, 0x02, 0x1A, 0xAF, 
+	0x40, 0x02, 0x00, 0xFC, 0x41, 0x02, 0x00, 0xFC, 
+	0x40, 0x80, 0x04, 0x13, 0xA0, 0x07, 0x04, 0x01, 
+	0x3C, 0x00, 0x5B, 0x04, 0xC0, 0x04, 0x01, 0x02, 
+	0x08, 0x00, 0x02, 0x02, 0x00, 0x12, 0xE0, 0xC1, 
+	0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 
+	0x03, 0x02, 0x00, 0x01, 0x00, 0xC8, 0x6A, 0x01, 
+	0xA0, 0xCC, 0x10, 0xF8, 0x80, 0x05, 0x03, 0x06, 
+	0xF9, 0x16, 0x22, 0x02, 0x00, 0x02, 0x01, 0x06, 
+	0xF3, 0x16, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 
+	0x07, 0xC8, 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, 
+	0x40, 0xC0, 0x01, 0x06, 0x01, 0xC8, 0x6A, 0x01, 
+	0x61, 0x02, 0x00, 0x80, 0x01, 0xC8, 0x10, 0xF8, 
+	0x00, 0x06, 0xF6, 0x16, 0xC0, 0x04, 0xC8, 0x04, 
+	0xC9, 0x04, 0x03, 0x02, 0x00, 0x08, 0x00, 0xC8, 
+	0x6A, 0x01, 0x80, 0xC1, 0x66, 0x02, 0x00, 0x80, 
+	0x20, 0xC1, 0x10, 0xF8, 0x06, 0x81, 0x15, 0x16, 
+	0x08, 0xC2, 0x06, 0x13, 0x80, 0x05, 0x03, 0x06, 
+	0xF2, 0x16, 0x08, 0xC2, 0x0D, 0x13, 0x19, 0x10, 
+	0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 0x20, 0xC1, 
+	0x10, 0xF8, 0x84, 0x02, 0x55, 0x55, 0x02, 0x16, 
+	0x06, 0xC2, 0xF0, 0x10, 0x06, 0x81, 0xEE, 0x13, 
+	0x5B, 0x04, 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 
+	0x60, 0xC1, 0x10, 0xF8, 0x05, 0x81, 0x03, 0x13, 
+	0x85, 0x02, 0x55, 0x55, 0xF5, 0x16, 0x08, 0xC2, 
+	0xE1, 0x13, 0x40, 0xC2, 0x09, 0x06, 0x48, 0x02, 
+	0xFF, 0x07, 0xC0, 0x04, 0x01, 0x02, 0x08, 0x00, 
+	0x02, 0x02, 0x00, 0x12, 0x03, 0x02, 0x00, 0x01, 
+	0x00, 0xC8, 0x6A, 0x01, 0x32, 0xC8, 0x10, 0xF8, 
+	0x80, 0x05, 0x03, 0x06, 0xF9, 0x16, 0x22, 0x02, 
+	0x00, 0x02, 0x01, 0x06, 0xF3, 0x16, 0x88, 0x02, 
+	0x40, 0x00, 0x13, 0x15, 0x89, 0x02, 0x4F, 0x00, 
+	0x10, 0x11, 0xC0, 0x04, 0x02, 0x02, 0x00, 0x12, 
+	0x01, 0x02, 0x08, 0x00, 0x03, 0x02, 0x00, 0x01, 
+	0x80, 0xCC, 0x03, 0x06, 0xFD, 0x16, 0x22, 0x02, 
+	0x00, 0x02, 0x01, 0x06, 0xF7, 0x16, 0xCB, 0x05, 
+	0x5B, 0x04, 0xA0, 0x07, 0x04, 0x01, 0x37, 0x00, 
+	0x5B, 0x04, 0x33, 0x07, 0x33, 0x07, 0x0C, 0x10, 
+	0x13, 0x07, 0x23, 0x07, 0x02, 0x00, 0xCB, 0xC8, 
+	0x06, 0x00, 0x23, 0x02, 0x18, 0x00, 0xE0, 0xCC, 
+	0x6C, 0x01, 0xCD, 0xCC, 0xCE, 0xCC, 0xCF, 0xCC, 
+	0x83, 0x07, 0x30, 0x06, 0xD3, 0xC1, 0x0A, 0x13, 
+	0x83, 0x07, 0x36, 0x07, 0xD3, 0xC1, 0x06, 0x13, 
+	0x83, 0x07, 0xA0, 0x00, 0x93, 0x00, 0x0C, 0xC8, 
+	0x6C, 0x01, 0x80, 0x03, 0x63, 0x07, 0x02, 0x00, 
+	0x2A, 0x15, 0x63, 0xC2, 0x04, 0x00, 0x63, 0x42, 
+	0x06, 0x00, 0xDB, 0x13, 0x63, 0xC3, 0x1A, 0x00, 
+	0x49, 0xD2, 0x0C, 0x13, 0xC9, 0x06, 0x49, 0x72, 
+	0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 0x49, 0x72, 
+	0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 
+	0x02, 0x00, 0x52, 0x04, 0x69, 0xC2, 0xC0, 0xE1, 
+	0x49, 0x72, 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 
+	0xE9, 0xA2, 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 
+	0x12, 0x00, 0x0F, 0x13, 0xDC, 0xC6, 0x03, 0x16, 
+	0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 
+	0x02, 0x00, 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 
+	0xFF, 0x01, 0x93, 0x00, 0x0C, 0xC8, 0x6C, 0x01, 
+	0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, 
+	0x00, 0xFC, 0xF1, 0x16, 0xE9, 0x48, 0x04, 0xE0, 
+	0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 0x4C, 0xCB, 
+	0x04, 0x00, 0xED, 0x10, 0x00, 0x03, 0x02, 0x00, 
+	0xDB, 0xC2, 0x63, 0xC2, 0x04, 0x00, 0x4B, 0x42, 
+	0x9F, 0x13, 0x49, 0xD2, 0x0E, 0x13, 0xC9, 0x06, 
+	0x49, 0x72, 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 
+	0x49, 0x72, 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 
+	0x49, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, 
+	0x80, 0x03, 0x69, 0xC2, 0xC0, 0xE1, 0x49, 0x72, 
+	0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 0xE9, 0xA2, 
+	0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 0x12, 0x00, 
+	0x0C, 0x13, 0xDC, 0xC6, 0x03, 0x16, 0xE9, 0x48, 
+	0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 
+	0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 0xFF, 0xFF, 
+	0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, 
+	0x00, 0xFC, 0xF4, 0x16, 0xF0, 0x10, 0x00, 0x03, 
+	0x02, 0x00, 0xBB, 0xC2, 0xBB, 0xC1, 0x86, 0xD1, 
+	0x03, 0x13, 0x86, 0xEA, 0x04, 0x00, 0x13, 0x10, 
+	0xA6, 0xD1, 0xC0, 0xE1, 0xC6, 0x06, 0x86, 0x71, 
+	0xCA, 0xC1, 0xE6, 0xA1, 0xB8, 0xE1, 0xA6, 0xEA, 
+	0x14, 0xE0, 0x04, 0x00, 0x1B, 0xC2, 0x86, 0x02, 
+	0x02, 0x00, 0x03, 0x16, 0xA0, 0x06, 0x0C, 0xB5, 
+	0x02, 0x10, 0xA0, 0x06, 0xE6, 0xB4, 0xDA, 0x04, 
+	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xAB, 0xC2, 
+	0x06, 0x00, 0x8C, 0x07, 0xE8, 0x05, 0x5C, 0xC2, 
+	0x16, 0x13, 0xA0, 0xC1, 0xEC, 0x05, 0x8A, 0x81, 
+	0x1A, 0x1A, 0xC6, 0xC1, 0x09, 0xC2, 0x59, 0xC2, 
+	0x20, 0x13, 0xE9, 0xA1, 0x08, 0x00, 0x87, 0x82, 
+	0xF9, 0x12, 0xA9, 0xA2, 0x08, 0x00, 0x87, 0x62, 
+	0xCA, 0xCA, 0x08, 0x00, 0x4A, 0x6A, 0x08, 0x00, 
+	0xC9, 0xC6, 0x0B, 0xC6, 0x80, 0x03, 0xCA, 0xCA, 
+	0x08, 0x00, 0x0A, 0xC8, 0xEC, 0x05, 0xDB, 0x04, 
+	0x0B, 0xCF, 0x0B, 0xC7, 0x80, 0x03, 0x8A, 0x61, 
+	0x46, 0xCA, 0x08, 0x00, 0xCA, 0xCA, 0x08, 0x00, 
+	0x0A, 0xC8, 0xEC, 0x05, 0xC9, 0xC6, 0x0B, 0xC7, 
+	0x80, 0x03, 0x87, 0x62, 0xCA, 0xCA, 0x08, 0x00, 
+	0xDB, 0x04, 0x0B, 0xC6, 0x0B, 0xCB, 0x02, 0x00, 
+	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xBB, 0xC1, 
+	0xDB, 0xC2, 0x8C, 0x07, 0xE8, 0x05, 0x4C, 0xC2, 
+	0xED, 0x04, 0x02, 0x00, 0x09, 0xC2, 0x59, 0xC2, 
+	0x18, 0x13, 0xA9, 0x81, 0x02, 0x00, 0xFA, 0x16, 
+	0xE9, 0x82, 0x04, 0x00, 0xF7, 0x16, 0x49, 0xCB, 
+	0x04, 0x00, 0x99, 0xC2, 0x0A, 0xC6, 0x0A, 0x13, 
+	0x08, 0x83, 0x04, 0x13, 0xA9, 0xAA, 0x08, 0x00, 
+	0x08, 0x00, 0x80, 0x03, 0x2A, 0xA8, 0x08, 0x00, 
+	0xEC, 0x05, 0x80, 0x03, 0x08, 0xCB, 0x02, 0x00, 
+	0x80, 0x03, 0x2D, 0x07, 0x02, 0x00, 0x8C, 0x07, 
+	0x08, 0x00, 0x06, 0xA3, 0x4C, 0xC2, 0x09, 0xC2, 
+	0x59, 0xC2, 0x13, 0x13, 0xE9, 0x82, 0x04, 0x00, 
+	0xFA, 0x16, 0xAD, 0x07, 0x02, 0x00, 0x01, 0x00, 
+	0x49, 0xCB, 0x04, 0x00, 0x19, 0xC6, 0x01, 0x13, 
+	0x80, 0x03, 0x08, 0x83, 0x04, 0x16, 0xA0, 0x49, 
+	0x14, 0xE0, 0x04, 0x00, 0x80, 0x03, 0x08, 0xCB, 
+	0x02, 0x00, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 
+	0x0B, 0x06, 0x1F, 0x11, 0x4D, 0x13, 0x8B, 0x07, 
+	0x00, 0x4E, 0x60, 0x01, 0x42, 0x01, 0x80, 0x00, 
+	0x09, 0x13, 0x8B, 0x07, 0x00, 0x3A, 0x20, 0xC1, 
+	0x4E, 0x01, 0x84, 0x02, 0x41, 0x0F, 0x02, 0x11, 
+	0x8B, 0x07, 0x00, 0x4E, 0x0B, 0xC8, 0x44, 0x01, 
+	0xA0, 0x07, 0x62, 0x09, 0xE8, 0x03, 0xE0, 0x01, 
+	0x40, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x40, 0x01, 
+	0x00, 0x20, 0x84, 0x07, 0x34, 0xAF, 0x60, 0x04, 
+	0x42, 0xAF, 0x20, 0xC8, 0x16, 0xE0, 0xE0, 0x00, 
+	0xE0, 0xC2, 0x6A, 0x09, 0xE0, 0x22, 0x10, 0xE0, 
+	0x03, 0x13, 0x20, 0xE8, 0x14, 0xE0, 0xE0, 0x00, 
+	0x20, 0xC8, 0x04, 0xE0, 0x82, 0x01, 0x20, 0xC8, 
+	0xE2, 0x00, 0x8A, 0x01, 0xE0, 0x04, 0x18, 0x09, 
+	0xE0, 0x04, 0xF4, 0x05, 0xE0, 0x04, 0xF8, 0x05, 
+	0xE0, 0x04, 0xF0, 0x05, 0xE0, 0x04, 0x42, 0x07, 
+	0xA0, 0x07, 0x88, 0x01, 0x20, 0x00, 0xE0, 0xC2, 
+	0x30, 0x09, 0x09, 0x13, 0xA0, 0x07, 0x88, 0x01, 
+	0x80, 0x00, 0x20, 0xE8, 0x16, 0xE0, 0x80, 0x01, 
+	0xE0, 0x01, 0x82, 0x01, 0x00, 0x03, 0x8B, 0x07, 
+	0x00, 0xA0, 0x0B, 0xE8, 0x86, 0x01, 0x80, 0x03, 
+	0xE0, 0x04, 0x86, 0x01, 0xE0, 0x01, 0x9C, 0x01, 
+	0x40, 0x00, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, 
+	0xCB, 0x04, 0xB0, 0x03, 0x0B, 0x06, 0x04, 0x13, 
+	0x60, 0x01, 0x9C, 0x01, 0x00, 0x40, 0xF9, 0x16, 
+	0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, 0x08, 0xE0, 
+	0x6A, 0x09, 0x8B, 0x07, 0x00, 0x80, 0x0B, 0xC8, 
+	0x98, 0x07, 0x0B, 0xC8, 0x78, 0x07, 0x20, 0xC8, 
+	0x04, 0xE0, 0x82, 0x01, 0x8B, 0x07, 0x6F, 0x87, 
+	0x0B, 0x48, 0x3A, 0x07, 0xE0, 0xC2, 0x50, 0x07, 
+	0x8B, 0x02, 0x58, 0x07, 0x10, 0x13, 0x20, 0xE8, 
+	0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, 
+	0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0x8B, 0x07, 
+	0x58, 0x07, 0x0B, 0xC8, 0x50, 0x07, 0x8B, 0x07, 
+	0x0C, 0xB8, 0x0B, 0xC8, 0x52, 0x07, 0x80, 0x03, 
+	0x00, 0x03, 0x02, 0x00, 0xE0, 0xC2, 0x1A, 0x09, 
+	0x0C, 0x13, 0x20, 0x06, 0x1C, 0x09, 0x0B, 0xC8, 
+	0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 0x1A, 0x09, 
+	0x4B, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, 
+	0x80, 0x03, 0x41, 0xC0, 0x0F, 0x13, 0x81, 0x80, 
+	0x0D, 0x13, 0x82, 0xA0, 0xE2, 0xC2, 0x32, 0x0C, 
+	0x12, 0x09, 0x0B, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 
+	0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 0x07, 0x11, 
+	0x02, 0xC8, 0x00, 0xFC, 0xED, 0x04, 0x02, 0x00, 
+	0xE0, 0x04, 0x6C, 0x01, 0x80, 0x03, 0x42, 0xCB, 
+	0x02, 0x00, 0x02, 0xC8, 0x6C, 0x01, 0x8B, 0xC0, 
+	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x83, 0x07, 
+	0x00, 0x80, 0x60, 0xC2, 0x7E, 0x09, 0x09, 0xC1, 
+	0x24, 0x02, 0xF8, 0xFF, 0xA9, 0x08, 0x01, 0x02, 
+	0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0B, 0x02, 
+	0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x07, 0x02, 
+	0x00, 0x00, 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 
+	0x06, 0x13, 0x8B, 0x05, 0xCC, 0x05, 0x0B, 0x88, 
+	0x46, 0x04, 0x27, 0x1B, 0xF6, 0x10, 0x09, 0xC2, 
+	0x8B, 0xC2, 0x08, 0x06, 0x0A, 0x13, 0x8B, 0x05, 
+	0xCC, 0x05, 0x0B, 0x88, 0x46, 0x04, 0x1D, 0x1B, 
+	0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 0xED, 0x16, 
+	0xF4, 0x10, 0x82, 0xC0, 0x14, 0x13, 0x02, 0xC8, 
+	0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 0x0A, 0xC8, 
+	0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x07, 
+	0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, 
+	0x0A, 0xC2, 0x08, 0xA2, 0x02, 0xCA, 0x32, 0x0C, 
+	0x8A, 0xC0, 0x87, 0x05, 0xD6, 0x10, 0x4A, 0xC0, 
+	0xEE, 0x10, 0x47, 0xCB, 0x02, 0x00, 0xE0, 0x04, 
+	0x6C, 0x01, 0x8B, 0x07, 0x43, 0x00, 0xE0, 0x04, 
+	0x00, 0x0C, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, 
+	0x6C, 0x01, 0x8B, 0x02, 0x43, 0x00, 0x04, 0x13, 
+	0x60, 0x01, 0x02, 0xFC, 0x20, 0x00, 0x06, 0x13, 
+	0x8B, 0xC2, 0xA0, 0x06, 0x42, 0xB4, 0x90, 0x03, 
+	0x7F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x02, 0xFC, 
+	0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 
+	0x0B, 0x16, 0x0A, 0x02, 0x02, 0xFC, 0xA0, 0xA2, 
+	0x2C, 0x09, 0xA0, 0xCE, 0xEE, 0x05, 0xA0, 0xC6, 
+	0x04, 0xFC, 0x20, 0xC8, 0x2C, 0x09, 0x04, 0xFC, 
+	0x8A, 0x07, 0xF8, 0x05, 0x5A, 0xC2, 0x08, 0x13, 
+	0xCA, 0x05, 0x5A, 0xC2, 0x09, 0xC8, 0x6C, 0x01, 
+	0x0B, 0xC8, 0x00, 0xFC, 0x8B, 0xC6, 0x02, 0x10, 
+	0x8B, 0xCE, 0x8B, 0xC6, 0x20, 0x20, 0x1A, 0xE0, 
+	0x05, 0x16, 0x20, 0xE8, 0x04, 0xE0, 0x3A, 0x07, 
+	0xE0, 0x04, 0x36, 0x07, 0x90, 0x03, 0x7F, 0x00, 
+	0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, 
+	0x6C, 0x01, 0xCC, 0x04, 0xE0, 0x04, 0x00, 0xFC, 
+	0x8B, 0xC2, 0xA0, 0x06, 0x50, 0xB4, 0x90, 0x03, 
+	0x7F, 0x00, 0x80, 0x03, 0xA0, 0x07, 0x02, 0xFC, 
+	0x00, 0x80, 0x20, 0xC8, 0x8C, 0xE1, 0x04, 0xFC, 
+	0x41, 0xC0, 0x0F, 0x16, 0x20, 0xD8, 0x00, 0xE2, 
+	0x83, 0x01, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 
+	0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 
+	0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x0A, 0xC8, 
+	0x8A, 0x01, 0x5B, 0x04, 0x0A, 0xC8, 0x6C, 0x01, 
+	0x20, 0xC3, 0x00, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 
+	0x8A, 0x02, 0x43, 0x00, 0xDF, 0x13, 0xA0, 0x07, 
+	0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, 
+	0x20, 0x98, 0x84, 0x09, 0x1D, 0x09, 0x0A, 0x13, 
+	0x20, 0xC8, 0x1A, 0x09, 0x00, 0xFC, 0x0A, 0xC8, 
+	0x1A, 0x09, 0xA0, 0x05, 0x1C, 0x09, 0x8C, 0xC2, 
+	0xE5, 0x16, 0x5B, 0x04, 0x41, 0xC0, 0x10, 0x13, 
+	0x8A, 0xA2, 0x82, 0xCA, 0x32, 0x0C, 0x1A, 0x09, 
+	0x02, 0xC8, 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 
+	0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 
+	0x09, 0x13, 0x8C, 0xC2, 0xD3, 0x16, 0x5B, 0x04, 
+	0x4A, 0xC0, 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 
+	0x00, 0xE2, 0x1B, 0x16, 0xE0, 0x01, 0x9C, 0x01, 
+	0x40, 0x00, 0xA0, 0x07, 0x64, 0x09, 0x00, 0x70, 
+	0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0x07, 0x13, 
+	0x20, 0x06, 0x64, 0x09, 0xF9, 0x16, 0x0A, 0x02, 
+	0x00, 0x01, 0x60, 0x04, 0x8A, 0xA3, 0x60, 0x01, 
+	0x02, 0x0C, 0x00, 0x01, 0xE2, 0x13, 0x20, 0xD8, 
+	0x2F, 0x09, 0x83, 0x01, 0xA0, 0x07, 0x02, 0x0C, 
+	0x00, 0x80, 0x0A, 0xC8, 0x8A, 0x01, 0x0A, 0xC8, 
+	0x18, 0x09, 0xD7, 0x10, 0xD8, 0x04, 0x57, 0xC2, 
+	0x03, 0x16, 0xC8, 0xCD, 0xC8, 0xC5, 0x5B, 0x04, 
+	0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, 
+	0x5B, 0x04, 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xA2, 
+	0x20, 0xCA, 0x00, 0xFC, 0x32, 0x0C, 0x18, 0x09, 
+	0x02, 0x10, 0x08, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 
+	0x00, 0xFC, 0x57, 0xC2, 0x03, 0x16, 0xC8, 0xCD, 
+	0xC8, 0xC5, 0x5B, 0x04, 0xC7, 0x05, 0x17, 0xC8, 
+	0x6C, 0x01, 0x08, 0xC8, 0x00, 0xFC, 0xC8, 0xC5, 
+	0x5B, 0x04, 0x17, 0xC6, 0x02, 0x16, 0xC8, 0xC9, 
+	0x02, 0x00, 0xC8, 0xC5, 0x5B, 0x04, 0x17, 0xC2, 
+	0x08, 0xC8, 0x6C, 0x01, 0x07, 0x13, 0xE0, 0xC5, 
+	0x00, 0xFC, 0x08, 0xA2, 0x28, 0xC8, 0x32, 0x0C, 
+	0x00, 0xFC, 0x18, 0x09, 0x5B, 0x04, 0x60, 0x01, 
+	0x82, 0x01, 0x00, 0x20, 0x0A, 0x16, 0x60, 0xC2, 
+	0x84, 0x01, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x20, 
+	0xE0, 0x01, 0x82, 0x01, 0x00, 0x20, 0x09, 0xC8, 
+	0x84, 0x01, 0xC9, 0x04, 0x5B, 0x04, 0xA0, 0x06, 
+	0xBE, 0xB7, 0xD3, 0x04, 0xE0, 0x04, 0x02, 0x01, 
+	0x20, 0xE8, 0x14, 0xE0, 0x00, 0x01, 0x20, 0xC8, 
+	0x16, 0xE0, 0x04, 0x01, 0x05, 0x2C, 0x20, 0x48, 
+	0x14, 0xE0, 0x00, 0x01, 0x8C, 0x07, 0x00, 0x0A, 
+	0x8D, 0x07, 0xD8, 0x07, 0x8E, 0x07, 0x18, 0x00, 
+	0x7C, 0xCF, 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x02, 
+	0xD8, 0x07, 0x8F, 0x07, 0x11, 0xFF, 0x8B, 0x02, 
+	0x3B, 0x59, 0x21, 0x16, 0x8A, 0x02, 0x3B, 0x59, 
+	0x1E, 0x13, 0x8F, 0x05, 0x20, 0x20, 0x16, 0xE0, 
+	0x01, 0x16, 0x19, 0x10, 0x20, 0x20, 0x04, 0xE0, 
+	0x16, 0x16, 0x00, 0x01, 0xBF, 0x00, 0x13, 0x16, 
+	0x8B, 0x07, 0xC0, 0x40, 0x00, 0x01, 0x00, 0x60, 
+	0x10, 0x13, 0x40, 0x01, 0x00, 0x60, 0x0B, 0x16, 
+	0x8B, 0x07, 0xC4, 0x44, 0xA0, 0xC3, 0x02, 0x01, 
+	0x0E, 0x48, 0x02, 0x01, 0x4E, 0x01, 0x00, 0x10, 
+	0x04, 0x16, 0x8F, 0x07, 0x18, 0xFF, 0x60, 0x04, 
+	0x94, 0xB7, 0x0B, 0xC3, 0x4B, 0xC3, 0x20, 0x20, 
+	0x0A, 0xE0, 0x02, 0x16, 0x6B, 0x02, 0x20, 0x20, 
+	0x20, 0x20, 0x0C, 0xE0, 0x02, 0x16, 0x6C, 0x02, 
+	0x00, 0x20, 0x20, 0x20, 0x0E, 0xE0, 0x02, 0x16, 
+	0x6C, 0x02, 0x20, 0x00, 0x8F, 0x05, 0x20, 0x20, 
+	0x10, 0xE0, 0x07, 0x16, 0x6D, 0x02, 0x20, 0x00, 
+	0x20, 0x21, 0x22, 0xE0, 0xE4, 0x13, 0x04, 0xC1, 
+	0x02, 0x16, 0x84, 0x07, 0xFE, 0x7F, 0x8F, 0x05, 
+	0x20, 0x20, 0x12, 0xE0, 0x02, 0x16, 0x6D, 0x02, 
+	0x00, 0x20, 0x60, 0x21, 0x22, 0xE0, 0xD7, 0x13, 
+	0x45, 0xC1, 0x02, 0x16, 0x85, 0x07, 0xFE, 0x7F, 
+	0x8F, 0x05, 0x86, 0xD1, 0x0B, 0x13, 0xA0, 0x25, 
+	0x26, 0xE0, 0x08, 0x13, 0x8F, 0x05, 0x20, 0x26, 
+	0x22, 0xE0, 0x04, 0x16, 0x8F, 0x05, 0xA0, 0x26, 
+	0x22, 0xE0, 0x02, 0x13, 0x60, 0x04, 0x94, 0xB7, 
+	0x01, 0xD8, 0xEC, 0x08, 0x20, 0xD8, 0xDB, 0x07, 
+	0x00, 0x09, 0x02, 0xD8, 0xF6, 0x08, 0x20, 0xD8, 
+	0xDD, 0x07, 0xE2, 0x08, 0xE0, 0x02, 0x58, 0x07, 
+	0x20, 0xD8, 0xEF, 0x07, 0xF4, 0x07, 0x20, 0xD8, 
+	0xF1, 0x07, 0xF6, 0x07, 0x20, 0xD8, 0xF3, 0x07, 
+	0xF8, 0x07, 0x09, 0x02, 0x06, 0x00, 0xCB, 0x04, 
+	0x0F, 0x02, 0xEE, 0x07, 0x8F, 0x05, 0xCB, 0xDF, 
+	0x09, 0x06, 0xFC, 0x16, 0xA0, 0x06, 0xBE, 0xB7, 
+	0x89, 0x07, 0x5C, 0xE3, 0xE0, 0x04, 0x1A, 0x01, 
+	0x20, 0xC8, 0xE4, 0x07, 0x18, 0x01, 0x19, 0xC8, 
+	0x0C, 0x01, 0x39, 0xC8, 0x0A, 0x01, 0x39, 0xC8, 
+	0x12, 0x01, 0x09, 0x16, 0x79, 0xC3, 0x0F, 0x02, 
+	0x00, 0xE0, 0x4F, 0x63, 0x2D, 0x02, 0x00, 0x90, 
+	0x0D, 0xC8, 0x14, 0x01, 0x02, 0x10, 0x39, 0xC8, 
+	0x14, 0x01, 0xF9, 0xC3, 0x3F, 0xC8, 0x0E, 0x01, 
+	0x1F, 0xC8, 0x10, 0x01, 0xE0, 0x04, 0x14, 0x09, 
+	0xB9, 0xC2, 0x1A, 0xC8, 0x00, 0x01, 0x96, 0x06, 
+	0x89, 0x02, 0x84, 0xE3, 0xE0, 0x16, 0x8F, 0x07, 
+	0x1C, 0xFF, 0x8C, 0x07, 0x00, 0x0A, 0x8D, 0x07, 
+	0x84, 0xE3, 0x8E, 0x07, 0x10, 0x00, 0x7C, 0x8F, 
+	0x44, 0x16, 0x4E, 0x06, 0xFC, 0x16, 0xA0, 0xC3, 
+	0xE2, 0x07, 0xE0, 0xC3, 0xE0, 0x07, 0xCE, 0x83, 
+	0x01, 0x14, 0xCE, 0xC3, 0x0F, 0xC8, 0x1A, 0x01, 
+	0x8C, 0x07, 0x94, 0xE3, 0x8D, 0x07, 0x00, 0x0A, 
+	0x8E, 0x07, 0xA4, 0xE3, 0x8C, 0x63, 0x7C, 0xCF, 
+	0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x04, 0x30, 0x09, 
+	0x20, 0x01, 0x42, 0x01, 0x00, 0x04, 0x02, 0x16, 
+	0x20, 0x07, 0x30, 0x09, 0x60, 0xC2, 0x62, 0x01, 
+	0xE0, 0x04, 0x62, 0x01, 0x8E, 0x07, 0x00, 0x80, 
+	0x8C, 0x07, 0x34, 0x09, 0x8D, 0x07, 0x06, 0x00, 
+	0x3E, 0xDF, 0x8E, 0x05, 0x0D, 0x06, 0xFC, 0x16, 
+	0xFE, 0xD3, 0xCF, 0x06, 0x8E, 0x05, 0xFE, 0xD3, 
+	0xCF, 0x06, 0x8C, 0x07, 0x34, 0x09, 0x09, 0xC8, 
+	0x62, 0x01, 0xC9, 0x04, 0x5C, 0xA3, 0x7C, 0xE2, 
+	0x5C, 0xA3, 0x7C, 0xE2, 0x5C, 0xA3, 0x7C, 0xE2, 
+	0x02, 0x13, 0xCD, 0x83, 0x09, 0x13, 0x20, 0x07, 
+	0x34, 0x09, 0x06, 0x10, 0x8F, 0x07, 0x19, 0xFF, 
+	0xCD, 0xA3, 0x0F, 0xC8, 0x04, 0x01, 0xFF, 0x10, 
+	0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0xE0, 0xC3, 
+	0xEE, 0x07, 0xE0, 0x43, 0x06, 0xE0, 0x0F, 0xC8, 
+	0x00, 0x01, 0x20, 0xC0, 0x04, 0xE0, 0xE0, 0x04, 
+	0xFE, 0x06, 0xD3, 0x04, 0xE0, 0x04, 0x04, 0x01, 
+	0x60, 0x04, 0x0C, 0xB8, 0x8C, 0x07, 0x00, 0x0A, 
+	0x8D, 0x07, 0x18, 0x00, 0x8E, 0x07, 0x3B, 0x59, 
+	0x0E, 0xCF, 0x4D, 0x06, 0xFD, 0x16, 0x5B, 0x04, 
+	0x93, 0x01, 0x00, 0x80, 0x20, 0x04, 0xC0, 0xE2, 
+	0x60, 0xD0, 0x98, 0x07, 0x1C, 0x13, 0x00, 0x03, 
+	0x02, 0x00, 0xA0, 0xC0, 0x46, 0x07, 0x12, 0xC8, 
+	0x46, 0x07, 0x02, 0x16, 0x93, 0x01, 0x20, 0x00, 
+	0x00, 0x03, 0x0F, 0x00, 0x20, 0x04, 0xE8, 0xE2, 
+	0x93, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x40, 
+	0x00, 0x01, 0xFE, 0x00, 0x49, 0x16, 0xC4, 0xC3, 
+	0x25, 0x16, 0xD3, 0xC3, 0xC5, 0x43, 0x0C, 0x16, 
+	0xE0, 0xC3, 0x98, 0x07, 0x03, 0x11, 0xE0, 0x02, 
+	0x98, 0x07, 0x51, 0x04, 0xE0, 0xC3, 0x78, 0x07, 
+	0x0A, 0x11, 0xE0, 0x02, 0x78, 0x07, 0x51, 0x04, 
+	0xD3, 0x11, 0x4F, 0x01, 0x00, 0x20, 0xE4, 0x13, 
+	0x4F, 0x01, 0x20, 0x00, 0xD1, 0x13, 0x05, 0x2C, 
+	0x41, 0xA0, 0x21, 0x04, 0xC0, 0xE2, 0x8B, 0x07, 
+	0x0C, 0xB8, 0x00, 0x01, 0x00, 0x40, 0x0F, 0x13, 
+	0xDD, 0xC3, 0x4F, 0x02, 0x0F, 0x00, 0x2F, 0xE1, 
+	0x14, 0xE0, 0x5B, 0x04, 0xE4, 0xC3, 0xC0, 0xE1, 
+	0xCF, 0x73, 0x2F, 0x41, 0x14, 0xE0, 0x6F, 0xC3, 
+	0xEC, 0xEA, 0x8B, 0x07, 0x0C, 0xB8, 0x4B, 0xC2, 
+	0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 0x08, 0x00, 
+	0xBD, 0xC0, 0xA0, 0xC3, 0xEA, 0x07, 0xE0, 0xC3, 
+	0xEC, 0x07, 0xA0, 0x06, 0x00, 0xBA, 0xC0, 0x01, 
+	0x00, 0x40, 0x02, 0xD8, 0x17, 0x01, 0x62, 0x02, 
+	0x80, 0xFF, 0xA0, 0x06, 0x54, 0xBA, 0x02, 0xC8, 
+	0x04, 0x01, 0x90, 0x03, 0x3F, 0x60, 0x59, 0x04, 
+	0xC0, 0xC3, 0xCF, 0x73, 0xEF, 0xC3, 0xC0, 0xE1, 
+	0xCF, 0x73, 0xAF, 0xC3, 0xDE, 0xEA, 0x9E, 0xC3, 
+	0x4E, 0x02, 0x0F, 0x00, 0x2E, 0x21, 0x14, 0xE0, 
+	0x08, 0x13, 0x2F, 0x40, 0x14, 0xE0, 0xCF, 0xA3, 
+	0x2F, 0x04, 0xF0, 0xE2, 0x40, 0x01, 0x00, 0x40, 
+	0xA4, 0x13, 0xC4, 0xC3, 0xC7, 0x16, 0x00, 0x01, 
+	0xFE, 0x00, 0xE6, 0x16, 0x9E, 0x10, 0x40, 0x01, 
+	0x00, 0x40, 0x05, 0x16, 0x20, 0xE0, 0x14, 0xE0, 
+	0x65, 0x02, 0x00, 0x58, 0x96, 0x10, 0x20, 0xD8, 
+	0xDE, 0x07, 0x17, 0x01, 0x8F, 0x07, 0x86, 0xFF, 
+	0x0F, 0xC8, 0x04, 0x01, 0xC0, 0x01, 0x00, 0x40, 
+	0x45, 0x02, 0xFF, 0xA7, 0x8A, 0x10, 0x20, 0xC3, 
+	0xFE, 0x06, 0x20, 0x27, 0x38, 0xE3, 0x07, 0x13, 
+	0x20, 0x23, 0x22, 0xE0, 0x1A, 0x13, 0x65, 0x02, 
+	0xFF, 0xDF, 0x20, 0x40, 0x14, 0xE0, 0x20, 0xE0, 
+	0x16, 0xE0, 0x0C, 0xC8, 0xE6, 0x08, 0x8D, 0x07, 
+	0xE2, 0x08, 0x58, 0x04, 0x20, 0x48, 0x08, 0xE0, 
+	0xFE, 0x06, 0x20, 0xC3, 0xE6, 0x08, 0x20, 0x27, 
+	0x38, 0xE3, 0x19, 0x16, 0x80, 0x03, 0x02, 0xC3,  
+	0x6C, 0xC2, 0x0A, 0x00, 0x99, 0x06, 0x60, 0x04,  
+	0x0C, 0xB8, 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 
+	0x01, 0x00, 0x8D, 0x07, 0x06, 0x06, 0xCE, 0x04, 
+	0xE0, 0xC3, 0x08, 0x06, 0x01, 0x13, 0x97, 0x06, 
+	0x20, 0xD8, 0x07, 0x06, 0x17, 0x01, 0x8B, 0x07, 
+	0x82, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0xA0, 0x06, 
+	0xB4, 0xBE, 0x60, 0x04, 0x0C, 0xB8, 0xA0, 0xC2, 
+	0xEE, 0x07, 0x8C, 0x07, 0x06, 0x00, 0x8D, 0x07, 
+	0xEE, 0x08, 0xA0, 0xC3, 0xE6, 0x07, 0xE0, 0xC3, 
+	0xE8, 0x07, 0x97, 0x06, 0xA0, 0xC2, 0xF4, 0x07, 
+	0x8D, 0x07, 0xF4, 0x08, 0xDD, 0x04, 0x8C, 0x07, 
+	0x02, 0x00, 0x97, 0x06, 0x8D, 0x07, 0x00, 0x80, 
+	0xA0, 0xC2, 0xEE, 0x08, 0x0A, 0x88, 0x0C, 0x06, 
+	0x14, 0x1B, 0x82, 0x07, 0xD0, 0xB9, 0xA0, 0xC3, 
+	0xF0, 0x08, 0xE0, 0xC3, 0xF2, 0x08, 0x8B, 0x07, 
+	0x0C, 0xE3, 0x8A, 0x02, 0x14, 0x00, 0x04, 0x1A, 
+	0x8B, 0x07, 0xBA, 0xEA, 0x2A, 0x02, 0xEC, 0xFF, 
+	0x8A, 0xA2, 0xCA, 0xA2, 0xDB, 0xC2, 0x01, 0x13, 
+	0x9B, 0x06, 0x20, 0xC8, 0xEE, 0x08, 0xF2, 0x08, 
+	0x20, 0xC8, 0x20, 0xE0, 0xEE, 0x08, 0x0D, 0xC8, 
+	0xF0, 0x08, 0x8D, 0x07, 0xEC, 0x08, 0x20, 0xE0, 
+	0x18, 0xE0, 0x65, 0x02, 0x00, 0x58, 0x58, 0x04, 
+	0x45, 0x02, 0xFF, 0xA7, 0x80, 0x03, 0x60, 0xC0, 
+	0xEE, 0x05, 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 
+	0x02, 0x01, 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 
+	0xEE, 0x05, 0xF9, 0x16, 0x39, 0x10, 0x60, 0xD0, 
+	0x03, 0x01, 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 
+	0x4C, 0xCC, 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 
+	0xB1, 0x07, 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 
+	0x00, 0x01, 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 
+	0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 
+	0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 0xEE, 0x05, 
+	0xF9, 0x16, 0x1E, 0x10, 0x60, 0xD0, 0x03, 0x01, 
+	0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 0x4C, 0xCC, 
+	0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 0xB1, 0x07, 
+	0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 0x00, 0x01, 
+	0xA0, 0x03, 0x60, 0xD0, 0x03, 0x01, 0x01, 0x13, 
+	0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 0x21, 0x02, 
+	0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 0x06, 0x00, 
+	0xF7, 0x16, 0x01, 0x88, 0xEE, 0x05, 0xF9, 0x16, 
+	0xCD, 0x04, 0x8A, 0x07, 0x00, 0x40, 0x20, 0xC3, 
+	0x00, 0x01, 0x0C, 0x01, 0x00, 0x80, 0x02, 0x13, 
+	0x8A, 0x07, 0x00, 0x20, 0xA0, 0xC3, 0x0E, 0x01, 
+	0xE0, 0xC3, 0x10, 0x01, 0xB0, 0x03, 0x20, 0xC3, 
+	0x58, 0x07, 0x20, 0x23, 0x04, 0xE0, 0x02, 0x13, 
+	0x60, 0x04, 0x8E, 0xB7, 0x60, 0x04, 0x8A, 0xA3, 
+	0x8D, 0x07, 0x00, 0x20, 0x20, 0x20, 0x0A, 0xE0, 
+	0x01, 0x16, 0x5B, 0x04, 0x0D, 0x02, 0x32, 0x0C, 
+	0x5D, 0xC2, 0x01, 0x11, 0xDD, 0x04, 0xCD, 0x05, 
+	0x0D, 0x88, 0x30, 0x0C, 0xF9, 0x16, 0x60, 0xC2, 
+	0x0A, 0x06, 0x8D, 0x07, 0x6A, 0x09, 0xA0, 0x06, 
+	0xF4, 0xBE, 0x09, 0x02, 0x48, 0x00, 0xE0, 0xC3, 
+	0x30, 0x09, 0x03, 0x16, 0xE0, 0x01, 0x6A, 0x09, 
+	0x10, 0x00, 0xE0, 0xC2, 0x6A, 0x09, 0x0F, 0x02, 
+	0x00, 0x01, 0xC9, 0x26, 0x02, 0x13, 0x60, 0x04, 
+	0x86, 0xBD, 0x09, 0x02, 0x00, 0x12, 0x4B, 0x01, 
+	0x10, 0x00, 0x02, 0x13, 0x09, 0x02, 0x00, 0x13, 
+	0x09, 0xD8, 0x2E, 0x09, 0x8F, 0x07, 0x00, 0x40, 
+	0x89, 0x07, 0x6C, 0x09, 0xCB, 0x04, 0xF9, 0xE2, 
+	0xF9, 0xE2, 0xF9, 0xE2, 0x07, 0x16, 0x8B, 0x07, 
+	0x34, 0x09, 0x8C, 0x07, 0x6C, 0x09, 0x3B, 0xCF, 
+	0x3B, 0xCF, 0x1B, 0xC7, 0x20, 0xC3, 0x6C, 0x09, 
+	0x19, 0x11, 0x8F, 0x07, 0x00, 0x20, 0x89, 0x07, 
+	0x7A, 0x09, 0xA0, 0x06, 0x3A, 0xBB, 0xA0, 0x06, 
+	0x3A, 0xBB, 0x12, 0x10, 0x4C, 0xCE, 0x5B, 0x04, 
+	0x19, 0xC3, 0x02, 0x16, 0x8C, 0x07, 0x1A, 0x00, 
+	0x4C, 0xC3, 0x2D, 0x02, 0xF8, 0xFF, 0x0A, 0x02, 
+	0x09, 0x00, 0x2D, 0x02, 0xFA, 0xFF, 0xF2, 0x13, 
+	0x0A, 0x06, 0xFB, 0x16, 0x60, 0x04, 0x86, 0xBD, 
+	0x8F, 0x07, 0x00, 0x10, 0xD9, 0xC2, 0xFA, 0x11, 
+	0x02, 0x16, 0x8B, 0x07, 0x00, 0x04, 0x4B, 0xC3, 
+	0x8D, 0x02, 0x20, 0x00, 0x02, 0x14, 0x0D, 0x02, 
+	0x20, 0x00, 0x8D, 0x02, 0x00, 0x04, 0x02, 0x12, 
+	0x0D, 0x02, 0x00, 0x04, 0x2D, 0x02, 0xF8, 0xFF, 
+	0x0D, 0xC8, 0x2C, 0x09, 0x2B, 0x02, 0xFF, 0x03, 
+	0x8B, 0x01, 0xFF, 0x03, 0x4B, 0xCE, 0x60, 0xC3, 
+	0x6A, 0x09, 0x60, 0x23, 0x18, 0xE0, 0x0C, 0x16, 
+	0x49, 0xC3, 0xDD, 0xC2, 0x0F, 0x02, 0x01, 0x01, 
+	0x8B, 0x01, 0x80, 0xC0, 0xD7, 0x16, 0x8F, 0x05, 
+	0xED, 0xC2, 0x02, 0x00, 0xD3, 0x16, 0x02, 0x10, 
+	0x8D, 0x07, 0xBA, 0xEA, 0x3D, 0xC8, 0xA8, 0x09, 
+	0x1D, 0xC8, 0xAA, 0x09, 0xCB, 0x04, 0xE0, 0x04, 
+	0xF8, 0x05, 0xE0, 0x04, 0x66, 0x09, 0x20, 0xC8, 
+	0x30, 0x0C, 0x80, 0x09, 0xA0, 0x07, 0x82, 0x09, 
+	0xFE, 0xDF, 0x8D, 0x07, 0xFE, 0xDF, 0xE0, 0xC3, 
+	0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x24, 0x16, 
+	0xE0, 0xC3, 0x30, 0x0C, 0x4F, 0x63, 0xFF, 0x04, 
+	0xFF, 0x04, 0x4D, 0x06, 0xFD, 0x16, 0x8D, 0x07, 
+	0xFE, 0xDF, 0x20, 0x04, 0xA2, 0xEA, 0xA0, 0xC3, 
+	0xA2, 0xEA, 0xEE, 0xC3, 0x12, 0x00, 0xAA, 0x16, 
+	0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x8C, 0x07, 
+	0x00, 0xE0, 0xAC, 0x09, 0x0D, 0x63, 0x0C, 0x13, 
+	0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x2D, 0x02, 
+	0x40, 0x00, 0x1D, 0x0A, 0x2D, 0x02, 0x32, 0x0C, 
+	0xBD, 0x07, 0xFF, 0x7F, 0x0C, 0x06, 0xFC, 0x16, 
+	0x20, 0xC3, 0x46, 0x04, 0x8C, 0x02, 0x80, 0x00, 
+	0x13, 0x1A, 0xAC, 0x02, 0x0C, 0xC8, 0x9A, 0x00, 
+	0xE0, 0x02, 0x80, 0x00, 0x88, 0x07, 0x80, 0x00, 
+	0x60, 0xC2, 0x46, 0x04, 0xA0, 0x06, 0x28, 0xAD, 
+	0x02, 0x10, 0x9D, 0x00, 0x05, 0x10, 0x9D, 0x00, 
+	0x8F, 0x07, 0x00, 0x08, 0x60, 0x04, 0x86, 0xBD, 
+	0x4B, 0x2D, 0x81, 0xC3, 0xC9, 0x05, 0x8F, 0x07, 
+	0x00, 0x10, 0x8E, 0x02, 0x02, 0x00, 0xF6, 0x11, 
+	0x8F, 0x07, 0x00, 0x04, 0xC9, 0x05, 0xD9, 0xC2, 
+	0xE0, 0x26, 0x26, 0xE0, 0x02, 0x16, 0x2B, 0x02, 
+	0x06, 0x00, 0x4B, 0xC6, 0x4B, 0xC3, 0xCB, 0x72, 
+	0x2E, 0x02, 0xFE, 0xFF, 0x8B, 0x83, 0xE6, 0x1B, 
+	0xCD, 0x06, 0x4D, 0x73, 0xCD, 0x82, 0xE2, 0x1B, 
+	0xE0, 0x04, 0x1A, 0x09, 0xE0, 0x04, 0x1C, 0x09, 
+	0x4D, 0xC3, 0x02, 0x13, 0x60, 0x66, 0x12, 0xE0, 
+	0xC9, 0x05, 0xCF, 0x04, 0x81, 0x2D, 0x01, 0xC8, 
+	0x6C, 0x01, 0xD4, 0x13, 0x0F, 0xC8, 0x00, 0xFC, 
+	0xC1, 0xC3, 0x0D, 0x06, 0xF7, 0x15, 0x0D, 0x02, 
+	0x36, 0x07, 0x0E, 0x02, 0x98, 0x08, 0x0C, 0x02, 
+	0x03, 0x00, 0x8D, 0xCB, 0x02, 0x00, 0x81, 0x2D, 
+	0x81, 0xCB, 0x06, 0x00, 0xC3, 0x13, 0xEE, 0x04, 
+	0x0C, 0x00, 0x2E, 0x02, 0x18, 0x00, 0x0C, 0x06, 
+	0xF4, 0x16, 0xE0, 0x04, 0x96, 0x08, 0x1F, 0x2E, 
+	0xB9, 0xC3, 0xD9, 0xC3, 0x89, 0x07, 0x12, 0x00, 
+	0x8D, 0x07, 0x3A, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 
+	0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, 
+	0x09, 0x16, 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 
+	0x20, 0xE8, 0x18, 0xE0, 0x98, 0x07, 0x20, 0xE8, 
+	0x12, 0xE0, 0x78, 0x07, 0x60, 0xC3, 0x6A, 0x09, 
+	0x60, 0x23, 0x1E, 0xE0, 0x03, 0x16, 0x20, 0x48, 
+	0xA4, 0xE3, 0x6A, 0x09, 0x60, 0x23, 0x22, 0xE0, 
+	0x06, 0x13, 0x60, 0x27, 0xA6, 0xE3, 0x03, 0x13, 
+	0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 0x20, 0x2D, 
+	0x00, 0x00, 0x8E, 0x07, 0x00, 0x00, 0xA0, 0x06, 
+	0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 0xA0, 0xC0, 
+	0x04, 0x08, 0xEF, 0xC3, 0x06, 0x00, 0x1B, 0x16, 
+	0xA0, 0xC3, 0x72, 0x09, 0xE0, 0xC3, 0x74, 0x09, 
+	0xA0, 0x06, 0xC2, 0xBD, 0xA0, 0xC3, 0x76, 0x09, 
+	0xE0, 0xC3, 0x78, 0x09, 0xA0, 0x06, 0xE0, 0xBD, 
+	0x20, 0xE0, 0x0A, 0xE0, 0x60, 0xC3, 0xD8, 0x07, 
+	0x60, 0x23, 0x16, 0xE0, 0x05, 0x16, 0xE0, 0x04, 
+	0x2E, 0x06, 0x60, 0x41, 0x04, 0xE0, 0x4D, 0x2E, 
+	0x8D, 0x07, 0x00, 0x80, 0x52, 0x04, 0xCF, 0x73, 
+	0x2F, 0x02, 0x00, 0x02, 0x4F, 0xC3, 0x52, 0x04, 
+	0x20, 0x20, 0x0A, 0xE0, 0x03, 0x13, 0x8D, 0x07, 
+	0x00, 0x10, 0x5B, 0x04, 0x20, 0x40, 0x0A, 0xE0, 
+	0x40, 0x02, 0xFF, 0xF0, 0x8E, 0x07, 0x02, 0x00, 
+	0xA0, 0x06, 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 
+	0xA0, 0xC0, 0x04, 0x08, 0xA0, 0x06, 0xB4, 0xBE, 
+	0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, 
+	0x66, 0x16, 0x20, 0x04, 0xB6, 0xEA, 0x63, 0x10, 
+	0x6E, 0x02, 0x00, 0x80, 0x8D, 0x07, 0x00, 0xC0, 
+	0x0D, 0xC8, 0xA6, 0x01, 0x0E, 0xC8, 0x72, 0x09, 
+	0x0F, 0xC8, 0x74, 0x09, 0x0E, 0xC8, 0xA8, 0x01, 
+	0x0F, 0xC8, 0xAA, 0x01, 0x12, 0x10, 0x8F, 0x01, 
+	0x01, 0x00, 0x8A, 0x07, 0x76, 0x09, 0xA0, 0xE3, 
+	0x4E, 0x09, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, 
+	0xE0, 0xE3, 0x50, 0x09, 0x8F, 0xE6, 0x8A, 0x07, 
+	0xAC, 0x01, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, 
+	0x8F, 0xE6, 0x20, 0x20, 0x0A, 0xE0, 0x3F, 0x13, 
+	0x8D, 0x07, 0x00, 0x10, 0x5B, 0x04, 0x20, 0x20, 
+	0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, 
+	0x5B, 0x04, 0x8E, 0xC3, 0x04, 0x13, 0xE0, 0x01, 
+	0x50, 0x09, 0x00, 0x01, 0x06, 0x10, 0xA0, 0x01, 
+	0x50, 0x09, 0x00, 0x01, 0xA0, 0x01, 0x78, 0x09, 
+	0x00, 0x01, 0xA0, 0xC3, 0x76, 0x09, 0xE0, 0xC3, 
+	0x78, 0x09, 0xA0, 0xE3, 0x4E, 0x09, 0xE0, 0xE3, 
+	0x50, 0x09, 0x0E, 0xC8, 0xAC, 0x01, 0x0F, 0xC8, 
+	0xAE, 0x01, 0x0E, 0xC8, 0x76, 0x09, 0x0F, 0xC8, 
+	0x78, 0x09, 0x19, 0x10, 0x6E, 0x02, 0x00, 0x80, 
+	0x0E, 0xC8, 0xA6, 0x01, 0x20, 0x20, 0x0A, 0xE0, 
+	0x12, 0x13, 0x0D, 0x02, 0x00, 0x10, 0x5B, 0x04, 
+	0x8D, 0x07, 0x28, 0x07, 0x89, 0x07, 0x0E, 0x00, 
+	0xA0, 0x06, 0xFA, 0xBE, 0x8D, 0x07, 0x28, 0x07, 
+	0xFD, 0x04, 0x8D, 0x02, 0x36, 0x07, 0xFC, 0x16, 
+	0x20, 0x48, 0x14, 0xE0, 0xFE, 0x06, 0x8D, 0x07, 
+	0x00, 0x80, 0x52, 0x04, 0xA0, 0xC2, 0xEE, 0x07, 
+	0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 0xF0, 0x08, 
+	0x97, 0x06, 0x7D, 0xC2, 0x5D, 0xC3, 0x60, 0x43, 
+	0x22, 0xE0, 0xA0, 0x06, 0xFA, 0xBE, 0xEF, 0x10, 
+	0x0E, 0xC8, 0x06, 0x06, 0x0F, 0xC8, 0x08, 0x06, 
+	0xEA, 0x10, 0xB0, 0x03, 0xA0, 0x01, 0x60, 0x07, 
+	0x26, 0x00, 0x40, 0x02, 0x00, 0xC0, 0xE0, 0x04, 
+	0x06, 0x06, 0x8C, 0x07, 0x10, 0x40, 0xCC, 0x44, 
+	0xE0, 0x04, 0xFE, 0x06, 0x85, 0x07, 0x40, 0x80, 
+	0x5B, 0x04, 0x02, 0xC8, 0x04, 0x08, 0x8F, 0x07, 
+	0xFA, 0x07, 0xCE, 0xCB, 0x02, 0x00, 0x8E, 0x07, 
+	0x36, 0x07, 0xCE, 0xCB, 0x04, 0x00, 0x8D, 0x07, 
+	0x30, 0x06, 0x8E, 0x07, 0x10, 0x00, 0x4D, 0x2C, 
+	0x5B, 0x04, 0xA0, 0xC2, 0xF2, 0x07, 0x02, 0x10, 
+	0xA0, 0xC2, 0xF8, 0x07, 0x0B, 0xC8, 0xEA, 0x08, 
+	0x09, 0xC3, 0x0A, 0x13, 0xA0, 0x06, 0x36, 0xBA, 
+	0xA0, 0xC2, 0x00, 0x01, 0xA0, 0xE2, 0x06, 0xE0, 
+	0x4C, 0xA3, 0xCC, 0xA3, 0x01, 0x17, 0x8E, 0x05, 
+	0x4C, 0x62, 0xE0, 0xC2, 0xEA, 0x08, 0x5B, 0x04, 
+	0x8D, 0x07, 0x00, 0x10, 0x20, 0x20, 0x0A, 0xE0, 
+	0x01, 0x13, 0x5B, 0x04, 0x0D, 0x02, 0x48, 0x00, 
+	0xE0, 0xC3, 0x30, 0x09, 0x02, 0x16, 0xCE, 0x01, 
+	0x10, 0x00, 0x8D, 0x27, 0x03, 0x13, 0x0D, 0x02, 
+	0x00, 0x01, 0x52, 0x04, 0x00, 0x03, 0x02, 0x00, 
+	0x60, 0xC3, 0x6A, 0x09, 0x4D, 0x02, 0x08, 0x80, 
+	0x4E, 0x02, 0xF7, 0x7F, 0x8D, 0xE3, 0xE0, 0xC3, 
+	0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x04, 0x13, 
+	0x8D, 0x07, 0x06, 0x00, 0x8D, 0x27, 0x02, 0x13, 
+	0xA0, 0xE3, 0x10, 0xE0, 0x0E, 0xC8, 0x6A, 0x09, 
+	0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x09, 0x13, 
+	0x0D, 0x02, 0x00, 0x12, 0x4E, 0x01, 0x10, 0x00, 
+	0x02, 0x13, 0x0D, 0x02, 0x00, 0x13, 0x0D, 0xD8, 
+	0x2E, 0x09, 0x60, 0xC3, 0x80, 0x01, 0x4E, 0x02, 
+	0x01, 0x00, 0x4D, 0x02, 0xFE, 0xFF, 0x4E, 0xE3, 
+	0x0D, 0xC8, 0x80, 0x01, 0x20, 0xD8, 0x40, 0xE2, 
+	0x2F, 0x09, 0x20, 0x01, 0x6A, 0x09, 0x06, 0x00, 
+	0x03, 0x13, 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 
+	0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x03, 0x13, 
+	0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, 0x00, 0x03, 
+	0x0F, 0x00, 0x60, 0x04, 0x88, 0xBE, 0x20, 0x20, 
+	0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, 
+	0x5B, 0x04, 0x09, 0x02, 0x08, 0x00, 0x0D, 0x02, 
+	0x58, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 0xA0, 0x07, 
+	0x02, 0x02, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x04, 
+	0xE0, 0xC3, 0x58, 0x09, 0x0F, 0x01, 0x00, 0x7C, 
+	0x01, 0x13, 0x52, 0x04, 0x8F, 0xC3, 0x4E, 0x02, 
+	0x0F, 0x00, 0xFB, 0x13, 0x8E, 0x02, 0x0F, 0x00, 
+	0xF8, 0x13, 0x0D, 0x02, 0x00, 0x40, 0x4F, 0xC2, 
+	0x49, 0x09, 0x49, 0x02, 0x3F, 0x00, 0x09, 0x01, 
+	0x01, 0x00, 0xEF, 0x16, 0x89, 0x02, 0x06, 0x00, 
+	0xEC, 0x1A, 0x89, 0x02, 0x20, 0x00, 0xE9, 0x14, 
+	0xC9, 0x06, 0x1F, 0x09, 0x4F, 0x02, 0x00, 0x40, 
+	0x4F, 0xE2, 0x69, 0x02, 0x00, 0x80, 0x09, 0xC8, 
+	0x58, 0x09, 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 
+	0x1F, 0x09, 0x09, 0x06, 0xFD, 0x16, 0x4F, 0x05, 
+	0x0D, 0x02, 0x00, 0x20, 0x60, 0xC2, 0x5A, 0x09, 
+	0xD4, 0x13, 0x4F, 0x26, 0xD2, 0x16, 0x0D, 0x02, 
+	0x00, 0x10, 0x60, 0xC2, 0x5C, 0x09, 0xCD, 0x13, 
+	0x4F, 0x26, 0xCB, 0x16, 0x0D, 0x02, 0x00, 0x30, 
+	0x20, 0x88, 0x5A, 0x09, 0x5C, 0x09, 0xC5, 0x13, 
+	0xE0, 0xC3, 0x5A, 0x09, 0x4E, 0xC2, 0x1F, 0x0A, 
+	0x09, 0x06, 0xFD, 0x16, 0xE0, 0xE3, 0x5E, 0x09, 
+	0x0F, 0xC8, 0x5A, 0x09, 0xE0, 0xC3, 0x5C, 0x09, 
+	0x4E, 0xC2, 0x1F, 0x0A, 0x09, 0x06, 0xFD, 0x16, 
+	0xE0, 0xE3, 0x5E, 0x09, 0x0F, 0xC8, 0x5C, 0x09, 
+	0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 0x1F, 0x0A, 
+	0x09, 0x06, 0xFD, 0x16, 0x0D, 0x02, 0x00, 0x08, 
+	0x60, 0xC2, 0x5E, 0x09, 0x4F, 0x26, 0xA5, 0x16, 
+	0x4F, 0x05, 0x0F, 0xC8, 0x5E, 0x09, 0x0F, 0x02, 
+	0x02, 0x02, 0x0E, 0x02, 0x03, 0x00, 0x60, 0xC3, 
+	0x40, 0x01, 0x0C, 0x02, 0xFE, 0xC0, 0xA0, 0x01, 
+	0x40, 0x01, 0x00, 0x04, 0xCF, 0x05, 0x09, 0x02, 
+	0x55, 0x55, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, 
+	0x09, 0x07, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, 
+	0x0E, 0x06, 0xF4, 0x16, 0xA0, 0x01, 0x40, 0x01, 
+	0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x09, 0x02, 
+	0x08, 0x00, 0x0E, 0x02, 0x58, 0x09, 0x0F, 0x02, 
+	0x02, 0x02, 0xFE, 0xCF, 0x49, 0x06, 0xFD, 0x16, 
+	0x60, 0x04, 0x88, 0xBE, 0xC9, 0xC7, 0x5F, 0x82, 
+	0x01, 0x16, 0x5B, 0x04, 0xA0, 0x01, 0x40, 0x01, 
+	0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x0D, 0x02, 
+	0x00, 0x01, 0x52, 0x04, 0x8D, 0x07, 0x00, 0x10, 
+	0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, 
+	0x00, 0x08, 0x20, 0x20, 0x10, 0xE0, 0x05, 0x13, 
+	0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, 
+	0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x10, 0xE0, 
+	0x20, 0x07, 0x9C, 0x08, 0x20, 0x07, 0xB4, 0x08, 
+	0x20, 0x07, 0xCC, 0x08, 0xA0, 0x07, 0xA2, 0x08, 
+	0x84, 0x02, 0xA0, 0x07, 0xBA, 0x08, 0x84, 0x02, 
+	0xA0, 0x07, 0xD2, 0x08, 0x84, 0x02, 0xA0, 0x07, 
+	0x04, 0x09, 0x00, 0x40, 0xE0, 0x04, 0x06, 0x09, 
+	0xE0, 0x04, 0x08, 0x09, 0x0E, 0xC8, 0x4C, 0x08, 
+	0x0F, 0xC8, 0x4E, 0x08, 0x0E, 0xC8, 0x8E, 0x08, 
+	0x0F, 0xC8, 0x90, 0x08, 0xE0, 0x04, 0x5A, 0x08, 
+	0xE0, 0x04, 0x60, 0x08, 0xE0, 0x02, 0x78, 0x07, 
+	0xE0, 0x04, 0x94, 0x08, 0x20, 0x40, 0x40, 0xE3, 
+	0x20, 0xE0, 0x0C, 0xE0, 0x60, 0x04, 0xBC, 0xC6, 
+	0x80, 0x01, 0x00, 0xF0, 0xC0, 0x01, 0x00, 0x40, 
+	0x10, 0x10, 0x80, 0x01, 0x00, 0xF0, 0x0D, 0x10, 
+	0xC0, 0x01, 0x00, 0xF0, 0x20, 0x40, 0x06, 0xE0, 
+	0x08, 0x10, 0xC0, 0x01, 0x00, 0xF0, 0x80, 0x01, 
+	0x00, 0x20, 0xE0, 0xC3, 0x94, 0x08, 0x01, 0x16, 
+	0x5B, 0x04, 0x4B, 0xC0, 0x20, 0x04, 0xDA, 0xEA, 
+	0x40, 0x01, 0x00, 0x20, 0xFB, 0x16, 0x51, 0x04, 
+	0xA0, 0xC2, 0xD8, 0x07, 0x4A, 0x01, 0x40, 0x00, 
+	0x01, 0x16, 0x5B, 0x04, 0xE0, 0x02, 0x78, 0x07, 
+	0x20, 0x20, 0x0C, 0xE0, 0xEF, 0x16, 0x43, 0xC2, 
+	0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 0x20, 0x2F, 
+	0x36, 0x07, 0x20, 0x40, 0x0C, 0xE0, 0xA0, 0x06, 
+	0xAC, 0xC1, 0xA0, 0xC3, 0x94, 0x08, 0xFB, 0x16, 
+	0xA0, 0x06, 0x3A, 0xC2, 0x8E, 0x07, 0x04, 0x09, 
+	0x9E, 0x07, 0x00, 0x80, 0x20, 0x20, 0x10, 0xE0, 
+	0x05, 0x16, 0x8F, 0x07, 0x4C, 0x08, 0xBF, 0xCF, 
+	0xBF, 0xCF, 0x9F, 0xC7, 0xA0, 0x06, 0x5A, 0xC2, 
+	0x20, 0xE8, 0x3C, 0xE3, 0x62, 0x07, 0xA0, 0x06, 
+	0x3A, 0xC2, 0x20, 0x48, 0x3C, 0xE3, 0x62, 0x07, 
+	0x20, 0x40, 0x40, 0xE3, 0x20, 0xE0, 0x04, 0xE0, 
+	0x20, 0x48, 0x10, 0xE0, 0x58, 0x07, 0x5B, 0x04, 
+	0x80, 0x01, 0x00, 0xF0, 0x20, 0xE0, 0x04, 0xE0, 
+	0x60, 0x01, 0x60, 0x07, 0x02, 0x00, 0x02, 0x13, 
+	0x9B, 0x06, 0xB8, 0x10, 0x20, 0xE8, 0x1E, 0xE0, 
+	0x58, 0x07, 0xB4, 0x10, 0x9B, 0x06, 0x80, 0x03, 
+	0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 0x00, 0x40, 
+	0x07, 0x16, 0x8D, 0x07, 0x00, 0x09, 0xA0, 0x06, 
+	0x68, 0xB8, 0xE0, 0x02, 0x78, 0x07, 0x5B, 0x04, 
+	0xC4, 0x01, 0x02, 0x00, 0xE0, 0x02, 0x78, 0x07, 
+	0x5B, 0x04, 0x0E, 0x68, 0x96, 0x08, 0xE9, 0x04, 
+	0x0C, 0x00, 0x11, 0x10, 0x0E, 0x02, 0x00, 0x23, 
+	0x4E, 0xDB, 0x01, 0x00, 0xCC, 0x01, 0x00, 0x04, 
+	0x4C, 0xD7, 0x1C, 0x10, 0x60, 0xC2, 0x5C, 0x07, 
+	0x20, 0x06, 0x94, 0x08, 0xA9, 0xC2, 0x08, 0x00, 
+	0xA9, 0xC3, 0x0C, 0x00, 0xEA, 0x16, 0x29, 0x07, 
+	0x04, 0x00, 0x69, 0x01, 0x0A, 0x00, 0x01, 0x00, 
+	0x2D, 0x13, 0x49, 0xC3, 0x2D, 0x02, 0x0E, 0x00, 
+	0x0A, 0xC3, 0x1D, 0xD3, 0x8C, 0x01, 0x00, 0x84, 
+	0xCC, 0x01, 0x00, 0x40, 0x0A, 0x01, 0x00, 0x5E, 
+	0xDD, 0x16, 0x4C, 0xC7, 0xA9, 0xC3, 0x10, 0x00, 
+	0xE9, 0xC3, 0x12, 0x00, 0x41, 0xCA, 0x10, 0x00, 
+	0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 0x8E, 0x05, 
+	0x8C, 0x07, 0x02, 0x00, 0xA0, 0xC2, 0xF6, 0x07, 
+	0xA0, 0x06, 0x00, 0xBA, 0x69, 0xC0, 0x10, 0x00, 
+	0x29, 0xC8, 0x14, 0x00, 0x06, 0x09, 0x29, 0xC8, 
+	0x16, 0x00, 0x08, 0x09, 0x69, 0x01, 0x0E, 0x00, 
+	0x00, 0x08, 0x04, 0x16, 0x90, 0x03, 0x7F, 0x00, 
+	0xA0, 0x06, 0x5A, 0xC2, 0x40, 0x01, 0x00, 0x40, 
+	0x01, 0x16, 0x51, 0x04, 0x60, 0x04, 0xBE, 0xC1, 
+	0xA9, 0xC3, 0x0C, 0x00, 0x0B, 0x13, 0x0E, 0x68, 
+	0x96, 0x08, 0xE9, 0x04, 0x0C, 0x00, 0x29, 0xC8, 
+	0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC3, 0x00, 0xFC, 
+	0x01, 0x13, 0x1E, 0x2E, 0x29, 0x07, 0x04, 0x00, 
+	0x5B, 0x04, 0x81, 0x07, 0x20, 0x20, 0x89, 0x07, 
+	0x4C, 0x08, 0x41, 0xCE, 0x63, 0xCE, 0x10, 0x00, 
+	0x63, 0xC6, 0x12, 0x00, 0xA0, 0x06, 0x54, 0xBA, 
+	0x43, 0xC2, 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 
+	0x20, 0xE0, 0x10, 0xE0, 0x60, 0x04, 0xEC, 0xC1, 
+	0x40, 0x01, 0x00, 0x04, 0xEA, 0x16, 0xA0, 0x06, 
+	0xAC, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 0x8C, 0x07, 
+	0x04, 0x00, 0x8D, 0x07, 0x4C, 0x08, 0xA0, 0xC3, 
+	0x8E, 0x08, 0xE0, 0xC3, 0x90, 0x08, 0xA0, 0x06, 
+	0x36, 0xBA, 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 
+	0x01, 0x00, 0x13, 0x16, 0xE0, 0xC2, 0x94, 0x08, 
+	0xEA, 0x16, 0x60, 0x04, 0xEC, 0xC1, 0xE0, 0xC3, 
+	0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 0x09, 0x16, 
+	0x60, 0x04, 0xEC, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 
+	0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 
+	0xD7, 0x13, 0xA0, 0xC2, 0xF0, 0x07, 0x20, 0xC3, 
+	0x7C, 0x09, 0x8D, 0x07, 0x4C, 0x08, 0x9D, 0xC3, 
+	0xA0, 0x06, 0x36, 0xBA, 0xC0, 0x06, 0x20, 0xD0, 
+	0x50, 0x08, 0xC0, 0x06, 0x40, 0x01, 0x00, 0x04, 
+	0x0A, 0x16, 0x40, 0x01, 0x80, 0x00, 0x07, 0x13, 
+	0x0E, 0xC8, 0x4C, 0x08, 0x0F, 0xC8, 0x4E, 0x08, 
+	0xA0, 0x06, 0xA2, 0xC1, 0xD8, 0x10, 0x0E, 0xC8, 
+	0x8E, 0x08, 0x0F, 0xC8, 0x90, 0x08, 0x40, 0x01, 
+	0x00, 0x04, 0x0C, 0x13, 0x40, 0x01, 0x20, 0x00, 
+	0x58, 0x16, 0x81, 0x07, 0x10, 0x20, 0x9F, 0x10, 
+	0xA0, 0x06, 0xAC, 0xC1, 0xA0, 0xC3, 0x8E, 0x08, 
+	0xE0, 0xC3, 0x90, 0x08, 0x83, 0x07, 0x98, 0x08, 
+	0x63, 0x07, 0x04, 0x00, 0x2D, 0x11, 0x83, 0x07, 
+	0xB0, 0x08, 0x63, 0x07, 0x04, 0x00, 0x28, 0x11, 
+	0x83, 0x07, 0xC8, 0x08, 0x63, 0x07, 0x04, 0x00, 
+	0x23, 0x11, 0xC3, 0x60, 0x60, 0xC2, 0x46, 0x07, 
+	0xE7, 0x13, 0x69, 0x01, 0x0E, 0x00, 0x00, 0x08, 
+	0xE3, 0x13, 0x00, 0x03, 0x02, 0x00, 0x19, 0xC8, 
+	0x46, 0x07, 0x03, 0x16, 0xA0, 0x01, 0x3A, 0x07, 
+	0x20, 0x00, 0x00, 0x03, 0x0F, 0x00, 0xC0, 0x01, 
+	0x00, 0xF0, 0x80, 0x01, 0x00, 0x20, 0x01, 0x02, 
+	0x06, 0xC4, 0x60, 0x04, 0x9A, 0xC2, 0x81, 0x07, 
+	0x80, 0x20, 0xE0, 0xC8, 0x8E, 0x08, 0x14, 0x00, 
+	0xE0, 0xC8, 0x90, 0x08, 0x16, 0x00, 0xC7, 0x10, 
+	0xE0, 0xC8, 0x50, 0x08, 0x0E, 0x00, 0xCE, 0xC8, 
+	0x10, 0x00, 0xCF, 0xC8, 0x12, 0x00, 0x40, 0x01, 
+	0x20, 0x00, 0xBB, 0x16, 0xE3, 0xC1, 0x06, 0x00, 
+	0xC7, 0xC8, 0x08, 0x00, 0x07, 0xC8, 0x6C, 0x01, 
+	0x07, 0xC8, 0xE0, 0x08, 0x08, 0x02, 0x02, 0xFC, 
+	0xB8, 0x07, 0x00, 0x81, 0xE0, 0xC1, 0xE8, 0x00, 
+	0x07, 0xCE, 0x20, 0xC8, 0x52, 0x08, 0x92, 0x08, 
+	0xDA, 0x13, 0xCE, 0xC8, 0x14, 0x00, 0xCF, 0xC8, 
+	0x16, 0x00, 0x80, 0x01, 0x00, 0x04, 0x82, 0x07, 
+	0x54, 0x08, 0x32, 0xC1, 0x08, 0x11, 0x72, 0xC1, 
+	0x92, 0xC1, 0x82, 0x07, 0x8A, 0x08, 0x04, 0xC1, 
+	0x07, 0x16, 0x60, 0x04, 0x8E, 0xC5, 0x72, 0xC1, 
+	0xB2, 0xC1, 0x84, 0x01, 0x00, 0x80, 0xF9, 0x13, 
+	0x04, 0x68, 0x92, 0x08, 0xC7, 0xC1, 0x37, 0x16, 
+	0x20, 0x98, 0x97, 0x08, 0x85, 0x09, 0x16, 0x16, 
+	0x81, 0x07, 0x40, 0x20, 0xE0, 0xC1, 0x94, 0x08, 
+	0x57, 0x13, 0xA0, 0x06, 0xAC, 0xC1, 0xF4, 0x10, 
+	0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 0x62, 0x07, 
+	0xE0, 0x26, 0x3A, 0xE3, 0x02, 0x13, 0xA0, 0x06, 
+	0x92, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 0x22, 0x10, 
+	0xA0, 0x06, 0x9C, 0xC1, 0x81, 0x2D, 0x01, 0xC2, 
+	0xFB, 0x13, 0xA0, 0x05, 0x96, 0x08, 0x23, 0xC8, 
+	0x08, 0x00, 0x6C, 0x01, 0xA0, 0x07, 0x02, 0xFC, 
+	0x00, 0x80, 0xC3, 0xC1, 0x27, 0x02, 0x06, 0x00, 
+	0xA0, 0x06, 0x0C, 0xB5, 0xA3, 0x05, 0x0C, 0x00, 
+	0x08, 0xC8, 0x6C, 0x01, 0x08, 0xC8, 0xE0, 0x08, 
+	0x08, 0x02, 0x02, 0xFC, 0xB8, 0x07, 0x00, 0x81, 
+	0xF8, 0xC1, 0x04, 0xC1, 0x37, 0x13, 0xE0, 0xD2, 
+	0x03, 0x01, 0xD2, 0x13, 0x0B, 0x02, 0x0A, 0x01, 
+	0xC4, 0xCE, 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 
+	0xFB, 0x04, 0x09, 0x02, 0x00, 0x04, 0x48, 0xA2, 
+	0xC9, 0xC6, 0x20, 0xA8, 0xE0, 0x08, 0x12, 0x01, 
+	0x20, 0xC8, 0xF2, 0x07, 0x00, 0x01, 0x47, 0xC2, 
+	0xC4, 0x81, 0x01, 0x14, 0x44, 0xC2, 0xC9, 0x61, 
+	0x09, 0xA2, 0x89, 0xA1, 0x01, 0x17, 0x85, 0x05, 
+	0x09, 0x61, 0xA8, 0x16, 0x82, 0x02, 0x8A, 0x08, 
+	0x05, 0x16, 0x40, 0x01, 0x10, 0x00, 0x12, 0x13, 
+	0x60, 0x04, 0xA6, 0xC3, 0x60, 0x04, 0xBC, 0xC4, 
+	0x60, 0x04, 0x40, 0xC3, 0x81, 0x07, 0x80, 0x20, 
+	0xFB, 0x10, 0x81, 0x07, 0x80, 0x20, 0xF8, 0x10, 
+	0x81, 0x07, 0x02, 0x20, 0xF5, 0x10, 0x81, 0x07, 
+	0x04, 0x20, 0xF2, 0x10, 0x23, 0xC8, 0x08, 0x00, 
+	0x6C, 0x01, 0x07, 0x05, 0xE0, 0xA1, 0xE8, 0x00, 
+	0x0C, 0x02, 0x04, 0xFC, 0x07, 0xCF, 0xE0, 0xC2, 
+	0x92, 0x08, 0xE8, 0x16, 0xE0, 0xD2, 0x03, 0x01, 
+	0x10, 0x16, 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 
+	0x62, 0x07, 0xE0, 0x26, 0x3A, 0xE3, 0x07, 0x13, 
+	0x90, 0x03, 0xC8, 0x2F, 0xA0, 0x06, 0x92, 0xC1, 
+	0xE0, 0xD2, 0x03, 0x01, 0x02, 0x16, 0xA0, 0x06, 
+	0x54, 0xBA, 0x23, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
+	0xA3, 0xC2, 0x0E, 0x00, 0x4A, 0x01, 0x00, 0x01, 
+	0x0B, 0x13, 0x0C, 0x02, 0x0E, 0xFC, 0x5C, 0xC2, 
+	0x49, 0x02, 0x00, 0x80, 0x0D, 0x02, 0x6C, 0x09, 
+	0x7D, 0xE2, 0x09, 0xCF, 0x3D, 0xCF, 0x3D, 0xCF, 
+	0x0C, 0x02, 0x00, 0xFC, 0x6C, 0xC3, 0x06, 0x00, 
+	0x4D, 0x02, 0xFF, 0xE0, 0x4A, 0x02, 0x00, 0x02, 
+	0x8A, 0xA2, 0x8A, 0xA2, 0x4A, 0xE3, 0x60, 0xE3,  
+	0x9E, 0x09, 0x0D, 0xCB, 0x06, 0x00, 0xCD, 0x06, 
+	0x0B, 0x02, 0x0F, 0x00, 0xEC, 0x82, 0x04, 0x00, 
+	0xAD, 0x11, 0xEC, 0xC3, 0x0E, 0x00, 0x11, 0x15, 
+	0x10, 0x13, 0x6C, 0xC2, 0x14, 0x00, 0x49, 0x02, 
+	0x00, 0x1F, 0xA7, 0x13, 0xC9, 0x06, 0x89, 0x02, 
+	0x12, 0x00, 0xA3, 0x1B, 0x49, 0x01, 0x01, 0x00, 
+	0xA0, 0x13, 0xC9, 0xA2, 0xEC, 0x82, 0x04, 0x00, 
+	0x9C, 0x11, 0x4D, 0xA3, 0x9D, 0x18, 0x14, 0x11, 
+	0x60, 0x01, 0x6A, 0x09, 0x00, 0x80, 0x18, 0x13, 
+	0x1D, 0x09, 0xCC, 0xA2, 0xEB, 0xC2, 0x08, 0x00, 
+	0x7B, 0x09, 0x4B, 0x02, 0x1E, 0x00, 0xA0, 0xC3, 
+	0xF0, 0x06, 0xAB, 0x23, 0x04, 0xE0, 0x8F, 0x16, 
+	0x60, 0x27, 0x3E, 0xE3, 0x8C, 0x16, 0x4D, 0xA3, 
+	0x4D, 0xA3, 0x4D, 0xA3, 0xCD, 0x06, 0x4D, 0x02, 
+	0x07, 0x00, 0x0D, 0x88, 0xEE, 0x06, 0x0A, 0x15, 
+	0x90, 0x03, 0xFF, 0x6F, 0x53, 0x2F, 0xA0, 0x05, 
+	0x94, 0x08, 0xC3, 0x04, 0xC0, 0x01, 0x00, 0x04, 
+	0x60, 0x04, 0xAA, 0xC3, 0x60, 0x01, 0x6A, 0x09, 
+	0x00, 0x80, 0xF2, 0x13, 0x01, 0x02, 0x08, 0x20, 
+	0x60, 0x04, 0xA2, 0xC5, 0x8D, 0x07, 0x00, 0x10, 
+	0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, 
+	0x00, 0x08, 0x20, 0x20, 0x0E, 0xE0, 0x05, 0x13, 
+	0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, 
+	0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x0E, 0xE0, 
+	0xA0, 0x07, 0xFA, 0x08, 0x00, 0x80, 0x0E, 0xC8,  
+	0xFA, 0x07, 0x0F, 0xC8, 0xFC, 0x07, 0x0E, 0xC8,  
+	0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xE0, 0x04,  
+	0x08, 0x08, 0xE0, 0x04, 0x0E, 0x08, 0xE0, 0x02,  
+	0x98, 0x07, 0x20, 0x40, 0x4C, 0xE3, 0x20, 0x07, 
+	0x2E, 0x06, 0x60, 0x04, 0x12, 0xCA, 0x00, 0x70, 
+	0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 0x0B, 0x10, 
+	0x20, 0xF0, 0x4B, 0xE3, 0x02, 0x10, 0x20, 0xF0, 
+	0x4A, 0xE3, 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 
+	0xE0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x20, 0xE8, 
+	0x46, 0xE3, 0x62, 0x07, 0x20, 0x04, 0xDA, 0xEA,  
+	0x40, 0x01, 0x00, 0x20, 0x04, 0x13, 0xFA, 0x10,  
+	0x40, 0x01, 0x00, 0x40, 0xF7, 0x16, 0x20, 0x07,  
+	0x2E, 0x06, 0x20, 0x50, 0x50, 0xE3, 0x51, 0x04, 
+	0xF1, 0x10, 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 
+	0x00, 0x40, 0x07, 0x16, 0x8D, 0x07, 0xF6, 0x08, 
+	0xA0, 0x06, 0x68, 0xB8, 0xE0, 0x02, 0x98, 0x07, 
+	0x5B, 0x04, 0xC4, 0x01, 0x04, 0x00, 0xE0, 0x02, 
+	0x98, 0x07, 0x5B, 0x04, 0x60, 0x01, 0x60, 0x07, 
+	0x04, 0x00, 0x06, 0x16, 0x20, 0xE8, 0x1C, 0xE0, 
+	0x58, 0x07, 0x80, 0x03, 0xE0, 0x02, 0x98, 0x07, 
+	0x20, 0xD8, 0xDC, 0x07, 0x17, 0x01, 0x8F, 0x07, 
+	0x8E, 0xFF, 0x0F, 0xC8, 0x04, 0x01, 0x20, 0xE8, 
+	0x06, 0xE0, 0x58, 0x07, 0x80, 0x01, 0x00, 0x80, 
+	0x5B, 0x04, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, 
+	0x03, 0x13, 0xDB, 0x2D, 0x03, 0xC8, 0x4A, 0x08, 
+	0x49, 0x01, 0x00, 0x01, 0x02, 0x16, 0x60, 0x04, 
+	0x52, 0xC9, 0xE0, 0xC0, 0xF8, 0x05, 0xFD, 0x13, 
+	0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 
+	0xF8, 0x05, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, 
+	0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x49, 0x01, 
+	0x00, 0x01, 0x4D, 0x16, 0x09, 0x01, 0x00, 0x5E, 
+	0x29, 0x16, 0x49, 0x01, 0x02, 0x00, 0x0B, 0x16, 
+	0x60, 0x01, 0x46, 0x08, 0x00, 0x02, 0x0A, 0x16, 
+	0x27, 0x02, 0x04, 0x00, 0x07, 0x88, 0x7E, 0x09, 
+	0x05, 0x12, 0x27, 0x02, 0xFC, 0xFF, 0xA0, 0x01, 
+	0x46, 0x08, 0x00, 0x02, 0xC7, 0xC1, 0x37, 0x15, 
+	0xD3, 0x2D, 0xE0, 0xC0, 0x4A, 0x08, 0x07, 0xA8, 
+	0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 0x0C, 0x15, 
+	0x20, 0xC8, 0x3C, 0x08, 0xFA, 0x07, 0x20, 0xC8, 
+	0x3E, 0x08, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, 
+	0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, 
+	0x60, 0x04, 0x52, 0xC9, 0xA0, 0x06, 0x54, 0xBA, 
+	0xD3, 0x2D, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, 
+	0x01, 0x13, 0xDB, 0x2D, 0x20, 0x88, 0x3E, 0x08, 
+	0x3A, 0x08, 0x0D, 0x16, 0x20, 0x88, 0x3C, 0x08, 
+	0x38, 0x08, 0x09, 0x16, 0xE0, 0x04, 0x44, 0x08, 
+	0x82, 0x07, 0x02, 0x08, 0x04, 0x61, 0xE0, 0x04, 
+	0x48, 0x08, 0x60, 0x04, 0x1E, 0xCA, 0x20, 0xC8, 
+	0x38, 0x08, 0xFA, 0x07, 0x20, 0xC8, 0x3A, 0x08, 
+	0xFC, 0x07, 0x60, 0x04, 0x12, 0xCA, 0x07, 0xA8, 
+	0x48, 0x08, 0x04, 0xC1, 0x1B, 0x16, 0x82, 0x02, 
+	0x38, 0x08, 0x0A, 0x16, 0x60, 0x01, 0xFC, 0x07, 
+	0x01, 0x00, 0x02, 0x16, 0xA0, 0x06, 0x6E, 0xCB, 
+	0xA0, 0x06, 0xFC, 0xCA, 0x80, 0x01, 0x10, 0x00, 
+	0x32, 0xC1, 0x07, 0x11, 0x72, 0xC1, 0x92, 0xC1, 
+	0x82, 0x07, 0x38, 0x08, 0x04, 0xC1, 0x06, 0x16, 
+	0xEA, 0x10, 0x72, 0xC1, 0xB2, 0xC1, 0x84, 0x01, 
+	0x00, 0x80, 0xE5, 0x13, 0xE0, 0xD2, 0x03, 0x01, 
+	0x34, 0x13, 0x0B, 0x02, 0x0A, 0x01, 0xC4, 0xCE, 
+	0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 0xFB, 0x04, 
+	0xC8, 0xC6, 0x03, 0xA8, 0x12, 0x01, 0x20, 0xC8, 
+	0xF8, 0x07, 0x00, 0x01, 0xC7, 0xC2, 0xC4, 0x81, 
+	0x01, 0x14, 0xC4, 0xC2, 0x0B, 0xA8, 0x44, 0x08, 
+	0x0B, 0x61, 0x0B, 0xA2, 0x8B, 0xA1, 0x01, 0x17, 
+	0x85, 0x05, 0xCB, 0x61, 0xC6, 0x16, 0x40, 0x01, 
+	0x40, 0x00, 0x15, 0x16, 0x87, 0x07, 0x20, 0x00, 
+	0xE0, 0x61, 0x44, 0x08, 0xC4, 0x81, 0x08, 0x1A, 
+	0x07, 0xA8, 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 
+	0x07, 0x61, 0x87, 0xA1, 0x01, 0x17, 0x85, 0x05, 
+	0x80, 0x01, 0x40, 0x00, 0x03, 0xC8, 0x6C, 0x01, 
+	0xE0, 0xC1, 0x04, 0xFC, 0xAC, 0x10, 0x60, 0x04, 
+	0xBC, 0xC7, 0x20, 0x01, 0x3A, 0x07, 0x00, 0x70, 
+	0x04, 0x13, 0xA0, 0x06, 0x28, 0xC7, 0x20, 0x07, 
+	0x2E, 0x06, 0xA0, 0x06, 0x54, 0xBA, 0xC1, 0x10, 
+	0xE0, 0xD2, 0x03, 0x01, 0x0A, 0x16, 0x20, 0x01, 
+	0x3A, 0x07, 0x00, 0x70, 0x04, 0x13, 0xA0, 0x06, 
+	0x28, 0xC7, 0x20, 0x07, 0x2E, 0x06, 0xA0, 0x06, 
+	0x54, 0xBA, 0x90, 0x03, 0xBF, 0x4F, 0xD3, 0x2D, 
+	0x60, 0x01, 0xFC, 0x07, 0x01, 0x00, 0x02, 0x16, 
+	0xA0, 0x06, 0x6E, 0xCB, 0x60, 0xD2, 0x46, 0x08, 
+	0x89, 0x01, 0x00, 0xF1, 0xC9, 0x01, 0x00, 0x70, 
+	0x40, 0x01, 0x10, 0x00, 0x1C, 0x13, 0x20, 0x88, 
+	0x3E, 0x08, 0x3A, 0x08, 0x04, 0x16, 0x20, 0x88, 
+	0x3C, 0x08, 0x38, 0x08, 0x14, 0x13, 0x89, 0x01, 
+	0x00, 0x10, 0x8D, 0x07, 0x44, 0x08, 0x9D, 0x07, 
+	0x00, 0x50, 0xA0, 0xC2, 0xF6, 0x07, 0x8C, 0x07, 
+	0x02, 0x00, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, 
+	0x3E, 0x08, 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 
+	0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x8D, 0x07, 
+	0x46, 0x08, 0x49, 0xC7, 0xA0, 0xC2, 0xF6, 0x07, 
+	0x8C, 0x07, 0x04, 0x00, 0xA0, 0xC3, 0x38, 0x08, 
+	0xE0, 0xC3, 0x3A, 0x08, 0xCC, 0xA3, 0x01, 0x17, 
+	0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x20, 0xC8, 
+	0x3C, 0x08, 0xFC, 0x08, 0x20, 0xC8, 0x3E, 0x08, 
+	0xFE, 0x08, 0x09, 0x01, 0x00, 0x0C, 0x0C, 0x13, 
+	0x49, 0x01, 0x00, 0x04, 0x05, 0x16, 0xA0, 0x06, 
+	0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0x04, 0x10, 
+	0x90, 0x03, 0x7F, 0x40, 0xA0, 0x06, 0x6C, 0xC7, 
+	0xC0, 0x01, 0x90, 0x00, 0xA0, 0x06, 0xFC, 0xCA, 
+	0x0B, 0xC8, 0x46, 0x08, 0xE0, 0xC2, 0x42, 0x07, 
+	0x2D, 0x13, 0xE0, 0xC2, 0x2E, 0x06, 0x2A, 0x13, 
+	0xE0, 0x02, 0x58, 0x07, 0x8F, 0x07, 0xBF, 0xFF, 
+	0x0F, 0x2C, 0xE0, 0x02, 0x98, 0x07, 0xE0, 0xC0, 
+	0x5C, 0x07, 0x03, 0xC8, 0x4A, 0x08, 0x03, 0xC8, 
+	0x6C, 0x01, 0xC3, 0xC2, 0xCB, 0xA2, 0xEB, 0xC2, 
+	0x32, 0x0C, 0x32, 0x13, 0x0B, 0xC8, 0x00, 0xFC, 
+	0x0B, 0xC3, 0x4B, 0xC3, 0x0B, 0xC8, 0x6C, 0x01, 
+	0xE0, 0xC2, 0x00, 0xFC, 0xFA, 0x16, 0x00, 0x03, 
+	0x02, 0x00, 0x20, 0xC8, 0xF8, 0x05, 0x00, 0xFC, 
+	0x02, 0x16, 0x0D, 0xC8, 0xFA, 0x05, 0x0C, 0xC8, 
+	0xF8, 0x05, 0x00, 0x03, 0x0F, 0x00, 0x03, 0xC8, 
+	0x6C, 0x01, 0x1A, 0x10, 0xA0, 0xC3, 0x2E, 0x06, 
+	0x03, 0x13, 0xE0, 0xC0, 0xF8, 0x05, 0x0D, 0x16, 
+	0x4F, 0x2E, 0xC0, 0x01, 0x00, 0x80, 0xA0, 0x01, 
+	0x62, 0x07, 0x00, 0x80, 0x8E, 0xC3, 0x03, 0x13, 
+	0xA0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x60, 0x04, 
+	0x4E, 0xC7, 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 
+	0x00, 0xFC, 0xF8, 0x05, 0x03, 0xC8, 0x4A, 0x08, 
+	0x60, 0x01, 0x6A, 0x09, 0x00, 0x04, 0x02, 0x13, 
+	0x60, 0x04, 0xE4, 0xC7, 0x8C, 0x07, 0x0E, 0x00, 
+	0x20, 0xC2, 0x0E, 0xFC, 0x0A, 0x15, 0x09, 0x13, 
+	0x20, 0xC2, 0x14, 0xFC, 0x48, 0x02, 0x00, 0x1F, 
+	0xC8, 0x06, 0x88, 0x02, 0x12, 0x00, 0xF0, 0x1B, 
+	0x08, 0xA3, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, 
+	0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x07, 0x83, 
+	0xE7, 0x1A, 0xCC, 0x61, 0x07, 0xC8, 0x04, 0xFC, 
+	0xCC, 0xC1, 0xC0, 0x01, 0x40, 0x00, 0x60, 0x04, 
+	0xF0, 0xC7, 0x4B, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 
+	0x20, 0xC3, 0x7A, 0x09, 0x8D, 0x07, 0xFA, 0x07, 
+	0x9D, 0xC3, 0xE0, 0xC3, 0xFC, 0x07, 0xA0, 0x06, 
+	0x00, 0xBA, 0x20, 0xC8, 0x3C, 0x08, 0x40, 0x08, 
+	0x20, 0xC8, 0x3E, 0x08, 0x42, 0x08, 0x0E, 0xC8, 
+	0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xC4, 0x04, 
+	0x82, 0x07, 0x02, 0x08, 0xE0, 0x04, 0x44, 0x08, 
+	0x40, 0x01, 0x80, 0x00, 0x06, 0x16, 0x0E, 0xC8, 
+	0x38, 0x08, 0x0F, 0xC8, 0x3A, 0x08, 0xE0, 0x04, 
+	0x48, 0x08, 0xA0, 0x06, 0x54, 0xBA, 0xE0, 0xC2, 
+	0xFE, 0x07, 0x0D, 0x11, 0x0E, 0xC8, 0xFA, 0x07, 
+	0x0F, 0xC8, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, 
+	0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, 
+	0xA0, 0x06, 0x32, 0xC7, 0xCB, 0x10, 0x80, 0x01, 
+	0x80, 0x00, 0x55, 0x04, 0x8B, 0xC0, 0xA0, 0xC2, 
+	0xF0, 0x07, 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 
+	0xFA, 0x07, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, 
+	0x3E, 0x08, 0xA0, 0x06, 0x36, 0xBA, 0x60, 0x01, 
+	0xFC, 0x07, 0x01, 0x00, 0x04, 0x13, 0xA0, 0x07, 
+	0xFA, 0x08, 0x00, 0x80, 0x52, 0x04, 0x60, 0x01, 
+	0x60, 0x07, 0x04, 0x00, 0x07, 0x16, 0x20, 0xD0, 
+	0x04, 0xE0, 0x20, 0xE8, 0x1A, 0xE0, 0x58, 0x07, 
+	0x60, 0x04, 0x3E, 0xC7, 0xA0, 0x07, 0xFA, 0x08, 
+	0x00, 0x40, 0x20, 0xC8, 0x3C, 0x08, 0xFC, 0x08, 
+	0x20, 0xC8, 0x3E, 0x08, 0xFE, 0x08, 0xA0, 0x06, 
+	0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0xD3, 0x10, 
+	0xAD, 0xC2, 0x02, 0x00, 0x6D, 0xC2, 0x00, 0x00, 
+	0x05, 0x16, 0xAA, 0x07, 0x02, 0x00, 0x36, 0x07, 
+	0x9A, 0x2C, 0x80, 0x03, 0xEA, 0x2C, 0x02, 0x00, 
+	0x41, 0xCB, 0x00, 0x00, 0x80, 0x03, 0x2D, 0xC3, 
+	0x18, 0x00, 0xAC, 0x07, 0x02, 0x00, 0x36, 0x07, 
+	0x20, 0x4B, 0x06, 0xEB, 0x0A, 0x00, 0x20, 0xEB, 
+	0x00, 0xEB, 0x0A, 0x00, 0x9C, 0x2E, 0x80, 0x03, 
+	0xA0, 0xC2, 0x22, 0xE0, 0x60, 0x04, 0x8A, 0xA3, 
+	0xED, 0xC0, 0x18, 0x00, 0xA0, 0x06, 0x3A, 0xCC, 
+	0x80, 0x03, 0x44, 0xC2, 0xC3, 0xC0, 0x02, 0x13, 
+	0xA0, 0x06, 0x3A, 0xCC, 0x19, 0xC3, 0x09, 0xCB, 
+	0x18, 0x00, 0xC9, 0x05, 0x19, 0xCB, 0x16, 0x00, 
+	0x4C, 0xC2, 0x2C, 0x02, 0x1A, 0x00, 0x0D, 0xCF, 
+	0x0E, 0xCF, 0x0F, 0xC7, 0x99, 0x00, 0x5B, 0x04, 
+	0x8C, 0x07, 0x0A, 0x09, 0x9C, 0xC2, 0xA0, 0x22, 
+	0x14, 0xE0, 0x06, 0x13, 0xA0, 0xC2, 0x58, 0x07, 
+	0xA0, 0x22, 0x20, 0xE0, 0x01, 0x16, 0x80, 0x03, 
+	0x03, 0xC1, 0xC3, 0x04, 0x8A, 0x07, 0x04, 0x00, 
+	0x84, 0xA2, 0x3A, 0xCF, 0x3A, 0xCF, 0x3A, 0xCF, 
+	0x3A, 0xCF, 0x3A, 0xCF, 0xE0, 0x02, 0x58, 0x07, 
+	0x8D, 0x07, 0x0A, 0x09, 0x0B, 0xC8, 0xC2, 0x07, 
+	0xA0, 0x06, 0x44, 0xB8, 0xE0, 0xC2, 0xC2, 0x07, 
+	0x20, 0xE0, 0x20, 0xE0, 0xE0, 0x02, 0xB8, 0x07, 
+	0x5B, 0x04, 0x2D, 0xC3, 0x18, 0x00, 0x8C, 0xC2, 
+	0x60, 0xC2, 0x6C, 0x01, 0x0A, 0xC8, 0x6C, 0x01, 
+	0xE0, 0xC2, 0x00, 0xFC, 0x02, 0x13, 0x8B, 0xC2, 
+	0xF9, 0x10, 0x09, 0xC8, 0x6C, 0x01, 0x8B, 0x07, 
+	0xF8, 0x05, 0x5B, 0xC2, 0x0C, 0x13, 0xCB, 0x05, 
+	0x5B, 0xC2, 0xCA, 0xC6, 0xE0, 0xC2, 0x6C, 0x01, 
+	0x09, 0xC8, 0x6C, 0x01, 0x0C, 0xC8, 0x00, 0xFC, 
+	0x0B, 0xC8, 0x6C, 0x01, 0x02, 0x10, 0xCC, 0xCE, 
+	0xCA, 0xC6, 0xA0, 0xC2, 0xE0, 0x00, 0xA0, 0x22, 
+	0x1A, 0xE0, 0x06, 0x16, 0x20, 0xE8, 0x04, 0xE0, 
+	0x3A, 0x07, 0x20, 0x48, 0x1A, 0xE0, 0xE0, 0x00, 
+	0x80, 0x03, 0xE0, 0xD3, 0xAB, 0xE3, 0xE0, 0x04, 
+	0x8E, 0x09, 0xE0, 0xC1, 0xA8, 0x06, 0x05, 0x16, 
+	0x07, 0x02, 0xA2, 0x06, 0xA0, 0x06, 0x38, 0xB5, 
+	0x0B, 0x16, 0xE0, 0xC1, 0xBA, 0x06, 0x23, 0x16, 
+	0x07, 0x02, 0xB4, 0x06, 0xA0, 0x06, 0x38, 0xB5, 
+	0x1E, 0x13, 0x07, 0x02, 0xB8, 0x06, 0x02, 0x10, 
+	0x07, 0x02, 0xA6, 0x06, 0x60, 0xC1, 0x02, 0xFC, 
+	0x25, 0xC8, 0x0C, 0x00, 0x02, 0xFC, 0xC5, 0xC9, 
+	0x0C, 0x00, 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xCD, 
+	0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xC5, 0xB7, 0x01, 
+	0x28, 0x00, 0x27, 0x02, 0xF4, 0xFF, 0xA7, 0x07, 
+	0x04, 0x00, 0x52, 0xCE, 0x20, 0xE8, 0x9E, 0x09, 
+	0x06, 0xFC, 0x97, 0x2E, 0xD2, 0x10, 0x00, 0x03, 
+	0x02, 0x00, 0xA0, 0x06, 0x50, 0xB5, 0x00, 0x03, 
+	0x0F, 0x00, 0x20, 0x2C, 0xF0, 0xED, 0xE0, 0x93, 
+	0xAB, 0xE3, 0x03, 0x16, 0x81, 0x02, 0x16, 0x00, 
+	0xC4, 0x16, 0x21, 0xC1, 0x10, 0xEB, 0x54, 0x04, 
+	0xE0, 0x93, 0x10, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 
+	0xA8, 0xE3, 0x0B, 0x10, 0xCF, 0xD3, 0x09, 0x16, 
+	0xA0, 0x23, 0x08, 0xE0, 0x06, 0x16, 0x84, 0x07, 
+	0x20, 0x00, 0x04, 0xE8, 0xD2, 0x06, 0xA0, 0xD2, 
+	0x0C, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0x04, 
+	0x70, 0xD1, 0x22, 0xC1, 0x04, 0x00, 0xE2, 0x04, 
+	0x02, 0x00, 0x54, 0x04, 0x02, 0xC8, 0x6C, 0x01, 
+	0x82, 0xA0, 0x22, 0xC8, 0x32, 0x0C, 0x00, 0xFC, 
+	0x02, 0x02, 0x00, 0xFC, 0xE0, 0x93, 0xAA, 0xE3, 
+	0x13, 0x16, 0xB0, 0x03, 0x20, 0x98, 0xAA, 0xE3, 
+	0x65, 0x06, 0x0D, 0x16, 0x8B, 0x07, 0x17, 0xFC, 
+	0xDB, 0xD2, 0x8B, 0x09, 0x8B, 0x02, 0x15, 0x00, 
+	0x7B, 0x1B, 0xEB, 0xD2, 0xC4, 0xEA, 0x06, 0x13, 
+	0x77, 0x15, 0x20, 0x07, 0xA0, 0x09, 0x74, 0x10, 
+	0xA0, 0x06, 0x02, 0xD0, 0xA0, 0x48, 0x04, 0xE0, 
+	0x0E, 0x00, 0x85, 0x02, 0x07, 0x00, 0x0E, 0x13, 
+	0x0E, 0x01, 0x03, 0x00, 0x0B, 0x13, 0xA0, 0x23, 
+	0x22, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 0x0E, 0xE0, 
+	0x02, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 0x8E, 0x01, 
+	0x03, 0x00, 0x5E, 0x10, 0x05, 0xC8, 0xFC, 0x06, 
+	0xC3, 0xC0, 0x57, 0x16, 0xA0, 0x43, 0x10, 0xE0, 
+	0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 0x0A, 0x16, 
+	0x22, 0x88, 0x10, 0x00, 0x6E, 0x09, 0x06, 0x16, 
+	0x22, 0x88, 0x12, 0x00, 0x70, 0x09, 0x02, 0x16, 
+	0xA0, 0xE3, 0x10, 0xE0, 0x85, 0x02, 0x09, 0x00, 
+	0x02, 0x13, 0xA0, 0x06, 0xB8, 0xD7, 0x45, 0xA1, 
+	0x65, 0xC1, 0xAC, 0xE3, 0x55, 0x04, 0x62, 0xC0, 
+	0x04, 0x00, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
+	0x82, 0x02, 0x48, 0x04, 0x02, 0x1B, 0xA0, 0x43, 
+	0x0C, 0xE0, 0x22, 0xC1, 0x0E, 0x00, 0x51, 0x04, 
+	0x42, 0xC0, 0xE1, 0x04, 0x02, 0x00, 0xA2, 0xC0, 
+	0x0C, 0x00, 0x22, 0xC1, 0x0A, 0x00, 0x20, 0x21, 
+	0x18, 0xE0, 0x07, 0x13, 0xA1, 0xC8, 0x0A, 0x00, 
+	0x0A, 0x00, 0xA1, 0xC8, 0x08, 0x00, 0x08, 0x00, 
+	0xE2, 0x10, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, 
+	0xA0, 0x06, 0x66, 0xD6, 0x60, 0x04, 0xB0, 0xCE, 
+	0x02, 0xC8, 0xD4, 0x06, 0x62, 0xC1, 0x02, 0x00, 
+	0x65, 0xC1, 0xD8, 0xE3, 0x55, 0x04, 0x0F, 0x10, 
+	0x0E, 0x10, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, 
+	0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 0xA2, 0xD8, 
+	0xA0, 0xE3, 0x0C, 0xE0, 0x20, 0xE8, 0x9E, 0x09, 
+	0x06, 0x04, 0xA0, 0x2E, 0xF4, 0x03, 0x60, 0x04, 
+	0xE4, 0xCC, 0xA0, 0x06, 0x26, 0xD5, 0x0C, 0x10, 
+	0xA0, 0x06, 0x66, 0xD6, 0x09, 0x10, 0xA0, 0x06, 
+	0x2A, 0xD8, 0x06, 0x10, 0xA0, 0x06, 0x66, 0xD6, 
+	0x03, 0xC8, 0x2A, 0x09, 0xA0, 0xD2, 0xAA, 0xE3, 
+	0xA0, 0x06, 0x6E, 0xCF, 0xA0, 0x92, 0x26, 0xE0, 
+	0x0C, 0x16, 0xE0, 0xD3, 0x26, 0xE0, 0xE0, 0x23, 
+	0x14, 0xE0, 0x0A, 0x13, 0x0A, 0xC1, 0xC4, 0x83, 
+	0x07, 0x13, 0xC4, 0xC3, 0x24, 0xC1, 0xDC, 0xE3, 
+	0x54, 0x04, 0xCA, 0x93, 0xDC, 0x13, 0xCA, 0xD3, 
+	0xB0, 0x03, 0x0F, 0xD8, 0x59, 0x06, 0x04, 0x71, 
+	0x24, 0xC1, 0xEC, 0xE3, 0x54, 0x04, 0xA0, 0x23, 
+	0x0C, 0xE0, 0xD1, 0x13, 0x4D, 0xC3, 0xCF, 0x13, 
+	0x4D, 0x01, 0x00, 0x04, 0x0B, 0x13, 0x86, 0x07, 
+	0x02, 0x00, 0x84, 0x07, 0x26, 0x00, 0x46, 0x23, 
+	0x03, 0x13, 0x44, 0x06, 0x86, 0xA1, 0xFB, 0x10, 
+	0x46, 0x43, 0xB3, 0x10, 0x84, 0x07, 0x18, 0x00, 
+	0x8D, 0x01, 0x00, 0x04, 0x85, 0x07, 0xF4, 0x03, 
+	0xF5, 0x04, 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 
+	0xA2, 0xD8, 0x20, 0xE8, 0x9C, 0x09, 0xFE, 0x03, 
+	0x20, 0xE8, 0x9E, 0x09, 0x06, 0x04, 0xA8, 0x10, 
+	0x85, 0x07, 0x1C, 0x07, 0x86, 0x07, 0x1A, 0x04, 
+	0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0xC6, 0x05, 
+	0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0x83, 0x07, 
+	0x00, 0x90, 0xA9, 0x10, 0x0B, 0xC3, 0x86, 0x07, 
+	0x00, 0x01, 0x85, 0x07, 0x00, 0x80, 0x20, 0xC1, 
+	0xD2, 0x06, 0x37, 0x13, 0xC4, 0x04, 0x60, 0xC0, 
+	0xD2, 0x06, 0x45, 0x20, 0x04, 0x13, 0x84, 0x05, 
+	0x15, 0x09, 0xF9, 0x16, 0x2E, 0x10, 0xCF, 0xD3, 
+	0x06, 0x16, 0xE0, 0x23, 0x14, 0xE0, 0x03, 0x16, 
+	0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0xE0, 0x04, 
+	0xD2, 0x06, 0x23, 0x10, 0x64, 0xD0, 0x1C, 0x07, 
+	0x46, 0xB0, 0x10, 0x18, 0x01, 0xD9, 0x1C, 0x07, 
+	0x60, 0x23, 0x20, 0xE0, 0x0B, 0x13, 0x81, 0x07, 
+	0x18, 0x00, 0x61, 0xC0, 0xFC, 0xE3, 0x11, 0x88, 
+	0xCE, 0xED, 0x04, 0x13, 0x08, 0x02, 0x18, 0x80, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x64, 0xD0, 0x28, 0x07, 
+	0x46, 0xB0, 0x08, 0x18, 0x01, 0xD9, 0x28, 0x07, 
+	0x46, 0xB0, 0x04, 0x17, 0x83, 0x07, 0x40, 0x80, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x05, 0x48, 0xD2, 0x06, 
+	0xCA, 0x16, 0x20, 0xC1, 0x32, 0x09, 0x01, 0x16, 
+	0x5C, 0x04, 0x04, 0x02, 0x07, 0x00, 0x20, 0x06, 
+	0x32, 0x09, 0x05, 0x02, 0x00, 0x01, 0xC7, 0x10, 
+	0x0B, 0xC3, 0xC5, 0x04, 0x42, 0xC0, 0xC7, 0x04, 
+	0x20, 0xC2, 0x6C, 0x01, 0xE1, 0xA1, 0x04, 0x00, 
+	0x11, 0xC8, 0x6C, 0x01, 0xFB, 0x16, 0x08, 0xC8, 
+	0x6C, 0x01, 0xC8, 0x04, 0xA0, 0x43, 0x1A, 0xE0, 
+	0x22, 0xC1, 0x0E, 0x00, 0x0D, 0x15, 0x0C, 0x13, 
+	0xA0, 0xE3, 0x1A, 0xE0, 0xA0, 0x06, 0x14, 0xD8, 
+	0x08, 0xC2, 0x48, 0x13, 0x88, 0x02, 0x12, 0x00, 
+	0x45, 0x1B, 0x20, 0x22, 0x22, 0xE0, 0x42, 0x13, 
+	0x02, 0xC1, 0x08, 0xA1, 0x08, 0x05, 0x28, 0x02, 
+	0xF2, 0xFF, 0x07, 0xA2, 0x83, 0x07, 0x01, 0x80, 
+	0x88, 0x02, 0x04, 0x00, 0x6E, 0x11, 0x64, 0xC2, 
+	0x16, 0x00, 0x49, 0xD2, 0x02, 0x16, 0x02, 0x81, 
+	0x31, 0x16, 0x09, 0x01, 0x00, 0xF0, 0x28, 0x16, 
+	0x49, 0xC1, 0x45, 0x71, 0xC3, 0x04, 0x85, 0x02, 
+	0x09, 0x00, 0x7C, 0x13, 0x83, 0x07, 0x02, 0x80, 
+	0xA4, 0xC1, 0x14, 0x00, 0x88, 0x81, 0x76, 0x16, 
+	0x83, 0x05, 0x85, 0x02, 0x15, 0x00, 0x13, 0x1B, 
+	0x83, 0x05, 0x49, 0x99, 0x30, 0xEB, 0x0A, 0x13, 
+	0x09, 0x98, 0x0E, 0xE0, 0x6B, 0x16, 0x25, 0x98, 
+	0x30, 0xEB, 0x0C, 0xE0, 0x67, 0x16, 0xE0, 0xC1, 
+	0xEC, 0x06, 0x64, 0x16, 0xC3, 0x04, 0x52, 0xC2, 
+	0x0F, 0x13, 0x83, 0x07, 0x09, 0x80, 0xE0, 0xC1, 
+	0x6A, 0x09, 0x47, 0x01, 0x00, 0x10, 0x5A, 0x16, 
+	0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0x06, 0xBE, 0xD6, 
+	0x60, 0x04, 0xB0, 0xCE, 0x60, 0x04, 0xBA, 0xCE, 
+	0x89, 0x07, 0x0E, 0x07, 0xC7, 0x04, 0xE5, 0xD1, 
+	0x46, 0xEB, 0x05, 0x13, 0xC7, 0x06, 0x27, 0x02, 
+	0x5C, 0xEB, 0x77, 0xCE, 0xFE, 0x15, 0x44, 0xC0, 
+	0x21, 0x02, 0x18, 0x00, 0x28, 0x02, 0xFC, 0xFF, 
+	0x36, 0x13, 0x91, 0xC1, 0x86, 0xD1, 0x1F, 0x13, 
+	0xC6, 0x06, 0x87, 0x07, 0x0E, 0x07, 0xF7, 0xC0, 
+	0x46, 0x02, 0xFF, 0xBF, 0x43, 0x02, 0xFF, 0x3F, 
+	0xA0, 0x91, 0xF5, 0xED, 0x09, 0x16, 0xB0, 0x03, 
+	0x20, 0x98, 0x0E, 0xE0, 0x5D, 0x06, 0x0F, 0x16, 
+	0x21, 0xC8, 0x02, 0x00, 0x0C, 0x07, 0x17, 0x10, 
+	0x47, 0x82, 0x0C, 0x1B, 0xC6, 0x90, 0xEB, 0x16, 
+	0x47, 0x06, 0xF7, 0x04, 0xB0, 0x03, 0x20, 0x98, 
+	0x5D, 0x06, 0x57, 0x06, 0x0C, 0x13, 0x83, 0x07, 
+	0x05, 0x80, 0x1C, 0x10, 0xD1, 0xC0, 0xE0, 0x20, 
+	0x16, 0xE0, 0x03, 0x16, 0x83, 0x07, 0x08, 0x80, 
+	0x15, 0x10, 0x60, 0x44, 0x26, 0xE0, 0x86, 0x71, 
+	0x46, 0xA0, 0x06, 0x62, 0x83, 0x07, 0x05, 0x80, 
+	0x08, 0xC2, 0xCB, 0x15, 0x0B, 0x16, 0xC3, 0x04, 
+	0x87, 0x07, 0x0E, 0x07, 0x77, 0xC0, 0x47, 0x82, 
+	0x05, 0x1B, 0x60, 0x20, 0x06, 0xE0, 0xFA, 0x16, 
+	0x83, 0x07, 0x07, 0x80, 0x5C, 0x04, 0xA0, 0x92, 
+	0x0E, 0xE0, 0x11, 0x16, 0x20, 0xC8, 0x20, 0xE0, 
+	0x08, 0x07, 0xE0, 0x04, 0x84, 0x01, 0x60, 0x05, 
+	0x02, 0x07, 0x4B, 0x13, 0x20, 0x48, 0x06, 0xE0, 
+	0x82, 0x01, 0xA0, 0x06, 0xD0, 0xD4, 0x83, 0x07, 
+	0x00, 0xC0, 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 
+	0x1E, 0xE0, 0x02, 0x07, 0xA0, 0xE3, 0x04, 0xE0, 
+	0x08, 0x02, 0x24, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x42, 0x10, 0x20, 0xC1, 0x84, 0x01, 0x44, 0x02, 
+	0x00, 0x88, 0x2A, 0x13, 0x04, 0x48, 0x84, 0x01, 
+	0x20, 0x06, 0x02, 0x07, 0xF1, 0x16, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x80, 0x15, 0x13, 0xA0, 0x23, 
+	0x22, 0xE0, 0x05, 0x16, 0xA0, 0x43, 0x22, 0xE0, 
+	0xA0, 0xD2, 0x0E, 0xE0, 0xCF, 0x10, 0xE0, 0x23, 
+	0x14, 0xE0, 0x04, 0x13, 0x20, 0x98, 0xA9, 0xE3, 
+	0x65, 0x06, 0x0C, 0x16, 0xA0, 0x92, 0x0E, 0xE0, 
+	0xC5, 0x13, 0xA0, 0xD2, 0xA8, 0xE3, 0xD3, 0x10, 
+	0x20, 0xC8, 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 
+	0x00, 0xC0, 0x04, 0x10, 0x83, 0x07, 0x02, 0x00, 
+	0x60, 0x04, 0xCA, 0xCE, 0x60, 0x04, 0xC0, 0xCE, 
+	0x20, 0xE8, 0x06, 0xE0, 0x82, 0x01, 0xA0, 0x06, 
+	0xD0, 0xD4, 0x20, 0x07, 0x02, 0x07, 0xA0, 0x43, 
+	0x04, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, 
+	0x20, 0x88, 0x20, 0xE0, 0x08, 0x07, 0x03, 0x16, 
+	0x20, 0xC8, 0x78, 0xEB, 0x08, 0x07, 0x60, 0x04, 
+	0xD2, 0xCE, 0x0E, 0x01, 0x03, 0x00, 0x16, 0x13, 
+	0xCF, 0xD3, 0x08, 0x16, 0xA0, 0x23, 0x20, 0xE0, 
+	0x03, 0x16, 0xA0, 0xD2, 0xA8, 0xE3, 0x02, 0x10, 
+	0xA0, 0xD2, 0x0E, 0xE0, 0x8E, 0x01, 0x03, 0x00, 
+	0x09, 0x10, 0x60, 0xC1, 0x84, 0x01, 0x60, 0x21, 
+	0x0A, 0xE0, 0x04, 0x16, 0x83, 0x07, 0x00, 0x84, 
+	0x60, 0x04, 0xCA, 0xCE, 0x20, 0xC8, 0x2E, 0xE0, 
+	0x84, 0x01, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0xE3, 
+	0x20, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x93, 
+	0x26, 0xE0, 0x10, 0x16, 0xA0, 0x23, 0x08, 0xE0, 
+	0x0D, 0x16, 0xA0, 0x23, 0x06, 0xE0, 0x02, 0x13, 
+	0x60, 0xE3, 0x1C, 0xE0, 0x60, 0xE3, 0x18, 0xE0, 
+	0xA0, 0x43, 0x06, 0xE0, 0x08, 0x02, 0x3C, 0x80, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 
+	0xA0, 0x92, 0xA8, 0xE3, 0x03, 0x13, 0xA0, 0x92, 
+	0xA9, 0xE3, 0x1E, 0x16, 0xE0, 0x23, 0x14, 0xE0, 
+	0x08, 0x13, 0x20, 0x98, 0xA9, 0xE3, 0x65, 0x06, 
+	0x04, 0x13, 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 
+	0xCA, 0xCE, 0xA0, 0xD2, 0x0E, 0xE0, 0x20, 0xC8, 
+	0x20, 0xE0, 0x08, 0x07, 0xA0, 0x27, 0x04, 0xE0, 
+	0x0B, 0x16, 0x20, 0xC8, 0x1E, 0xE0, 0x08, 0x07, 
+	0xE0, 0x93, 0xA8, 0xE3, 0x05, 0x16, 0xA0, 0x23, 
+	0x12, 0xE0, 0x02, 0x13, 0x20, 0x06, 0x08, 0x07, 
+	0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 
+	0x3E, 0x13, 0xB0, 0x03, 0x20, 0x98, 0x0E, 0xE0, 
+	0x6F, 0x06, 0x0F, 0x16, 0xCF, 0xD3, 0x37, 0x16, 
+	0xA0, 0xD2, 0xA8, 0xE3, 0x60, 0x04, 0xD2, 0xCE, 
+	0xA0, 0x92, 0x0C, 0xE0, 0x30, 0x16, 0xE0, 0x23, 
+	0x14, 0xE0, 0xF6, 0x13, 0x83, 0x07, 0x06, 0x00, 
+	0x07, 0x10, 0x83, 0x07, 0x05, 0x00, 0xE0, 0x93, 
+	0x0E, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x07, 0x00, 
+	0x60, 0x04, 0xCA, 0xCE, 0x60, 0xE3, 0x12, 0xE0, 
+	0xE0, 0x23, 0x14, 0xE0, 0x11, 0x13, 0x20, 0x98, 
+	0x0C, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 
+	0xA9, 0xE3, 0x65, 0x06, 0x14, 0x10, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x80, 0x10, 0x13, 0x20, 0xC1, 
+	0x84, 0x01, 0x20, 0x21, 0x06, 0xE0, 0xD2, 0x16, 
+	0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x07, 0x13, 
+	0x20, 0x48, 0x06, 0xE0, 0x84, 0x01, 0x08, 0x02, 
+	0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 
+	0xD2, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x20, 
+	0xFA, 0x16, 0x08, 0x02, 0x78, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x20, 0xC2, 0xA2, 0x09, 0x03, 0x13, 
+	0x20, 0x06, 0xA2, 0x09, 0x21, 0x13, 0x20, 0xC2, 
+	0xA4, 0x09, 0xED, 0x13, 0x20, 0x06, 0xA4, 0x09, 
+	0xEA, 0x16, 0xA0, 0x07, 0xA4, 0x09, 0x05, 0x00, 
+	0xCD, 0x01, 0x00, 0x04, 0xE4, 0x10, 0x60, 0x01, 
+	0x8E, 0x09, 0x80, 0x00, 0x3E, 0x13, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x10, 0x02, 0x16, 0xA0, 0x06, 
+	0xE6, 0xD5, 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x10, 
+	0xE0, 0x01, 0x8E, 0x09, 0x80, 0x00, 0x83, 0x07, 
+	0x00, 0xA8, 0xA0, 0x06, 0x2A, 0xD8, 0x16, 0x10, 
+	0x60, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x21, 0x13, 
+	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x10, 0xA0, 0x07, 
+	0x08, 0x07, 0x05, 0x00, 0x83, 0x07, 0x08, 0xA8, 
+	0xA0, 0x23, 0x04, 0xE0, 0x05, 0x16, 0x20, 0xC8,  
+	0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 0x08, 0xE8,  
+	0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x01, 0x8E, 0x09, 
+	0x00, 0x20, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x01, 
+	0xE0, 0x01, 0x82, 0x01, 0x00, 0x08, 0xA0, 0xD2, 
+	0x0E, 0xE0, 0x83, 0x07, 0x10, 0x80, 0x60, 0x04, 
+	0xC0, 0xCE, 0x08, 0x02, 0x78, 0x00, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x83, 0x07, 0x00, 0x82, 0x60, 0x04, 
+	0xCA, 0xCE, 0x60, 0x04, 0xD2, 0xCE, 0x20, 0x06, 
+	0x90, 0x09, 0x07, 0x15, 0xA0, 0xD2, 0x10, 0xE0, 
+	0xCA, 0x06, 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 
+	0xF4, 0x10, 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x20, 0xC2, 0x90, 0x09, 0x88, 0x02,  
+	0x96, 0x00, 0x0D, 0x1B, 0xEA, 0x16, 0x20, 0x48,  
+	0x08, 0xE0, 0x82, 0x01, 0xA0, 0x01, 0x8E, 0x09, 
+	0x00, 0x10, 0xA0, 0x06, 0xE6, 0xD5, 0x83, 0x07, 
+	0x00, 0x28, 0x60, 0x04, 0xC0, 0xCE, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x10, 0xDA, 0x16, 0x84, 0x07, 
+	0x04, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, 
+	0xB5, 0x07, 0x30, 0x06, 0xA0, 0x06, 0xA2, 0xD8, 
+	0xA0, 0x07, 0xF8, 0x03, 0x34, 0xD4, 0x60, 0x04, 
+	0xC0, 0xDB, 0xA0, 0x07, 0x90, 0x09, 0xF4, 0x01, 
+	0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x08, 0x02, 0x36, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x23, 
+	0x18, 0xE0, 0x06, 0x13, 0xA0, 0xE3, 0x18, 0xE0, 
+	0xE0, 0x2E, 0x00, 0x00, 0x41, 0xC0, 0xFA, 0x16, 
+	0xA0, 0x06, 0xE6, 0xD5, 0xB2, 0x10, 0x04, 0x02, 
+	0x64, 0x00, 0x04, 0x06, 0xFE, 0x16, 0x5B, 0x04, 
+	0xA0, 0xE3, 0x0A, 0xE0, 0x08, 0xC2, 0x02, 0x11, 
+	0xA0, 0x43, 0x0A, 0xE0, 0x20, 0x42, 0x04, 0xE0, 
+	0x28, 0x02, 0xFC, 0xE3, 0x58, 0xC0, 0x02, 0xC0, 
+	0x11, 0x88, 0xCE, 0xED, 0x03, 0x16, 0xD1, 0x2C, 
+	0x58, 0xC0, 0xD1, 0x04, 0x80, 0xC0, 0x0E, 0x01, 
+	0x00, 0x10, 0x0F, 0x13, 0x60, 0xCC, 0xCE, 0xED, 
+	0xC8, 0x05, 0x78, 0xCC, 0x03, 0x16, 0x41, 0x06, 
+	0x60, 0xCC, 0xD6, 0x06, 0x58, 0xC4, 0x02, 0x16, 
+	0x60, 0xC4, 0x00, 0x07, 0x21, 0x02, 0xFA, 0xFF, 
+	0x91, 0x2C, 0x5B, 0x04, 0x0B, 0xC3, 0xA0, 0x06, 
+	0xC2, 0xD5, 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 
+	0x05, 0x16, 0x62, 0xC2, 0x02, 0x00, 0x60, 0x26, 
+	0xA8, 0xE4, 0x0D, 0x16, 0x42, 0xC2, 0xC9, 0x05, 
+	0x60, 0xCE, 0xF2, 0xED, 0x60, 0xC6, 0x7C, 0xEB, 
+	0xA0, 0x06, 0x10, 0xD6, 0x18, 0xCA, 0x0A, 0x00, 
+	0x20, 0x46, 0x26, 0xE0, 0x04, 0x16, 0xA0, 0xC0, 
+	0x6C, 0x01, 0x12, 0x2E, 0x1D, 0x10, 0x12, 0xC1, 
+	0x05, 0x13, 0x60, 0xC1, 0x6C, 0x01, 0x14, 0x2E, 
+	0x05, 0xC8, 0x6C, 0x01, 0xD2, 0x04, 0x48, 0x06, 
+	0x84, 0x07, 0x02, 0x00, 0x48, 0xC1, 0xA0, 0xC0, 
+	0x6C, 0x01, 0x02, 0xC0, 0xA0, 0x06, 0xA2, 0xD8, 
+	0x60, 0xC5, 0x02, 0xFC, 0x07, 0x02, 0xA2, 0x06, 
+	0x25, 0x02, 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 
+	0x20, 0xC2, 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 
+	0x5C, 0x04, 0x42, 0xC2, 0x29, 0x02, 0x08, 0x00, 
+	0x39, 0xC2, 0x48, 0x02, 0x00, 0xC0, 0x88, 0x02, 
+	0x00, 0xC0, 0x08, 0x16, 0x60, 0x8E, 0x2E, 0xE0, 
+	0x05, 0x16, 0x60, 0x86, 0x2E, 0xE0, 0x02, 0x16, 
+	0xC8, 0x04, 0x5B, 0x04, 0x08, 0x07, 0x5B, 0x04, 
+	0x20, 0x88, 0x8E, 0xE1, 0x6C, 0x01, 0x02, 0x16,  
+	0x60, 0x04, 0xBA, 0xCE, 0x5B, 0x04, 0x88, 0x07,  
+	0xAE, 0x01, 0x20, 0xE8, 0x0E, 0xE0, 0x80, 0x01, 
+	0x08, 0x06, 0xFE, 0x16, 0x20, 0x48, 0x0E, 0xE0, 
+	0x80, 0x01, 0x5B, 0x04, 0xC2, 0x04, 0xA0, 0x23, 
+	0x0C, 0xE0, 0x10, 0x16, 0x20, 0x2F, 0x30, 0x06, 
+	0x82, 0x07, 0xDF, 0xFF, 0x02, 0x2C, 0x82, 0x02, 
+	0xF4, 0x03, 0x06, 0x13, 0xE2, 0x04, 0x02, 0x00, 
+	0xA2, 0xC0, 0x06, 0x00, 0x12, 0x2E, 0xF4, 0x10, 
+	0xA0, 0x43, 0x0C, 0xE0, 0x5B, 0x04, 0x42, 0xC2, 
+	0x88, 0x07, 0x0E, 0x00, 0x09, 0xA2, 0x29, 0x02, 
+	0x08, 0x00, 0x78, 0xCE, 0x78, 0xCE, 0x78, 0xCE, 
+	0x60, 0xCE, 0x6C, 0x09, 0x60, 0xCE, 0x6E, 0x09, 
+	0x60, 0xCE, 0x70, 0x09, 0xA0, 0x23, 0x1A, 0xE0, 
+	0x0F, 0x16, 0x58, 0xC2, 0x49, 0x02, 0x80, 0x1F, 
+	0x60, 0x2A, 0x14, 0xE0, 0xA0, 0xE8, 0x04, 0xE0, 
+	0x0E, 0x00, 0x09, 0xC6, 0x49, 0x02, 0x00, 0x1F, 
+	0xC9, 0x06, 0x09, 0xA2, 0x89, 0xA8, 0x04, 0x00, 
+	0x28, 0x02, 0x02, 0x00, 0x58, 0xC2, 0x49, 0x0A, 
+	0x49, 0x02, 0x00, 0xF0, 0x09, 0xD6, 0xE2, 0x04, 
+	0x06, 0x00, 0x5B, 0x04, 0x00, 0x07, 0x82, 0xC0, 
+	0x53, 0x13, 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0xC1, 
+	0x06, 0xFC, 0x46, 0x02, 0x0F, 0x00, 0x86, 0x02, 
+	0x01, 0x00, 0x3D, 0x12, 0x06, 0x88, 0xF2, 0x06, 
+	0x12, 0x16, 0x01, 0x02, 0x0E, 0xFC, 0x31, 0x88, 
+	0xF4, 0x06, 0x0D, 0x16, 0x31, 0x88, 0xF6, 0x06, 
+	0x0A, 0x16, 0x31, 0x88, 0xF8, 0x06, 0x07, 0x16, 
+	0x86, 0x02, 0x02, 0x00, 0x2C, 0x16, 0x20, 0x88, 
+	0x0A, 0x07, 0xFA, 0x06, 0x28, 0x13, 0x20, 0xC1, 
+	0x6A, 0x09, 0x44, 0x01, 0x00, 0x08, 0x06, 0x13, 
+	0x86, 0x02, 0x02, 0x00, 0x20, 0x16, 0x44, 0x01, 
+	0x80, 0x00, 0x1D, 0x16, 0x00, 0x07, 0xE0, 0x23, 
+	0x14, 0xE0, 0x19, 0x16, 0x82, 0x02, 0x43, 0x00, 
+	0x16, 0x13, 0x00, 0x02, 0x02, 0xFC, 0x40, 0xC0, 
+	0xB0, 0x01, 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 
+	0x01, 0x00, 0x07, 0x16, 0x60, 0xA0, 0x2C, 0x09, 
+	0x60, 0xCC, 0xEE, 0x05, 0x50, 0xC4, 0x20, 0xC4, 
+	0x2C, 0x09, 0x80, 0x07, 0x36, 0x07, 0x81, 0x07, 
+	0x40, 0x00, 0x40, 0x2C, 0xC0, 0x04, 0x84, 0x07, 
+	0xF2, 0x06, 0x06, 0xCD, 0x01, 0x02, 0x0E, 0xFC, 
+	0x31, 0xCD, 0x31, 0xCD, 0x31, 0xCD, 0x20, 0xC5, 
+	0x0A, 0x07, 0x00, 0xC0, 0x01, 0x13, 0x12, 0x2E, 
+	0xE0, 0x04, 0x6C, 0x01, 0x5B, 0x04, 0x60, 0x01, 
+	0x8A, 0x09, 0x00, 0x80, 0x12, 0x13, 0x0B, 0xC8, 
+	0x22, 0x09, 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 
+	0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x08, 0x02, 
+	0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xC2, 
+	0x22, 0x09, 0x5B, 0x04, 0x20, 0x48, 0xAC, 0xE4, 
+	0x80, 0x01, 0x20, 0x48, 0x7E, 0xEB, 0x82, 0x01, 
+	0x20, 0x48, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0x48, 
+	0x22, 0xE0, 0x78, 0x09, 0x60, 0x43, 0x18, 0xE0, 
+	0xA0, 0x43, 0x08, 0xE0, 0x60, 0x01, 0x8A, 0x09, 
+	0x00, 0x80, 0xEB, 0x13, 0x0B, 0xC3, 0x08, 0x02, 
+	0x42, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 0x5C, 0x04, 
+	0x0B, 0xC3, 0x20, 0xE8, 0x0E, 0xE0, 0x82, 0x01, 
+	0x20, 0xE8, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0xE8, 
+	0x22, 0xE0, 0x78, 0x09, 0xA0, 0xE3, 0x08, 0xE0, 
+	0x60, 0xE3, 0x18, 0xE0, 0xA0, 0x43, 0x06, 0xE0, 
+	0x08, 0x02, 0x3C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x5C, 0x04, 0x0B, 0xC3, 0x83, 0x07, 0x00, 0x68, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x83, 0x07, 0x10, 0x80, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x5C, 0x04, 0x0B, 0xC3, 
+	0xA0, 0x06, 0x14, 0xD8, 0x02, 0xA2, 0x68, 0xC2, 
+	0x14, 0x00, 0x29, 0x02, 0xFC, 0xFF, 0x24, 0x13, 
+	0x28, 0x02, 0x18, 0x00, 0x87, 0x07, 0x0E, 0x00, 
+	0x81, 0x07, 0x0E, 0x07, 0xF1, 0x04, 0x47, 0x06, 
+	0xFD, 0x15, 0x58, 0xC0, 0xB0, 0x03, 0x01, 0x78, 
+	0x63, 0x06, 0x41, 0x02, 0x3F, 0x00, 0x0E, 0x13, 
+	0x81, 0x02, 0x1F, 0x00, 0x0B, 0x1B, 0x41, 0xA0, 
+	0x61, 0xC0, 0x86, 0xE4, 0xF8, 0xC1, 0xC7, 0x06, 
+	0xC7, 0x71, 0x47, 0x06, 0x78, 0xCC, 0x47, 0x06, 
+	0xFD, 0x15, 0x04, 0x10, 0x58, 0xC0, 0xC1, 0x06, 
+	0x41, 0x70, 0x01, 0xA2, 0x49, 0xC2, 0xE5, 0x15, 
+	0x5C, 0x04, 0xA0, 0x23, 0x1A, 0xE0, 0x02, 0x13, 
+	0xC8, 0x04, 0x5B, 0x04, 0x22, 0xC2, 0x14, 0x00, 
+	0x48, 0x02, 0x00, 0x1F, 0xC8, 0x06, 0x5B, 0x04, 
+	0x83, 0x02, 0x0F, 0x00, 0x17, 0x1B, 0xA0, 0xC1, 
+	0xD4, 0x06, 0x35, 0x13, 0x26, 0x02, 0x04, 0x00, 
+	0xA0, 0xCD, 0xCE, 0xED, 0x83, 0xC5, 0x04, 0x13, 
+	0x4A, 0xC2, 0x39, 0x0A, 0xC9, 0xE0, 0x83, 0xC5, 
+	0x86, 0x07, 0x36, 0x07, 0x87, 0x07, 0x10, 0x00, 
+	0x20, 0xC2, 0xD4, 0x06, 0xE0, 0x04, 0xD4, 0x06, 
+	0x46, 0x2C, 0x5B, 0x04, 0x60, 0xC0, 0xFE, 0x06, 
+	0x20, 0xC2, 0x6A, 0x09, 0x48, 0x02, 0x00, 0x60, 
+	0x20, 0x22, 0x06, 0xE0, 0x04, 0x16, 0x20, 0xE2, 
+	0x0A, 0xE0, 0x20, 0xE2, 0x18, 0xE0, 0x13, 0x0A, 
+	0x04, 0x18, 0x41, 0x05, 0x03, 0x48, 0xFE, 0x06, 
+	0x06, 0x10, 0x83, 0x02, 0x02, 0x00, 0x01, 0x16, 
+	0x13, 0x09, 0x03, 0xE8, 0xFE, 0x06, 0xC8, 0x40, 
+	0xC1, 0x40, 0x05, 0x13, 0x88, 0x07, 0x36, 0x07, 
+	0x89, 0x07, 0x00, 0x40, 0x48, 0x2C, 0x5B, 0x04, 
+	0xC9, 0x04, 0x24, 0xC1, 0x94, 0xEB, 0x84, 0xC1, 
+	0x86, 0x71, 0x86, 0xA1, 0x26, 0x02, 0x56, 0xEC, 
+	0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xC2, 0xEB, 
+	0x14, 0xD2, 0xC8, 0x09, 0x08, 0xA2, 0xB0, 0x03, 
+	0x34, 0xD8, 0x5F, 0x06, 0x47, 0x02, 0x0F, 0x00, 
+	0xC7, 0xA1, 0x28, 0xC2, 0x82, 0xEB, 0x58, 0x04, 
+	0x76, 0xCD, 0x47, 0x06, 0xFD, 0x16, 0x32, 0x10, 
+	0x36, 0xC2, 0x26, 0x10, 0x17, 0x09, 0x47, 0xA1, 
+	0x2D, 0x10, 0x17, 0x09, 0x47, 0x61, 0x2A, 0x10, 
+	0xA0, 0x43, 0x16, 0xE0, 0x5B, 0x04, 0xA0, 0x43, 
+	0x16, 0xE0, 0x49, 0xC2, 0x03, 0x16, 0x44, 0xC2, 
+	0x06, 0xC8, 0x22, 0x09, 0x27, 0xC1, 0x8E, 0xED, 
+	0x84, 0xC1, 0x86, 0x71, 0x26, 0x02, 0xC4, 0xED, 
+	0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xAA, 0xED, 
+	0xD3, 0x10, 0x09, 0xC1, 0xA0, 0xC1, 0x22, 0x09, 
+	0xC9, 0x04, 0x10, 0x10, 0x36, 0xC2, 0x78, 0xD5,  
+	0x60, 0x41, 0x22, 0xE0, 0xC5, 0x05, 0x0A, 0x10, 
+	0x78, 0xCD, 0x47, 0x06, 0xFD, 0x15, 0x06, 0x10, 
+	0xA0, 0x23, 0x16, 0xE0, 0xCD, 0x16, 0x49, 0xC2, 
+	0xEC, 0x16, 0xD6, 0x10, 0xA0, 0xE3, 0x16, 0xE0, 
+	0xBB, 0x10, 0x08, 0x02, 0x5A, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x44, 0x10, 0xA0, 0x92, 0x0C, 0xE0, 
+	0x15, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x14, 0x16, 
+	0x20, 0x48, 0xAC, 0xE4, 0x80, 0x01, 0xA0, 0x06, 
+	0x72, 0xD7, 0x20, 0xC8, 0x9E, 0x01, 0x9E, 0x01, 
+	0xE0, 0x2E, 0x01, 0x00, 0xA0, 0x43, 0x18, 0xE0, 
+	0xA0, 0xD2, 0x26, 0xE0, 0x83, 0x07, 0x10, 0x00, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xD2, 0xCE, 
+	0x84, 0x07, 0x08, 0x00, 0x60, 0x04, 0x94, 0xCE, 
+	0x85, 0x07, 0x03, 0x02, 0x05, 0xC8, 0xCE, 0x06, 
+	0xA0, 0x43, 0x12, 0xE0, 0xE0, 0x04, 0xFA, 0x06, 
+	0xA0, 0x06, 0xA4, 0xD7, 0x08, 0x02, 0x48, 0x80, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x17, 0x10, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x80, 0x02, 0x16, 0x60, 0x04, 
+	0x9C, 0xD4, 0xA0, 0x27, 0x2C, 0xE0, 0x04, 0x16, 
+	0x08, 0x02, 0x54, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x83, 0x07, 0x00, 0xA8, 0x20, 0x88, 0x08, 0x07, 
+	0x20, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x00, 0xE8, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x08, 0x02, 0x36, 0x00, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 0x0C, 0xE0, 
+	0x82, 0x01, 0xA0, 0x23, 0x18, 0xE0, 0x06, 0x13, 
+	0xA0, 0xE3, 0x18, 0xE0, 0xE0, 0x2E, 0x00, 0x00, 
+	0x41, 0xC0, 0xFA, 0x16, 0xA0, 0x06, 0xE6, 0xD5, 
+	0x82, 0xC0, 0x02, 0x13, 0x4F, 0x02, 0x80, 0xFF, 
+	0xC4, 0x04, 0x0F, 0xD1, 0xC4, 0x06, 0x60, 0x04, 
+	0x94, 0xCE, 0xA0, 0x06, 0x32, 0xDA, 0x08, 0x02, 
+	0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 0x20, 0xDA, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x10, 0x10, 0xA0, 0x06, 
+	0x32, 0xDA, 0x20, 0xD1, 0xCE, 0x06, 0xE6, 0x13, 
+	0x20, 0x78, 0x12, 0xE0, 0xCE, 0x06, 0xE2, 0x10, 
+	0x20, 0xC1, 0x16, 0x04, 0x14, 0x0A, 0xC4, 0x06, 
+	0x0A, 0x91, 0x01, 0x16, 0x5B, 0x04, 0x60, 0x04, 
+	0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 0xAB, 0xE3, 
+	0x65, 0x06, 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 
+	0x60, 0xC1, 0x94, 0x09, 0x02, 0x13, 0x60, 0x04, 
+	0x22, 0xDE, 0x60, 0xD1, 0x0E, 0xE0, 0x3D, 0x10, 
+	0x85, 0x07, 0xBE, 0xEA, 0x35, 0xC8, 0x8A, 0x09, 
+	0x15, 0xC8, 0x8C, 0x09, 0x0B, 0x10, 0xE0, 0x04, 
+	0xA0, 0x09, 0x20, 0xD8, 0x2E, 0x09, 0xA6, 0x09, 
+	0x20, 0xC8, 0xA8, 0x09, 0x8A, 0x09, 0x20, 0xC8, 
+	0xAA, 0x09, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, 
+	0xCA, 0x04, 0xCD, 0x04, 0xCE, 0x04, 0xCF, 0x04, 
+	0xE0, 0x04, 0xA8, 0x06, 0xE0, 0x04, 0xBA, 0x06, 
+	0x84, 0x07, 0xA0, 0x01, 0x85, 0x07, 0x10, 0x00, 
+	0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, 
+	0xD8, 0x06, 0x85, 0x07, 0x34, 0x07, 0x44, 0x61, 
+	0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, 
+	0xC8, 0x00, 0x04, 0xC8, 0x00, 0x07, 0x84, 0x07, 
+	0xFF, 0x7F, 0x04, 0xC8, 0xF0, 0x06, 0x84, 0x07, 
+	0x06, 0x00, 0x04, 0xC8, 0xEE, 0x06, 0x85, 0x07, 
+	0x02, 0x0C, 0x20, 0xC1, 0x8A, 0x09, 0x01, 0x11, 
+	0xC5, 0x06, 0xB0, 0x03, 0x05, 0xD8, 0x65, 0x06, 
+	0x60, 0x04, 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 
+	0xAA, 0xE3, 0x65, 0x06, 0x79, 0x16, 0x60, 0xD1, 
+	0x10, 0xE0, 0xF3, 0x10, 0x60, 0xD1, 0xAB, 0xE3, 
+	0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0xE0, 0x01, 
+	0x80, 0x01, 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 
+	0x80, 0x01, 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 
+	0x2E, 0x09, 0xE3, 0x10, 0x20, 0xF8, 0x19, 0xEE, 
+	0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0xC6, 0x06, 
+	0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x20, 0xC8, 
+	0xC2, 0xEA, 0x90, 0x09, 0xE0, 0x2E, 0x00, 0x00, 
+	0xA0, 0x06, 0xE6, 0xD5, 0x20, 0xC8, 0x6C, 0x09, 
+	0xA0, 0x01, 0x20, 0xC8, 0x6E, 0x09, 0xA2, 0x01, 
+	0x20, 0xC8, 0x70, 0x09, 0xA4, 0x01, 0x20, 0xC8, 
+	0x6E, 0x09, 0xB0, 0x01, 0x20, 0xC8, 0x70, 0x09, 
+	0xB2, 0x01, 0x20, 0xC8, 0x70, 0x09, 0xCC, 0x06, 
+	0x20, 0xF8, 0x18, 0xEE, 0x80, 0x01, 0xB0, 0x03, 
+	0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0x20, 0x98, 
+	0xAA, 0xE3, 0x65, 0x06, 0x3A, 0x13, 0xE0, 0x01, 
+	0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x56, 0xDF, 
+	0xE0, 0xC2, 0x8A, 0x09, 0x05, 0x11, 0xA0, 0x01, 
+	0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x9A, 0xDF, 
+	0x98, 0x06, 0x08, 0x02, 0x12, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x84, 0x07, 0x0A, 0x00, 0x85, 0x07, 
+	0xF4, 0x03, 0x20, 0x88, 0xC6, 0x06, 0x20, 0xE0, 
+	0x08, 0x1B, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
+	0xA5, 0x13, 0x84, 0x07, 0x1C, 0x00, 0x85, 0x07, 
+	0xF8, 0x03, 0xA0, 0x06, 0xA2, 0xD8, 0x85, 0x07, 
+	0x42, 0xDC, 0x05, 0xC8, 0xF8, 0x03, 0x20, 0xC8, 
+	0xA0, 0x09, 0xA0, 0x09, 0x6C, 0x16, 0x20, 0xE8, 
+	0x9C, 0x09, 0xFE, 0x03, 0x20, 0xE8, 0x9E, 0x09, 
+	0x06, 0x04, 0xA0, 0x23, 0x0C, 0xE0, 0x32, 0x13, 
+	0xA0, 0xE3, 0x0C, 0xE0, 0xA0, 0x2E, 0xF4, 0x03, 
+	0x2D, 0x10, 0xA0, 0x06, 0x56, 0xDF, 0x60, 0x01, 
+	0x8E, 0x09, 0x00, 0x40, 0x08, 0x13, 0x08, 0x02, 
+	0x6C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x22, 0x10, 
+	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x40, 0x08, 0x02, 
+	0x60, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x84, 0x07, 
+	0x2A, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xA0, 0x06, 
+	0xA2, 0xD8, 0xD5, 0x10, 0xB0, 0x03, 0x20, 0x98, 
+	0xAA, 0xE3, 0x65, 0x06, 0x0F, 0x16, 0x20, 0x06, 
+	0x90, 0x09, 0x9A, 0x16, 0x60, 0x01, 0x8A, 0x09, 
+	0x00, 0x40, 0x39, 0x13, 0xE0, 0x04, 0x8A, 0x09, 
+	0xE0, 0x04, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, 
+	0x60, 0x04, 0x62, 0xDA, 0x60, 0x04, 0xB0, 0xCE, 
+	0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, 
+	0xF9, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x04, 0x16, 
+	0x20, 0x06, 0xC6, 0x06, 0x9A, 0x16, 0x0A, 0x10, 
+	0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, 
+	0xED, 0x16, 0x20, 0x06, 0xC8, 0x06, 0x02, 0x13, 
+	0x60, 0x04, 0x5A, 0xDB, 0x60, 0x01, 0x8E, 0x09, 
+	0x00, 0x01, 0x02, 0x16, 0xCE, 0x01, 0x03, 0x00, 
+	0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0x83, 0x07, 
+	0x00, 0x82, 0x07, 0x10, 0x83, 0x07, 0x01, 0x00, 
+	0xE0, 0x04, 0x8E, 0x09, 0x20, 0xE8, 0x0C, 0xE0, 
+	0x82, 0x01, 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x01, 
+	0x8A, 0x09, 0x00, 0x40, 0xC7, 0x16, 0x83, 0x07, 
+	0x0D, 0x00, 0xF2, 0x10, 0xB0, 0x03, 0x20, 0x98, 
+	0xAA, 0xE3, 0x65, 0x06, 0xC7, 0x16, 0x20, 0x88, 
+	0x98, 0x09, 0x20, 0xE0, 0xF0, 0x16, 0x22, 0xC8, 
+	0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 0x10, 0x00, 
+	0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, 0xE0, 0x06, 
+	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x08, 0x02, 
+	0x66, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB2, 0x10, 
+	0xA0, 0x07, 0x9A, 0x09, 0x5A, 0x00, 0xA0, 0x07, 
+	0xA2, 0x09, 0x19, 0x00, 0xA0, 0x07, 0xA4, 0x09, 
+	0x05, 0x00, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x20, 
+	0xE0, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x08, 0x02, 
+	0x78, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB0, 0x03, 
+	0x20, 0x98, 0xAB, 0xE3, 0x65, 0x06, 0x9A, 0x16, 
+	0x08, 0x02, 0x72, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x06, 
+	0xD0, 0xD5, 0x20, 0x06, 0x9A, 0x09, 0xBF, 0x13, 
+	0x84, 0x07, 0x2C, 0x00, 0x85, 0x07, 0xF4, 0x03, 
+	0xA0, 0x06, 0xA2, 0xD8, 0x60, 0x04, 0xC0, 0xDB, 
+	0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 0x82, 0x10, 
+	0x0E, 0x01, 0x03, 0x00, 0x0A, 0x13, 0x08, 0x02, 
+	0x0C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xE3, 
+	0x14, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, 
+	0x26, 0x10, 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 
+	0xE0, 0x2E, 0x01, 0x00, 0x60, 0xC1, 0x1E, 0x09, 
+	0x35, 0x0A, 0x05, 0xE8, 0x82, 0x01, 0x20, 0xC1, 
+	0x6A, 0x09, 0x04, 0x01, 0x06, 0x00, 0x06, 0x13, 
+	0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 0x20, 0xD8, 
+	0xD0, 0xE1, 0x83, 0x01, 0x20, 0x21, 0x22, 0xE0, 
+	0x03, 0x16, 0x20, 0xE8, 0x22, 0xE0, 0x80, 0x01, 
+	0x20, 0x21, 0x04, 0xE0, 0x04, 0x16, 0xA0, 0xE3, 
+	0x14, 0xE0, 0x60, 0x04, 0x0A, 0xD3, 0x08, 0x02, 
+	0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 
+	0x08, 0xE0, 0x82, 0x01, 0xE0, 0xC2, 0x8A, 0x09, 
+	0x02, 0x11, 0x60, 0x04, 0xB0, 0xCE, 0xA0, 0x01, 
+	0x8E, 0x09, 0x00, 0x04, 0x6B, 0x10, 0x20, 0xC8, 
+	0xAE, 0xE4, 0x86, 0x01, 0x08, 0x02, 0x00, 0x80, 
+	0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC2, 0x1E, 0x09, 
+	0x08, 0xA2, 0x08, 0x05, 0x28, 0xC8, 0x22, 0xE0, 
+	0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xC6, 0x06, 
+	0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x60, 0xE3, 
+	0x16, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x44, 0xC1, 
+	0x44, 0x02, 0x00, 0x5E, 0xF8, 0x16, 0x60, 0x25, 
+	0xA8, 0xE4, 0x0F, 0x16, 0x20, 0x06, 0xC6, 0x06, 
+	0xF2, 0x16, 0x20, 0x06, 0xCA, 0x06, 0x03, 0x13, 
+	0xA0, 0x05, 0xCC, 0x06, 0xE6, 0x10, 0xB0, 0x03, 
+	0x20, 0xD8, 0x0C, 0xE0, 0x65, 0x06, 0x60, 0x04, 
+	0xD2, 0xCE, 0x20, 0x06, 0xC8, 0x06, 0xE3, 0x16, 
+	0x20, 0x88, 0x70, 0x09, 0xCC, 0x06, 0x03, 0x16, 
+	0x83, 0x07, 0x08, 0x00, 0x02, 0x10, 0x83, 0x07, 
+	0x0C, 0x00, 0x60, 0x04, 0x8A, 0xDC, 0x60, 0x04, 
+	0xD2, 0xCE, 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x13, 
+	0x60, 0x23, 0x12, 0xE0, 0x06, 0x16, 0xB0, 0x03, 
+	0x20, 0xD8, 0xA9, 0xE3, 0x65, 0x06, 0x60, 0x04, 
+	0xD2, 0xCE, 0x08, 0x02, 0x00, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x60, 0x04, 0xB0, 0xCE, 0x08, 0x02, 
+	0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC8, 
+	0x1E, 0xE0, 0xC6, 0x06, 0x20, 0xC8, 0x1E, 0xE0, 
+	0xC8, 0x06, 0x60, 0xE3, 0x10, 0xE0, 0x60, 0x04, 
+	0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 0x30, 0x13, 
+	0x44, 0xC1, 0x44, 0x02, 0x00, 0x1E, 0xF5, 0x16, 
+	0x60, 0x25, 0xA8, 0xE4, 0x1D, 0x16, 0x20, 0x06, 
+	0xC8, 0x06, 0xEF, 0x16, 0x60, 0x01, 0x8E, 0x09, 
+	0x00, 0x80, 0x13, 0x16, 0x60, 0x01, 0x8E, 0x09, 
+	0x00, 0x01, 0x0C, 0x16, 0xA0, 0x01, 0x8E, 0x09, 
+	0x00, 0x01, 0xA0, 0x01, 0x8E, 0x09, 0x80, 0x00, 
+	0xA0, 0x43, 0x04, 0xE0, 0x83, 0x07, 0x18, 0x68, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 0xAE, 0xE4, 
+	0x86, 0x01, 0xC2, 0x04, 0x60, 0x04, 0x2C, 0xE4, 
+	0x08, 0x02, 0x1E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x07, 0x10, 0x20, 0x06, 0xC6, 0x06, 0xCD, 0x16, 
+	0x83, 0x07, 0x09, 0x00, 0xA0, 0x06, 0x8A, 0xDC, 
+	0x60, 0x04, 0xB0, 0xCE, 0xCE, 0x04, 0xE0, 0x04, 
+	0x2A, 0x09, 0xE0, 0xD3, 0xAA, 0xE3, 0x8F, 0xC2, 
+	0x20, 0xC8, 0xB0, 0xE4, 0x86, 0x01, 0x20, 0x48, 
+	0x08, 0xE0, 0x82, 0x01, 0x86, 0x07, 0x05, 0x00, 
+	0x84, 0x07, 0x72, 0x06, 0x54, 0xC1, 0x01, 0x13, 
+	0xD4, 0x2C, 0x24, 0x02, 0x0A, 0x00, 0x06, 0x06, 
+	0xF9, 0x16, 0x08, 0x02, 0x2A, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x20, 0x2C, 0x1A, 0xE0, 0x60, 0x04, 
+	0x50, 0xCD, 0xA0, 0x06, 0x3E, 0xD7, 0xCD, 0x04, 
+	0xA0, 0x23, 0x1C, 0xE0, 0x0D, 0x13, 0x0E, 0x01, 
+	0x03, 0x00, 0x0A, 0x13, 0xA0, 0xE3, 0x1C, 0xE0, 
+	0xB0, 0x03, 0x20, 0xD8, 0x10, 0xE0, 0x65, 0x06, 
+	0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 0x08, 0x10, 
+	0x20, 0x2D, 0x01, 0x00, 0xE0, 0xC0, 0x2A, 0x09, 
+	0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0xD2, 0xAB, 0xE3, 
+	0x60, 0x04, 0xD2, 0xCE, 0xA0, 0x01, 0x80, 0x01, 
+	0x00, 0x01, 0xE0, 0x01, 0x80, 0x01, 0x00, 0xAC, 
+	0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 0xE0, 0x01, 
+	0x82, 0x01, 0x00, 0x08, 0x88, 0x07, 0xAE, 0x01, 
+	0x08, 0x06, 0xFE, 0x16, 0x60, 0x01, 0x8E, 0x09, 
+	0x00, 0x02, 0x03, 0x16, 0xA0, 0x01, 0x80, 0x01, 
+	0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 0x80, 0x01, 
+	0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 0x2E, 0x09, 
+	0xA0, 0x07, 0x9E, 0x09, 0x00, 0x10, 0x5B, 0x04, 
+	0x20, 0xD8, 0xA6, 0x09, 0x2E, 0x09, 0xE0, 0x01, 
+	0x80, 0x01, 0x00, 0x04, 0xE0, 0x01, 0x82, 0x01, 
+	0x00, 0x08, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 
+	0x20, 0xC2, 0x30, 0x09, 0x03, 0x13, 0xE0, 0x01, 
+	0x82, 0x01, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01, 
+	0x00, 0xA1, 0x20, 0xF8, 0x2E, 0x09, 0x80, 0x01, 
+	0x88, 0x07, 0xAE, 0x01, 0x08, 0x06, 0xFE, 0x16, 
+	0xA0, 0x01, 0x80, 0x01, 0x00, 0x0C, 0xE0, 0x04, 
+	0x9E, 0x01, 0xE0, 0x04, 0x9C, 0x09, 0xE0, 0x04, 
+	0x9E, 0x09, 0x5B, 0x04, 0x20, 0x01, 0xA8, 0x09, 
+	0x00, 0x80, 0x11, 0x13, 0xE0, 0x93, 0x26, 0xE0, 
+	0x0E, 0x16, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
+	0x0A, 0x13, 0x08, 0x02, 0x84, 0x80, 0x00, 0x00, 
+	0x00, 0xE0, 0xDC, 0x0F, 0xA0, 0x06, 0xDA, 0xD4, 
+	0x20, 0x48, 0x08, 0xE0, 0x82, 0x01, 0x02, 0x10, 
+	0x60, 0x04, 0x70, 0xDA, 0x60, 0x04, 0xBA, 0xCE, 
+	0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x19, 0x13, 
+	0x83, 0x07, 0x80, 0x80, 0xE0, 0x23, 0x14, 0xE0, 
+	0x02, 0x13, 0x83, 0x07, 0x0A, 0x00, 0x60, 0x04, 
+	0xC6, 0xCE, 0x20, 0xC1, 0x06, 0x06, 0x0D, 0x13, 
+	0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x09, 0x13, 
+	0x83, 0x07, 0x0B, 0x00, 0xE0, 0x23, 0x14, 0xE0, 
+	0x02, 0x16, 0x83, 0x07, 0x01, 0x80, 0x60, 0x04, 
+	0xC6, 0xCE, 0x83, 0x07, 0x0A, 0x80, 0x60, 0x04, 
+	0xB4, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
+	0x06, 0x16, 0xA0, 0x06, 0xA8, 0xE5, 0x47, 0x10, 
+	0xD0, 0x03, 0x60, 0x04, 0xB0, 0xD3, 0xE0, 0x93, 
+	0x0E, 0xE0, 0x5E, 0x13, 0xE0, 0x93, 0x10, 0xE0, 
+	0x17, 0x13, 0xE0, 0x23, 0x14, 0xE0, 0x04, 0x13,  
+	0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 0xC6, 0xCE, 
+	0x83, 0x07, 0x00, 0xA0, 0xA0, 0x06, 0x2A, 0xD8,  
+	0x83, 0x07, 0x00, 0x48, 0xA0, 0x06, 0x2A, 0xD8, 
+	0xA0, 0xD2, 0x10, 0xE0, 0x20, 0xC8, 0x1C, 0xE0, 
+	0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 
+	0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 0x4E, 0x80, 
+	0xA0, 0x06, 0xDA, 0xD4, 0xA0, 0x23, 0x1C, 0xE0, 
+	0x20, 0x13, 0x20, 0x88, 0x6C, 0x09, 0x0E, 0x07, 
+	0x1C, 0x16, 0x20, 0x88, 0x6E, 0x09, 0x10, 0x07, 
+	0x18, 0x16, 0x20, 0x88, 0x70, 0x09, 0x12, 0x07, 
+	0x14, 0x16, 0x20, 0x88, 0x0A, 0x07, 0x22, 0xE0, 
+	0x10, 0x13, 0x20, 0x06, 0xCA, 0x06, 0x38, 0x16, 
+	0xA0, 0xE3, 0x20, 0xE0, 0x06, 0x10, 0xE0, 0x23, 
+	0x14, 0xE0, 0xCA, 0x16, 0xA0, 0xE3, 0x22, 0xE0, 
+	0xC2, 0x04, 0xA0, 0xD2, 0xAA, 0xE3, 0x60, 0x04, 
+	0xBA, 0xCE, 0x20, 0xC8, 0x1C, 0xE0, 0xCA, 0x06, 
+	0xA0, 0x88, 0xDC, 0x06, 0x0E, 0x00, 0x10, 0x16, 
+	0xA0, 0x88, 0xDE, 0x06, 0x10, 0x00, 0x0C, 0x16, 
+	0xA0, 0x88, 0xE0, 0x06, 0x12, 0x00, 0x08, 0x16, 
+	0x20, 0x06, 0xCC, 0x06, 0x19, 0x16, 0x20, 0xE8, 
+	0x0E, 0xE0, 0x82, 0x01, 0xA0, 0xE3, 0x1E, 0xE0, 
+	0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 0x10, 0x10, 
+	0xA0, 0x23, 0x10, 0xE0, 0x08, 0x16, 0x64, 0xC1, 
+	0x06, 0x00, 0x60, 0x21, 0x0C, 0xE0, 0x08, 0x13, 
+	0xA0, 0xD2, 0xA8, 0xE3, 0x05, 0x10, 0x20, 0x88, 
+	0x0A, 0x07, 0x08, 0x07, 0x96, 0x12, 0x00, 0x10, 
+	0x60, 0x04, 0xBA, 0xCE, 0x60, 0x01, 0x8E, 0x09, 
+	0x00, 0x80, 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 
+	0xE0, 0x93, 0x0E, 0xE0, 0x50, 0x13, 0xE0, 0x93, 
+	0xA9, 0xE3, 0x4D, 0x13, 0xE0, 0x93, 0xA8, 0xE3, 
+	0x1C, 0x13, 0xA0, 0x06, 0xA4, 0xD7, 0xA0, 0x23, 
+	0x10, 0xE0, 0x45, 0x13, 0xA0, 0x23, 0x08, 0xE0, 
+	0x06, 0x16, 0x60, 0xE3, 0x1E, 0xE0, 0x20, 0xC8, 
+	0x22, 0xE0, 0x06, 0x07, 0x34, 0x10, 0xE0, 0x23, 
+	0x14, 0xE0, 0x31, 0x16, 0x60, 0xC1, 0x6A, 0x09, 
+	0x60, 0x21, 0x12, 0xE0, 0x2C, 0x16, 0xA0, 0x06, 
+	0x0E, 0xE2, 0x31, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 
+	0x2E, 0x10, 0xA0, 0xE3, 0x12, 0xE0, 0xA0, 0x06, 
+	0x0E, 0xE2, 0x64, 0xC1, 0x06, 0x00, 0x60, 0x21, 
+	0x0C, 0xE0, 0x25, 0x13, 0x20, 0x88, 0x0E, 0x07, 
+	0xDC, 0x06, 0x14, 0x16, 0x20, 0x88, 0x10, 0x07, 
+	0xDE, 0x06, 0x10, 0x16, 0x20, 0x88, 0x12, 0x07, 
+	0xE0, 0x06, 0x0C, 0x16, 0x20, 0x98, 0xCE, 0x06, 
+	0xCF, 0x06, 0x15, 0x13, 0x20, 0x06, 0xCE, 0x06, 
+	0x12, 0x16, 0x60, 0xE3, 0x1A, 0xE0, 0xA0, 0xD2, 
+	0x0C, 0xE0, 0x0D, 0x10, 0x60, 0xE3, 0x1E, 0xE0,  
+	0x20, 0xC8, 0x32, 0xE0, 0x06, 0x07, 0xA0, 0x06, 
+	0x3E, 0xD7, 0x08, 0x02, 0x48, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0xA0, 0xD2, 0xA9, 0xE3, 0x60, 0x04, 
+	0xBA, 0xCE, 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 
+	0xC9, 0x1A, 0x0B, 0x1B, 0x22, 0x88, 0x10, 0x00, 
+	0x6E, 0x09, 0xC4, 0x1A, 0x06, 0x1B, 0x22, 0x88, 
+	0x12, 0x00, 0x70, 0x09, 0xBF, 0x1A, 0x01, 0x1B, 
+	0x5B, 0x04, 0x60, 0xC1, 0x6C, 0x01, 0x85, 0x02, 
+	0x43, 0x00, 0xE1, 0x13, 0xE0, 0x93, 0xA8, 0xE3, 
+	0xDE, 0x16, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, 
+	0x84, 0x07, 0x0E, 0x00, 0x42, 0xC1, 0xA0, 0xC0, 
+	0x6C, 0x01, 0x02, 0xC0, 0x25, 0x02, 0x48, 0x00, 
+	0x81, 0x07, 0x60, 0xE2, 0x83, 0x07, 0x14, 0xAE, 
+	0x60, 0x04, 0x9E, 0xE5, 0x02, 0x02, 0x00, 0xFC, 
+	0xCA, 0x10, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 
+	0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 0xA0, 0x06, 
+	0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 0x20, 0x98, 
+	0x0E, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 
+	0xA8, 0xE3, 0x65, 0x06, 0xE0, 0x93, 0xA9, 0xE3, 
+	0x0D, 0x13, 0xA0, 0x23, 0x08, 0xE0, 0x19, 0x16, 
+	0xA0, 0x23, 0x10, 0xE0, 0x16, 0x13, 0x60, 0xE3, 
+	0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, 
+	0xA0, 0x06, 0x3E, 0xD7, 0xA0, 0x43, 0x18, 0xE0, 
+	0xE0, 0x2E, 0x01, 0x00, 0xA0, 0xD2, 0x26, 0xE0, 
+	0x83, 0x07, 0x10, 0x00, 0xA0, 0x06, 0x2A, 0xD8, 
+	0xE0, 0x23, 0x14, 0xE0, 0x02, 0x16, 0xA0, 0x06, 
+	0x18, 0xD7, 0xA0, 0x43, 0x2C, 0xE0, 0x20, 0xC8, 
+	0x20, 0xE0, 0x24, 0x09, 0x60, 0x04, 0xBA, 0xCE, 
+	0xA0, 0x06, 0xA8, 0xE5, 0x01, 0x10, 0x03, 0x10, 
+	0x20, 0x07, 0xA0, 0x09, 0x03, 0x10, 0xA0, 0x07, 
+	0xA2, 0x09, 0x19, 0x00, 0x60, 0x04, 0xBA, 0xCE, 
+	0xA0, 0x43, 0x0E, 0xE0, 0xA0, 0xC1, 0x24, 0x09, 
+	0x02, 0x13, 0x20, 0x06, 0x24, 0x09, 0xE0, 0x23, 
+	0x14, 0xE0, 0x03, 0x13, 0xA0, 0x23, 0x08, 0xE0, 
+	0x29, 0x16, 0x20, 0xC2, 0x8A, 0x09, 0xE4, 0x11, 
+	0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 
+	0xA0, 0x23, 0x08, 0xE0, 0x1F, 0x16, 0xA0, 0x23, 
+	0x10, 0xE0, 0x0A, 0x16, 0x22, 0xC1, 0x02, 0x00, 
+	0x20, 0x25, 0xA8, 0xE4, 0x23, 0x16, 0x83, 0x07, 
+	0x20, 0x80, 0xA0, 0x06, 0x2A, 0xD8, 0x12, 0x10, 
+	0xA0, 0x06, 0x3E, 0xD7, 0xE0, 0x23, 0x14, 0xE0, 
+	0x02, 0x16, 0xA0, 0x06, 0x18, 0xD7, 0x60, 0xE3, 
+	0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, 
+	0xA0, 0x23, 0x08, 0xE0, 0x03, 0x16, 0xA0, 0x23, 
+	0x06, 0xE0, 0x51, 0x13, 0x20, 0x98, 0x0E, 0xE0, 
+	0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 0xA8, 0xE3, 
+	0x65, 0x06, 0x22, 0xC1, 0x02, 0x00, 0x20, 0x25, 
+	0xA8, 0xE4, 0x0E, 0x13, 0x83, 0x07, 0x20, 0x00, 
+	0xA0, 0x06, 0x2A, 0xD8, 0x22, 0xC8, 0x0E, 0x00, 
+	0xE6, 0x06, 0x22, 0xC8, 0x10, 0x00, 0xE8, 0x06, 
+	0x22, 0xC8, 0x12, 0x00, 0xEA, 0x06, 0x37, 0x10, 
+	0x22, 0x88, 0x0E, 0x00, 0xDC, 0x06, 0x08, 0x16, 
+	0x22, 0x88, 0x10, 0x00, 0xDE, 0x06, 0x04, 0x16, 
+	0x22, 0x88, 0x12, 0x00, 0xE0, 0x06, 0x0B, 0x13, 
+	0x22, 0xC8, 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 
+	0x10, 0x00, 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00,  
+	0xE0, 0x06, 0x60, 0xE3, 0x14, 0xE0, 0xA0, 0x23, 
+	0x0E, 0xE0, 0x08, 0x16, 0xA0, 0xC1, 0x24, 0x09, 
+	0x1A, 0x16, 0x86, 0x07, 0x00, 0x10, 0x06, 0xE8, 
+	0xD2, 0x06, 0x15, 0x10, 0xA0, 0xE3, 0x0E, 0xE0, 
+	0xA0, 0x23, 0x08, 0xE0, 0x09, 0x16, 0xA0, 0xE3, 
+	0x06, 0xE0, 0xE0, 0x04, 0xE6, 0x06, 0xE0, 0x04, 
+	0xE8, 0x06, 0xE0, 0x04, 0xEA, 0x06, 0x07, 0x10, 
+	0x08, 0x02, 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 
+	0x36, 0xD3, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 
+	0xBA, 0xCE, 0x20, 0x98, 0x65, 0x06, 0x10, 0xE0, 
+	0x03, 0x16, 0x20, 0xD8, 0x0E, 0xE0, 0x65, 0x06, 
+	0x60, 0x04, 0xBA, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 
+	0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 0x2E, 0x10, 
+	0xB0, 0x03, 0x20, 0x98, 0xA9, 0xE3, 0x6F, 0x06, 
+	0x19, 0x16, 0x24, 0xC2, 0x08, 0x00, 0x16, 0x11, 
+	0xE0, 0xE3, 0x14, 0xE0, 0x83, 0x07, 0x00, 0x00, 
+	0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x23, 0x14, 0xE0, 
+	0x04, 0x13, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, 
+	0xDA, 0xD4, 0x08, 0x02, 0x1E, 0x00, 0xA0, 0x06, 
+	0xDA, 0xD4, 0xA0, 0x23, 0x08, 0xE0, 0x02, 0x13, 
+	0xA0, 0x06, 0x18, 0xD7, 0x82, 0xC0, 0x02, 0x16, 
+	0x60, 0x04, 0xD2, 0xCE, 0x20, 0xE8, 0x1C, 0xEE, 
+	0xF0, 0x06, 0x20, 0x99, 0x0E, 0xE0, 0x16, 0x00, 
+	0x05, 0x16, 0xE0, 0x04, 0xEC, 0x06, 0x20, 0x48, 
+	0x14, 0xE0, 0xF0, 0x06, 0x83, 0x07, 0x01, 0x00, 
+	0x60, 0x04, 0xB4, 0xCE, 0x64, 0xC2, 0x14, 0x00, 
+	0x24, 0x02, 0x18, 0x00, 0xC4, 0xC1, 0xC2, 0x61, 
+	0x27, 0x02, 0xFC, 0xFF, 0x74, 0xC1, 0x85, 0xC1, 
+	0x45, 0x71, 0x85, 0x02, 0x27, 0x00, 0x46, 0x16, 
+	0x54, 0xC1, 0x45, 0x02, 0xCF, 0xFF, 0x42, 0x16, 
+	0xC8, 0x04, 0x64, 0xC1, 0x08, 0x00, 0x06, 0x15, 
+	0x05, 0x13, 0x24, 0xC2, 0x0E, 0x00, 0x48, 0x02, 
+	0x00, 0x1F, 0xC8, 0x06, 0x28, 0x02, 0x11, 0x00, 
+	0x04, 0xA2, 0x18, 0x98, 0x21, 0xEE, 0x32, 0x16, 
+	0x42, 0xC1, 0x25, 0x02, 0x04, 0x00, 0x47, 0x65, 
+	0x35, 0xC2, 0x74, 0xCD, 0x48, 0x06, 0xFD, 0x15, 
+	0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC1, 0x04, 0xC8, 
+	0x6C, 0x01, 0xA0, 0xC1, 0x00, 0xFC, 0x05, 0x13, 
+	0x20, 0xC8, 0x80, 0xEB, 0x02, 0xFC, 0x06, 0xC1, 
+	0xF6, 0x10, 0x20, 0xC8, 0x00, 0xEE, 0x02, 0xFC, 
+	0x02, 0xC8, 0x6C, 0x01, 0x81, 0x07, 0x08, 0xE5, 
+	0x04, 0xC0, 0x83, 0x07, 0x10, 0x02, 0x84, 0x07, 
+	0x0E, 0x00, 0x3B, 0x10, 0x84, 0x07, 0x0C, 0x00, 
+	0xE2, 0xC0, 0x08, 0x00, 0x05, 0x02, 0x00, 0xFC, 
+	0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x95, 0xC1, 
+	0x30, 0x13, 0xD5, 0x04, 0x16, 0x2E, 0x02, 0xC8, 
+	0x6C, 0x01, 0x2B, 0x10, 0xA0, 0xC8, 0x22, 0xEE, 
+	0x0E, 0x00, 0xA0, 0xC8, 0x24, 0xEE, 0x10, 0x00, 
+	0xA0, 0xC8, 0x26, 0xEE, 0x12, 0x00, 0x83, 0x07, 
+	0x06, 0x80, 0x60, 0x04, 0xB4, 0xCE, 0x60, 0x04, 
+	0xD2, 0xCE, 0x84, 0x07, 0x10, 0x00, 0x85, 0x07, 
+	0x34, 0x00, 0x09, 0x10, 0x84, 0x07, 0x12, 0x00, 
+	0x85, 0x07, 0x32, 0x00, 0x04, 0x10, 0x84, 0x07, 
+	0x14, 0x00, 0x85, 0x07, 0x38, 0x00, 0xA0, 0x06, 
+	0xC2, 0xD5, 0x85, 0xC8, 0x04, 0x00, 0xA0, 0x06, 
+	0x10, 0xD6, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, 
+	0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x48, 0x06, 
+	0x48, 0xC1, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, 
+	0xA2, 0x06, 0x60, 0xC5, 0x02, 0xFC, 0x25, 0x02, 
+	0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 0x20, 0xC2, 
+	0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 0x60, 0x04, 
+	0xB0, 0xCE, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, 
+	0xB4, 0x06, 0xEF, 0x10, 0x22, 0x88, 0x12, 0x00, 
+	0x70, 0x09, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, 
+	0x6E, 0x09, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, 
+	0x6C, 0x09, 0x0E, 0x13, 0x22, 0x88, 0x12, 0x00, 
+	0xE0, 0x06, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, 
+	0xDE, 0x06, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, 
+	0xDC, 0x06, 0x01, 0x13, 0xCB, 0x05, 0xCB, 0x05, 
+	0x5B, 0x04, 0x0B, 0xC3, 0x00, 0x03, 0x02, 0x00, 
+	0x82, 0x07, 0xC0, 0x00, 0x20, 0xC8, 0x0C, 0x00, 
+	0xC0, 0x00, 0x20, 0xC8, 0x0E, 0x00, 0xC2, 0x00, 
+	0x20, 0xC8, 0x10, 0x00, 0xC4, 0x00, 0x20, 0xC8, 
+	0x12, 0x00, 0xC6, 0x00, 0x20, 0xC8, 0x14, 0x00, 
+	0xC8, 0x00, 0x20, 0xC8, 0x16, 0x00, 0xCA, 0x00, 
+	0x20, 0xC8, 0x04, 0x00, 0xCC, 0x00, 0x20, 0xC8, 
+	0x06, 0x00, 0xCE, 0x00, 0x02, 0xC8, 0x0C, 0x00, 
+	0xA0, 0x07, 0x0E, 0x00, 0x7E, 0xE6, 0x02, 0xC8, 
+	0x10, 0x00, 0xA0, 0x07, 0x12, 0x00, 0x88, 0xE6, 
+	0x02, 0xC8, 0x14, 0x00, 0xA0, 0x07, 0x16, 0x00, 
+	0xB8, 0xE6, 0x02, 0xC8, 0x04, 0x00, 0xA0, 0x07, 
+	0x06, 0x00, 0xCE, 0xE6, 0x60, 0x01, 0x1C, 0x01, 
+	0x04, 0x00, 0x09, 0x16, 0xE0, 0x01, 0x40, 0x01, 
+	0x00, 0x08, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 
+	0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xA0, 0x06, 
+	0x8E, 0xE9, 0x05, 0x02, 0x00, 0x80, 0x05, 0xD8, 
+	0x80, 0x04, 0xC7, 0x04, 0x00, 0x03, 0x0F, 0x00, 
+	0x88, 0x07, 0x00, 0x10, 0x09, 0x02, 0x00, 0x20, 
+	0x8A, 0x07, 0xE6, 0xE6, 0x03, 0x02, 0x3E, 0xE6, 
+	0x5A, 0x04, 0x00, 0x03, 0x00, 0x00, 0x20, 0xD2, 
+	0x87, 0x01, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00, 
+	0x20, 0xC2, 0x8A, 0x01, 0x08, 0x02, 0x00, 0x1A, 
+	0x60, 0xC2, 0xAE, 0x00, 0x48, 0xDA, 0x80, 0x04, 
+	0x89, 0x05, 0x89, 0x02, 0x06, 0x00, 0x07, 0x15, 
+	0x88, 0x07, 0x00, 0x80, 0x48, 0xDA, 0x80, 0x04, 
+	0x09, 0xC8, 0xAE, 0x00, 0x80, 0x03, 0xE0, 0x02, 
+	0xA0, 0x00, 0x5C, 0x04, 0x00, 0x03, 0x00, 0x00, 
+	0x60, 0x01, 0x9C, 0x01, 0x20, 0x00, 0xE2, 0x13, 
+	0x20, 0xC2, 0x8C, 0x01, 0x08, 0x02, 0x00, 0x1C, 
+	0xE3, 0x10, 0x00, 0x03, 0x00, 0x00, 0x60, 0x01,  
+	0x40, 0x01, 0x00, 0x40, 0xEC, 0x16, 0xA0, 0x01,  
+	0x40, 0x01, 0x00, 0x40, 0x08, 0x02, 0x00, 0x02, 
+	0xD7, 0x10, 0xB3, 0xC0, 0x92, 0x06, 0xFD, 0x10, 
+	0xB3, 0xC0, 0x48, 0xC0, 0x72, 0xCC, 0x72, 0xCC, 
+	0x32, 0xC1, 0x44, 0xCC, 0x72, 0xDC, 0x04, 0x06, 
+	0xFD, 0x16, 0x5B, 0x04, 0x48, 0xC0, 0x02, 0x02, 
+	0xD0, 0xE9, 0x84, 0x07, 0x06, 0x00, 0xF6, 0x10, 
+	0x02, 0x02, 0x1E, 0xE6, 0x49, 0xC0, 0x84, 0x07, 
+	0x06, 0x00, 0xF0, 0x10, 0xB3, 0xC0, 0x32, 0xC1, 
+	0x01, 0x02, 0x01, 0x00, 0x44, 0xD0, 0xC1, 0x06, 
+	0x44, 0x02, 0xFF, 0x00, 0xE7, 0x10, 0x33, 0xC1, 
+	0x73, 0xC0, 0x44, 0xD1, 0x44, 0x02, 0xFF, 0x00, 
+	0x45, 0xDC, 0x04, 0x06, 0xFD, 0x16, 0x5A, 0x04, 
+	0xA0, 0x06, 0x0E, 0xE9, 0x33, 0xC8, 0x9E, 0x01, 
+	0x5A, 0x04, 0xA0, 0x06, 0x0C, 0xE7, 0x89, 0xC1, 
+	0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 
+	0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 0x66, 0x02,  
+	0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 0xC2, 0x04,  
+	0xC7, 0xC1, 0x03, 0x16, 0x02, 0x06, 0xFC, 0x16,  
+	0x4D, 0x10, 0x5A, 0x04, 0xA0, 0x06, 0x58, 0xE8, 
+	0x89, 0xC1, 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 
+	0x06, 0xC8, 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 
+	0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 
+	0x33, 0xC8, 0x9E, 0x01, 0xE8, 0x10, 0x33, 0x8A, 
+	0x02, 0x00, 0x38, 0x16, 0x73, 0x8A, 0x02, 0x00, 
+	0x35, 0x16, 0x5A, 0x04, 0x20, 0x8A, 0xCA, 0xE9, 
+	0x02, 0x00, 0x30, 0x16, 0x60, 0x8A, 0xCE, 0xE9, 
+	0x02, 0x00, 0x2C, 0x16, 0x82, 0x07, 0x74, 0xEA, 
+	0x01, 0x10, 0xB3, 0xC0, 0x04, 0x02, 0x80, 0x04, 
+	0x52, 0xD1, 0x03, 0x13, 0x32, 0x9D, 0x22, 0x16, 
+	0xFB, 0x10, 0x85, 0x07, 0x00, 0x80, 0x05, 0xD8, 
+	0x80, 0x04, 0xC7, 0x04, 0x5A, 0x04, 0x20, 0xC8, 
+	0xC0, 0x00, 0x0C, 0x00, 0x20, 0xC8, 0xC2, 0x00, 
+	0x0E, 0x00, 0x20, 0xC8, 0xC4, 0x00, 0x10, 0x00, 
+	0x20, 0xC8, 0xC6, 0x00, 0x12, 0x00, 0x20, 0xC8, 
+	0xC8, 0x00, 0x14, 0x00, 0x20, 0xC8, 0xCA, 0x00, 
+	0x16, 0x00, 0x20, 0xC8, 0xCC, 0x00, 0x04, 0x00, 
+	0x20, 0xC8, 0xCE, 0x00, 0x06, 0x00, 0x00, 0x03, 
+	0x0F, 0x00, 0xCC, 0x05, 0x5C, 0x04, 0xE0, 0x04, 
+	0x82, 0x01, 0x02, 0x02, 0x18, 0xE6, 0x32, 0xC8, 
+	0x82, 0x01, 0x32, 0xC8, 0x80, 0x01, 0xA0, 0x06, 
+	0x24, 0xE8, 0x12, 0xC8, 0x82, 0x01, 0xCA, 0xC2, 
+	0x84, 0x07, 0xD0, 0x07, 0xE0, 0x04, 0x84, 0x01, 
+	0x04, 0x06, 0xFC, 0x16, 0x20, 0xC1, 0x84, 0x01, 
+	0xE9, 0x16, 0x04, 0x02, 0x32, 0x00, 0x85, 0x07, 
+	0x00, 0x80, 0x05, 0xD8, 0x80, 0x04, 0xC7, 0x04, 
+	0x60, 0xC1, 0x86, 0x01, 0x04, 0x06, 0xFC, 0x16, 
+	0x20, 0xC1, 0x84, 0x01, 0x5B, 0x04, 0xB3, 0xC0, 
+	0xB3, 0xC4, 0x5B, 0x04, 0x48, 0xC0, 0xB3, 0xC0, 
+	0x73, 0xA0, 0x42, 0xC4, 0x5B, 0x04, 0x33, 0x88, 
+	0x84, 0x01, 0xE6, 0x16, 0x5A, 0x04, 0x89, 0xC1, 
+	0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 
+	0x8A, 0x01, 0x5B, 0x04, 0xC5, 0x04, 0xA0, 0x07, 
+	0x9C, 0x01, 0x40, 0x00, 0x60, 0x01, 0x9C, 0x01, 
+	0x40, 0x00, 0x03, 0x13, 0x05, 0x06, 0xF7, 0x16, 
+	0x5C, 0x04, 0x5B, 0x04, 0xA0, 0x06, 0xAC, 0xE8, 
+	0x60, 0xC0, 0x40, 0x01, 0x05, 0xC8, 0x40, 0x01, 
+	0x02, 0xC5, 0x01, 0xC8, 0x40, 0x01, 0x5A, 0x04, 
+	0xA0, 0x06, 0xAC, 0xE8, 0x08, 0xA1, 0xF4, 0x10, 
+	0xB3, 0xC0, 0x33, 0xC1, 0x60, 0xC1, 0x40, 0x01, 
+	0x85, 0x01, 0x00, 0x04, 0xC5, 0x01, 0x00, 0x10,  
+	0x5B, 0x04, 0x08, 0xC1, 0x09, 0xC2, 0x44, 0xC2, 
+	0x5B, 0x04, 0x05, 0x02, 0xC8, 0x00, 0x05, 0x06, 
+	0xFE, 0x16, 0x5B, 0x04, 0x33, 0xC1, 0x03, 0xC0, 
+	0xC4, 0xC0, 0x5B, 0x04, 0xC0, 0xC0, 0x5B, 0x04, 
+	0xE0, 0x94, 0x9E, 0x01, 0xC2, 0x16, 0xC3, 0x05, 
+	0x5B, 0x04, 0x73, 0xC0, 0xA0, 0x06, 0x26, 0xE9, 
+	0x2D, 0x02, 0x08, 0x00, 0x85, 0x07, 0x08, 0x00, 
+	0x71, 0x9F, 0xB7, 0x16, 0x05, 0x06, 0xFC, 0x16, 
+	0x5A, 0x04, 0x02, 0x02, 0x24, 0xE6, 0x60, 0x04, 
+	0x10, 0xE7, 0xE9, 0x8C, 0x04, 0x00, 0xAD, 0x16, 
+	0x5B, 0x04, 0x20, 0xC1, 0x80, 0x01, 0x85, 0x07, 
+	0xD0, 0x07, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x04, 
+	0x45, 0x06, 0xFE, 0x16, 0x04, 0xC8, 0x80, 0x01, 
+	0x5B, 0x04, 0x33, 0xC1, 0x48, 0xC3, 0x04, 0xC1, 
+	0x04, 0x13, 0x2D, 0x02, 0x00, 0x04, 0x04, 0x06, 
+	0xFC, 0x16, 0x5B, 0x04, 0x8D, 0xC3, 0xA0, 0x06, 
+	0x26, 0xE9, 0x8D, 0xC1, 0xA6, 0x09, 0x66, 0x02, 
+	0x40, 0x00, 0x86, 0xC7, 0x5A, 0x04, 0x8D, 0xC1, 
+	0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 
+	0x8A, 0x01, 0x5B, 0x04, 0x8D, 0xC1, 0xA6, 0x09, 
+	0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 
+	0x5B, 0x04, 0x4D, 0xC0, 0x04, 0x02, 0x28, 0x00, 
+	0x85, 0x07, 0x00, 0x55, 0x60, 0x04, 0x34, 0xE7, 
+	0x4D, 0xC0, 0xB3, 0xC0, 0x32, 0xC1, 0x60, 0x04, 
+	0xF8, 0xE6, 0x33, 0xC1, 0x60, 0x01, 0x1C, 0x01, 
+	0x04, 0x00, 0x01, 0x16, 0x5B, 0x04, 0xC4, 0xC0, 
+	0x5B, 0x04, 0x89, 0x07, 0x66, 0xE5, 0x39, 0xC2, 
+	0x07, 0x13, 0x39, 0xC6, 0x39, 0x86, 0x25, 0x16, 
+	0x39, 0xC6, 0x39, 0x86, 0x22, 0x16, 0xF7, 0x10, 
+	0x02, 0x02, 0xAC, 0xE9, 0xC4, 0x04, 0xC5, 0x04, 
+	0x39, 0xC2, 0x02, 0x13, 0x60, 0x04, 0xE8, 0xE9, 
+	0x02, 0x02, 0xBA, 0xE9, 0xC4, 0x04, 0x39, 0xC2, 
+	0x03, 0x13, 0x79, 0xC1, 0x60, 0x04, 0xE8, 0xE9, 
+	0x02, 0x02, 0xCA, 0xE9, 0xC5, 0x04, 0x39, 0xC2, 
+	0x03, 0x13, 0x39, 0xC1, 0x60, 0x04, 0xE8, 0xE9, 
+	0x79, 0xC0, 0xB9, 0xC0, 0x81, 0x60, 0xC2, 0x05, 
+	0x12, 0x09, 0xF1, 0x04, 0x02, 0x06, 0xFD, 0x16, 
+	0x5B, 0x04, 0x5C, 0x04, 0x01, 0x02, 0xAA, 0xAA, 
+	0x01, 0xC6, 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 
+	0xF8, 0x16, 0x01, 0x02, 0x14, 0x00, 0x01, 0x06, 
+	0xFE, 0x16, 0x01, 0x02, 0x55, 0x55, 0x01, 0xC6, 
+	0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 0xED, 0x16, 
+	0x52, 0x04, 0xE0, 0x02, 0xA0, 0x00, 0x88, 0x07, 
+	0xC0, 0x00, 0x09, 0x02, 0x62, 0xEA, 0x84, 0x07, 
+	0x2A, 0xE6, 0x05, 0x02, 0x01, 0x00, 0x8B, 0xC2, 
+	0xCC, 0x04, 0xA0, 0x06, 0x6C, 0xEA, 0x60, 0x2C, 
+	0x01, 0x00, 0x99, 0x06, 0xA0, 0x2C, 0x02, 0x00, 
+	0x99, 0x06, 0x20, 0x2D, 0x04, 0x00, 0x99, 0x06, 
+	0x20, 0x2E, 0x08, 0x00, 0x99, 0x06, 0xA0, 0x2F, 
+	0x10, 0x00, 0x8C, 0x05, 0x09, 0x16, 0x80, 0xCC, 
+	0x81, 0xC4, 0x83, 0x07, 0xB0, 0xEA, 0x88, 0xC0, 
+	0x02, 0x04, 0x8C, 0x05, 0x01, 0x16, 0x33, 0x10, 
+	0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x8C, 0x05, 
+	0xFB, 0x16, 0x80, 0xCC, 0x81, 0xC4, 0x15, 0x0A, 
+	0xB4, 0xC0, 0x12, 0xC0, 0x88, 0xCC, 0x52, 0xC0, 
+	0xB4, 0xC4, 0x42, 0x06, 0x5B, 0x04, 0x2D, 0x07, 
+	0x18, 0x00, 0x41, 0x8B, 0x0A, 0x00, 0xEC, 0x16, 
+	0xC1, 0x82, 0xEA, 0x16, 0xC2, 0x02, 0x42, 0x02, 
+	0x00, 0x02, 0xE6, 0x16, 0x80, 0x03, 0x81, 0x07, 
+	0x01, 0x00, 0xF1, 0x10, 0x01, 0x02, 0x02, 0x00, 
+	0xEE, 0x10, 0x01, 0x02, 0x04, 0x00, 0xEB, 0x10, 
+	0x01, 0x02, 0x08, 0x00, 0xE8, 0x10, 0x01, 0x02, 
+	0x10, 0x00, 0xE5, 0x10, 0xA1, 0x02, 0x41, 0x8B, 
+	0x10, 0x00, 0x02, 0x13, 0x60, 0x04, 0x5C, 0xEA, 
+	0x2D, 0x07, 0x18, 0x00, 0x80, 0x03, 0x09, 0x02, 
+	0x00, 0x08, 0x03, 0x02, 0x04, 0x00, 0xC7, 0x04, 
+	0xA0, 0x06, 0xDC, 0xEB, 0x60, 0x01, 0x1C, 0x01, 
+	0x04, 0x00, 0x1C, 0x16, 0xA0, 0x01, 0x40, 0x01, 
+	0x00, 0x08, 0xE0, 0x01, 0x40, 0x01, 0x00, 0x10, 
+	0x04, 0x02, 0x01, 0x00, 0x44, 0xCE, 0xC4, 0x06, 
+	0x44, 0xC6, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x10, 
+	0x49, 0x06, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 
+	0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xE0, 0x01, 
+	0x40, 0x01, 0x00, 0x08, 0xA0, 0x06, 0x7A, 0xEC, 
+	0xA0, 0x06, 0x7A, 0xEC, 0xC7, 0x05, 0x04, 0x02, 
+	0xE4, 0xE4, 0xE0, 0x04, 0xD0, 0x03, 0x74, 0xC1, 
+	0xB4, 0xC1, 0x86, 0x05, 0x1C, 0x13, 0xE0, 0x02, 
+	0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0xC0, 
+	0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC1, 0x40, 0xC1, 
+	0x80, 0xC1, 0xC0, 0xC1, 0x00, 0xC2, 0x40, 0xC2, 
+	0x80, 0xC2, 0xC0, 0xC2, 0x00, 0xC3, 0x40, 0xC3, 
+	0x80, 0xC3, 0xC0, 0xC3, 0xA0, 0x04, 0xAA, 0x00, 
+	0xD0, 0x03, 0xD0, 0x03, 0x3F, 0x10, 0x85, 0x05, 
+	0x85, 0x81, 0xE1, 0x13, 0xE4, 0x10, 0xC7, 0x05, 
+	0x05, 0x02, 0xFF, 0x7F, 0x45, 0xA1, 0xD0, 0x03, 
+	0xD0, 0x03, 0x34, 0x10, 0xC0, 0xCC, 0xC1, 0xC4, 
+	0x03, 0x02, 0x28, 0x00, 0xA0, 0x06, 0xDC, 0xEB, 
+	0xE0, 0x01, 0x42, 0x01, 0x00, 0x10, 0xC7, 0x05, 
+	0xD0, 0x03, 0xD0, 0x03, 0x27, 0x10, 0xC7, 0x05, 
+	0xA0, 0xC1, 0x4A, 0x01, 0xA0, 0x07, 0x4A, 0x01, 
+	0x00, 0x0E, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x02, 
+	0x20, 0x07, 0x44, 0x01, 0x60, 0xC1, 0x44, 0x01, 
+	0x85, 0x02, 0x00, 0xFF, 0x17, 0x16, 0xE0, 0x01, 
+	0x40, 0x01, 0x00, 0x22, 0x05, 0x02, 0xC0, 0x00, 
+	0x05, 0x06, 0xD0, 0x03, 0xFD, 0x16, 0x60, 0xC1, 
+	0x46, 0x01, 0x85, 0x02, 0x00, 0xFF, 0x0A, 0x13, 
+	0x05, 0x02, 0x93, 0x33, 0x05, 0x06, 0x00, 0x10, 
+	0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 
+	0xD0, 0x03, 0xF8, 0x16, 0x51, 0x10, 0x06, 0xC8, 
+	0x4A, 0x01, 0xC0, 0xCC, 0xC1, 0xC4, 0x4B, 0x10, 
+	0x13, 0xC0, 0xC8, 0xCC, 0x53, 0xC0, 0x02, 0x02, 
+	0xEC, 0xEB, 0xC2, 0xC4, 0x43, 0x06, 0x5B, 0x04, 
+	0x60, 0xC0, 0xAE, 0x00, 0xC4, 0x02, 0x44, 0x02, 
+	0x0F, 0x00, 0x44, 0x88, 0xCA, 0xE4, 0x3C, 0x16, 
+	0x81, 0x02, 0x08, 0x00, 0x27, 0x13, 0x21, 0xC1, 
+	0xDC, 0xE4, 0x14, 0xC1, 0x21, 0x21, 0xBA, 0xE4, 
+	0x33, 0x16, 0x21, 0xC1, 0xC2, 0xE4, 0x81, 0x02, 
+	0x00, 0x00, 0x0B, 0x13, 0x0D, 0x02, 0xA0, 0x00, 
+	0x84, 0x83, 0x09, 0x13, 0xC4, 0x05, 0x84, 0x83, 
+	0x06, 0x13, 0xC4, 0x05, 0x84, 0x83, 0x03, 0x13, 
+	0x23, 0x10, 0x0E, 0x81, 0x21, 0x16, 0x21, 0xC1, 
+	0xDC, 0xE4, 0x21, 0x45, 0xBA, 0xE4, 0xE0, 0x01, 
+	0x42, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, 
+	0x00, 0x10, 0xA1, 0xC3, 0xD4, 0xE4, 0x0F, 0x02, 
+	0x2F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x40, 0x01, 
+	0x00, 0x02, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 
+	0x6D, 0xC0, 0x0A, 0x00, 0x09, 0x13, 0x81, 0x02, 
+	0x5C, 0x12, 0x06, 0x1B, 0x0E, 0x02, 0xD2, 0xEB, 
+	0x0F, 0x02, 0x0F, 0x00, 0x80, 0x03, 0xCA, 0x05, 
+	0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x59, 0xCE, 
+	0x20, 0x88, 0xE4, 0xE4, 0xE4, 0xE4, 0xF8, 0x10, 
+	0xC1, 0x04, 0x48, 0x62, 0x89, 0x05, 0xA0, 0xC0, 
+	0x6C, 0x01, 0x08, 0xC8, 0x6C, 0x01, 0x03, 0x02, 
+	0x00, 0xFC, 0x04, 0x02, 0x00, 0x02, 0x73, 0xA0, 
+	0x04, 0x06, 0xFD, 0x16, 0x88, 0x05, 0x09, 0x06, 
+	0xF4, 0x16, 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x86, 
+	0x02, 0x16, 0xD0, 0x03, 0xCB, 0x05, 0x5B, 0x04, 
+	0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, 
+	0x38, 0x38, 0x42, 0x20, 0x20, 0x59, 0x49, 0x54, 
+	0x4B, 0xC2, 0xA8, 0x02, 0x98, 0x00, 0x83, 0x07, 
+	0x02, 0x00, 0x28, 0x02, 0x08, 0x00, 0x23, 0xC6, 
+	0x36, 0xE5, 0x48, 0x06, 0xC4, 0xC0, 0x73, 0x0A, 
+	0x65, 0x17, 0xA0, 0x06, 0xAA, 0xED, 0xC8, 0xC1, 
+	0xC7, 0x05, 0x03, 0x02, 0xA5, 0x00, 0xB0, 0x03, 
+	0xF8, 0xCD, 0xF8, 0xCD, 0xA6, 0x02, 0x06, 0x62, 
+	0x88, 0x02, 0x0A, 0x00, 0x57, 0x16, 0x03, 0x29, 
+	0x55, 0x16, 0x05, 0x29, 0xC4, 0x80, 0x52, 0x16, 
+	0x15, 0x09, 0x50, 0x17, 0x15, 0x09, 0x4E, 0x18, 
+	0x85, 0x02, 0x29, 0x00, 0x4B, 0x16, 0xC6, 0x05, 
+	0x96, 0x00, 0x03, 0x07, 0xC4, 0x04, 0x45, 0x06, 
+	0x95, 0x00, 0x44, 0x05, 0x43, 0x16, 0x44, 0x81, 
+	0x41, 0x16, 0x00, 0x03, 0x05, 0x00, 0xC4, 0x02, 
+	0x00, 0x03, 0x0A, 0x00, 0x44, 0x02, 0x0F, 0x00, 
+	0x84, 0x02, 0x05, 0x00, 0x37, 0x16, 0xC4, 0x02, 
+	0x00, 0x03, 0x0F, 0x00, 0x44, 0x02, 0x0F, 0x00, 
+	0x84, 0x02, 0x0A, 0x00, 0x2F, 0x16, 0x04, 0x02, 
+	0xFE, 0xFF, 0x2C, 0x13, 0x2B, 0x15, 0x2A, 0x1A, 
+	0x84, 0x05, 0x28, 0x12, 0x27, 0x15, 0x26, 0x1A, 
+	0x25, 0x18, 0x84, 0x05, 0x23, 0x16, 0x22, 0x1B, 
+	0x21, 0x17, 0x84, 0x05, 0x1F, 0x13, 0x1E, 0x1A, 
+	0x1D, 0x11, 0x04, 0x06, 0x1B, 0x16, 0xA5, 0x02, 
+	0xC5, 0xC1, 0x25, 0x02, 0x06, 0x00, 0x03, 0x02, 
+	0xA5, 0xA5, 0x83, 0xC1, 0x95, 0x00, 0x03, 0x38, 
+	0x94, 0x00, 0x83, 0x02, 0x2E, 0x6B, 0x0E, 0x16, 
+	0x84, 0x02, 0x59, 0x1C, 0x0B, 0x16, 0x24, 0x02, 
+	0x69, 0x00, 0x95, 0x00, 0x03, 0x3C, 0x94, 0x00, 
+	0x83, 0x81, 0x04, 0x16, 0x84, 0x02, 0x69, 0x00, 
+	0x01, 0x16, 0xC9, 0x05, 0x59, 0x04, 0xC3, 0xD0, 
+	0xFD, 0x13, 0x01, 0x1C, 0xFB, 0x10, 0xE0, 0x90, 
+	0x3D, 0xE5, 0xF8, 0x16, 0xC3, 0x06, 0xC3, 0xD0, 
+	0xF5, 0x1C, 0xF4, 0x16, 0xE0, 0x90, 0x3A, 0xE5, 
+	0xF1, 0x16, 0x5B, 0x04, 0x0B, 0xC3, 0x09, 0x02, 
+	0x3E, 0xE5, 0xA0, 0x06, 0x92, 0xE9, 0xCC, 0x05, 
+	0x5C, 0x04, 0x88, 0x07, 0x00, 0xA0, 0x89, 0x07, 
+	0xFE, 0xFF, 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 
+	0x02, 0xE0, 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 
+	0x88, 0x07, 0x00, 0x90, 0x89, 0x07, 0xFE, 0x9F, 
+	0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 0x78, 0xE0, 
+	0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 0xA0, 0x06, 
+	0xC4, 0xEC, 0x00, 0x00, 0xE6, 0x10, 0xE5, 0x10, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 
+	0x00, 0x08, 0x11, 0xE3, 0x6C, 0xCC, 0x00, 0x80, 
+	0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 
+	0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 
+	0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 
+	0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0xFF, 
+	0xFF, 0x00, 0xF0, 0xFF, 0x00, 0xF0, 0x0F, 0x00,  
+	0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00,  
+	0xC3, 0x00, 0xE7, 0xE7, 0xF3, 0xE7, 0xF1, 0xF1, 
+	0x43, 0x28, 0x20, 0x29, 0x4F, 0x43, 0x59, 0x50, 
+	0x49, 0x52, 0x48, 0x47, 0x20, 0x54, 0x42, 0x49, 
+	0x20, 0x4D, 0x39, 0x31, 0x33, 0x38, 0x34, 0x2C, 
+	0x35, 0x2C, 0x36, 0x2C, 0x43, 0x28, 0x20, 0x29, 
+	0x4F, 0x43, 0x59, 0x50, 0x49, 0x52, 0x48, 0x47, 
+	0x20, 0x54, 0x49, 0x54, 0x31, 0x20, 0x38, 0x39, 
+	0x2D, 0x33, 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 
+	0x38, 0x39, 0x00, 0x00, 0x61, 0x9B, 0xC4, 0xEC, 
+	0x0E, 0xEA, 0xDE, 0xE5, 0xC8, 0xED, 0x00, 0x00, 
+	0xC4, 0x00, 0xB8, 0xAF, 0x4A, 0x06, 0x50, 0x06, 
+	0x4C, 0x06, 0xDC, 0xCC, 0x4E, 0x06, 0x0F, 0x00, 
+	0x32, 0x06, 0x01, 0x00, 0x50, 0x07, 0x58, 0x07, 
+	0x52, 0x07, 0x70, 0xB5, 0x54, 0x07, 0x0F, 0x00, 
+	0x38, 0x07, 0x01, 0x00, 0xBA, 0x00, 0xA0, 0x00, 
+	0xBC, 0x00, 0xD6, 0xED, 0xBE, 0x00, 0x0F, 0x00, 
+	0x5E, 0x07, 0x3A, 0x07, 0x62, 0x07, 0x40, 0x80, 
+	0x64, 0x07, 0x54, 0xBA, 0x66, 0x07, 0x36, 0xBA, 
+	0x68, 0x07, 0x40, 0xB8, 0x98, 0x07, 0x00, 0x80, 
+	0x78, 0x07, 0x00, 0x80, 0xE2, 0x08, 0x04, 0x00, 
+	0xE4, 0x08, 0x01, 0x00, 0xEC, 0x08, 0x08, 0x00, 
+	0xF6, 0x08, 0x0A, 0x00, 0xF8, 0x08, 0x06, 0x00, 
+	0x00, 0x09, 0x0C, 0x00, 0x02, 0x09, 0x04, 0x00, 
+	0xAE, 0x01, 0x00, 0x00, 0x1E, 0x09, 0x00, 0x00, 
+	0x66, 0x09, 0x00, 0x00, 0x0C, 0x06, 0x13, 0x00, 
+	0x0A, 0x06, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x00, 
+	0x86, 0xA3, 0xE0, 0x00, 0xE6, 0xA2, 0xE0, 0x00, 
+	0x86, 0xA3, 0xE0, 0x00, 0x02, 0xA5, 0xE0, 0x00, 
+	0x5E, 0xA6, 0xE0, 0x00, 0x66, 0xA9, 0xE0, 0x00, 
+	0x12, 0xA4, 0xC0, 0x00, 0x22, 0xA4, 0xE0, 0x00, 
+	0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, 
+	0x74, 0xA4, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, 
+	0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, 
+	0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, 
+	0xDE, 0xAF, 0xC0, 0x00, 0x48, 0xB0, 0xC0, 0x00, 
+	0x84, 0xB0, 0xC0, 0x00, 0xF4, 0xB0, 0xC0, 0x00, 
+	0x76, 0xB1, 0xE0, 0x00, 0xE4, 0xB2, 0xE0, 0x00, 
+	0x8A, 0xB2, 0xE0, 0x00, 0xF4, 0xB3, 0xE0, 0x00, 
+	0x7C, 0xB3, 0xE0, 0x00, 0xC6, 0xAA, 0xC0, 0x00, 
+	0x36, 0xAB, 0xC0, 0x00, 0x90, 0xAB, 0xC0, 0x00, 
+	0xC2, 0xAB, 0xC0, 0x00, 0xEA, 0xAA, 0xC0, 0x00, 
+	0x80, 0xA3, 0xC0, 0x00, 0x80, 0xA3, 0x00, 0x3F, 
+	0x00, 0x7F, 0x00, 0x5E, 0x30, 0x00, 0x28, 0x00, 
+	0x43, 0x00, 0xB6, 0xA6, 0xB6, 0xA6, 0x1C, 0xA5, 
+	0x14, 0xA5, 0x46, 0xA5, 0x46, 0xA5, 0x62, 0xA5, 
+	0xB6, 0xA6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 
+	0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, 
+	0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, 
+	0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 
+	0x14, 0x00, 0x0E, 0x10, 0x0C, 0x0C, 0x0A, 0x0A, 
+	0x0A, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 
+	0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,  
+	0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
+	0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,  
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
+	0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
+	0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x98, 0x07, 0x7E, 0xCA, 0x58, 0x07, 
+	0xF8, 0xB8, 0x58, 0x07, 0xFE, 0xB7, 0x58, 0x07, 
+	0x68, 0xB9, 0x58, 0x07, 0xD0, 0xB8, 0x98, 0x07, 
+	0x5A, 0xC7, 0x98, 0x07, 0x52, 0xC7, 0x78, 0x07, 
+	0xC2, 0xC1, 0x58, 0x07, 0x30, 0xB9, 0x98, 0x07, 
+	0x38, 0xCA, 0x78, 0x07, 0x96, 0xC2, 0x58, 0x07, 
+	0x6A, 0xC7, 0x58, 0x07, 0xE0, 0xB8, 0x58, 0x07, 
+	0x1E, 0xB9, 0x58, 0x07, 0xE2, 0xB9, 0x98, 0x07, 
+	0xAE, 0xCB, 0x98, 0x07, 0x8E, 0xC7, 0x78, 0x07, 
+	0x56, 0xC2, 0xB8, 0x07, 0x14, 0xCC, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0xA2, 0xBA, 0x16, 0xC1, 
+	0xCA, 0xC1, 0xD6, 0xC6, 0x8A, 0xBD, 0xC2, 0xBD, 
+	0xE0, 0xBD, 0x6A, 0xBE, 0x8E, 0xBE, 0xAA, 0xBE, 
+	0x22, 0xBF, 0x22, 0xBF, 0x56, 0xBE, 0xC8, 0xBF, 
+	0x10, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 
+	0x00, 0x0C, 0x01, 0x0F, 0xFF, 0xFE, 0x00, 0x58, 
+	0x00, 0x0E, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x70, 
+	0x40, 0x80, 0x00, 0x5E, 0xA0, 0xC0, 0xDF, 0xFF, 
+	0x00, 0x18, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x50, 
+	0x00, 0x60, 0x00, 0x70, 0x00, 0x0C, 0x06, 0x00, 
+	0x00, 0x00, 0x84, 0xE3, 0xE6, 0x07, 0xF4, 0x07, 
+	0x08, 0x00, 0x00, 0x00, 0x8A, 0xE3, 0xEA, 0x07, 
+	0xF4, 0x07, 0x06, 0x00, 0x40, 0x00, 0x00, 0x0A, 
+	0xE6, 0x07, 0xEE, 0x07, 0x08, 0x00, 0x40, 0x00, 
+	0x06, 0x0A, 0xEA, 0x07, 0xEE, 0x07, 0x00, 0x00, 
+	0xE2, 0xC1, 0x8B, 0xD4, 0xFF, 0xFF, 0xD7, 0xD1, 
+	0xD9, 0xC5, 0xD4, 0xC3, 0x3B, 0x59, 0x34, 0x09, 
+	0xFC, 0x05, 0x6C, 0x09, 0xD8, 0x06, 0x06, 0x04, 
+	0xBA, 0xEA, 0x30, 0x09, 0x48, 0x04, 0x80, 0x08, 
+	0x06, 0x00, 0x0A, 0x06, 0x0E, 0x0C, 0xBA, 0xCE, 
+	0x2E, 0xE0, 0x56, 0xE0, 0x50, 0xE1, 0x66, 0xE2, 
+	0xEC, 0xE2, 0x4C, 0xE3, 0xFE, 0xE3, 0xBA, 0xCE, 
+	0x80, 0xE4, 0x10, 0xE4, 0x14, 0xE0, 0x1C, 0xE4, 
+	0x1C, 0xE4, 0x46, 0xE5, 0x50, 0xE5, 0x5A, 0xE5, 
+	0xBA, 0xCE, 0xA6, 0xDC, 0xBA, 0xCE, 0x44, 0xDA, 
+	0xE6, 0xDF, 0x70, 0xDA, 0xDE, 0xDE, 0xB0, 0xCE, 
+	0x16, 0xDB, 0x3A, 0xDD, 0xB8, 0xDD, 0x34, 0xDE, 
+	0x58, 0xDE, 0x16, 0xDB, 0xDA, 0xDC, 0x08, 0xCF, 
+	0xB0, 0xCE, 0xA8, 0xD9, 0x8A, 0xD9, 0x44, 0xD9, 
+	0xB0, 0xCE, 0xEA, 0xDE, 0xB0, 0xCE, 0x72, 0x06, 
+	0xF6, 0xD2, 0x08, 0x07, 0x72, 0x06, 0x54, 0xD2, 
+	0xF4, 0x01, 0x72, 0x06, 0x34, 0xD2, 0x08, 0x07, 
+	0x7C, 0x06, 0x5A, 0xDC, 0x04, 0x00, 0x7C, 0x06, 
+	0x78, 0xD2, 0x00, 0x00, 0x7C, 0x06, 0xCC, 0xDE, 
+	0xFA, 0x00, 0x86, 0x06, 0xAC, 0xD1, 0x05, 0x00, 
+	0x90, 0x06, 0x1C, 0xDF, 0x28, 0x00, 0x90, 0x06, 
+	0x50, 0xD3, 0x04, 0x01, 0x90, 0x06, 0x00, 0x00, 
+	0x02, 0x00, 0x90, 0x06, 0x80, 0xD2, 0xBC, 0x02, 
+	0x9A, 0x06, 0x06, 0xD3, 0xDC, 0x05, 0x9A, 0x06, 
+	0xAA, 0xD2, 0x64, 0x00, 0x9A, 0x06, 0x0A, 0xD3, 
+	0x14, 0x00, 0x9A, 0x06, 0xE2, 0xE0, 0x40, 0x06, 
+	0x9A, 0x06, 0x12, 0xD3, 0x64, 0x00, 0x7C, 0x06, 
+	0x16, 0xDC, 0x04, 0x00, 0x7C, 0x06, 0xE6, 0xDA,  
+	0x16, 0x00, 0x7C, 0x06, 0xFA, 0xDB, 0x05, 0x00, 
+	0x7C, 0x06, 0x00, 0xDD, 0x14, 0x00, 0x9A, 0x06, 
+	0x7C, 0xD3, 0x14, 0x00, 0x9A, 0x06, 0x38, 0xD4, 
+	0x02, 0x00, 0x7C, 0x06, 0x0C, 0xE0, 0x19, 0x00, 
+	0x00, 0x00, 0x0A, 0x07, 0x0E, 0x07, 0x04, 0x07, 
+	0xD8, 0x06, 0x00, 0x07, 0xF0, 0x06, 0xEE, 0x06, 
+	0xEC, 0x06, 0x0C, 0x07, 0xE6, 0x06, 0x18, 0x07, 
+	0x92, 0x09, 0x94, 0x09, 0x96, 0x09, 0x98, 0x09, 
+	0x00, 0x50, 0xCC, 0x00, 0x03, 0x00, 0x00, 0x84, 
+	0x00, 0xA8, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x80, 
+	0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, 
+	0x00, 0x40, 0x00, 0x10, 0x82, 0xEC, 0x48, 0xEB, 
+	0x62, 0xEB, 0x7C, 0xEB, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0xEA, 0xEB, 
+	0x52, 0xEB, 0x68, 0xEB, 0x82, 0xEB, 0x40, 0x01, 
+	0x42, 0x01, 0x42, 0x01, 0x42, 0x01, 0x00, 0x00, 
+	0x7F, 0x00, 0xA0, 0x00, 0xFF, 0x00, 0x10, 0x02, 
+	0x1F, 0x02, 0x30, 0x02, 0x3F, 0x02, 0x50, 0x02, 
+	0x5F, 0x02, 0x70, 0x02, 0x7F, 0x02, 0x90, 0x02, 
+	0x9F, 0x02, 0xB0, 0x02, 0xBF, 0x02, 0xD0, 0x02, 
+	0xDF, 0x02, 0xE1, 0x02, 0xFF, 0x02, 0x01, 0x03, 
+	0x7F, 0x03, 0x81, 0x03, 0x8F, 0x03, 0x91, 0x03, 
+	0x9F, 0x03, 0xA1, 0x03, 0xAF, 0x03, 0xB1, 0x03, 
+	0xBF, 0x03, 0xC1, 0x03, 0xCF, 0x03, 0xE1, 0x03, 
+	0xFF, 0x03, 0xC0, 0x07, 0xFF, 0x07, 0x00, 0x0C, 
+	0xFF, 0x0F, 0x00, 0x30, 0xFF, 0x37, 0xFF, 0xFF, 
+	0xFF, 0xFF, 0xBC, 0xFE, 0x07, 0x00, 0x5E, 0x02, 
+	0x00, 0x01, 0xFF, 0xBA, 0x80, 0xBA, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x0A, 0x01, 
+	0x0E, 0x01, 0x10, 0x01, 0x14, 0x01, 0x00, 0x00, 
+	0x12, 0x01, 0x00, 0xF8, 0x16, 0x01, 0x00, 0xFF, 
+	0x00, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x1C, 0x01, 
+	0x82, 0x01, 0x66, 0x96, 0x66, 0x96, 0x55, 0x55, 
+	0x00, 0x00, 0x82, 0x01, 0x2A, 0x8A, 0x2A, 0x8A, 
+	0x18, 0xC9, 0x18, 0xC9, 0x86, 0x01, 0xAA, 0xA2, 
+	0x1E, 0xA0, 0x55, 0x55, 0x1E, 0x54, 0x8A, 0x01, 
+	0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 
+	0x8C, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 
+	0x00, 0x00, 0x8E, 0x01, 0x00, 0x50, 0x00, 0x00, 
+	0x00, 0xA8, 0x00, 0x00, 0x90, 0x01, 0x00, 0x50, 
+	0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x92, 0x01, 
+	0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 
+	0x94, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 
+	0x00, 0x00, 0x96, 0x01, 0x00, 0x50, 0x00, 0x00, 
+	0x00, 0xA8, 0x00, 0x00, 0x98, 0x01, 0x00, 0x50, 
+	0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x9A, 0x01, 
+	0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 
+	0x9C, 0x01, 0x55, 0x55, 0xC0, 0x7F, 0xAA, 0xAA, 
+	0xC0, 0x7F, 0x00, 0x00, 0xA2, 0x01, 0xA4, 0x01, 
+	0xA8, 0x01, 0xAA, 0x01, 0xAE, 0x01, 0xB0, 0x01, 
+	0xB2, 0x01, 0x80, 0x01, 0x00, 0x00, 0x88, 0x01, 
+	0x00, 0xFF, 0x9E, 0x01, 0xFF, 0x00, 0xA0, 0x01, 
+	0x00, 0x80, 0xAC, 0x01, 0x00, 0x80, 0x00, 0x00, 
+	0xA6, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01, 
+	0xBC, 0x01, 0x00, 0x88, 0x00, 0x06, 0x00, 0xC8, 
+	0x00, 0x00, 0x00, 0x80, 0x30, 0x00, 0x00, 0x00, 
+	0x00, 0x80, 0x02, 0x00, 0x44, 0x00, 0x92, 0xEA, 
+	0x48, 0x00, 0x98, 0xEA, 0x50, 0x00, 0x9E, 0xEA, 
+	0x60, 0x00, 0xA4, 0xEA, 0x78, 0x00, 0xAA, 0xEA, 
+	0x0A, 0xE8, 0x18, 0xE7, 0x3C, 0xEA, 0x2A, 0xE7, 
+	0x14, 0x55, 0xA0, 0x01, 0xEC, 0xE6, 0xD0, 0xE9, 
+	0x46, 0xE7, 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 
+	0x00, 0x00, 0x1E, 0x00, 0x46, 0xE7, 0x92, 0xE7, 
+	0x00, 0x41, 0x01, 0x41, 0xB6, 0xE7, 0x73, 0xEA, 
+	0x18, 0xE7, 0x48, 0xEA, 0xEC, 0xE6, 0x04, 0xEA, 
+	0x56, 0xE7, 0x62, 0xE7, 0xB6, 0xE7, 0x6E, 0xEA, 
+	0x62, 0xE8, 0x00, 0x00, 0x36, 0xE8, 0xEC, 0xE6, 
+	0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 0x36, 0xE8, 
+	0x62, 0xE8, 0x00, 0x00, 0xEC, 0xE6, 0xF0, 0xE9, 
+	0x0C, 0xE7, 0x4A, 0xE7, 0x62, 0xE7, 0x36, 0xE8, 
+	0xEC, 0xE6, 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 
+	0x36, 0xE8, 0x62, 0xE8, 0x00, 0x20, 0x2A, 0xE7, 
+	0x14, 0x55, 0xA0, 0x01, 0x18, 0xE7, 0x50, 0xEA, 
+	0xEC, 0xE6, 0xD0, 0xE9, 0x58, 0xE8, 0x50, 0x55, 
+	0x0C, 0x00, 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 
+	0x00, 0x00, 0xB6, 0xE7, 0x75, 0xEA, 0x00, 0xE7, 
+	0x58, 0xE8, 0x55, 0x55, 0x0C, 0x00, 0x56, 0xE7, 
+	0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 0xFF, 0xFF, 
+	0x08, 0x00, 0x58, 0xE8, 0x02, 0x10, 0x06, 0x00, 
+	0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 
+	0xB6, 0xE7, 0x80, 0xEA, 0x00, 0xE7, 0x58, 0xE8, 
+	0x00, 0xC0, 0x08, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 
+	0x0A, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 0x0C, 0x00, 
+	0x58, 0xE8, 0x0D, 0x10, 0x06, 0x00, 0x46, 0xE7, 
+	0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 0xB6, 0xE7, 
+	0x74, 0xEA, 0x62, 0xE8, 0x08, 0x20, 0x00, 0xE7, 
+	0x52, 0xE8, 0x82, 0x01, 0x02, 0xC9, 0x46, 0xE7, 
+	0xB6, 0xE7, 0x80, 0xEA, 0x62, 0xE8, 0x34, 0x20, 
+	0x00, 0xE7, 0x58, 0xE8, 0x00, 0x10, 0x06, 0x00, 
+	0x46, 0xE7, 0xC6, 0xE8, 0xB6, 0xE7, 0x78, 0xEA, 
+	0x52, 0xE8, 0x9C, 0x01, 0x40, 0x00, 0x18, 0xE7, 
+	0x50, 0xEA, 0x2A, 0xE7, 0xFF, 0x00, 0x80, 0x07, 
+	0x26, 0xE9, 0x03, 0x00, 0x66, 0xE9, 0x74, 0xE9, 
+	0x12, 0xEA, 0x38, 0xE9, 0x00, 0x00, 0x74, 0xE9, 
+	0x1C, 0xEA, 0x38, 0xE9, 0x04, 0x00, 0x74, 0xE9, 
+	0x24, 0xEA, 0x38, 0xE9, 0x07, 0x00, 0x74, 0xE9, 
+	0x2C, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x74, 0xE9, 
+	0x34, 0xEA, 0x38, 0xE9, 0x02, 0x00, 0x74, 0xE9, 
+	0x34, 0xEA, 0x38, 0xE9, 0x06, 0x00, 0x74, 0xE9, 
+	0x34, 0xEA, 0x38, 0xE9, 0x05, 0x00, 0x74, 0xE9, 
+	0x34, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x4A, 0xE9, 
+	0x26, 0xE9, 0x03, 0x00, 0x58, 0xE9, 0x62, 0xE7, 
+	0xE6, 0xE8, 0xD8, 0xE9, 0x01, 0x00, 0xE6, 0xE8, 
+	0x25, 0xEA, 0x02, 0x00, 0xE6, 0xE8, 0x2F, 0xEA, 
+	0x06, 0x00, 0xE6, 0xE8, 0x3A, 0xEA, 0x05, 0x00, 
+	0xB6, 0xE7, 0x74, 0xEA, 0x36, 0xE8, 0xEC, 0xE6, 
+	0xD0, 0xE9, 0x56, 0xE7, 0xC6, 0xE8, 0x0C, 0xE7, 
+	0x92, 0xE7, 0x00, 0x01, 0x00, 0x80, 0xB6, 0xE7, 
+	0x78, 0xEA, 0x00, 0xE7, 0xFE, 0xE8, 0x52, 0xE8, 
+	0x80, 0x01, 0x41, 0x8E, 0x4A, 0xE7, 0x92, 0xE7, 
+	0x00, 0x01, 0x01, 0x1B, 0x06, 0xE9, 0xE4, 0xFF, 
+	0xB6, 0xE7, 0x7C, 0xEA, 0xBE, 0xE8, 0x18, 0xE7, 
+	0x56, 0xEA, 0x0C, 0xE7, 0x6A, 0xE8, 0x3C, 0xE7, 
+	0x00, 0xE0, 0xC6, 0xE8, 0xB6, 0xE7, 0x86, 0xEA, 
+	0x3C, 0xE7, 0x00, 0xE8, 0x62, 0xE7, 0xB6, 0xE7, 
+	0x85, 0xEA, 0x3C, 0xE7, 0x00, 0x08, 0xC6, 0xE8, 
+	0xB6, 0xE7, 0x86, 0xEA, 0x3C, 0xE7, 0x00, 0xF8, 
+	0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, 
+	0x80, 0x01, 0x00, 0x02, 0x3C, 0xE7, 0x00, 0xE0, 
+	0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, 
+	0x84, 0x01, 0x00, 0x00, 0x62, 0xE8, 0x34, 0x00, 
+	0x3C, 0xE7, 0x00, 0x00, 0xC6, 0xE8, 0x62, 0xE8, 
+	0x34, 0x60, 0x0E, 0xE9, 0x52, 0xE8, 0x84, 0x01, 
+	0x00, 0x00, 0xB6, 0xE7, 0x86, 0xEA, 0x52, 0xE8, 
+	0x82, 0x01, 0x00, 0xC8, 0x3C, 0xE7, 0x00, 0xE0, 
+	0xC6, 0xE8, 0x3C, 0xE7, 0x00, 0x10, 0xC6, 0xE8, 
+	0x62, 0xE8, 0x34, 0x60, 0x52, 0xE8, 0x80, 0x01, 
+	0x00, 0x06, 0x3C, 0xE7, 0x10, 0x00, 0x78, 0xE8, 
+	0x36, 0xE8, 0x52, 0xE8, 0x84, 0x01, 0x00, 0x00, 
+	0x62, 0xE8, 0x34, 0x00, 0xEC, 0xE6, 0xD0, 0xE9, 
+	0x18, 0xE7, 0x5C, 0xEA, 0xD0, 0xE8, 0x92, 0xE9, 
+	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xF0, 
+	0x06, 0x00, 0x00, 0xC7, 0xA0, 0xE7, 0xDC, 0xE8, 
+	0x00, 0xE0, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 
+	0x40, 0xD0, 0x06, 0x00, 0x00, 0xE0, 0xA0, 0xE7, 
+	0xDC, 0xE8, 0x00, 0xC0, 0x00, 0xE7, 0x0C, 0xE7, 
+	0x70, 0xE7, 0x40, 0x90, 0x06, 0x00, 0x00, 0xA0, 
+	0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x80, 0x00, 0xE7, 
+	0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x50, 0x06, 0x00, 
+	0x00, 0x60, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x40, 
+	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x10, 
+	0x06, 0x00, 0x00, 0x20, 0xA0, 0xE7, 0xDC, 0xE8,  
+	0x00, 0x00, 0xD0, 0xE8, 0x92, 0xE9, 0x00, 0xE7,  
+	0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xD0, 0x06, 0x00, 
+	0x00, 0xA6, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0xC0, 
+	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x90, 
+	0x06, 0x00, 0x00, 0xC0, 0xA0, 0xE7, 0xDC, 0xE8, 
+	0x00, 0x80, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 
+	0x40, 0x50, 0x06, 0x00, 0x00, 0x40, 0xA0, 0xE7, 
+	0xDC, 0xE8, 0x00, 0x40, 0x00, 0xE7, 0x0C, 0xE7, 
+	0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 0x00, 0x60, 
+	0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 0x7E, 0xE9, 
+	0x90, 0xE9, 0x18, 0xE7, 0x62, 0xEA, 0xEC, 0xE6, 
+	0xD0, 0xE9, 0xA4, 0xE8, 0x55, 0x55, 0x16, 0x00, 
+	0x46, 0xE7, 0x92, 0xE7, 0x00, 0x00, 0x00, 0x00, 
+	0xB6, 0xE7, 0x8B, 0xEA, 0x0A, 0xE8, 0x18, 0xE7, 
+	0x62, 0xEA, 0x58, 0xE8, 0x55, 0x55, 0x16, 0x00, 
+	0x00, 0xE7, 0x46, 0xE7, 0xA0, 0xE7, 0x2A, 0xE7, 
+	0xFF, 0x00, 0x00, 0x08, 0x2A, 0xE7, 0xFF, 0x00, 
+	0x00, 0x0C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x10,  
+	0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x14, 0x2A, 0xE7, 
+	0xFF, 0x00, 0x00, 0x18, 0x2A, 0xE7, 0xFF, 0x00, 
+	0x00, 0x1C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x20, 
+	0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x24, 0x2A, 0xE7, 
+	0xFF, 0x00, 0x00, 0x28, 0x2A, 0xE7, 0xFF, 0x00, 
+	0x00, 0x2C, 0xD2, 0xE7, 0x00, 0xE7, 0x0C, 0xE7, 
+	0x70, 0xE7, 0x40, 0x30, 0x06, 0x00, 0x00, 0x01, 
+	0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x20, 0x00, 0xE7, 
+	0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 
+	0x00, 0x43, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 
+	0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xB0, 
+	0x06, 0x00, 0x00, 0x85, 0xA0, 0xE7, 0xDC, 0xE8, 
+	0x00, 0xA0, 0xD8, 0xE8, 0x00, 0x01, 0x03, 0x01, 
+	0x01, 0x01, 0x00, 0x00, 0x00, 0x81, 0x1A, 0x00, 
+	0x40, 0x10, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
+	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x72, 0x82, 
+	0x4A, 0xA9, 0xA5, 0x5A, 0xDA, 0xE7, 0x03, 0x09, 
+	0x11, 0x9D, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 
+	0xD8, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x81, 
+	0x04, 0x00, 0xD8, 0x90, 0xD8, 0xB4, 0x00, 0x00, 
+	0x00, 0x81, 0x08, 0x00, 0xD8, 0x90, 0x46, 0x16, 
+	0x00, 0x40, 0xD8, 0xB4, 0x08, 0x00, 0x00, 0x00, 
+	0x00, 0x80, 0x13, 0x00, 0x40, 0x10, 0x16, 0x00, 
+	0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x15, 0x00, 
+	0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x15, 0x00, 
+	0x00, 0x00, 0x00, 0x81, 0x0F, 0x00, 0x06, 0x00, 
+	0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x0A, 0x80, 
+	0x40, 0x9E, 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 
+	0x0F, 0x00, 0x06, 0x80, 0x40, 0xFE, 0x00, 0xCC, 
+	0x00, 0x00, 0x04, 0x80, 0x40, 0x8E, 0x00, 0xC9, 
+	0x04, 0x80, 0x00, 0x06, 0x00, 0xCC, 0x04, 0x80, 
+	0x40, 0x0A, 0x00, 0xC8, 0x0A, 0x80, 0x40, 0x8A, 
+	0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 0x0F, 0x00, 
+	0x0A, 0x08, 0x80, 0x1C, 0x0A, 0x00, 0x1C, 0x1A, 
+	0x00, 0x80, 0x1C, 0x0C, 0x00, 0x80, 0x1C, 0x1A, 
+	0x00, 0x80, 0x1A, 0x0E, 0x80, 0x1C, 0x04, 0x00, 
+	0x00, 0x80, 0x80, 0x02, 0x02, 0x00, 0x00, 0x80, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 
+	0x40, 0x00, 0x00, 0x00, 0x58, 0x07, 0x0C, 0xB8, 
+	0x16, 0xE0, 0xE2, 0x08, 0xEC, 0x08, 0xF6, 0x08, 
+	0x16, 0xE0, 0x00, 0x09, 0x0A, 0x09, 0x00, 0x00, 
+	0x00, 0x00, 0xE2, 0x08, 0x00, 0x00, 0xEC, 0x08, 
+	0xF6, 0x08, 0x00, 0x09, 0x00, 0x00, 0xB8, 0x07, 
+	0xCA, 0xCB, 0x80, 0x02, 0xB8, 0x07, 0xE8, 0xCB, 
+	0x84, 0xFF, 0xB8, 0x07, 0x0A, 0xCC, 0xB8, 0x07, 
+	0x84, 0xCC, 0x6E, 0xCD, 0x62, 0xCD, 0x88, 0xCD, 
+	0x90, 0xCE, 0x84, 0xCD, 0x92, 0xCE, 0x92, 0xCE, 
+	0x92, 0xCE, 0x8C, 0xCD, 0x96, 0xCD, 0x38, 0xCE, 
+	0x82, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 
+	0x92, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x08, 0x00, 0x08, 0x01, 0x05, 0x08, 
+	0x08, 0x08, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, 
+	0x00, 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0x04, 
+	0x0A, 0x08, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x00, 
+	0x04, 0x41, 0x06, 0x0B, 0x08, 0xC2, 0x00, 0xE6, 
+	0x00, 0xE7, 0x04, 0x06, 0x04, 0x07, 0x04, 0x03, 
+	0x06, 0x04, 0x04, 0x05, 0x04, 0x88, 0x04, 0xCF, 
+	0x04, 0xCD, 0x03, 0x00, 0x05, 0x00, 0x1C, 0x00, 
+	0x00, 0x0C, 0x00, 0x80, 0xD2, 0xD8, 0xDA, 0xD8, 
+	0x1E, 0xD9, 0xDE, 0xD8, 0xEA, 0xD8, 0xF0, 0xD8, 
+	0x14, 0xD9, 0xE4, 0xD8, 0x32, 0xD9, 0x00, 0x06, 
+	0x00, 0x00, 0x03, 0x07, 0x0A, 0x0E, 0x0F, 0x14, 
+	0x26, 0x2A, 0x52, 0x42, 0x50, 0x48, 0x5D, 0x4D, 
+	0x62, 0x62, 0x6D, 0x57, 0x46, 0x39, 0x1A, 0x1D, 
+	0x7C, 0x76, 0x1F, 0x23, 0x15, 0x1D, 0x74, 0x6F, 
+	0x84, 0x7C, 0x8B, 0x82, 0x92, 0x89, 0x00, 0x00, 
+	0x32, 0x2F, 0x3F, 0x34, 0x32, 0x01, 0x01, 0x57, 
+	0x32, 0x11, 0x81, 0x51, 0x02, 0x56, 0x03, 0x55, 
+	0x54, 0x11, 0x56, 0x81, 0x55, 0x02, 0x54, 0x02, 
+	0x56, 0x81, 0x01, 0x76, 0x02, 0x34, 0x02, 0x55, 
+	0x81, 0x54, 0x02, 0x58, 0x02, 0x55, 0x81, 0x54, 
+	0x02, 0x58, 0x11, 0x12, 0x02, 0x52, 0x58, 0x83, 
+	0x52, 0x05, 0x83, 0x04, 0x02, 0x58, 0x08, 0x55, 
+	0x58, 0x83, 0x55, 0x02, 0x81, 0x02, 0x05, 0x58, 
+	0x03, 0x52, 0x5C, 0x15, 0x53, 0x5B, 0x52, 0x87, 
+	0x11, 0x03, 0x41, 0x51, 0x78, 0x51, 0x34, 0x11, 
+	0x81, 0x11, 0x20, 0x31, 0x54, 0x57, 0x01, 0x53, 
+	0x5A, 0x12, 0x81, 0x51, 0x20, 0x31, 0x5B, 0x57, 
+	0x01, 0x5A, 0x01, 0x11, 0x51, 0x11, 0x31, 0x81, 
+	0x57, 0x20, 0x15, 0x01, 0x13, 0x01, 0x11, 0x01, 
+	0x11, 0x11, 0x81, 0x51, 0x05, 0x58, 0x02, 0x52, 
+	0x5B, 0x54, 0x5D, 0x81, 0x52, 0x05, 0x54, 0x02, 
+	0x58, 0x81, 0x50, 0x02, 0x13, 0x03, 0x58, 0x81, 
+	0x50, 0x02, 0x11, 0x03, 0x81, 0x54, 0x72, 0x5D, 
+	0x50, 0x03, 0x13, 0x03, 0x13, 0x01, 0x40, 0x54, 
+	0x0E, 0x00, 0x20, 0x06, 0x56, 0x06, 0x0C, 0xDA, 
+	0x24, 0x00, 0x02, 0x10, 0x16, 0x00, 0x02, 0x00, 
+	0x01, 0x04, 0x08, 0x07, 0x0C, 0xDA, 0x20, 0x00, 
+	0x03, 0x10, 0x12, 0x00, 0x03, 0x00, 0x4E, 0xD9, 
+	0x14, 0x8E, 0x20, 0x00, 0x04, 0x10, 0x12, 0x00, 
+	0x04, 0x00, 0xD2, 0xCE, 0x20, 0x00, 0x05, 0xE0, 
+	0x12, 0x00, 0x05, 0x00, 0xD2, 0xCE, 0x20, 0x00, 
+	0x06, 0xE0, 0x12, 0x00, 0x06, 0x00, 0xE8, 0xDD, 
+	0x12, 0x00, 0x01, 0xE0, 0x6C, 0x09, 0xCC, 0x06, 
+	0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x30, 0x06, 
+	0x42, 0xDC, 0xF0, 0x05, 0x00, 0xE0, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0xE2, 0x05, 0x08, 0x00, 
+	0x26, 0xFF, 0xDC, 0x05, 0x00, 0x00, 0x30, 0x06, 
+	0xF8, 0xDB, 0x1E, 0x00, 0x01, 0xE0, 0x10, 0x00, 
+	0x11, 0x30, 0x0C, 0x04, 0x01, 0x00, 0x0E, 0x04, 
+	0x02, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 
+	0x30, 0x06, 0x32, 0xDD, 0x12, 0x00, 0x01, 0xE0, 
+	0x04, 0x00, 0x13, 0x30, 0x74, 0xDE, 0x3E, 0x00, 
+	0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, 
+	0x30, 0x00, 0x20, 0x50, 0x23, 0x0C, 0xFC, 0x05, 
+	0x52, 0x06, 0x56, 0x06, 0x00, 0x00, 0x00, 0x81, 
+	0x16, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 
+	0x10, 0x00, 0x08, 0x00, 0x2A, 0x40, 0x2A, 0x04, 
+	0x56, 0x06, 0x26, 0x00, 0x19, 0xED, 0x2B, 0x06, 
+	0x72, 0x09, 0x22, 0x00, 0x24, 0x00, 0x2F, 0xED, 
+	0x23, 0x0C, 0xFC, 0x05, 0x28, 0x08, 0x34, 0x09, 
+	0x29, 0x08, 0x58, 0x07, 0x78, 0x07, 0x98, 0x07, 
+	0x23, 0x00, 0x2A, 0x00, 0x3D, 0xED, 0x06, 0x04, 
+	0xF0, 0x06, 0x07, 0x04, 0xEE, 0x06, 0x24, 0x00, 
+	0xD2, 0xCE, 0x34, 0x00, 0x00, 0xE0, 0x00, 0xC0, 
+	0x00, 0x00, 0x10, 0x00, 0x26, 0x00, 0x25, 0x40, 
+	0xD2, 0xCE, 0x20, 0x00, 0x00, 0xE0, 0x00, 0xC0, 
+	0x00, 0x00, 0x10, 0x00, 0x12, 0x00, 0x26, 0x40, 
+	0xD2, 0xCE, 0x1A, 0x00, 0x00, 0xE0, 0x0C, 0x00, 
+	0x27, 0x60, 0x0A, 0x08, 0xE6, 0x06, 0xD2, 0xCE, 
+	0x24, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x28, 0x60, 
+	0x30, 0x04, 0x06, 0x07, 0x52, 0xCF, 0x00, 0x81, 
+	0x30, 0x00, 0x00, 0xE0, 0x22, 0x00, 0x29, 0x60, 
+	0x2D, 0x08, 0x1C, 0x07, 0x2E, 0x08, 0x22, 0x07, 
+	0x00, 0x00, 0x08, 0x02, 0x06, 0x01, 0x14, 0x06, 
+	0x18, 0x08, 0x20, 0x0C, 0x26, 0x0E, 0x30, 0x0F, 
+	0x34, 0x11, 0x3E, 0x12, 0x42, 0x14, 0x46, 0x16, 
+	0x1C, 0x0A, 0x4A, 0x18, 0x13, 0x03, 0x11, 0x83, 
+	0x01, 0x11, 0x11, 0x81, 0x12, 0x81, 0x13, 0x01, 
+	0x52, 0x83, 0x81, 0x85, 0x85, 0x11, 0x12, 0x81, 
+	0x12, 0x81, 0x19, 0x81, 0x60, 0x85, 0x00, 0xC0, 
+	0x00, 0x00, 0x08, 0x00, 0x6C, 0x09, 0x00, 0x00, 
+	0x30, 0x06, 0x08, 0xE5, 0x54, 0x06, 0x50, 0x06, 
+	0x38, 0x02, 0x21, 0x04, 0x1E, 0x09, 0x0B, 0x06, 
+	0xD8, 0x06, 0x02, 0x08, 0xDC, 0x06, 0x00, 0xC0, 
+	0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x41, 0x00, 
+	0x14, 0xAE, 0x00, 0x00, 0x00, 0x81, 0x09, 0x04, 
+	0x0C, 0x07, 0x41, 0x00, 0x41, 0x00, 0x14, 0x02, 
+	0x00, 0x00, 0x00, 0x81, 0x0B, 0x06, 0xD8, 0x06, 
+	0x2C, 0x06, 0x76, 0x09, 0x22, 0x14, 0x3A, 0x09, 
+	0x41, 0x00, 0x41, 0x00, 0x54, 0x02, 0x00, 0x00, 
+	0x00, 0x81, 0xD8, 0x06, 0x00, 0x84, 0x00, 0x48, 
+	0xFC, 0xFF, 0x09, 0x00, 0x00, 0xC0, 0x00, 0x00, 
+	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x20, 0x00, 
+	0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, 
+	0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 0x38, 0x39, 
+	0x54, 0x20, 0x78, 0x65, 0x73, 0x61, 0x49, 0x20, 
+	0x73, 0x6E, 0x72, 0x74, 0x6D, 0x75, 0x6E, 0x65, 
+	0x73, 0x74, 0x28, 0x0A, 0x29, 0x43, 0x39, 0x31, 
+	0x33, 0x38, 0x34, 0x2C, 0x35, 0x2C, 0x36, 0x2C, 
+	0x49, 0x20, 0x4D, 0x42, 0x43, 0x20, 0x72, 0x6F, 
+	0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x34, 0x90, 
+	0x00, 0x00, 0xFA, 0xFF, 0x01, 0x00, 0xB8, 0xFF, 
+	0x00, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0x80, 0x00, 
+	0x3E, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00  
+};
+#endif /* CONFIG_TMS380TR */
diff -u --recursive --new-file v2.3.21/linux/drivers/net/wan/cosa.c linux/drivers/net/wan/cosa.c
--- v2.3.21/linux/drivers/net/wan/cosa.c	Mon Oct 11 15:38:15 1999
+++ linux/drivers/net/wan/cosa.c	Thu Oct 14 14:29:57 1999
@@ -1,4 +1,4 @@
-/* $Id: cosa.c,v 1.26 1999/07/09 15:02:37 kas Exp $ */
+/* $Id: cosa.c,v 1.28 1999/10/11 21:06:58 kas Exp $ */
 
 /*
  *  Copyright (C) 1995-1997  Jan "Yenya" Kasprzak <kas@fi.muni.cz>
@@ -137,8 +137,7 @@
 	struct semaphore rsem, wsem;
 	char *rxdata;
 	int rxsize;
-	wait_queue_head_t txwaitq; 
-	wait_queue_head_t rxwaitq;
+	wait_queue_head_t txwaitq, rxwaitq;
 	int tx_status, rx_status;
 
 	/* SPPP/HDLC device parts */
@@ -147,6 +146,11 @@
 	struct net_device_stats stats;
 };
 
+/* cosa->firmware_status bits */
+#define COSA_FW_RESET		(1<<0)	/* Is the ROM monitor active? */
+#define COSA_FW_DOWNLOAD	(1<<1)	/* Is the microcode downloaded? */
+#define COSA_FW_START		(1<<2)	/* Is the microcode running? */
+
 struct cosa_data {
 	int num;			/* Card number */
 	char name[COSA_MAX_NAME];	/* Card name - e.g "cosa0" */
@@ -606,6 +610,11 @@
 	struct channel_data *chan = d->priv;
 	int err, flags;
 
+	if (!(chan->cosa->firmware_status & COSA_FW_START)) {
+		printk(KERN_NOTICE "%s: start the firmware first (status %d)\n",
+			chan->cosa->name, chan->cosa->firmware_status);
+		return -EPERM;
+	}
 	spin_lock_irqsave(&chan->cosa->lock, flags);
 	if (chan->usage != 0) {
 		printk(KERN_WARNING "%s: sppp_open called with usage count %d\n",
@@ -781,6 +790,11 @@
 	struct cosa_data *cosa = chan->cosa;
 	char *kbuf;
 
+	if (!(cosa->firmware_status & COSA_FW_START)) {
+		printk(KERN_NOTICE "%s: start the firmware first (status %d)\n",
+			cosa->name, cosa->firmware_status);
+		return -EPERM;
+	}
 	if (down_interruptible(&chan->rsem))
 		return -ERESTARTSYS;
 	
@@ -845,12 +859,17 @@
 static ssize_t cosa_write(struct file *file,
 	const char *buf, size_t count, loff_t *ppos)
 {
-	struct channel_data *chan = (struct channel_data *)file->private_data;
 	DECLARE_WAITQUEUE(wait, current);
+	struct channel_data *chan = (struct channel_data *)file->private_data;
 	struct cosa_data *cosa = chan->cosa;
 	unsigned int flags;
 	char *kbuf;
 
+	if (!(cosa->firmware_status & COSA_FW_START)) {
+		printk(KERN_NOTICE "%s: start the firmware first (status %d)\n",
+			cosa->name, cosa->firmware_status);
+		return -EPERM;
+	}
 	if (down_interruptible(&chan->wsem))
 		return -ERESTARTSYS;
 
@@ -992,12 +1011,14 @@
 	if (cosa->usage > 1)
 		printk(KERN_INFO "cosa%d: WARNING: reset requested with cosa->usage > 1 (%d). Odd things may happen.\n",
 			cosa->num, cosa->usage);
+	cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_START);
 	if (cosa_reset_and_read_id(cosa, idstring) < 0) {
 		printk(KERN_NOTICE "cosa%d: reset failed\n", cosa->num);
 		return -EIO;
 	}
 	printk(KERN_INFO "cosa%d: resetting device: %s\n", cosa->num,
 		idstring);
+	cosa->firmware_status |= COSA_FW_RESET;
 	return 0;
 }
 
@@ -1009,15 +1030,14 @@
 	char *code;
 
 	if (cosa->usage > 1)
-		printk(KERN_INFO "cosa%d: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",
-			cosa->num, cosa->usage);
-#if 0
-	if (cosa->status != CARD_STATUS_RESETED && cosa->status != CARD_STATUS_DOWNLOADED) {
-		printk(KERN_NOTICE "cosa%d: reset the card first (status %d).\n",
-			cosa->num, cosa->status);
+		printk(KERN_INFO "%s: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",
+			cosa->name, cosa->usage);
+	if (!(cosa->firmware_status & COSA_FW_RESET)) {
+		printk(KERN_NOTICE "%s: reset the card first (status %d).\n",
+			cosa->name, cosa->firmware_status);
 		return -EPERM;
 	}
-#endif
+
 	get_user_ret(addr, &(d->addr), -EFAULT);
 	get_user_ret(len, &(d->len), -EFAULT);
 	get_user_ret(code, &(d->code), -EFAULT);
@@ -1027,6 +1047,9 @@
 	if (d->len < 0 || d->len > COSA_MAX_FIRMWARE_SIZE)
 		return -EINVAL;
 
+	/* If something fails, force the user to reset the card */
+	cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_DOWNLOAD);
+
 	if ((i=download(cosa, d->code, len, addr)) < 0) {
 		printk(KERN_NOTICE "cosa%d: microcode download failed: %d\n",
 			cosa->num, i);
@@ -1034,6 +1057,7 @@
 	}
 	printk(KERN_INFO "cosa%d: downloading microcode - 0x%04x bytes at 0x%04x\n",
 		cosa->num, len, addr);
+	cosa->firmware_status |= COSA_FW_RESET|COSA_FW_DOWNLOAD;
 	return 0;
 }
 
@@ -1048,18 +1072,19 @@
 		printk(KERN_INFO "cosa%d: WARNING: readmem requested with "
 			"cosa->usage > 1 (%d). Odd things may happen.\n",
 			cosa->num, cosa->usage);
-#if 0
-	if (cosa->status != CARD_STATUS_RESETED &&
-		cosa->status != CARD_STATUS_DOWNLOADED) {
-		printk(KERN_NOTICE "cosa%d: reset the card first (status %d).\n",
-			cosa->num, cosa->status);
+	if (!(cosa->firmware_status & COSA_FW_RESET)) {
+		printk(KERN_NOTICE "%s: reset the card first (status %d).\n",
+			cosa->name, cosa->firmware_status);
 		return -EPERM;
 	}
-#endif
+
 	get_user_ret(addr, &(d->addr), -EFAULT);
 	get_user_ret(len, &(d->len), -EFAULT);
 	get_user_ret(code, &(d->code), -EFAULT);
 
+	/* If something fails, force the user to reset the card */
+	cosa->firmware_status &= ~COSA_FW_RESET;
+
 	if ((i=readmem(cosa, d->code, len, addr)) < 0) {
 		printk(KERN_NOTICE "cosa%d: reading memory failed: %d\n",
 			cosa->num, i);
@@ -1067,6 +1092,7 @@
 	}
 	printk(KERN_INFO "cosa%d: reading card memory - 0x%04x bytes at 0x%04x\n",
 		cosa->num, len, addr);
+	cosa->firmware_status |= COSA_FW_RESET;
 	return 0;
 }
 
@@ -1078,13 +1104,14 @@
 	if (cosa->usage > 1)
 		printk(KERN_INFO "cosa%d: WARNING: start microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",
 			cosa->num, cosa->usage);
-#if 0
-	if (cosa->status != CARD_STATUS_DOWNLOADED) {
-		printk(KERN_NOTICE "cosa%d: download the microcode first (status %d).\n",
-			cosa->num, cosa->status);
+
+	if ((cosa->firmware_status & (COSA_FW_RESET|COSA_FW_DOWNLOAD))
+		!= (COSA_FW_RESET|COSA_FW_DOWNLOAD)) {
+		printk(KERN_NOTICE "%s: download the microcode and/or reset the card first (status %d).\n",
+			cosa->name, cosa->firmware_status);
 		return -EPERM;
 	}
-#endif
+	cosa->firmware_status &= ~COSA_FW_RESET;
 	if ((i=startmicrocode(cosa, address)) < 0) {
 		printk(KERN_NOTICE "cosa%d: start microcode at 0x%04x failed: %d\n",
 			cosa->num, address, i);
@@ -1093,6 +1120,7 @@
 	printk(KERN_INFO "cosa%d: starting microcode at 0x%04x\n",
 		cosa->num, address);
 	cosa->startaddr = address;
+	cosa->firmware_status |= COSA_FW_START;
 	return 0;
 }
 		
@@ -1689,9 +1717,11 @@
 			/* in second pass, accept first ready-to-TX channel */
 			if (i > cosa->nchannels) {
 				/* Can be safely ignored */
+#ifdef DEBUG_IRQS
 				printk(KERN_DEBUG "%s: Forcing TX "
 					"to not-ready channel %d\n",
 					cosa->name, cosa->txchan);
+#endif
 				break;
 			}
 		}
diff -u --recursive --new-file v2.3.21/linux/drivers/net/wan/cycx_x25.c linux/drivers/net/wan/cycx_x25.c
--- v2.3.21/linux/drivers/net/wan/cycx_x25.c	Mon Oct 11 15:38:15 1999
+++ linux/drivers/net/wan/cycx_x25.c	Wed Oct 13 10:34:34 1999
@@ -11,6 +11,10 @@
 *		as published by the Free Software Foundation; either version
 *		2 of the License, or (at your option) any later version.
 * ============================================================================
+* 1999/10/09	acme		chan_disc renamed to chan_disconnect,
+* 				began adding support for X.25 sockets:
+* 				conf->protocol in new_if
+* 1999/10/05	acme		fixed return E... to return -E...
 * 1999/08/10	acme		serialized access to the card thru a spinlock
 *				in x25_exec
 * 1999/08/09	acme		removed per channel spinlocks
@@ -132,16 +136,19 @@
 	   x25_connect_response (cycx_t *card, x25_channel_t *chan),
 	   x25_disconnect_response (cycx_t *card, u8 link, u8 lcn);
 
-/* Miscellaneous functions */
-static int chan_connect (struct net_device *dev),
-	   chan_send (struct net_device *dev, struct sk_buff *skb);
+/* channel functions */
+int chan_connect (struct net_device *dev),
+    chan_send (struct net_device *dev, struct sk_buff *skb);
+
+static void chan_disconnect (struct net_device *dev);
 
+/* Miscellaneous functions */
 static void set_chan_state (struct net_device *dev, u8 state),
-	    nibble_to_byte (u8 *s, u8 *d, u8 len, u8 nibble),
-	    reset_timer (struct net_device *dev),
-	    chan_disc (struct net_device *dev),
 	    chan_timer (unsigned long d);
 
+static void nibble_to_byte (u8 *s, u8 *d, u8 len, u8 nibble),
+	    reset_timer (struct net_device *dev);
+
 static u8 bps_to_speed_code (u32 bps);
 static u8 log2 (u32 n);
 
@@ -334,7 +341,7 @@
 	strcpy(chan->name, conf->name);
 	chan->card = card;
 	chan->link = conf->port;
-	chan->protocol = ETH_P_IP;
+	chan->protocol = conf->protocol ? ETH_P_X25 : ETH_P_IP;
 	chan->rx_skb = NULL;
 	/* only used in svc connected thru crossover cable */
 	chan->local_addr = NULL;
@@ -353,7 +360,7 @@
 
 				if (!chan->local_addr) {
 					kfree(chan);
-					return ENOMEM;
+					return -ENOMEM;
 				}
 			}
 
@@ -505,7 +512,7 @@
 	dev->start = 0;
 
 	if (chan->state == WAN_CONNECTED || chan->state == WAN_CONNECTING)
-		chan_disc(dev);
+		chan_disconnect(dev);
 		
 	cyclomx_close(card);
 	return 0;
@@ -763,7 +770,7 @@
 	dev->last_rx = jiffies;		/* timestamp */
 	chan->rx_skb = NULL;		/* dequeue packet */
 
-	skb->protocol = htons(ETH_P_IP);
+	skb->protocol = htons(chan->protocol);
 	skb->dev = dev;
 	skb->mac.raw = skb->data;
 	netif_rx(skb);
@@ -799,6 +806,7 @@
 
 	dprintk(KERN_INFO "connect_intr:lcn=%d, local=%s, remote=%s\n",
 			  lcn, loc, rem);
+
 	if ((dev = get_dev_by_dte_addr(wandev, rem)) == NULL) {
 		/* Invalid channel, discard packet */
 		printk(KERN_INFO "%s: connect not expected: remote %s!\n",
@@ -824,6 +832,7 @@
 	cycx_peek(&card->hw, cmd->buf + 1, &key, sizeof(key));
 	dprintk(KERN_INFO "%s: connect_confirm_intr:lcn=%d, key=%d\n",
 			  card->devname, lcn, key);
+
 	if ((dev = get_dev_by_lcn(wandev, -key)) == NULL) {
 		/* Invalid channel, discard packet */
 		clear_bit(--key, (void*)&card->u.x.connection_keys);
@@ -1139,10 +1148,8 @@
 	if ((err = x25_exec(card, X25_CONNECT_REQUEST, chan->link,
 			    &d, 7 + len + 1, NULL, 0)) != 0)
 		clear_bit(--key, (void*)&card->u.x.connection_keys);
-	else {
+	else
                 chan->lcn = -key;
-                chan->protocol = ETH_P_IP;
-        }
 
         return err;
 }
@@ -1229,7 +1236,7 @@
  * Return:	0	connected
  *		>0	connection in progress
  *		<0	failure */
-static int chan_connect (struct net_device *dev)
+int chan_connect (struct net_device *dev)
 {
 	x25_channel_t *chan = dev->priv;
 	cycx_t *card = chan->card;
@@ -1251,7 +1258,7 @@
 
 /* Disconnect logical channel.
  * o if SVC then clear X.25 call */
-static void chan_disc (struct net_device *dev)
+static void chan_disconnect (struct net_device *dev)
 {
 	x25_channel_t *chan = dev->priv;
 
@@ -1270,7 +1277,7 @@
 	
 	switch (chan->state) {
 		case WAN_CONNECTED:
-			chan_disc(dev);
+			chan_disconnect(dev);
 			break;
 		default:
 			printk (KERN_ERR "%s: chan_timer for svc (%s) not "
@@ -1345,7 +1352,7 @@
  *    the packet into 'complete sequence' using M-bit.
  * 2. When transmission is complete, an event notification should be issued
  *    to the router.  */
-static int chan_send (struct net_device *dev, struct sk_buff *skb)
+int chan_send (struct net_device *dev, struct sk_buff *skb)
 {
 	x25_channel_t *chan = dev->priv;
 	cycx_t *card = chan->card;
@@ -1473,14 +1480,15 @@
 	struct net_device *dev = wandev->dev;
 
 	printk (KERN_INFO "x25 dev states\n");
-	printk (KERN_INFO "name: addr:           tbusy:\n");
-	printk (KERN_INFO "----------------------------\n");
+	printk (KERN_INFO "name: addr:           tbusy:  protocol:\n");
+	printk (KERN_INFO "---------------------------------------\n");
 
 	for (; dev; dev = dev->slave) {
 		x25_channel_t *chan = dev->priv;
 
-		printk (KERN_INFO "%-5.5s %-15.15s   %ld\n",
-				  chan->name, chan->addr, dev->tbusy);
+		printk (KERN_INFO "%-5.5s %-15.15s   %ld     ETH_P_%s\n",
+				  chan->name, chan->addr, dev->tbusy,
+				  chan->protocol == ETH_P_IP ? "IP" : "X25");
 	}
 }
 
diff -u --recursive --new-file v2.3.21/linux/drivers/net/wan/sbni.c linux/drivers/net/wan/sbni.c
--- v2.3.21/linux/drivers/net/wan/sbni.c	Mon Oct 11 15:38:15 1999
+++ linux/drivers/net/wan/sbni.c	Tue Oct 12 09:58:02 1999
@@ -1280,10 +1280,12 @@
 				return -EPERM;
 			if(copy_from_user( tmpstr, ifr->ifr_data, 6))
 				return -EFAULT;
-			slave=dev_get(tmpstr);
+			slave = dev_get_by_name(tmpstr);
 			if(!(slave && slave->flags & IFF_UP && dev->flags & IFF_UP))
 			{
 				printk("%s: Both devices should be UP to enslave!\n",dev->name);
+				if (slave)
+					dev_put(slave);
 				return -EINVAL;
 			}
 		
@@ -1304,8 +1306,9 @@
 				else
 				{
 					printk("%s: one of devices is already slave!\n",dev->name);
-					return -EBUSY;
+					error = -EBUSY;
 				}
+				dev_put(slave);
 			}
 			else
 			{
@@ -1359,7 +1362,7 @@
 
 unsigned long calc_crc(char *mem, int len, unsigned initial)
 {
-   
+	unsigned crc, dummy_len;
 	__asm__ (
 		"xorl %%eax,%%eax\n\t"
 		"1:\n\t"
@@ -1367,13 +1370,12 @@
 		"xorb %%dl,%%al\n\t"
 		"shrl $8,%%edx\n\t"
 		"xorl (%%edi,%%eax,4),%%edx\n\t"
-		"loop 1b\n\t"
-		"movl %%edx,%%eax"
-		: 
-		: "S" (mem), "D" (&crc32tab[0]), "c" (len), "d" (initial)
-		: "eax", "edx", "ecx"
+		"loop 1b"
+		: "=d" (crc), "=c" (dummy_len)
+		: "S" (mem), "D" (&crc32tab[0]), "1" (len), "0" (initial)
+		: "eax"
 	);
-	/* return crc; */
+	return crc;
 }
 
 #else
diff -u --recursive --new-file v2.3.21/linux/drivers/parport/Config.in linux/drivers/parport/Config.in
--- v2.3.21/linux/drivers/parport/Config.in	Tue Aug 31 17:29:14 1999
+++ linux/drivers/parport/Config.in	Wed Oct 13 10:32:35 1999
@@ -7,41 +7,43 @@
 
 tristate 'Parallel port support' CONFIG_PARPORT
 if [ "$CONFIG_PARPORT" != "n" ]; then
-  dep_tristate '   PC-style hardware' CONFIG_PARPORT_PC $CONFIG_PARPORT
-  if [ "$CONFIG_PARPORT_PC" != "n" ]; then
-    bool '   Use FIFO/DMA if available' CONFIG_PARPORT_PC_FIFO
-  fi
-  if [ "$CONFIG_PARPORT_PC" = "y" ]; then
-    # Don't bother with this if parport_pc is a module; it only affects
-    # the presence or not of some __init's, which are no-ops for modules.
-    bool '   Support for PCMCIA management for PC-style ports' CONFIG_PARPORT_PC_PCMCIA
-  fi
-  if [ "$CONFIG_ARM" = "y" ]; then
-    dep_tristate '   Archimedes hardware' CONFIG_PARPORT_ARC $CONFIG_PARPORT
-  fi
-  if [ "$CONFIG_AMIGA" = "y" ]; then
-    dep_tristate '   Amiga builtin port' CONFIG_PARPORT_AMIGA $CONFIG_PARPORT
-    if [ "$CONFIG_ZORRO" != "n" ]; then
-      dep_tristate '   Multiface III parallel port' CONFIG_PARPORT_MFC3 $CONFIG_PARPORT
-    fi
-  else
-    define_bool CONFIG_PARPORT_AMIGA n
-    define_bool CONFIG_PARPORT_MFC3 n
-  fi
-  if [ "$CONFIG_ATARI" = "y" ]; then
-    dep_tristate '   Atari hardware' CONFIG_PARPORT_ATARI $CONFIG_PARPORT
-  else
-    define_bool CONFIG_PARPORT_ATARI n
-  fi
-  if [ "$CONFIG_SBUS" = "y" ]; then
-    dep_tristate '   Sparc hardware (EXPERIMENTAL)' CONFIG_PARPORT_SUNBPP $CONFIG_PARPORT
-  else
-    define_bool CONFIG_PARPORT_SUNBPP n
-  fi
+   dep_tristate '  PC-style hardware' CONFIG_PARPORT_PC $CONFIG_PARPORT
+   if [ "$CONFIG_PARPORT_PC" != "n" ]; then
+      bool '    Use FIFO/DMA if available' CONFIG_PARPORT_PC_FIFO
+   fi
+   if [ "$CONFIG_PARPORT_PC" = "y" ]; then
+      # Don't bother with this if parport_pc is a module; it only affects
+      # the presence or not of some __init's, which are no-ops for modules.
+      if [ "$CONFIG_PCMCIA" != "n" ]; then
+	 bool '    Support for PCMCIA management for PC-style ports' CONFIG_PARPORT_PC_PCMCIA
+      fi
+   fi
+   if [ "$CONFIG_ARM" = "y" ]; then
+      dep_tristate '  Archimedes hardware' CONFIG_PARPORT_ARC $CONFIG_PARPORT
+   fi
+   if [ "$CONFIG_AMIGA" = "y" ]; then
+      dep_tristate '  Amiga builtin port' CONFIG_PARPORT_AMIGA $CONFIG_PARPORT
+      if [ "$CONFIG_ZORRO" != "n" ]; then
+	 dep_tristate '  Multiface III parallel port' CONFIG_PARPORT_MFC3 $CONFIG_PARPORT
+      fi
+   else
+      define_bool CONFIG_PARPORT_AMIGA n
+      define_bool CONFIG_PARPORT_MFC3 n
+   fi
+   if [ "$CONFIG_ATARI" = "y" ]; then
+      dep_tristate '  Atari hardware' CONFIG_PARPORT_ATARI $CONFIG_PARPORT
+   else
+      define_bool CONFIG_PARPORT_ATARI n
+   fi
+   if [ "$CONFIG_SBUS" = "y" ]; then
+      dep_tristate '  Sparc hardware (EXPERIMENTAL)' CONFIG_PARPORT_SUNBPP $CONFIG_PARPORT
+   else
+      define_bool CONFIG_PARPORT_SUNBPP n
+   fi
 
-  # If exactly one hardware type is selected then parport will optimise away
-  # support for loading any others.  Defeat this if the user is keen.
-  bool '   Support foreign hardware' CONFIG_PARPORT_OTHER
+   # If exactly one hardware type is selected then parport will optimise away
+   # support for loading any others.  Defeat this if the user is keen.
+   bool '  Support foreign hardware' CONFIG_PARPORT_OTHER
 
-  bool '   IEEE 1284 transfer modes' CONFIG_PARPORT_1284
+   bool '  IEEE 1284 transfer modes' CONFIG_PARPORT_1284
 fi
diff -u --recursive --new-file v2.3.21/linux/drivers/parport/ieee1284.c linux/drivers/parport/ieee1284.c
--- v2.3.21/linux/drivers/parport/ieee1284.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/parport/ieee1284.c	Thu Oct 14 15:59:32 1999
@@ -278,6 +278,9 @@
 		return -ENOSYS; /* FIXME (implement BECP) */
 	}
 
+	if (mode & IEEE1284_EXT_LINK)
+		m = 1<<7; /* request extensibility link */
+
 	port->ieee1284.phase = IEEE1284_PH_NEGOTIATION;
 
 	/* Start off with nStrobe and nAutoFd high, and nSelectIn low */
@@ -354,12 +357,59 @@
 		return 1;
 	}
 
+	/* More to do if we've requested extensibility link. */
+	if (mode & IEEE1284_EXT_LINK) {
+		m = mode & 0x7f;
+		udelay (1);
+		parport_write_data (port, m);
+		udelay (1);
+
+		/* Event 51: Set nStrobe low */
+		parport_frob_control (port,
+				      PARPORT_CONTROL_STROBE,
+				      PARPORT_CONTROL_STROBE);
+
+		/* Event 53: Set nStrobe high */
+		udelay (5);
+		parport_frob_control (port,
+				      PARPORT_CONTROL_STROBE,
+				      0);
+
+		/* Event 55: nAck goes high */
+		if (parport_wait_peripheral (port,
+					     PARPORT_STATUS_ACK,
+					     PARPORT_STATUS_ACK)) {
+			/* This shouldn't really happen with a compliant
+			 * device. */
+			DPRINTK (KERN_DEBUG
+				 "%s: Mode 0x%02x not supported? (0x%02x)\n",
+				 port->name, mode,
+				 port->ops->read_status (port));
+			parport_ieee1284_terminate (port);
+			return 1;
+		}
+
+		/* Event 54: Peripheral sets XFlag to reflect support */
+		xflag = parport_read_status (port) & PARPORT_STATUS_SELECT;
+
+		/* xflag should be high. */
+		if (!xflag) {
+			/* Extended mode not supported. */
+			DPRINTK (KERN_DEBUG "%s: Extended mode 0x%02x not "
+				 "supported\n", port->name, mode);
+			parport_ieee1284_terminate (port);
+			return 1;
+		}
+
+		/* Any further setup is left to the caller. */
+	}
+
 	/* Mode is supported */
 	DPRINTK (KERN_DEBUG "%s: In mode 0x%02x\n", port->name, mode);
 	port->ieee1284.mode = mode;
 
 	/* But ECP is special */
-	if (mode & IEEE1284_MODE_ECP) {
+	if (!(mode & IEEE1284_EXT_LINK) && (mode & IEEE1284_MODE_ECP)) {
 		port->ieee1284.phase = IEEE1284_PH_ECP_SETUP;
 
 		/* Event 30: Set nAutoFd low */
diff -u --recursive --new-file v2.3.21/linux/drivers/parport/parport_pc.c linux/drivers/parport/parport_pc.c
--- v2.3.21/linux/drivers/parport/parport_pc.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/parport/parport_pc.c	Thu Oct 14 15:59:32 1999
@@ -1207,7 +1207,7 @@
 
 	outb (ECR_SPP << 5, ECONTROL (pb)); /* Reset FIFO */
 	outb (0xf4, ECONTROL (pb)); /* Configuration mode */
-	config = inb (FIFO (pb));
+	config = inb (CONFIGA (pb));
 	pword = (config >> 4) & 0x7;
 	switch (pword) {
 	case 0:
@@ -1230,10 +1230,10 @@
 	priv->pword = pword;
 	printk (KERN_DEBUG "0x%lx: PWord is %d bits\n", pb->base, 8 * pword);
 
-	config = inb (CONFIGB (pb));
 	printk (KERN_DEBUG "0x%lx: Interrupts are ISA-%s\n", pb->base,
 		config & 0x80 ? "Level" : "Pulses");
 
+	config = inb (CONFIGB (pb));
 	if (!(config & 0x40)) {
 		printk (KERN_WARNING "0x%lx: IRQ conflict!\n", pb->base);
 		pb->irq = PARPORT_IRQ_NONE;
@@ -1708,58 +1708,83 @@
 	struct {
 		unsigned int vendor;
 		unsigned int device;
+		unsigned int subvendor;
+		unsigned int subdevice;
 		unsigned int numports;
 		struct {
 			unsigned long lo;
 			unsigned long hi; /* -ve if not there */
 		} addr[4];
 	} cards[] = {
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550, 1,
-		  { { 3, 4 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650, 1,
-		  { { 3, 4 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850, 1,
-		  { { 3, 4 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_10x, 1,
-		  { { 2, 3 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_10x, 2,
-		  { { 2, 3 }, { 4, 5 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550, 1,
-		  { { 4, 5 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650, 1,
-		  { { 4, 5 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850, 1,
-		  { { 4, 5 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_20x, 1,
-		  { { 0, 1 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_20x, 2,
-		  { { 0, 1 }, { 2, 3 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550, 2,
-		  { { 1, 2 }, { 3, 4 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650, 2,
-		  { { 1, 2 }, { 3, 4 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850, 2,
-		  { { 1, 2 }, { 3, 4 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550, 1,
-		  { { 1, 2 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650, 1,
-		  { { 1, 2 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850, 1,
-		  { { 1, 2 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550, 1,
-		  { { 2, 3 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650, 1,
-		  { { 2, 3 }, } },
-		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850, 1,
-		  { { 2, 3 }, } },
-		{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PARALLEL, 1,
-		  { { 0, -1 }, } },
-		{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_A, 1,
-		  { { 0, -1 }, } },
-		{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_B, 1,
-		  { { 0, -1 }, } },
-		{ PCI_VENDOR_ID_EXSYS, PCI_DEVICE_ID_EXSYS_4014, 2,
-		  { { 2, -1 }, { 3, -1 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 3, 4 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 3, 4 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 3, 4 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_10x,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 2, 3 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_10x,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  2, { { 2, 3 }, { 4, 5 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 4, 5 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 4, 5 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 4, 5 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_20x,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 0, 1 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_20x,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  2, { { 0, 1 }, { 2, 3 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  2, { { 1, 2 }, { 3, 4 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  2, { { 1, 2 }, { 3, 4 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  2, { { 1, 2 }, { 3, 4 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 1, 2 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 1, 2 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 1, 2 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 2, 3 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 2, 3 }, } },
+		{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 2, 3 }, } },
+		{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PARALLEL,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 0, -1 }, } },
+		{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_A,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 0, -1 }, } },
+		{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_B,
+		  PCI_ANY_ID, PCI_ANY_ID,
+		  1, { { 0, -1 }, } },
+		{ PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
+		  PCI_SUBVENDOR_ID_EXSYS, PCI_SUBDEVICE_ID_EXSYS_4014,
+		  2, { { 4, -1 }, { 5, -1 }, } },
 		{ 0, }
 	};
 
@@ -1776,6 +1801,15 @@
 						  cards[i].device,
 						  pcidev)) != NULL) {
 			int n;
+
+			if (cards[i].subvendor != PCI_ANY_ID &&
+			    cards[i].subvendor != pcidev->subsystem_vendor)
+				continue;
+
+			if (cards[i].subdevice != PCI_ANY_ID &&
+			    cards[i].subdevice != pcidev->subsystem_device)
+				continue;
+
 			for (n = 0; n < cards[i].numports; n++) {
 				unsigned long lo = cards[i].addr[n].lo;
 				unsigned long hi = cards[i].addr[n].hi;
diff -u --recursive --new-file v2.3.21/linux/drivers/pci/devlist.h linux/drivers/pci/devlist.h
--- v2.3.21/linux/drivers/pci/devlist.h	Sat Oct  9 11:47:50 1999
+++ linux/drivers/pci/devlist.h	Thu Oct 14 15:59:32 1999
@@ -1,4 +1,5 @@
 VENDOR( COMPAQ, "Compaq" )
+	DEVICE( COMPAQ,		COMPAQ_TOKENRING, "Token Ring 4/16")
 	DEVICE( COMPAQ,		COMPAQ_1280,	"QVision 1280/p")
 	DEVICE( COMPAQ,		COMPAQ_SMART2P,	"Smart-2/P RAID Controller")
 	DEVICE( COMPAQ,		COMPAQ_NETEL100,"Netelligent 10/100")
@@ -486,6 +487,10 @@
 	DEVICE( MACRONIX,	MACRONIX_MX987x5,"MX98715 / MX98725")
 ENDVENDOR()
 
+VENDOR( TCONRAD, "Thomas-Conrad" )
+	DEVICE( TCONRAD,	TCONRAD_TOKENRING, "Token Ring 4/16")
+ENDVENDOR()
+
 VENDOR( CERN, "CERN" )
 	DEVICE( CERN,		CERN_SPSB_PMC,	"STAR/RD24 SCI-PCI (PMC)")
 	DEVICE( CERN,		CERN_SPSB_PCI,	"STAR/RD24 SCI-PCI (PMC)")
@@ -987,10 +992,6 @@
 
 VENDOR( ATRONICS, "Atronics" )
 	DEVICE( ATRONICS,	ATRONICS_2015,	"IDE-2015PL")
-ENDVENDOR()
-
-VENDOR( EXSYS, "Exsys" )
-	DEVICE( EXSYS,		EXSYS_4014,	"EX-4014")
 ENDVENDOR()
 
 VENDOR( TIGERJET, "TigerJet" )
diff -u --recursive --new-file v2.3.21/linux/drivers/pci/pcisyms.c linux/drivers/pci/pcisyms.c
--- v2.3.21/linux/drivers/pci/pcisyms.c	Thu Aug 26 13:05:38 1999
+++ linux/drivers/pci/pcisyms.c	Thu Oct 14 14:32:18 1999
@@ -43,3 +43,5 @@
 /* Quirk info */
 
 EXPORT_SYMBOL(isa_dma_bridge_buggy);
+EXPORT_SYMBOL(pci_pci_problems);
+
diff -u --recursive --new-file v2.3.21/linux/drivers/pci/quirks.c linux/drivers/pci/quirks.c
--- v2.3.21/linux/drivers/pci/quirks.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/pci/quirks.c	Wed Oct 13 10:32:35 1999
@@ -56,6 +56,47 @@
 	}
 }
 
+int pci_pci_problems = 0;
+
+/*
+ *	Chipsets where PCI->PCI transfers vanish or hang
+ */
+
+static void __init quirk_nopcipci(struct pci_dev *dev)
+{
+	if((pci_pci_problems&PCIPCI_FAIL)==0)
+	{
+		printk(KERN_INFO "Disabling direct PCI/PCI transfers.\n");
+		pci_pci_problems|=PCIPCI_FAIL;
+	}
+}
+
+/*
+ *	Triton requires workarounds to be used by the drivers
+ */
+ 
+static void __init quirk_triton(struct pci_dev *dev)
+{
+	if((pci_pci_problems&PCIPCI_TRITON)==0)
+	{
+		printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n");
+		pci_pci_problems|=PCIPCI_TRITON;
+	}
+}
+
+/*
+ *	Natoma has some interesting boundary conditions with Zoran stuff
+ *	at least
+ */
+ 
+static void __init quirk_natoma(struct pci_dev *dev)
+{
+	if((pci_pci_problems&PCIPCI_NATOMA)==0)
+	{
+		printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n");
+		pci_pci_problems|=PCIPCI_NATOMA;
+	}
+}
 
 /*
  *  S3 868 and 968 chips report region size equal to 32M, but they decode 64M.
@@ -79,6 +120,7 @@
 
 static struct pci_fixup pci_fixups[] __initdata = {
 	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82441,	quirk_passive_release },
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82441,	quirk_passive_release },
 	/*
 	 * Its not totally clear which chipsets are the problematic ones
 	 * We know 82C586 and 82C596 variants are affected.
@@ -88,6 +130,18 @@
 	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_VIA,	PCI_DEVICE_ID_VIA_82C596,	quirk_isa_dma_hangs },
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_S3,	PCI_DEVICE_ID_S3_868,		quirk_s3_64M },
 	{ PCI_FIXUP_HEADER,	PCI_VENDOR_ID_S3,	PCI_DEVICE_ID_S3_968,		quirk_s3_64M },
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL, 	PCI_DEVICE_ID_INTEL_82437, 	quirk_triton }, 
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL, 	PCI_DEVICE_ID_INTEL_82437VX, 	quirk_triton }, 
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL, 	PCI_DEVICE_ID_INTEL_82439, 	quirk_triton }, 
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL, 	PCI_DEVICE_ID_INTEL_82439TX, 	quirk_triton }, 
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL, 	PCI_DEVICE_ID_INTEL_82441, 	quirk_natoma }, 
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL, 	PCI_DEVICE_ID_INTEL_82443LX_0, 	quirk_natoma }, 
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL, 	PCI_DEVICE_ID_INTEL_82443LX_1, 	quirk_natoma }, 
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL, 	PCI_DEVICE_ID_INTEL_82443BX_0, 	quirk_natoma }, 
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL, 	PCI_DEVICE_ID_INTEL_82443BX_1, 	quirk_natoma }, 
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_INTEL, 	PCI_DEVICE_ID_INTEL_82443BX_2, 	quirk_natoma },
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_5597,		quirk_nopcipci },
+	{ PCI_FIXUP_FINAL,	PCI_VENDOR_ID_SI,	PCI_DEVICE_ID_SI_496,		quirk_nopcipci },
 	{ 0 }
 };
 
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/ChangeLog.ips linux/drivers/scsi/ChangeLog.ips
--- v2.3.21/linux/drivers/scsi/ChangeLog.ips	Wed Dec 31 16:00:00 1969
+++ linux/drivers/scsi/ChangeLog.ips	Wed Oct 13 10:32:35 1999
@@ -0,0 +1,25 @@
+Change Log
+~~~~~~~~~~
+
+	1.00.00 - Initial Public Release
+		- Functionally equivalent to 0.99.05
+
+        0.99.05 - Fix an oops on certain passthru commands
+
+	0.99.04 - Fix race condition in the passthru mechanism
+                  -- this required the interface to the utilities to change
+		- Fix error recovery code
+
+	0.99.03 - Make interrupt routine handle all completed request on the
+		  adapter not just the first one
+		- Make sure passthru commands get woken up if we run out of
+		  SCBs
+		- Send all of the commands on the queue at once rather than
+		  one at a time since the card will support it.
+
+	0.99.02 - Added some additional debug statements to print out
+                  errors if an error occurs while trying to read/write
+                  to a logical drive (IPS_DEBUG).
+
+                  Fixed read/write errors when the adapter is using an
+                  8K stripe size.
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/ChangeLog.sym53c8xx linux/drivers/scsi/ChangeLog.sym53c8xx
--- v2.3.21/linux/drivers/scsi/ChangeLog.sym53c8xx	Sat Oct  9 11:47:50 1999
+++ linux/drivers/scsi/ChangeLog.sym53c8xx	Thu Oct 14 14:32:18 1999
@@ -1,3 +1,14 @@
+Sun Oct  3  19:00 1999 Gerard Roudier (groudier@club-internet.fr)
+	* version sym53c8xx-1.5f
+	- Change the way the driver checks the PCI clock frequency, so 
+	  that overclocked PCI BUS up to 48 MHz will not be refused.
+	  The more the BUS is overclocked, the less the driver will 
+	  guarantee that its measure of the SCSI clock is correct.
+	- Backport some minor improvements of SCRIPTS from the sym_hipd 
+	  driver.
+	- Backport the code rewrite of the START QUEUE dequeuing (on 
+	  bad scsi status received) from the sym_hipd driver.
+
 Sat Sep 11  11:00 1999 Gerard Roudier (groudier@club-internet.fr)
 	* version sym53c8xx-1.5e
 	- New linux-2.3.13 __setup scheme support added.
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/Config.in linux/drivers/scsi/Config.in
--- v2.3.21/linux/drivers/scsi/Config.in	Tue Aug 31 17:29:14 1999
+++ linux/drivers/scsi/Config.in	Wed Oct 13 10:32:35 1999
@@ -1,19 +1,19 @@
 comment 'SCSI support type (disk, tape, CD-ROM)'
 
-dep_tristate 'SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
-dep_tristate 'SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
-dep_tristate 'SCSI CD-ROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
+dep_tristate '  SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
+dep_tristate '  SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
+dep_tristate '  SCSI CD-ROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
 if [ "$CONFIG_BLK_DEV_SR" != "n" ]; then
-  bool '  Enable vendor-specific extensions (for SCSI CDROM)' CONFIG_BLK_DEV_SR_VENDOR
+   bool '    Enable vendor-specific extensions (for SCSI CDROM)' CONFIG_BLK_DEV_SR_VENDOR
 fi
-dep_tristate 'SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
+dep_tristate '  SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
 
 comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
 
-bool 'Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
+bool '  Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
 
-bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
-bool 'SCSI logging facility' CONFIG_SCSI_LOGGING
+bool '  Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
+bool '  SCSI logging facility' CONFIG_SCSI_LOGGING
 
 mainmenu_option next_comment
 comment 'SCSI low-level drivers'
@@ -25,10 +25,10 @@
 dep_tristate 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 $CONFIG_SCSI
 dep_tristate 'Adaptec AIC7xxx support' CONFIG_SCSI_AIC7XXX $CONFIG_SCSI
 if [ "$CONFIG_SCSI_AIC7XXX" != "n" ]; then
-    bool '   Enable Tagged Command Queueing (TCQ) by default' CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT
-    int  '   Maximum number of TCQ commands per device' CONFIG_AIC7XXX_CMDS_PER_DEVICE 8
-    bool '   Collect statistics to report in /proc' CONFIG_AIC7XXX_PROC_STATS N
-    int  '   Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5
+   bool '  Enable Tagged Command Queueing (TCQ) by default' CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT
+   int  'Maximum number of TCQ commands per device' CONFIG_AIC7XXX_CMDS_PER_DEVICE 8
+   bool '  Collect statistics to report in /proc' CONFIG_AIC7XXX_PROC_STATS
+   int  'Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5
 fi
 dep_tristate 'IBM ServeRAID support' CONFIG_SCSI_IPS $CONFIG_SCSI
 dep_tristate 'AdvanSys SCSI support' CONFIG_SCSI_ADVANSYS $CONFIG_SCSI
@@ -38,80 +38,81 @@
 
 dep_tristate 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC $CONFIG_SCSI
 if [ "$CONFIG_SCSI_BUSLOGIC" != "n" ]; then
-    bool '  Omit FlashPoint support' CONFIG_SCSI_OMIT_FLASHPOINT
+   bool '  Omit FlashPoint support' CONFIG_SCSI_OMIT_FLASHPOINT
 fi
 dep_tristate 'DTC3180/3280 SCSI support' CONFIG_SCSI_DTC3280 $CONFIG_SCSI
 dep_tristate 'EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) support' CONFIG_SCSI_EATA $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_EATA" != "n" ]; then
-    bool '  enable tagged command queueing' CONFIG_SCSI_EATA_TAGGED_QUEUE
-    bool '  enable elevator sorting' CONFIG_SCSI_EATA_LINKED_COMMANDS
-    int  '  maximum number of queued commands' CONFIG_SCSI_EATA_MAX_TAGS 16
-  fi
+   if [ "$CONFIG_SCSI_EATA" != "n" ]; then
+      bool '  enable tagged command queueing' CONFIG_SCSI_EATA_TAGGED_QUEUE
+      bool '  enable elevator sorting' CONFIG_SCSI_EATA_LINKED_COMMANDS
+      int  'maximum number of queued commands' CONFIG_SCSI_EATA_MAX_TAGS 16
+   fi
 dep_tristate 'EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support' CONFIG_SCSI_EATA_DMA $CONFIG_SCSI
 dep_tristate 'EATA-PIO (old DPT PM2001, PM2012A) support' CONFIG_SCSI_EATA_PIO $CONFIG_SCSI
 dep_tristate 'Future Domain 16xx SCSI/AHA-2920A support' CONFIG_SCSI_FUTURE_DOMAIN $CONFIG_SCSI
 if [ "$CONFIG_MCA" = "y" ]; then
-    dep_tristate 'Future Domain MCS-600/700 SCSI support' CONFIG_SCSI_FD_MCS $CONFIG_SCSI
+   dep_tristate 'Future Domain MCS-600/700 SCSI support' CONFIG_SCSI_FD_MCS $CONFIG_SCSI
 fi
 dep_tristate 'GDT SCSI Disk Array Controller support' CONFIG_SCSI_GDTH $CONFIG_SCSI
 dep_tristate 'Generic NCR5380/53c400 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI
 if [ "$CONFIG_SCSI_GENERIC_NCR5380" != "n" ]; then
-	bool '   Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400
-	choice 'NCR5380/53c400 mapping method (use Port for T130B)' \
+   bool '  Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400
+   choice 'NCR5380/53c400 mapping method (use Port for T130B)' \
 		"Port CONFIG_SCSI_G_NCR5380_PORT \
-		Memory CONFIG_SCSI_G_NCR5380_MEM" Port
+		 Memory CONFIG_SCSI_G_NCR5380_MEM" Port
 fi
 if [ "$CONFIG_PCI" = "y" ]; then
-  dep_tristate 'Initio 9100U(W) support' CONFIG_SCSI_INITIO $CONFIG_SCSI
-  dep_tristate 'Initio INI-A100U2W support' CONFIG_SCSI_INIA100 $CONFIG_SCSI
+   dep_tristate 'Initio 9100U(W) support' CONFIG_SCSI_INITIO $CONFIG_SCSI
+   dep_tristate 'Initio INI-A100U2W support' CONFIG_SCSI_INIA100 $CONFIG_SCSI
 fi
 if [ "$CONFIG_PARPORT" != "n" ]; then
-  dep_tristate 'IOMEGA parallel port (ppa - older drives)' CONFIG_SCSI_PPA $CONFIG_SCSI $CONFIG_PARPORT
-  dep_tristate 'IOMEGA parallel port (imm - newer drives)' CONFIG_SCSI_IMM $CONFIG_SCSI $CONFIG_PARPORT
-  if [ "$CONFIG_SCSI_PPA" != "n" -o "$CONFIG_SCSI_IMM" != "n" ]; then
-    bool  '  ppa/imm option - Use slow (but safe) EPP-16' CONFIG_SCSI_IZIP_EPP16
-    bool  '  ppa/imm option - Assume slow parport control register' CONFIG_SCSI_IZIP_SLOW_CTR
-  fi
+   dep_tristate 'IOMEGA parallel port (ppa - older drives)' CONFIG_SCSI_PPA $CONFIG_SCSI $CONFIG_PARPORT
+   dep_tristate 'IOMEGA parallel port (imm - newer drives)' CONFIG_SCSI_IMM $CONFIG_SCSI $CONFIG_PARPORT
+   if [ "$CONFIG_SCSI_PPA" != "n" -o "$CONFIG_SCSI_IMM" != "n" ]; then
+      bool  '  ppa/imm option - Use slow (but safe) EPP-16' CONFIG_SCSI_IZIP_EPP16
+      bool  '  ppa/imm option - Assume slow parport control register' CONFIG_SCSI_IZIP_SLOW_CTR
+   fi
 fi
 dep_tristate 'NCR53c406a SCSI support' CONFIG_SCSI_NCR53C406A $CONFIG_SCSI
 dep_tristate 'symbios 53c416 SCSI support' CONFIG_SCSI_SYM53C416 $CONFIG_SCSI
+dep_tristate 'Simple 53c710 SCSI support (Compaq, NCR machines)' CONFIG_SCSI_SIM710 $CONFIG_SCSI
 if [ "$CONFIG_PCI" = "y" ]; then
-  dep_tristate 'NCR53c7,8xx SCSI support'  CONFIG_SCSI_NCR53C7xx $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_NCR53C7xx" != "n" ]; then
-    bool '   always negotiate synchronous transfers' CONFIG_SCSI_NCR53C7xx_sync
-    bool '   allow FAST-SCSI [10MHz]' CONFIG_SCSI_NCR53C7xx_FAST
-    bool '   allow DISCONNECT' CONFIG_SCSI_NCR53C7xx_DISCONNECT
-  fi
+   dep_tristate 'NCR53c7,8xx SCSI support'  CONFIG_SCSI_NCR53C7xx $CONFIG_SCSI
+   if [ "$CONFIG_SCSI_NCR53C7xx" != "n" ]; then
+      bool '  always negotiate synchronous transfers' CONFIG_SCSI_NCR53C7xx_sync
+      bool '  allow FAST-SCSI [10MHz]' CONFIG_SCSI_NCR53C7xx_FAST
+      bool '  allow DISCONNECT' CONFIG_SCSI_NCR53C7xx_DISCONNECT
+   fi
 fi
 if [ "$CONFIG_PCI" = "y" -a "$CONFIG_SCSI_NCR53C7xx" != "y" ]; then
-  dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI
-  dep_tristate 'SYM53C8XX SCSI support' CONFIG_SCSI_SYM53C8XX $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_NCR53C8XX" != "n" -o "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then
-    int  '  default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8
-    int  '  maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32
-    int  '  synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 20
-    bool '  enable profiling' CONFIG_SCSI_NCR53C8XX_PROFILE
-    bool '  use normal IO' CONFIG_SCSI_NCR53C8XX_IOMAPPED
-    if [ "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then
-      bool '  include support for the NCR PQS/PDS SCSI card' CONFIG_SCSI_NCR53C8XX_PQS_PDS
-    fi
-    if [ "$CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS" = "0" ]; then
-      bool '  not allow targets to disconnect' CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
-    fi
-    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-      bool '  assume boards are SYMBIOS compatible' CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
-    fi
-  fi
+   dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI
+   dep_tristate 'SYM53C8XX SCSI support' CONFIG_SCSI_SYM53C8XX $CONFIG_SCSI
+   if [ "$CONFIG_SCSI_NCR53C8XX" != "n" -o "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then
+      int  'default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8
+      int  'maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32
+      int  'synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 20
+      bool '  enable profiling' CONFIG_SCSI_NCR53C8XX_PROFILE
+      bool '  use normal IO' CONFIG_SCSI_NCR53C8XX_IOMAPPED
+      if [ "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then
+	 bool '  include support for the NCR PQS/PDS SCSI card' CONFIG_SCSI_NCR53C8XX_PQS_PDS
+      fi
+      if [ "$CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS" = "0" ]; then
+	 bool '  not allow targets to disconnect' CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
+      fi
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+	 bool '  assume boards are SYMBIOS compatible (EXPERIMENTAL)' CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
+      fi
+   fi
 fi
 if [ "$CONFIG_MCA" = "y" ]; then
-  dep_tristate 'IBMMCA SCSI support' CONFIG_SCSI_IBMMCA $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_IBMMCA" != "n" ]; then
-     bool '  Standard SCSI-order' CONFIG_IBMMCA_SCSI_ORDER_STANDARD
-     bool '  Reset SCSI-devices at boottime' CONFIG_IBMMCA_SCSI_DEV_RESET
-  fi
+   dep_tristate 'IBMMCA SCSI support' CONFIG_SCSI_IBMMCA $CONFIG_SCSI
+   if [ "$CONFIG_SCSI_IBMMCA" != "n" ]; then
+      bool '  Standard SCSI-order' CONFIG_IBMMCA_SCSI_ORDER_STANDARD
+      bool '  Reset SCSI-devices at boottime' CONFIG_IBMMCA_SCSI_DEV_RESET
+   fi
 fi
 if [ "$CONFIG_MCA" = "y" ]; then
-  dep_tristate 'NCR MCA 53C9x SCSI support' CONFIG_SCSI_MCA_53C9X $CONFIG_SCSI
+   dep_tristate 'NCR MCA 53C9x SCSI support' CONFIG_SCSI_MCA_53C9X $CONFIG_SCSI
 fi
 dep_tristate 'PAS16 SCSI support' CONFIG_SCSI_PAS16 $CONFIG_SCSI
 dep_tristate 'PCI2000 support' CONFIG_SCSI_PCI2000 $CONFIG_SCSI
@@ -119,22 +120,22 @@
 dep_tristate 'PSI240i support' CONFIG_SCSI_PSI240I $CONFIG_SCSI
 dep_tristate 'Qlogic FAS SCSI support' CONFIG_SCSI_QLOGIC_FAS $CONFIG_SCSI
 if [ "$CONFIG_PCI" = "y" ]; then
-  dep_tristate 'Qlogic ISP SCSI support' CONFIG_SCSI_QLOGIC_ISP $CONFIG_SCSI
-  dep_tristate 'Qlogic ISP FC SCSI support' CONFIG_SCSI_QLOGIC_FC $CONFIG_SCSI
+   dep_tristate 'Qlogic ISP SCSI support' CONFIG_SCSI_QLOGIC_ISP $CONFIG_SCSI
+   dep_tristate 'Qlogic ISP FC SCSI support' CONFIG_SCSI_QLOGIC_FC $CONFIG_SCSI
 fi
 dep_tristate 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE $CONFIG_SCSI
 if [ "$CONFIG_PCI" = "y" ]; then
-  dep_tristate 'Tekram DC390(T) and Am53/79C974 SCSI support' CONFIG_SCSI_DC390T $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_DC390T" != "n" ]; then
-    bool '  _omit_ support for non-DC390 adapters' CONFIG_SCSI_DC390T_NOGENSUPP
-  fi
+   dep_tristate 'Tekram DC390(T) and Am53/79C974 SCSI support' CONFIG_SCSI_DC390T $CONFIG_SCSI
+   if [ "$CONFIG_SCSI_DC390T" != "n" ]; then
+      bool '  _omit_ support for non-DC390 adapters' CONFIG_SCSI_DC390T_NOGENSUPP
+   fi
 fi
 dep_tristate 'Trantor T128/T128F/T228 SCSI support' CONFIG_SCSI_T128 $CONFIG_SCSI
 dep_tristate 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_U14_34F" != "n" ]; then
-    bool '  enable elevator sorting' CONFIG_SCSI_U14_34F_LINKED_COMMANDS
-    int  '  maximum number of queued commands' CONFIG_SCSI_U14_34F_MAX_TAGS 8
-  fi
+   if [ "$CONFIG_SCSI_U14_34F" != "n" ]; then
+      bool '  enable elevator sorting' CONFIG_SCSI_U14_34F_LINKED_COMMANDS
+      int  'maximum number of queued commands' CONFIG_SCSI_U14_34F_MAX_TAGS 8
+   fi
 dep_tristate 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR $CONFIG_SCSI
 #
 # Note - this is a very special 'host' adapter that simulates the presence of some disks.
@@ -145,19 +146,19 @@
 # simulate various conditions that I am testing.
 #
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  dep_tristate 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG $CONFIG_SCSI
+   dep_tristate 'SCSI debugging host simulator (EXPERIMENTAL)' CONFIG_SCSI_DEBUG $CONFIG_SCSI
 fi
 if [ "$CONFIG_PPC" = "y" ]; then
-  dep_tristate 'MESH (Power Mac internal SCSI) support' CONFIG_SCSI_MESH $CONFIG_SCSI
-  if [ "$CONFIG_SCSI_MESH" != "n" ]; then
-    int '  maximum synchronous transfer rate (MB/s) (0 = async)' CONFIG_SCSI_MESH_SYNC_RATE 5
-  fi
-  dep_tristate '53C94 (Power Mac external SCSI) support' CONFIG_SCSI_MAC53C94 $CONFIG_SCSI
+   dep_tristate 'MESH (Power Mac internal SCSI) support' CONFIG_SCSI_MESH $CONFIG_SCSI
+   if [ "$CONFIG_SCSI_MESH" != "n" ]; then
+      int 'maximum synchronous transfer rate (MB/s) (0 = async)' CONFIG_SCSI_MESH_SYNC_RATE 5
+   fi
+   dep_tristate '53C94 (Power Mac external SCSI) support' CONFIG_SCSI_MAC53C94 $CONFIG_SCSI
 fi
 if [ "$CONFIG_ARCH_ACORN" = "y" ]; then
-  source drivers/acorn/scsi/Config.in
+   source drivers/acorn/scsi/Config.in
 fi
 if [ "$CONFIG_MIPS_JAZZ" = "y" ]; then
-  bool 'MIPS JAZZ FAS216 SCSI support' CONFIG_JAZZ_ESP
+   bool 'MIPS JAZZ FAS216 SCSI support' CONFIG_JAZZ_ESP
 fi
 endmenu
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/aha152x.c linux/drivers/scsi/aha152x.c
--- v2.3.21/linux/drivers/scsi/aha152x.c	Thu Aug 26 13:05:38 1999
+++ linux/drivers/scsi/aha152x.c	Thu Oct 14 14:32:18 1999
@@ -344,6 +344,8 @@
 #include <linux/ioport.h>
 #include <linux/proc_fs.h>
 #include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
 
 #include "aha152x.h"
 #include <linux/stat.h>
@@ -714,6 +716,7 @@
 	}
 }
 
+#if 0
 /* called from init/main.c */
 void aha152x_setup(char *str, int *ints)
 {
@@ -742,6 +745,29 @@
 	} else
 		setup_count++;
 }
+#endif
+
+static int __init do_aha152x_setup (char * str)
+{
+	if (setup_count > 2) {
+		printk(KERN_ERR"aha152x: you can only configure up to two
+controllers\n");
+	return 0;
+	}
+
+	setup[setup_count].conf = str;
+	get_option(&str,&setup[setup_count].io_port);
+	get_option(&str,&setup[setup_count].irq);
+	get_option(&str,&setup[setup_count].scsiid);
+	get_option(&str,&setup[setup_count].reconnect);
+	
+	setup_count++;
+	return 1;
+}
+
+#ifndef MODULE
+__setup("aha152x=",do_aha152x_setup);
+#endif
 
 /*
  * Test, if port_base is valid.
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/dec_esp.c linux/drivers/scsi/dec_esp.c
--- v2.3.21/linux/drivers/scsi/dec_esp.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/scsi/dec_esp.c	Wed Oct 13 10:32:35 1999
@@ -0,0 +1,351 @@
+/*
+ * dec_esp.c: Driver for SCSI chips on IOASIC based TURBOchannel DECstations
+ *
+ * TURBOchannel changes by Harald Koerfgen
+ *
+ * based on jazz_esp.c:
+ * Copyright (C) 1997 Thomas Bogendoerfer (tsbogend@alpha.franken.de)
+ *
+ * jazz_esp is based on David S. Miller's ESP driver and cyber_esp
+ */
+
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/types.h>
+#include <linux/string.h>
+#include <linux/malloc.h>
+#include <linux/blk.h>
+#include <linux/proc_fs.h>
+#include <linux/stat.h>
+
+#include "scsi.h"
+#include "hosts.h"
+#include "NCR53C9x.h"
+#include "dec_esp.h"
+
+#include <asm/irq.h>
+#include <asm/jazz.h>
+#include <asm/jazzdma.h>
+#include <asm/dma.h>
+
+#include <asm/pgtable.h>
+
+#include <asm/dec/tc.h>
+#include <asm/dec/interrupts.h>
+#include <asm/dec/ioasic_addrs.h>
+#include <asm/dec/ioasic_ints.h>
+#include <asm/dec/machtype.h>
+
+static int  dma_bytes_sent(struct NCR_ESP *esp, int fifo_count);
+static void dma_drain(struct NCR_ESP *esp);
+static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd * sp);
+static void dma_dump_state(struct NCR_ESP *esp);
+static void dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length);
+static void dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length);
+static void dma_ints_off(struct NCR_ESP *esp);
+static void dma_ints_on(struct NCR_ESP *esp);
+static int  dma_irq_p(struct NCR_ESP *esp);
+static int  dma_ports_p(struct NCR_ESP *esp);
+static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write);
+static void dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp);
+static void dma_mmu_get_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd * sp);
+static void dma_advance_sg(Scsi_Cmnd * sp);
+
+
+volatile unsigned char cmd_buffer[16];
+				/* This is where all commands are put
+				 * before they are trasfered to the ESP chip
+				 * via PIO.
+				 */
+
+volatile unsigned long *scsi_dma_ptr;
+volatile unsigned long *scsi_next_ptr;
+volatile unsigned long *scsi_scr;
+volatile unsigned long *ioasic_ssr;
+volatile unsigned long *scsi_sdr0;
+volatile unsigned long *scsi_sdr1;
+
+static void scsi_dma_int(int, void *, struct pt_regs *);
+
+/***************************************************************** Detection */
+int dec_esp_detect(Scsi_Host_Template * tpnt)
+{
+    struct NCR_ESP *esp;
+    struct ConfigDev *esp_dev;
+
+	if (IOASIC) {
+	esp_dev = 0;
+	esp = esp_allocate(tpnt, (void *) esp_dev);
+	
+		scsi_dma_ptr = (unsigned long *) (system_base + IOCTL + SCSI_DMA_P);
+		scsi_next_ptr = (unsigned long *) (system_base + IOCTL + SCSI_DMA_BP);
+		scsi_scr = (unsigned long *) (system_base + IOCTL + SCSI_SCR);
+		ioasic_ssr = (unsigned long *) (system_base + IOCTL + SSR);
+		scsi_sdr0 = (unsigned long *) (system_base + IOCTL + SCSI_SDR0);
+		scsi_sdr1 = (unsigned long *) (system_base + IOCTL + SCSI_SDR1);
+
+	/* Do command transfer with programmed I/O */
+	esp->do_pio_cmds = 1;
+	
+	/* Required functions */
+	esp->dma_bytes_sent = &dma_bytes_sent;
+	esp->dma_can_transfer = &dma_can_transfer;
+	esp->dma_dump_state = &dma_dump_state;
+	esp->dma_init_read = &dma_init_read;
+	esp->dma_init_write = &dma_init_write;
+	esp->dma_ints_off = &dma_ints_off;
+	esp->dma_ints_on = &dma_ints_on;
+	esp->dma_irq_p = &dma_irq_p;
+	esp->dma_ports_p = &dma_ports_p;
+	esp->dma_setup = &dma_setup;
+
+	/* Optional functions */
+	esp->dma_barrier = 0;
+		esp->dma_drain = &dma_drain;
+	esp->dma_invalidate = 0;
+	esp->dma_irq_entry = 0;
+	esp->dma_irq_exit = 0;
+	esp->dma_poll = 0;
+	esp->dma_reset = 0;
+	esp->dma_led_off = 0;
+	esp->dma_led_on = 0;
+	
+	/* virtual DMA functions */
+	esp->dma_mmu_get_scsi_one = &dma_mmu_get_scsi_one;
+	esp->dma_mmu_get_scsi_sgl = &dma_mmu_get_scsi_sgl;
+		esp->dma_mmu_release_scsi_one = 0;
+		esp->dma_mmu_release_scsi_sgl = 0;
+	esp->dma_advance_sg = &dma_advance_sg;
+
+
+	/* SCSI chip speed */
+		esp->cfreq = 25000000;
+
+	/* 
+	 * we don't give the address of DMA channel, but the number
+	 * of DMA channel, so we can use the jazz DMA functions
+	 * 
+	 */
+	esp->dregs = JAZZ_SCSI_DMA;
+	
+	/* ESP register base */
+		esp->eregs = (struct ESP_regs *) (system_base + SCSI);
+	
+	/* Set the command buffer */
+		esp->esp_command = (volatile unsigned char *) cmd_buffer;
+	
+	/* get virtual dma address for command buffer */
+		esp->esp_command_dvma = KSEG1ADDR((volatile unsigned char *) cmd_buffer);
+	
+		esp->irq = SCSI_INT;
+	request_irq(esp->irq, esp_intr, SA_INTERRUPT, "NCR 53C94 SCSI",
+	            NULL);
+		request_irq(SCSI_DMA_INT, scsi_dma_int, SA_INTERRUPT, "JUNKIO SCSI DMA",
+			    NULL);
+
+	/*
+	 * FIXME, look if the scsi id is availabe from NVRAM
+	 */
+	esp->scsi_id = 7;
+		
+	/* Check for differential SCSI-bus */
+	/* What is this stuff? */
+	esp->diff = 0;
+
+	esp_initialize(esp);
+	
+		printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps, esps_in_use);
+	esps_running = esps_in_use;
+	return esps_in_use;
+    }
+    return 0;
+}
+
+/************************************************************* DMA Functions */
+static void scsi_dma_int(int irq, void *dev_id, struct pt_regs *regs)
+{
+	extern volatile unsigned int *isr;
+	unsigned int dummy;
+
+	if (*isr & SCSI_PTR_LOADED) {
+		/* next page */
+		*scsi_next_ptr = ((*scsi_dma_ptr + PAGE_SIZE) & PAGE_MASK) << 3;
+		*isr &= ~SCSI_PTR_LOADED;
+	} else {
+		printk("Got unexpected SCSI DMA Interrupt! < ");
+		if (*isr & SCSI_PAGOVRRUN)
+			printk("SCSI_PAGOVRRUN ");
+		if (*isr & SCSI_DMA_MEMRDERR)
+			printk("SCSI_DMA_MEMRDERR ");
+		printk(">\n");
+//		panic("stop");
+		*isr &= ~(SCSI_PAGOVRRUN || SCSI_DMA_MEMRDERR);
+	}
+
+	/*
+	 * This driver will only work on IOASIC machines
+	 * so we can avoid an indirect function call here
+	 * and flush the writeback buffer the fast way
+	 */
+	dummy = *isr;
+	dummy = *isr;
+}
+
+static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count)
+{
+    return fifo_count;
+}
+
+static void dma_drain(struct NCR_ESP *esp)
+{
+	unsigned long nw;
+	unsigned short *p = KSEG1ADDR((unsigned short *) ((*scsi_dma_ptr) >> 3));
+
+    /*
+	 * Is there something in the dma buffers left?
+     */
+	if (nw = *scsi_scr) {
+		switch (nw) {
+		case 1:
+			*p = (unsigned short) *scsi_sdr0;
+			break;
+		case 2:
+			*p++ = (unsigned short) (*scsi_sdr0);
+			*p = (unsigned short) ((*scsi_sdr0) >> 16);
+			break;
+		case 3:
+			*p++ = (unsigned short) (*scsi_sdr0);
+			*p++ = (unsigned short) ((*scsi_sdr0) >> 16);
+			*p = (unsigned short) (*scsi_sdr1);
+			break;
+		default:
+			printk("Strange: %d words in dma buffer left\n", (int) nw);
+			break;
+		}
+	}
+}
+
+static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd * sp)
+{
+	return sp->SCp.this_residual;;
+}
+    
+static void dma_dump_state(struct NCR_ESP *esp)
+{
+/*    
+    ESPLOG(("esp%d: dma -- enable <%08x> residue <%08x\n",
+	    esp->esp_id, vdma_get_enable((int)esp->dregs), vdma_get_resdiue((int)esp->dregs)));
+ */
+}
+
+static void dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length)
+{
+	extern volatile unsigned int *isr;
+	unsigned int dummy;
+
+	if (vaddress & 3)
+		panic("dec_efs.c: unable to handle partial word transfers, yet...");
+
+	dma_cache_wback_inv((unsigned long) phys_to_virt(vaddress), length);
+
+	*ioasic_ssr &= ~SCSI_DMA_EN;
+	*scsi_scr = 0;
+	*scsi_dma_ptr = vaddress << 3;
+
+	/* prepare for next page */
+	*scsi_next_ptr = ((vaddress + PAGE_SIZE) & PAGE_MASK) << 3;
+	*ioasic_ssr |= (SCSI_DMA_DIR | SCSI_DMA_EN);
+
+	/*
+	 * see above
+	 */
+	dummy = *isr;
+	dummy = *isr;
+}
+
+static void dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length)
+{
+	extern volatile unsigned int *isr;
+	unsigned int dummy;
+
+	if (vaddress & 3)
+		panic("dec_efs.c: unable to handle partial word transfers, yet...");
+
+	dma_cache_wback_inv((unsigned long) phys_to_virt(vaddress), length);
+
+	*ioasic_ssr &= ~(SCSI_DMA_DIR | SCSI_DMA_EN);
+	*scsi_scr = 0;
+	*scsi_dma_ptr = vaddress << 3;
+
+	/* prepare for next page */
+	*scsi_next_ptr = ((vaddress + PAGE_SIZE) & PAGE_MASK) << 3;
+	*ioasic_ssr |= SCSI_DMA_EN;
+
+	/*
+	 * see above
+	 */
+	dummy = *isr;
+	dummy = *isr;
+}
+
+static void dma_ints_off(struct NCR_ESP *esp)
+{
+	disable_irq(SCSI_DMA_INT);
+}
+
+static void dma_ints_on(struct NCR_ESP *esp)
+{
+	enable_irq(SCSI_DMA_INT);
+}
+
+static int dma_irq_p(struct NCR_ESP *esp)
+{
+    return (esp->eregs->esp_status & ESP_STAT_INTR);
+}
+
+static int dma_ports_p(struct NCR_ESP *esp)
+{
+/*
+ * FIXME: what's this good for?
+ */
+	return 1;
+}
+
+static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write)
+{
+    /* 
+     * On the Sparc, DMA_ST_WRITE means "move data from device to memory"
+     * so when (write) is true, it actually means READ!
+     */
+	if (write) {
+	dma_init_read(esp, addr, count);
+    } else {
+	dma_init_write(esp, addr, count);
+    }
+}
+
+/*
+ * These aren't used yet
+ */
+static void dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp)
+{
+	sp->SCp.have_data_in = PHYSADDR(sp->SCp.buffer);
+	sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.have_data_in);
+}
+
+static void dma_mmu_get_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd * sp)
+{
+    int sz = sp->SCp.buffers_residual;
+    struct mmu_sglist *sg = (struct mmu_sglist *) sp->SCp.buffer;
+    
+    while (sz >= 0) {
+		sg[sz].dvma_addr = PHYSADDR(sg[sz].addr);
+	sz--;
+    }
+	sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.buffer->dvma_address);
+}
+
+static void dma_advance_sg(Scsi_Cmnd * sp)
+{    
+	sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.buffer->dvma_address);
+}
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/dec_esp.h linux/drivers/scsi/dec_esp.h
--- v2.3.21/linux/drivers/scsi/dec_esp.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/scsi/dec_esp.h	Wed Oct 13 10:32:35 1999
@@ -0,0 +1,42 @@
+/* dec_esp.h: Defines and structures for the JAZZ SCSI driver.
+ *
+ * DECstation changes Copyright (C) 1998 Harald Koerfgen
+ *
+ * based on jazz_esp.h:
+ * Copyright (C) 1997 Thomas Bogendoerfer (tsbogend@alpha.franken.de)
+ */
+
+#ifndef DEC_ESP_H
+#define DEC_ESP_H
+
+#define EREGS_PAD(n)     unchar n[3];
+
+#include "NCR53C9x.h"
+
+
+extern int dec_esp_detect(struct SHT *);
+extern const char *esp_info(struct Scsi_Host *);
+extern int esp_queue(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
+extern int esp_command(Scsi_Cmnd *);
+extern int esp_abort(Scsi_Cmnd *);
+extern int esp_reset(Scsi_Cmnd *, unsigned int);
+extern int esp_proc_info(char *buffer, char **start, off_t offset, int length,
+			 int hostno, int inout);
+
+#define SCSI_DEC_ESP {                                         \
+		proc_dir:       &proc_scsi_esp,			\
+		proc_info:      &esp_proc_info,			\
+		name:           "PMAZ-AA",			\
+		detect:         dec_esp_detect,			\
+		info:           esp_info,			\
+		command:        esp_command,			\
+		queuecommand:   esp_queue,			\
+		abort:          esp_abort,			\
+		reset:          esp_reset,			\
+		can_queue:      7,				\
+		this_id:        7,				\
+		sg_tablesize:   SG_ALL,				\
+		cmd_per_lun:    1,				\
+		use_clustering: DISABLE_CLUSTERING, }
+
+#endif /* DEC_ESP_H */
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/mac53c94.c linux/drivers/scsi/mac53c94.c
--- v2.3.21/linux/drivers/scsi/mac53c94.c	Fri Sep 10 23:57:31 1999
+++ linux/drivers/scsi/mac53c94.c	Tue Oct 12 10:00:58 1999
@@ -85,7 +85,9 @@
 		if (host == 0)
 			panic("couldn't register 53c94 host");
 		host->unique_id = nfscs;
+#ifndef MODULE
 		note_scsi_host(node, host);
+#endif
 
 		state = (struct fsc_state *) host->hostdata;
 		if (state == 0)
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/mac53c94.h linux/drivers/scsi/mac53c94.h
--- v2.3.21/linux/drivers/scsi/mac53c94.h	Sun Dec 21 17:04:49 1997
+++ linux/drivers/scsi/mac53c94.h	Tue Oct 12 10:00:58 1999
@@ -28,6 +28,7 @@
 	sg_tablesize:	SG_ALL,				\
 	cmd_per_lun:	1,				\
 	use_clustering:	DISABLE_CLUSTERING,		\
+	use_new_eh_code: 1,				\
 }
 
 /*
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/scsi_error.c linux/drivers/scsi/scsi_error.c
--- v2.3.21/linux/drivers/scsi/scsi_error.c	Tue Sep  7 12:14:06 1999
+++ linux/drivers/scsi/scsi_error.c	Thu Oct 14 14:32:18 1999
@@ -1762,33 +1762,21 @@
 	int rtn;
 	DECLARE_MUTEX_LOCKED(sem);
 	unsigned long flags;
-	struct fs_struct *fs;
+
+	siginitsetinv(&current->blocked, SHUTDOWN_SIGS);
 
 	lock_kernel();
 
 	/*
-	 * If we were started as result of loading a module, close all of the
-	 * user space pages.  We don't need them, and if we didn't close them
-	 * they would be locked into memory.
+	 *	Flush resources
 	 */
-	exit_mm(current);
-
-	current->session = 1;
-	current->pgrp = 1;
-
-	/* Become as one with the init task */
-
-	exit_fs(current);	/* current->fs->count--; */
-	fs = init_task.fs;
-	current->fs = fs;
-	atomic_inc(&fs->count);
-
-	siginitsetinv(&current->blocked, SHUTDOWN_SIGS);
-
-
+	 
+	daemonize();
+	
 	/*
 	 * Set the name of this process.
 	 */
+
 	sprintf(current->comm, "scsi_eh_%d", host->host_no);
 
 	host->eh_wait = &sem;
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/sgiwd93.c linux/drivers/scsi/sgiwd93.c
--- v2.3.21/linux/drivers/scsi/sgiwd93.c	Tue Aug 31 17:29:14 1999
+++ linux/drivers/scsi/sgiwd93.c	Wed Oct 13 10:32:35 1999
@@ -5,13 +5,14 @@
  *
  * (In all truth, Jed Schimmel wrote all this code.)
  *
- * $Id: sgiwd93.c,v 1.1 1998/05/01 01:35:42 ralf Exp $
+ * $Id: sgiwd93.c,v 1.13 1999/03/28 23:06:06 tsbogend Exp $
  */
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/mm.h>
 #include <linux/blk.h>
 #include <linux/version.h>
+#include <linux/delay.h>
 
 #include <asm/page.h>
 #include <asm/pgtable.h>
@@ -21,6 +22,7 @@
 #include <asm/sgihpc.h>
 #include <asm/sgint23.h>
 #include <asm/irq.h>
+#include <asm/spinlock.h>
 #include <asm/io.h>
 
 #include "scsi.h"
@@ -65,14 +67,40 @@
 /* XXX woof! */
 static void sgiwd93_intr(int irq, void *dev_id, struct pt_regs *regs)
 {
+	unsigned long flags;
+
+	spin_lock_irqsave(&io_request_lock, flags);
 	wd33c93_intr(sgiwd93_host);
+	spin_unlock_irqrestore(&io_request_lock, flags);
 }
 
 #undef DEBUG_DMA
 
+static inline
+void fill_hpc_entries (struct hpc_chunk **hcp, char *addr, unsigned long len)
+{
+	unsigned long physaddr;
+	unsigned long count;
+	
+	dma_cache_wback_inv((unsigned long)addr,len);
+	physaddr = PHYSADDR(addr);
+	while (len) {
+		/*
+		 * even cntinfo could be up to 16383, without
+		 * magic only 8192 works correctly
+		 */
+		count = len > 8192 ? 8192 : len;
+		(*hcp)->desc.pbuf = physaddr;
+		(*hcp)->desc.cntinfo = count;
+		(*hcp)++;
+		len -= count;
+		physaddr += count;
+	}
+}
+
 static int dma_setup(Scsi_Cmnd *cmd, int datainp)
 {
-	struct WD33C93_hostdata *hdata = CMDHOSTDATA(cmd);
+	struct WD33C93_hostdata *hdata = (struct WD33C93_hostdata *)cmd->host->hostdata;
 	wd33c93_regs *regp = hdata->regp;
 	struct hpc3_scsiregs *hregs = (struct hpc3_scsiregs *) cmd->host->base;
 	struct hpc_chunk *hcp = (struct hpc_chunk *) hdata->dma_bounce_buffer;
@@ -84,21 +112,18 @@
 
 	hdata->dma_dir = datainp;
 
-	if(cmd->use_sg) {
+	if(cmd->SCp.buffers_residual) {
 		struct scatterlist *slp = cmd->SCp.buffer;
 		int i, totlen = 0;
 
 #ifdef DEBUG_DMA
 		printk("SCLIST<");
 #endif
-		for(i = 0; i <= (cmd->use_sg - 1); i++, hcp++) {
+		for(i = 0; i <= cmd->SCp.buffers_residual; i++) {
 #ifdef DEBUG_DMA
 			printk("[%p,%d]", slp[i].address, slp[i].length);
 #endif
-			dma_cache_wback_inv((unsigned long)slp[i].address,
-			                    PAGE_SIZE);
-			hcp->desc.pbuf = PHYSADDR(slp[i].address);
-			hcp->desc.cntinfo = (slp[i].length & HPCDMA_BCNT);
+			fill_hpc_entries (&hcp, slp[i].address, slp[i].length);
 			totlen += slp[i].length;
 		}
 #ifdef DEBUG_DMA
@@ -111,10 +136,16 @@
 #ifdef DEBUG_DMA
 		printk("ONEBUF<%p,%d>", cmd->SCp.ptr, cmd->SCp.this_residual);
 #endif
-		dma_cache_wback_inv((unsigned long)cmd->SCp.ptr, PAGE_SIZE);
-		hcp->desc.pbuf = PHYSADDR(cmd->SCp.ptr);
-		hcp->desc.cntinfo = (cmd->SCp.this_residual & HPCDMA_BCNT);
-		hcp++;
+		/*
+		 * wd33c93 shouldn't pass us bogus dma_setups, but
+		 * it does:-( The other wd33c93 drivers deal with
+		 * it the same way (which isn't that obvious).
+		 * IMHO a better fix would be, not to do these
+		 * dma setups in the first place
+		 */
+		if (cmd->SCp.ptr == NULL)
+			return 1;
+		fill_hpc_entries (&hcp, cmd->SCp.ptr,cmd->SCp.this_residual);
 		write_wd33c93_count(regp, cmd->SCp.this_residual);
 	}
 
@@ -141,9 +172,14 @@
 static void dma_stop(struct Scsi_Host *instance, Scsi_Cmnd *SCpnt,
 		     int status)
 {
-	struct WD33C93_hostdata *hdata = INSTHOSTDATA(instance);
+	struct WD33C93_hostdata *hdata = (struct WD33C93_hostdata *)instance->hostdata;
 	wd33c93_regs *regp = hdata->regp;
-	struct hpc3_scsiregs *hregs = (struct hpc3_scsiregs *) SCpnt->host->base;
+	struct hpc3_scsiregs *hregs;
+
+	if (!SCpnt)
+		return;
+
+	hregs = (struct hpc3_scsiregs *) SCpnt->host->base;
 
 #ifdef DEBUG_DMA
 	printk("dma_stop: status<%d> ", status);
@@ -158,7 +194,7 @@
 	hregs->ctrl = 0;
 
 	/* See how far we got and update scatterlist state if necessary. */
-	if(SCpnt->use_sg) {
+	if(SCpnt->SCp.buffers_residual) {
 		struct scatterlist *slp = SCpnt->SCp.buffer;
 		int totlen, wd93_residual, transferred, i;
 
@@ -178,7 +214,7 @@
 #ifdef DEBUG_DMA
 			printk("Jed was here...");
 #endif
-			for(i = 0; i <= (SCpnt->use_sg - 1); i++) {
+			for(i = 0; i <= SCpnt->SCp.buffers_residual; i++) {
 				if(slp[i].length >= transferred)
 					break;
 				transferred -= slp[i].length;
@@ -188,10 +224,10 @@
 #ifdef DEBUG_DMA
 			printk("did it all...");
 #endif
-			i = (SCpnt->use_sg - 1);
+			i = SCpnt->SCp.buffers_residual;
 		}
 		SCpnt->SCp.buffer = &slp[i];
-		SCpnt->SCp.buffers_residual = (SCpnt->use_sg - 1 - i);
+		SCpnt->SCp.buffers_residual = SCpnt->SCp.buffers_residual - i;
 		SCpnt->SCp.ptr = (char *) slp[i].address;
 		SCpnt->SCp.this_residual = slp[i].length;
 	}
@@ -200,6 +236,15 @@
 #endif
 }
 
+void sgiwd93_reset(void)
+{
+	struct hpc3_scsiregs *hregs = &hpc3c0->scsi_chan0;
+
+	hregs->ctrl = HPC3_SCTRL_CRESET;
+	udelay (50);
+	hregs->ctrl = 0;
+}
+
 static inline void init_hpc_chain(uchar *buf)
 {
 	struct hpc_chunk *hcp = (struct hpc_chunk *) buf;
@@ -231,6 +276,7 @@
 
 	sgiwd93_host = scsi_register(HPsUX, sizeof(struct WD33C93_hostdata));
 	sgiwd93_host->base = (unsigned char *) hregs;
+	sgiwd93_host->irq = 1;
 
 	buf = (uchar *) get_free_page(GFP_KERNEL);
 	init_hpc_chain(buf);
@@ -239,7 +285,7 @@
 	wd33c93_init(sgiwd93_host, (wd33c93_regs *) 0xbfbc0003,
 		     dma_setup, dma_stop, WD33C93_FS_16_20);
 
-	hdata = INSTHOSTDATA(sgiwd93_host);
+	hdata = (struct WD33C93_hostdata *)sgiwd93_host->hostdata;
 	hdata->no_sync = 0;
 	hdata->dma_bounce_buffer = (uchar *) (KSEG1ADDR(buf));
 	dma_cache_wback_inv((unsigned long) buf, PAGE_SIZE);
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/sgiwd93.h linux/drivers/scsi/sgiwd93.h
--- v2.3.21/linux/drivers/scsi/sgiwd93.h	Fri May  8 00:22:12 1998
+++ linux/drivers/scsi/sgiwd93.h	Wed Oct 13 10:32:35 1999
@@ -1,4 +1,4 @@
-/* $Id: sgiwd93.h,v 1.2 1998/05/04 09:18:49 ralf Exp $
+/* $Id: sgiwd93.h,v 1.5 1998/08/25 09:18:50 ralf Exp $
  * sgiwd93.h: SGI WD93 scsi definitions.
  *
  * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/sr.c linux/drivers/scsi/sr.c
--- v2.3.21/linux/drivers/scsi/sr.c	Mon Oct  4 15:49:30 1999
+++ linux/drivers/scsi/sr.c	Thu Oct 14 14:32:18 1999
@@ -861,7 +861,6 @@
 	unsigned char *buffer;
 	int the_result, retries;
 	Scsi_Cmnd *SCpnt;
-	unsigned long flags;
 
 	buffer = (unsigned char *) scsi_malloc(512);
 	SCpnt = scsi_allocate_device(NULL, scsi_CDs[i].device, 1);
@@ -1031,7 +1030,6 @@
 {
 	Scsi_Cmnd *SCpnt;
 	Scsi_Device *device = scsi_CDs[MINOR(cdi->dev)].device;
-	unsigned long flags;
 	int stat;
 
 	/* get the device */
diff -u --recursive --new-file v2.3.21/linux/drivers/scsi/sym53c8xx.c linux/drivers/scsi/sym53c8xx.c
--- v2.3.21/linux/drivers/scsi/sym53c8xx.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/scsi/sym53c8xx.c	Thu Oct 14 14:32:18 1999
@@ -55,7 +55,7 @@
 */
 
 /*
-**	Sep 10 1999, sym53c8xx 1.5e
+**	October 3 1999, sym53c8xx 1.5f
 **
 **	Supported SCSI features:
 **	    Synchronous data transfers
@@ -83,7 +83,7 @@
 /*
 **	Name and version of the driver
 */
-#define SCSI_NCR_DRIVER_NAME	"sym53c8xx - version 1.5e"
+#define SCSI_NCR_DRIVER_NAME	"sym53c8xx - version 1.5f"
 
 /* #define DEBUG_896R1 */
 #define SCSI_NCR_OPTIMIZE_896
@@ -1847,6 +1847,16 @@
 	u_long		clock_khz;	/* SCSI clock frequency in KHz	*/
 
 	/*----------------------------------------------------------------
+	**	Range for the PCI clock frequency measurement result
+	**	that ensures the algorithm used by the driver can be 
+	**	trusted for the SCSI clock frequency measurement.
+	**	(Assuming a PCI clock frequency of 33 MHz).
+	**----------------------------------------------------------------
+	*/
+	u_int		pciclock_min;
+	u_int		pciclock_max;
+
+	/*----------------------------------------------------------------
 	**	Start queue management.
 	**	It is filled up by the host processor and accessed by the 
 	**	SCRIPTS processor in order to start SCSI commands.
@@ -1993,7 +2003,7 @@
 **	of 825A, 875, 876, 895, 895A and 896 chips.
 */
 struct script {
-	ncrcmd	start		[ 18];
+	ncrcmd	start		[ 14];
 	ncrcmd	getjob_begin	[  4];
 	ncrcmd	getjob_end	[  4];
 	ncrcmd	select		[  8];
@@ -2114,7 +2124,7 @@
 	ncrcmd	bad_identify	[ 12];
 	ncrcmd	bad_i_t_l	[  4];
 	ncrcmd	bad_i_t_l_q	[  4];
-	ncrcmd	bad_status	[ 10];
+	ncrcmd	bad_status	[  6];
 	ncrcmd	tweak_pmj	[ 12];
 	ncrcmd	pm_handle	[ 20];
 	ncrcmd	pm_handle1	[  4];
@@ -2319,15 +2329,14 @@
 	*/
 	SCR_FROM_REG (istat),
 		0,
-	SCR_JUMPR ^ IFFALSE (MASK (SEM, SEM)),
-		16,
 	/*
 	**	Report to the C code the next position in 
 	**	the start queue the SCRIPTS will schedule.
+	**	The C code must not change SCRATCHA.
 	*/
 	SCR_LOAD_ABS (scratcha, 4),
 		PADDRH (startpos),
-	SCR_INT,
+	SCR_INT ^ IFTRUE (MASK (SEM, SEM)),
 		SIR_SCRIPT_STOPPED,
 
 	/*
@@ -2344,8 +2353,6 @@
 	**	may happen that the job address is not yet in the DSA 
 	**	and the the next queue position points to the next JOB.
 	*/
-	SCR_LOAD_ABS (scratcha, 4),
-		PADDRH (startpos),
 	SCR_LOAD_ABS (dsa, 4),
 		PADDRH (startpos),
 	SCR_LOAD_REL (temp, 4),
@@ -3755,17 +3762,14 @@
 		PADDRH (abort_resel),
 }/*-------------------------< BAD_STATUS >-----------------*/,{
 	/*
-	**	If command resulted in either QUEUE FULL,
-	**	CHECK CONDITION or COMMAND TERMINATED,
-	**	call the C code.
+	**	Anything different from INTERMEDIATE 
+	**	CONDITION MET should be a bad SCSI status, 
+	**	given that GOOD status has already been tested.
+	**	Call the C code.
 	*/
 	SCR_LOAD_ABS (scratcha, 4),
 		PADDRH (startpos),
-	SCR_INT ^ IFTRUE (DATA (S_QUEUE_FULL)),
-		SIR_BAD_STATUS,
-	SCR_INT ^ IFTRUE (DATA (S_CHECK_COND)),
-		SIR_BAD_STATUS,
-	SCR_INT ^ IFTRUE (DATA (S_TERMINATED)),
+	SCR_INT ^ IFFALSE (DATA (S_COND_MET)),
 		SIR_BAD_STATUS,
 	SCR_RETURN,
 		0,
@@ -5181,15 +5185,48 @@
 	(void) ncr_prepare_setting(np, nvram);
 
 	/*
-	**	Check the PCI clock frequency.
-	**	Must be done after prepare_setting since it 
-	**	destroys STEST1 that is used to probe for 
-	**	the clock doubler.
-	*/
-	i = (int) ncr_getpciclock(np);
-	if (i > 37000) {
-		printk(KERN_ERR "%s: PCI clock seems too high (%u KHz).\n",
-		       ncr_name(np), i);
+	**	Check the PCI clock frequency if needed.
+	**	
+	**	Must be done after ncr_prepare_setting since it destroys 
+	**	STEST1 that is used to probe for the clock multiplier.
+	**
+	**	The range is currently [22688 - 45375 Khz], given 
+	**	the values used by ncr_getclock().
+	**	This calibration of the frequecy measurement 
+	**	algorithm against the PCI clock frequency is only 
+	**	performed if the driver has had to measure the SCSI 
+	**	clock due to other heuristics not having been enough 
+	**	to deduce the SCSI clock frequency.
+	**
+	**	When the chip has been initialized correctly by the 
+	**	SCSI BIOS, the driver deduces the presence of the 
+	**	clock multiplier and the value of the SCSI clock from 
+	**	initial values of IO registers, and therefore no 
+	**	clock measurement is performed.
+	**	Normally the driver should never have to measure any 
+	**	clock, unless the controller may use a 80 MHz clock 
+	**	or has a clock multiplier and any of the following 
+	**	condition is met:
+	**
+	**	- No SCSI BIOS is present.
+	**	- SCSI BIOS did'nt enable the multiplier for some reason.
+	**	- User has disabled the controller from the SCSI BIOS.
+	**	- User booted the O/S from another O/S that did'nt enable 
+	**	  the multiplier for some reason.
+	**
+	**	As a result, the driver may only have to measure some 
+	**	frequency in very unusual situations.
+	**
+	**	For this reality test against the PCI clock to really 
+	**	protect against flaws in the udelay() calibration or 
+	**	driver problem that affect the clock measurement 
+	**	algorithm, the actual PCI clock frequency must be 33 MHz.
+	*/
+	i = np->pciclock_max ? ncr_getpciclock(np) : 0;
+	if (i && (i < np->pciclock_min  || i > np->pciclock_max)) {
+		printk(KERN_ERR "%s: PCI clock (%u KHz) is out of range "
+			"[%u KHz - %u KHz].\n",
+		       ncr_name(np), i, np->pciclock_min, np->pciclock_max);
 		goto attach_error;
 	}
 
@@ -8509,82 +8546,64 @@
 	u_int32		startp;
 	u_char		s_status = INB (SS_PRT);
 	int		msglen;
+	int		i, j;
+
 
 	/*
+	**	If the LCB is not yet available, then only 
+	**	1 IO is accepted, so we should have it.
+	*/
+	if (!lp)
+		goto next;	
+	/*
 	**	Remove all CCBs queued to the chip for that LUN and put 
 	**	them back in the LUN CCB wait queue.
 	*/
-	if (lp) {
-		int i = np->squeueput;
-		int j = (INL (nc_scratcha) - vtobus(np->squeue)) / 4;
-		int k = np->squeueput;
-
-		busyccbs = lp->queuedccbs;
-		while (1) {
-			if (i == j)
-				break;
-			if (i == 0)
-				i = MAX_START*2;
-			i = i - 2;
-			cp2 = ncr_ccb_from_dsa(np, scr_to_cpu(np->squeue[i]));
-			if (!cp2)
-				continue;
-			if (cp2->target != cp->target || cp2->lun != cp->lun)
-				continue;
+	busyccbs = lp->queuedccbs;
+	i = (INL (nc_scratcha) - vtobus(np->squeue)) / 4;
+	j = i;
+	while (i != np->squeueput) {
+		cp2 = ncr_ccb_from_dsa(np, scr_to_cpu(np->squeue[i]));
+		assert(cp2);
 #ifdef SCSI_NCR_IARB_SUPPORT
-			cp2->host_flags &= ~HF_HINT_IARB;
-			if (cp2 == np->last_cp)
-				np->last_cp = 0;
+		/* IARB hints may not be relevant any more. Forget them. */
+		cp2->host_flags &= ~HF_HINT_IARB;
 #endif
+		if (cp2 && cp2->target == cp->target && cp2->lun == cp->lun) {
 			xpt_remque(&cp2->link_ccbq);
 			xpt_insque_head(&cp2->link_ccbq, &lp->wait_ccbq);
 			--lp->queuedccbs;
 			cp2->queued = 0;
-			np->squeue[i] = DSA_INVALID;
-			k = i;
 		}
+		else {
+			if (i != j)
+				np->squeue[j] = np->squeue[i];
+			if ((j += 2) >= MAX_START*2) j = 0;
+		}
+		if ((i += 2) >= MAX_START*2) i = 0;
+	}
+	if (i != j)		/* Copy back the idle task if needed */
+		np->squeue[j] = np->squeue[i];
+	np->squeueput = j;	/* Update our current start queue pointer */
 
-		/*
-		**	Requeue the interrupted CCB in front of 
-		**	the LUN CCB wait queue.
-		*/
-#ifdef SCSI_NCR_IARB_SUPPORT
-		cp->host_flags &= ~HF_HINT_IARB;
-		if (cp == np->last_cp)
-			np->last_cp = 0;
-#endif
-		xpt_remque(&cp->link_ccbq);
-		xpt_insque_head(&cp->link_ccbq, &lp->wait_ccbq);
-		--lp->queuedccbs;
-		cp->queued = 0;
+	/*
+	**	Requeue the interrupted CCB in front of the 
+	**	LUN CCB wait queue to preserve ordering.
+	*/
+	xpt_remque(&cp->link_ccbq);
+	xpt_insque_head(&cp->link_ccbq, &lp->wait_ccbq);
+	--lp->queuedccbs;
+	cp->queued = 0;
+
+next:
 
 #ifdef SCSI_NCR_IARB_SUPPORT
-		if (np->last_cp)
-			np->last_cp->host_flags &= ~HF_HINT_IARB;
+	/* IARB hint may not be relevant any more. Forget it. */
+	cp->host_flags &= ~HF_HINT_IARB;
+	if (np->last_cp)
+		np->last_cp = 0;
 #endif
 
-		/*
-		**	Repair the startqueue if necessary.
-		*/
-		if (k != np->squeueput) {
-			j = k;
-			while (1) {
-				j += 2;
-				if (j >= MAX_START*2)
-					j = 0;
-				if (np->squeue[j] == DSA_INVALID)
-					continue;
-				np->squeue[k] = np->squeue[j];
-				if (j == np->squeueput)
-					break;
-				k += 2;
-				if (k >= MAX_START*2)
-					k = 0;
-			}
-			np->squeueput = k;
-		}
-	}
-
 	/*
 	**	Now we can restart the SCRIPTS processor safely.
 	*/
@@ -8592,7 +8611,10 @@
 	OUTL (nc_dsp, NCB_SCRIPT_PHYS (np, start));
 
 	switch(s_status) {
-	default:	/* Just for safety, should never happen */
+	default:
+	case S_BUSY:
+		ncr_complete(np, cp);
+		break;
 	case S_QUEUE_FULL:
 		if (!lp || !lp->queuedccbs) {
 			ncr_complete(np, cp);
@@ -8951,6 +8973,7 @@
 			assert(k != -1);
 			if (k != 1) {
 				np->squeue[k] = np->squeue[i]; /* Idle task */
+				np->squeueput = k; /* Start queue pointer */
 				cp->host_status = HS_ABORTED;
 				cp->scsi_status = S_ILLEGAL;
 				ncr_complete(np, cp);
@@ -10944,11 +10967,18 @@
 		if (bootverbose)
 			printk ("%s: NCR clock is %uKHz\n", ncr_name(np), f1);
 
-		if	(f1 <	45000)		f1 =  40000;
-		else if (f1 <	55000)		f1 =  50000;
+		if	(f1 < 55000)		f1 =  40000;
 		else				f1 =  80000;
 
-		if (f1 < 80000 && mult > 1) {
+		/*
+		**	Suggest to also check the PCI clock frequency 
+		**	to make sure our frequency calculation algorithm 
+		**	is not too biased.
+		*/
+		np->pciclock_min = (33000*55+80-1)/80;
+		np->pciclock_max = (33000*55)/40;
+
+		if (f1 == 40000 && mult > 1) {
 			if (bootverbose >= 2)
 				printk ("%s: clock multiplier assumed\n", ncr_name(np));
 			np->multiplier	= mult;
@@ -10973,13 +11003,12 @@
  */
 static u_int __init ncr_getpciclock (ncb_p np)
 {
-	static u_int f = 0;
+	static u_int f;
+
+	OUTB (nc_stest1, SCLK);	/* Use the PCI clock as SCSI clock */
+	f = ncr_getfreq (np);
+	OUTB (nc_stest1, 0);
 
-	if (!f) {
-		OUTB (nc_stest1, SCLK);	/* Use the PCI clock as SCSI clock */
-		f = ncr_getfreq (np);
-		OUTB (nc_stest1, 0);
-	}
 	return f;
 }
 
diff -u --recursive --new-file v2.3.21/linux/drivers/sgi/Config.in linux/drivers/sgi/Config.in
--- v2.3.21/linux/drivers/sgi/Config.in	Fri Jun 25 17:39:34 1999
+++ linux/drivers/sgi/Config.in	Wed Oct 13 10:32:35 1999
@@ -6,13 +6,13 @@
 
 bool 'SGI Zilog85C30 serial support' CONFIG_SGI_SERIAL
 if [ "$CONFIG_SGI_SERIAL" != "n" ]; then
-  define_bool CONFIG_SERIAL y
+   define_bool CONFIG_SERIAL y
 fi
 
 bool 'SGI DS1286  RTC support' CONFIG_SGI_DS1286
 
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then  
-  tristate 'SGI Newport Graphics support' CONFIG_SGI_NEWPORT_GFX
+   tristate 'SGI Newport Graphics support (EXPERIMENTAL)' CONFIG_SGI_NEWPORT_GFX
 fi
 
 endmenu
diff -u --recursive --new-file v2.3.21/linux/drivers/sound/ac97.h linux/drivers/sound/ac97.h
--- v2.3.21/linux/drivers/sound/ac97.h	Mon Oct  4 15:49:30 1999
+++ linux/drivers/sound/ac97.h	Wed Oct 13 10:32:35 1999
@@ -33,6 +33,19 @@
 
 /* registers 0x0028 - 0x0058 are reserved */
 
+/* AC'97 2.0 */
+#define AC97_EXTENDED_ID	0x0028	/* Extended Audio ID */
+#define AC97_EXTENDED_STATUS	0x002A	/* Extended Audio Status */
+#define AC97_PCM_FRONT_DAC_RATE 0x002C  /* PCM Front DAC Rate */
+#define AC97_PCM_SURR_DAC_RATE  0x002E  /* PCM Surround DAC Rate */
+#define AC97_PCM_LFE_DAC_RATE   0x0030  /* PCM LFE DAC Rate */
+#define AC97_PCM_LR_DAC_RATE	0x0032	/* PCM LR DAC Rate */
+#define AC97_PCM_MIC_ADC_RATE   0x0034  /* PCM MIC ADC Rate */
+#define AC97_CENTER_LFE_MASTER  0x0036  /* Center + LFE Master Volume */
+#define AC97_SURROUND_MASTER    0x0038  /* Surround (Rear) Master Volume */
+#define AC97_RESERVED_3A	0x003A	/* Reserved */
+/* range 0x3c-0x58 - MODEM */
+
 /* registers 0x005a - 0x007a are vendor reserved */
 
 #define  AC97_VENDOR_ID1         0x007c
diff -u --recursive --new-file v2.3.21/linux/drivers/sound/dmasound.c linux/drivers/sound/dmasound.c
--- v2.3.21/linux/drivers/sound/dmasound.c	Mon Oct  4 15:49:30 1999
+++ linux/drivers/sound/dmasound.c	Tue Oct 12 10:00:58 1999
@@ -89,6 +89,7 @@
 #include <linux/malloc.h>
 #include <linux/sound.h>
 #include <linux/init.h>
+#include <linux/delay.h>
 
 #if defined(__mc68000__) || defined(CONFIG_APUS)
 #include <asm/setup.h>
@@ -239,7 +240,7 @@
 	-269,	-245,	-218,	-187,	-153,	-117,	-79,	-40,
 };
 
-#define BEEP_SPEED	2	/* 22050 Hz sample rate */
+#define BEEP_SRATE	22050	/* 22050 Hz sample rate */
 #define BEEP_BUFLEN	512
 #define BEEP_VOLUME	15	/* 0 - 100 */
 
@@ -295,7 +296,7 @@
 MODULE_PARM(catchRadius, "i");
 MODULE_PARM(numBufs, "i");
 MODULE_PARM(bufSize, "i");
-MODULE_PARM(numreadBufs, "i");
+MODULE_PARM(numReadBufs, "i");
 MODULE_PARM(readbufSize, "i");
 
 #define arraysize(x)	(sizeof(x)/sizeof(*(x)))
@@ -3209,6 +3210,7 @@
 static int awacs_freqs[8] = {
 	44100, 29400, 22050, 17640, 14700, 11025, 8820, 7350
 };
+static int awacs_freqs_ok[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };
 
 static void PMacInit(void)
 {
@@ -3232,10 +3234,13 @@
 	 * Otherwise choose the next higher rate.
 	 * N.B.: burgundy awacs (iMac and later) only works at 44100 Hz.
 	 */
-	i = (awacs_revision >= AWACS_BURGUNDY)? 1: 8;
+	i = 8;
 	do {
 		tolerance = catchRadius * awacs_freqs[--i] / 100;
-	} while (sound.soft.speed > awacs_freqs[i] + tolerance && i > 0);
+		if (awacs_freqs_ok[i]
+		    && sound.soft.speed <= awacs_freqs[i] + tolerance)
+			break;
+	} while (i > 0);
 	if (sound.soft.speed >= awacs_freqs[i] - tolerance)
 		sound.trans = &transAwacsNormal;
 	else
@@ -3529,8 +3534,8 @@
 static void awacs_mksound(unsigned int hz, unsigned int ticks)
 {
 	unsigned long flags;
-	int beep_speed = (awacs_revision < AWACS_BURGUNDY)? BEEP_SPEED: 0;
-	int srate = awacs_freqs[beep_speed];
+	int beep_speed = 0;
+	int srate;
 	int period, ncycles, nsamples;
 	int i, j, f;
 	short *p;
@@ -3538,6 +3543,11 @@
 	static int beep_nsamples_cache;
 	static int beep_volume_cache;
 
+	for (i = 0; i < 8 && awacs_freqs[i] >= BEEP_SRATE; ++i)
+		if (awacs_freqs_ok[i])
+			beep_speed = i;
+	srate = awacs_freqs[beep_speed];
+
 	if (hz <= srate / BEEP_BUFLEN || hz > srate / 2) {
 #if 1
 		/* this is a hack for broken X server code */
@@ -3625,6 +3635,12 @@
 		out_le32(&awacs->byteswap, sound.hard.format != AFMT_S16_BE);
 		enable_irq(awacs_irq);
 		enable_irq(awacs_tx_irq);
+		if (awacs_revision == 3) {
+			mdelay(100);
+			awacs_write(0x6000);
+			mdelay(2);
+			awacs_write(awacs_reg[1] | MASK_ADDR1);
+		}
 	}
 	return PBOOK_SLEEP_OK;
 }
@@ -3667,7 +3683,7 @@
 awacs_burgundy_rcw(unsigned addr)
 {
 	unsigned val = 0;
-	int flags;
+	unsigned long flags;
 
 	/* should have timeouts here */
 	save_flags(flags); cli();
@@ -3709,7 +3725,7 @@
 awacs_burgundy_rcb(unsigned addr)
 {
 	unsigned val = 0;
-	int flags;
+	unsigned long flags;
 
 	/* should have timeouts here */
 	save_flags(flags); cli();
@@ -5497,12 +5513,41 @@
 		np = find_devices("davbus");
 		sound = find_devices("sound");
 		if (sound != 0 && sound->parent == np) {
-			int *sfprop;
-			sfprop = (int *) get_property(sound, "sub-frame", 0);
-			if (sfprop != 0 && *sfprop >= 0 && *sfprop < 16)
-				awacs_subframe = *sfprop;
+			unsigned int *prop, l, i;
+			prop = (unsigned int *)
+				get_property(sound, "sub-frame", 0);
+			if (prop != 0 && *prop >= 0 && *prop < 16)
+				awacs_subframe = *prop;
 			if (device_is_compatible(sound, "burgundy"))
 				awacs_revision = AWACS_BURGUNDY;
+
+			/* look for a property saying what sample rates
+			   are available */
+			for (i = 0; i < 8; ++i)
+				awacs_freqs_ok[i] = 0;
+			prop = (unsigned int *) get_property
+				(sound, "sample-rates", &l);
+			if (prop == 0)
+				prop = (unsigned int *) get_property
+					(sound, "output-frame-rates", &l);
+			if (prop != 0) {
+				for (l /= sizeof(int); l > 0; --l) {
+					/* sometimes the rate is in the
+					   high-order 16 bits (?) */
+					unsigned int r = *prop++;
+					if (r >= 0x10000)
+						r >>= 16;
+					for (i = 0; i < 8; ++i) {
+						if (r == awacs_freqs[i]) {
+							awacs_freqs_ok[i] = 1;
+							break;
+						}
+					}
+				}
+			} else {
+				/* assume just 44.1k is OK */
+				awacs_freqs_ok[0] = 1;
+			}
 		}
 	}
 	if (np != NULL && np->n_addrs >= 3 && np->n_intrs >= 3) {
diff -u --recursive --new-file v2.3.21/linux/drivers/sound/maestro.c linux/drivers/sound/maestro.c
--- v2.3.21/linux/drivers/sound/maestro.c	Mon Oct  4 15:49:30 1999
+++ linux/drivers/sound/maestro.c	Wed Oct 13 10:32:35 1999
@@ -40,14 +40,14 @@
  *	channels.  They can take data from a number of sources and perform
  *	basic encodings of the data.  The wavecache is a storehouse for
  *	PCM data.  Typically it deals with PCI and interracts with the
- *	APUs.  The ASP is a wacky DSP like device that ESS is loathe
+ *	APUs.  The ASP is a wacky DSP like device that ESS is loth
  *	to release docs on.  Thankfully it isn't required on the Maestro
  *	until you start doing insane things like FM emulation and surround
  *	encoding.  The codecs are almost always AC-97 compliant codecs, 
  *	but it appears that early Maestros may have had PT101 (an ESS
  *	part?) wired to them.  The only real difference in the Maestro
  *	families is external goop like docking capability, memory for
- *	the ASP, and trivial initialization differences.
+ *	the ASP, and initialization differences.
  *
  *  Driver Operation
  *
@@ -70,7 +70,7 @@
  *	the client and complicates the buffer maths tremendously.  Ick.
  *
  *	This also pollutes the recording paths as well.  We have to use
- *	2 l/r incoming APUs that are fixed at 16bit/48khz.  We then pipe
+ *	2 L/R incoming APUs that are fixed at 16bit/48khz.  We then pipe
  * 	these through 2 rate converion apus that mix them down to the
  * 	requested frequency and write them to memory through the wavecache.
  *	We also apparently need a 512byte region thats used as temp space 
@@ -79,21 +79,39 @@
  *	The wavecache makes our life even more fun.  First off, it can
  *	only address the first 28 bits of PCI address space, making it
  *	useless on quite a few architectures.  Secondly, its insane.
- *	It can only fetch from 4 regions of PCI space, each 2 meg in length
- *	and 4k aligned.  It then uses high bits of the address in the APU
- *	to decide which buffer to use, but as far as I can tell can only
- *	choose between 2 of the 4 available when you really want to hit
- *	PCI space.  So all the memory we're touching has to fit in 2 regions
- *	of 4 meg under 256meg.  So much for dynamic allocation of multiple
- *	/dev/dsps.  So we force only 1 /dev/dsp, allocate both its read
- *	and write buffers contiguously at open(), and allocate the weird
- *	mixbuf input APU buffers on another page.  The first 2meg region
- *	goes to the input/output buffers, and the second region goes to
- *	the weird mixbuf.   Long term fixes?  Get an allocator that lets
- *	us try and allocate from zones.  Alleviate pain by putting the mixbuf
- *	in onboard ram rather than in system memory.  Buy a real sound card.
+ *	It claims to only fetch from 4 regions of PCI space, each 4 meg in length.
+ *	But that doesn't really work.  You can only use 1 region.  So all our
+ *	allocations have to be in 4meg of each other.  Booo.  Hiss.
+ *	So we have a module parameter, dsps_order, that is the order of
+ *	the number of dsps to provide.  All their buffer space is allocated
+ *	on open time.  The sonicvibes oss routines we inherited really want
+ *	power of 2 buffers, so we have all those next to each other, then
+ *	512 byte regions for the recording wavecaches.  This ends up
+ *	wasting quite a bit of memory.  The only fixes I can see would be 
+ *	getting a kernel allocator that could work in zones, or figuring out
+ *	just how to coerce the WP into doing what we want.
+ *
+ *	The indirection of the various registers means we have to spinlock
+ *	nearly all register accesses.  We have the main register indirection
+ *	like the wave cache, maestro registers, etc.  Then we have beasts
+ *	like the APU interface that is indirect registers gotten at through
+ *	the main maestro indirection.  Ouch.  We spinlock around the actual
+ *	ports on a per card basis.  This means spinlock activity at each IO
+ *	operation, but the only IO operation clusters are in non critical 
+ *	paths and it makes the code far easier to follow.  Interrupts are
+ *	blocked while holding the locks because the int handler has to
+ *	get at some of them :(.  The mixer interface doesn't, however.
+ *	We also have an OSS state lock that is thrown around in a few
+ *	places.
  *	
  * History
+ *  v0.07 - Oct 4 1999 - Zach Brown <zab@redhat.com>
+ *	tweak adc/dac, formating, and stuff to allow full duplex
+ *	allocate dsps memory at open() so we can fit in the wavecache window
+ *	fix wavecache braindamage.  again.  no more scribbling?
+ *	fix ess 1921 codec bug on some laptops.
+ *	fix dumb pci scanning bug
+ *	started 2.3 cleanup, redid spinlocks, little cleanups
  *  v0.06 - Sep 20 1999 - Zach Brown <zab@redhat.com>
  *	fix wavecache thinkos.  limit to 1 /dev/dsp.
  *	eric is wearing his thinking toque this week.
@@ -125,20 +143,10 @@
  *	look really hard at the apu/bob/dma buffer code paths.
  *	fix bob frequency
  *	do smart things with ac97 2.0 bits.
- *	fix wavecache so multiple /dev/dsps work
  *	test different sized writes
  *	fixup latencies ?
  *	get apm save/restore working?
- *	allocate dma bounce page
- *	start_adc is called way too often
  *	sort out 0x34->0x36 crap in init
- *	wavecache needs to be looked at, multiple
- *		dsps and recording seem confused
- *
- *	the entire issue of smp safety needs to be looked at.  cli() needs
- *	to be replaced with spinlock_irqsave, being very careful of call
- *	paths avoiding deadlock.  if lock hold times are quick just
- *	use one big ass per device spinlock.. 
  *
  *	apm is kind of a mess.  I doubt we can rely on the machine keeping
  *	power to the maestro/codecs when we suspend.  This means we have
@@ -187,13 +195,14 @@
 
 #ifdef M_DEBUG
 static int debug=0;
+static int dsps_order=0;
 #define M_printk(args...) {if (debug) printk(args);}
 #else
 #define M_printk(x)
 #endif
 
 /* --------------------------------------------------------------------- */
-#define DRIVER_VERSION "0.06"
+#define DRIVER_VERSION "0.07"
 
 #ifndef PCI_VENDOR_ESS
 #define PCI_VENDOR_ESS			0x125D
@@ -208,7 +217,6 @@
 
 #define ESS_CHAN_HARD		0x100
 
-#undef CONFIG_APM /* see notes above */
 
 /* changed so that I could actually find all the
 	references and fix them up.  its a little more readable now. */
@@ -218,16 +226,15 @@
 #define ESS_DAC_SHIFT	0   
 #define ESS_ADC_SHIFT	4
 
-#define ESS_ENABLE_PE		1
-#define ESS_ENABLE_RE		2
-
 #define ESS_STATE_MAGIC		0x125D1968
 #define ESS_CARD_MAGIC		0x19283746
 
 #define DAC_RUNNING		1
 #define ADC_RUNNING		2
 
-#define NR_DSPS		1 /* our wavecache setup demands this. */
+#define MAX_DSP_ORDER	3
+#define MAX_DSPS	(1<<3)
+#define NR_DSPS		(1<<dsps_order)
 
 #define SND_DEV_DSP16   5 
 
@@ -260,10 +267,14 @@
 	unsigned int rateadc, ratedac;
 	unsigned char fmt, enable;
 
+	int index;
+
+	/* this locks around the oss state in the driver */
 	spinlock_t lock;
+	/* only let 1 be opening at a time */
 	struct semaphore open_sem;
-	mode_t open_mode;
 	wait_queue_head_t open_wait;
+	mode_t open_mode;
 
 	/* soundcore stuff */
 	int dev_audio;
@@ -286,7 +297,7 @@
 		unsigned fragsamples;
 		/* OSS stuff */
 		unsigned mapped:1;
-		unsigned ready:1;
+		unsigned ready:1;	/* our oss buffers are ready to go */
 		unsigned endcleared:1;
 		unsigned ossfragshift;
 		int ossmaxfrags;
@@ -294,7 +305,6 @@
 		u16 base;		/* Offset for ptr */
 	} dma_dac, dma_adc;
 
-
 	/* pointer to each dsp?s piece of the apu->src buffer page */
 	void *mixbuf;
 };
@@ -323,7 +333,7 @@
 		unsigned int mixer_state[SOUND_MIXER_NRDEVICES];
 	} mix;
 	
-	struct ess_state channels[NR_DSPS];
+	struct ess_state channels[MAX_DSPS];
 	u16 maestro_map[32];	/* Register map */
 #ifdef CONFIG_APM
 	/* we have to store this junk so that we can come back from a
@@ -331,16 +341,19 @@
 	u16 apu_map[64][16];	/* contents of apu regs */
 #endif
 
-	/* 1 page of DMA-able memory for mixer apu buffers,
-		shared amongst dsp?s. */
-	void *mixpage;
+	/* this locks around the physical registers on the card */
+	spinlock_t lock;
+
+	/* memory for this card.. wavecache limited :(*/
+	void *dmapages;
+	int dmaorder;
 
 	/* hardware resources */
 	u32 iobase;
 	u32 irq;
 
 	int bob_freq;
-	char bob_running;
+	char dsps_open;
 };
 
 extern __inline__ unsigned ld2(unsigned int x)
@@ -454,7 +467,6 @@
 	be sure to fill it in if you add oss mixers
 	to anyone's supported mixer defines */
 
-/* possible __init */
 static struct mixer_defaults {
 	int mixer;
 	unsigned int value;
@@ -721,42 +733,21 @@
 		card->mix.supported_mixers &= ~(SOUND_MASK_MIC);
 		card->mix.record_sources = 0;
 		card->mix.recmask_io = NULL;
-		/* no idea what these do */
+#if 0	/* don't ask.  I have yet to see what these actually do. */
 		maestro_ac97_set(iobase,0x76,0xABBA); /* o/~ Take a chance on me o/~ */
 		udelay(20);
 		maestro_ac97_set(iobase,0x78,0x3002);
 		udelay(20);
 		maestro_ac97_set(iobase,0x78,0x3802);
 		udelay(20);
+#endif
 		break;
 	default: break;
 	}
 
-#if 0 /* used to be set, lets try using the codec defaults */
-	/* always set headphones to max unmuted, OSS won't 
-		let us change it :( */
-        maestro_ac97_set(iobase, 0x04, 0x0000);
-        maestro_ac97_set(iobase, 0x06, 0x0000);
-	maestro_ac97_set(iobase, 0x0C, 0x1F1F);
-	/* null record select */
-	maestro_ac97_set(iobase, 0x1A, 0x0000);
-#endif
 	maestro_ac97_set(iobase, 0x1E, 0x0404);
 	/* null misc stuff */
 	maestro_ac97_set(iobase, 0x20, 0x0000);
-	/* the regs are read only, duh  :) */
-/*	maestro_ac97_set(iobase, 0x26, 0x000F);*/
-
-#if 0 /* this is a really good way to hang
-	codecs.  we need a better way. */
-	if(maestro_ac97_get(iobase,0x36) ==0x8080) {
-		int reg;
-		printk("maestro: your ac97 might be 2.0, see if this makes sense:\n");
-		for(reg = 0x28; reg <= 0x58 ; reg += 2) {
-			printk("   0x%2x: %4x\n",reg,maestro_ac97_get(iobase,reg));
-		}
-	}
-#endif
 
 	return 0;
 }
@@ -837,30 +828,46 @@
  *	The Maestro engineers were a little indirection happy. These indirected
  *	registers themselves include indirect registers at another layer
  */
+
+static void __maestro_write(struct ess_card *card, u16 reg, u16 data)
+{
+	long ioaddr = card->iobase;
+
+	outw(reg, ioaddr+0x02);
+	outw(data, ioaddr+0x00);
+	card->maestro_map[reg]=data;
+
+}
  
 static void maestro_write(struct ess_state *ess, u16 reg, u16 data)
 {
-	long ioaddr = ess->card->iobase;
 	unsigned long flags;
-	save_flags(flags);
-	cli();
+
+	spin_lock_irqsave(&ess->card->lock,flags);
+
+	__maestro_write(ess->card,reg,data);
+
+	spin_unlock_irqrestore(&card->lock,flags);
+}
+
+static u16 __maestro_read(struct ess_card *card, u16 reg)
+{
+	long ioaddr = card->iobase;
+
 	outw(reg, ioaddr+0x02);
-	outw(data, ioaddr+0x00);
-	ess->card->maestro_map[reg]=data;
-	restore_flags(flags);
+	return card->maestro_map[reg]=inw(ioaddr+0x00);
 }
 
 static u16 maestro_read(struct ess_state *ess, u16 reg)
 {
-	long ioaddr = ess->card->iobase;
 	if(READABLE_MAP & (1<<reg))
 	{
 		unsigned long flags;
-		save_flags(flags);
-		cli();
-		outw(reg, ioaddr+0x02);
-		ess->card->maestro_map[reg]=inw(ioaddr+0x00);
-		restore_flags(flags);
+		spin_lock_irqsave(&ess->card->lock,flags);
+
+		__maestro_read(ess->card,reg);
+
+		spin_unlock_irqrestore(&ess->card->lock,flags);
 	}
 	return ess->card->maestro_map[reg];
 }
@@ -883,24 +890,24 @@
 #define IDR6_TIMER_CTRL		0x06
 #define IDR7_WAVE_ROMRAM	0x07
 
-static void apu_index_set(struct ess_state *ess, u16 index)
+static void apu_index_set(struct ess_card *card, u16 index)
 {
 	int i;
-	maestro_write(ess, IDR1_CRAM_POINTER, index);
+	__maestro_write(card, IDR1_CRAM_POINTER, index);
 	for(i=0;i<1000;i++)
-		if(maestro_read(ess, IDR1_CRAM_POINTER)==index)
+		if(__maestro_read(card, IDR1_CRAM_POINTER)==index)
 			return;
 	printk(KERN_WARNING "maestro: APU register select failed.\n");
 }
 
-static void apu_data_set(struct ess_state *ess, u16 data)
+static void apu_data_set(struct ess_card *card, u16 data)
 {
 	int i;
 	for(i=0;i<1000;i++)
 	{
-		if(maestro_read(ess, IDR0_DATA_PORT)==data)
+		if(__maestro_read(card, IDR0_DATA_PORT)==data)
 			return;
-		maestro_write(ess, IDR0_DATA_PORT, data);
+		__maestro_write(card, IDR0_DATA_PORT, data);
 	}
 }
 
@@ -929,11 +936,13 @@
 #endif
 	reg|=(channel<<4);
 	
-	save_flags(flags);
-	cli();
-	apu_index_set(ess, reg);
-	apu_data_set(ess, data);
-	restore_flags(flags);
+	/* hooray for double indirection!! */
+	spin_lock_irqsave(&ess->card->lock,flags);
+
+	apu_index_set(ess->card, reg);
+	apu_data_set(ess->card, data);
+
+	spin_unlock_irqrestore(&ess->card->lock,flags);
 }
 
 static u16 apu_get_register(struct ess_state *ess, u16 channel, u8 reg)
@@ -948,11 +957,12 @@
 
 	reg|=(channel<<4);
 	
-	save_flags(flags);
-	cli();
-	apu_index_set(ess, reg);
-	v=maestro_read(ess, IDR0_DATA_PORT);
-	restore_flags(flags);
+	spin_lock_irqsave(&ess->card->lock,flags);
+
+	apu_index_set(ess->card, reg);
+	v=__maestro_read(ess->card, IDR0_DATA_PORT);
+
+	spin_unlock_irqrestore(&ess->card->lock,flags);
 	return v;
 }
 
@@ -967,11 +977,12 @@
 	long ioaddr = ess->card->iobase;
 	unsigned long flags;
 	
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&ess->card->lock,flags);
+
 	outw(reg, ioaddr+0x10);
 	outw(value, ioaddr+0x12);
-	restore_flags(flags);
+
+	spin_unlock_irqrestore(&ess->card->lock,flags);
 }
 
 static u16 wave_get_register(struct ess_state *ess, u16 reg)
@@ -980,11 +991,10 @@
 	unsigned long flags;
 	u16 value;
 	
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&ess->card->lock,flags);
 	outw(reg, ioaddr+0x10);
 	value=inw(ioaddr+0x12);
-	restore_flags(flags);
+	spin_unlock_irqrestore(&ess->card->lock,flags);
 	
 	return value;
 }
@@ -1085,6 +1095,70 @@
 	apu_set_register(s, 5, 3, freq>>8);
 }
 
+/* Stop our host of recording apus */
+extern inline void stop_adc(struct ess_state *s)
+{
+	/* XXX lets hope we don't have to lock around this */
+	if (! (s->enable & ADC_RUNNING)) return;
+
+	s->enable &= ~ADC_RUNNING;
+	apu_set_register(s, 2, 0, apu_get_register(s, 2, 0)&0xFF0F);
+	apu_set_register(s, 3, 0, apu_get_register(s, 3, 0)&0xFF0F);
+	apu_set_register(s, 4, 0, apu_get_register(s, 2, 0)&0xFF0F);
+	apu_set_register(s, 5, 0, apu_get_register(s, 3, 0)&0xFF0F);
+}	
+
+/* stop output apus */
+extern inline void stop_dac(struct ess_state *s)
+{
+	/* XXX have to lock around this? */
+	if (! (s->enable & DAC_RUNNING)) return;
+
+	s->enable &= ~DAC_RUNNING;
+	apu_set_register(s, 0, 0, apu_get_register(s, 0, 0)&0xFF0F);
+	apu_set_register(s, 1, 0, apu_get_register(s, 1, 0)&0xFF0F);
+}	
+
+static void start_dac(struct ess_state *s)
+{
+	/* XXX locks? */
+	if (	(s->dma_dac.mapped || s->dma_dac.count > 0) && 
+		s->dma_dac.ready &&
+		(! (s->enable & DAC_RUNNING)) ) {
+
+		s->enable |= DAC_RUNNING;
+
+		apu_set_register(s, 0, 0, 
+			(apu_get_register(s, 0, 0)&0xFF0F)|s->apu_mode[0]);
+
+		if((s->fmt >> ESS_DAC_SHIFT)  & ESS_FMT_STEREO) 
+			apu_set_register(s, 1, 0, 
+				(apu_get_register(s, 1, 0)&0xFF0F)|s->apu_mode[1]);
+	}
+}	
+
+static void start_adc(struct ess_state *s)
+{
+	/* XXX locks? */
+	if ((s->dma_adc.mapped || s->dma_adc.count < (signed)(s->dma_adc.dmasize - 2*s->dma_adc.fragsize)) 
+	    && s->dma_adc.ready && (! (s->enable & ADC_RUNNING)) ) {
+
+		s->enable |= ADC_RUNNING;
+		apu_set_register(s, 2, 0, 
+			(apu_get_register(s, 2, 0)&0xFF0F)|s->apu_mode[2]);
+		apu_set_register(s, 4, 0, 
+			(apu_get_register(s, 4, 0)&0xFF0F)|s->apu_mode[4]);
+
+		if( s->fmt & (ESS_FMT_STEREO << ESS_ADC_SHIFT)) {
+			apu_set_register(s, 3, 0, 
+				(apu_get_register(s, 3, 0)&0xFF0F)|s->apu_mode[3]);
+			apu_set_register(s, 5, 0, 
+				(apu_get_register(s, 5, 0)&0xFF0F)|s->apu_mode[5]);
+		}
+			
+	}
+}	
+
 
 /*
  *	Native play back driver 
@@ -1115,29 +1189,6 @@
 	{
 		int i;
 		
-		/*
-		 *	To understand this it helps to know how the
-		 *	wave cache works. There are 4 DSP wavecache 
-		 *	blocks which are 0x1FC->0x1FF. They are selected
-		 *	by setting bits  22,21,20 of the address to
-		 *	1 X Y   where X Y select the block.
-		 *
-		 *	In addition stereo pairing is supported. This is
-		 *	set in the wave cache control for the channel as is
-		 *	8bit unsigned.
-		 *
-		 *	Note that this causes a problem. With our limit of
-		 *	about 12 full duplex pairs (48 channels active) we
-		 *	will need to do a lot of juggling to get all the
-		 *	memory we want sufficiently close together.
-		 *	
-		 *	Even with 64K blocks that means
-		 *		24 channel pairs
-		 *		6 pairs/block
-		 *	
-		 *	10K per channel pair = 5000 samples.
-		 */
-		
 		if(!channel) 
 			pa = virt_to_bus(buffer);
 		else
@@ -1145,9 +1196,6 @@
 			*2 accomodates for rampant shifting earlier */
 			pa = virt_to_bus(buffer + size*2);
 
-		/* play bufs are in the same first region as record bufs */
-		wave_set_register(ess, 0x01FC , (pa&0xFFE00000)>>12);
-
 		/* set the wavecache control reg */
 		tmpval = (pa - 0x10) & 0xFFF8;
 #if 0
@@ -1200,6 +1248,10 @@
 		else
 			apu_set_register(ess, channel, 10, 0x8F08);
 
+		if(mode&ESS_FMT_16BIT)
+			ess->apu_mode[channel]=0x10;
+		else
+			ess->apu_mode[channel]=0x30;
 	}
 	
 	/* clear WP interupts */
@@ -1207,24 +1259,9 @@
 	/* enable WP ints */
 	outw(inw(ess->card->iobase+0x18)|4, ess->card->iobase+0x18);
 
+	/* go team! */
 	set_dac_rate(ess,rate);
-
-	for(channel=0; channel<=high_apu; channel++)
-	{
-		/* Turn on the DMA */
-		if(mode&ESS_FMT_16BIT)
-		{
-			apu_set_register(ess, channel, 0,
-				(apu_get_register(ess, channel, 0)&0xFF0F)|0x10);
-			ess->apu_mode[channel]=0x10;
-		}
-		else
-		{
-			apu_set_register(ess, channel, 0,
-				(apu_get_register(ess, channel, 0)&0xFF0F)|0x30);
-			ess->apu_mode[channel]=0x30;
-		}
-	}
+	start_dac(ess);
 }
 
 /*
@@ -1232,11 +1269,11 @@
  */
 
 /* again, passed mode is alrady shifted/masked */
-static void ess_rec_setup(struct ess_state *ess, int mode, u32 rate, void *buffer, int size)
+static void 
+ess_rec_setup(struct ess_state *ess, int mode, u32 rate, void *buffer, int size)
 {
 	int apu_step = 2;
 	int channel;
-	u8 apu_type;
 
 	M_printk("maestro: ess_rec_setup: mode=%d rate=%d buf=0x%p len=%d.\n",
 		mode, rate, buffer, size);
@@ -1279,6 +1316,7 @@
 			/* we source from a 'magic' apu */
 			bsize = PAGE_SIZE >> 5;	/* half of this channels alloc, in words */
 			route = 0x14 + (channel - 4); /* parallel in crap, see maestro reg 0xC [8-11] */
+			ess->apu_mode[channel] = 0x90;  /* Input Mixer */
 
 		} else {  
 			/* we're a rate converter taking
@@ -1292,6 +1330,8 @@
 				pa = virt_to_bus(buffer + size*2);
 			}
 
+			ess->apu_mode[channel] = 0xB0;  /* Sample Rate Converter */
+
 			bsize = size; 
 			/* get input from inputing apu */
 			route = channel + 2;
@@ -1299,9 +1339,6 @@
 
 		M_printk("maestro: ess_rec_setup: getting pa 0x%x from %d\n",pa,channel);
 		
-		/* put our base address in the right region */
-		wave_set_register(ess, 0x01FC  + (channel >> 2), (pa&0xFFE00000)>>12);
-
 		/* set the wavecache control reg */
 		tmpval = (pa - 0x10) & 0xFFF8;
 		wave_set_register(ess, ess->apu[channel]<<3, tmpval);
@@ -1315,9 +1352,6 @@
 
 		pa|=0x00400000;			/* bit 22 -> System RAM */
 
-		if ( channel & 4) 
-			pa|=0x00200000;			/* bit 21 -> second region for mixbuf */
-		
 		M_printk("maestro: ess_rec_setup: APU[%d] pa = 0x%x size = 0x%x route = 0x%x\n", 
 			ess->apu[channel], pa, bsize, route);
 		
@@ -1356,20 +1390,9 @@
 	/* enable WP ints */
 	outw(inw(ess->card->iobase+0x18)|4, ess->card->iobase+0x18);
 
+	/* let 'er rip */
 	set_adc_rate(ess,rate);
-
-	for(channel=2; channel<6; channel+=apu_step)
-	{
-		if(channel & 0x04) {
-			apu_type = 0x90;	/* Input Mixer */
-		} else {
-			apu_type = 0xB0;	/* Sample Rate Converter */
-		}
-		
-		apu_set_register(ess, channel, 0,
-				(apu_get_register(ess, channel, 0)&0xFF0F) | apu_type);
-		ess->apu_mode[channel] = apu_type;
-	}
+	start_adc(ess);
 }
 /* --------------------------------------------------------------------- */
 
@@ -1388,12 +1411,17 @@
 {
 	long ioport = s->card->iobase;
 	int offset;
+	unsigned long flags;
+
+	spin_lock_irqsave(&s->card->lock,flags);
 	
 	outw(1, ioport+2);
 	outw(s->apu[0]<<4|5, ioport);
 	outw(0, ioport+2);
 	offset=inw(ioport);
 
+	spin_unlock_irqrestore(&s->card->lock,flags);
+
 /*	M_printk("dmaa: offset: %d, base: %d\n",offset,s->dma_dac.base); */
 	
 	offset-=s->dma_dac.base;
@@ -1406,12 +1434,17 @@
 {
 	long ioport = s->card->iobase;
 	int offset;
+	unsigned long flags;
+
+	spin_lock_irqsave(&s->card->lock,flags);
 	
 	outw(1, ioport+2);
 	outw(s->apu[2]<<4|5, ioport);
 	outw(0, ioport+2);
 	offset=inw(ioport);
 
+	spin_unlock_irqrestore(&s->card->lock,flags);
+
 /*	M_printk("dmac: offset: %d, base: %d\n",offset,s->dma_adc.base); */
 	
 	/* The offset is an address not a position relative to base */
@@ -1527,113 +1560,23 @@
 
 }
 
-/* Stop our host of recording apus */
-extern inline void stop_adc(struct ess_state *s)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&s->lock, flags);
-	s->enable &= ~ADC_RUNNING;
-	apu_set_register(s, 2, 0, apu_get_register(s, 2, 0)&0xFF0F);
-	apu_set_register(s, 3, 0, apu_get_register(s, 3, 0)&0xFF0F);
-	apu_set_register(s, 4, 0, apu_get_register(s, 2, 0)&0xFF0F);
-	apu_set_register(s, 5, 0, apu_get_register(s, 3, 0)&0xFF0F);
-	spin_unlock_irqrestore(&s->lock, flags);
-}	
-
-/* stop output apus */
-extern inline void stop_dac(struct ess_state *s)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&s->lock, flags);
-	s->enable &= ~DAC_RUNNING;
-	apu_set_register(s, 0, 0, apu_get_register(s, 0, 0)&0xFF0F);
-	apu_set_register(s, 1, 0, apu_get_register(s, 1, 0)&0xFF0F);
-	spin_unlock_irqrestore(&s->lock, flags);
-}	
-
-static void start_dac(struct ess_state *s)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&s->lock, flags);
-	if ((s->dma_dac.mapped || s->dma_dac.count > 0) && s->dma_dac.ready) {
-		s->enable |= DAC_RUNNING;
-
-		apu_set_register(s, 0, 0, 
-			(apu_get_register(s, 0, 0)&0xFF0F)|s->apu_mode[0]);
-
-		if((s->fmt >> ESS_DAC_SHIFT)  & ESS_FMT_STEREO) 
-			apu_set_register(s, 1, 0, 
-				(apu_get_register(s, 1, 0)&0xFF0F)|s->apu_mode[1]);
-	}
-	spin_unlock_irqrestore(&s->lock, flags);
-}	
-
-static void start_adc(struct ess_state *s)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&s->lock, flags);
-	if ((s->dma_adc.mapped || s->dma_adc.count < (signed)(s->dma_adc.dmasize - 2*s->dma_adc.fragsize)) 
-	    && s->dma_adc.ready) {
-		s->enable |= ADC_RUNNING;
-		apu_set_register(s, 2, 0, 
-			(apu_get_register(s, 2, 0)&0xFF0F)|s->apu_mode[2]);
-		apu_set_register(s, 4, 0, 
-			(apu_get_register(s, 4, 0)&0xFF0F)|s->apu_mode[4]);
-		if( s->fmt & (ESS_FMT_STEREO << ESS_ADC_SHIFT)) {
-			apu_set_register(s, 3, 0, 
-				(apu_get_register(s, 3, 0)&0xFF0F)|s->apu_mode[3]);
-			apu_set_register(s, 5, 0, 
-				(apu_get_register(s, 5, 0)&0xFF0F)|s->apu_mode[5]);
-		}
-			
-	}
-	spin_unlock_irqrestore(&s->lock, flags);
-}	
-
-/* --------------------------------------------------------------------- */
-
-/* we allocate both buffers at once */
-#define DMABUF_DEFAULTORDER (15-PAGE_SHIFT)
-#define DMABUF_MINORDER 2
-
-static void dealloc_dmabuf(struct dmabuf *db)
-{
-	unsigned long map, mapend;
-
-	if (db->rawbuf) {
-		M_printk("maestro: freeing %p\n",db->rawbuf);
-		/* undo marking the pages as reserved */
-		mapend = MAP_NR(db->rawbuf + (PAGE_SIZE << db->buforder) - 1);
-		for (map = MAP_NR(db->rawbuf); map <= mapend; map++)
-			clear_bit(PG_reserved, &mem_map[map].flags);	
-		free_pages((unsigned long)db->rawbuf, db->buforder);
-	}
-	db->rawbuf = NULL;
-	db->mapped = db->ready = 0;
-}
-
-static int prog_dmabuf(struct ess_state *s, unsigned rec)
+static int 
+prog_dmabuf(struct ess_state *s, unsigned rec)
 {
 	struct dmabuf *db = rec ? &s->dma_adc : &s->dma_dac;
 	unsigned rate = rec ? s->rateadc : s->ratedac;
-	int order;
 	unsigned bytepersec;
 	unsigned bufs;
-	unsigned long map, mapend;
 	unsigned char fmt;
 	unsigned long flags;
 
 	spin_lock_irqsave(&s->lock, flags);
 	fmt = s->fmt;
 	if (rec) {
-		s->enable &= ~ESS_ENABLE_RE;
+		stop_adc(s);
 		fmt >>= ESS_ADC_SHIFT;
 	} else {
-		s->enable &= ~ESS_ENABLE_PE;
+		stop_dac(s);
 		fmt >>= ESS_DAC_SHIFT;
 	}
 	spin_unlock_irqrestore(&s->lock, flags);
@@ -1641,47 +1584,6 @@
 
 	db->hwptr = db->swptr = db->total_bytes = db->count = db->error = db->endcleared = 0;
 
-	if (!db->rawbuf) {
-		void *rawbuf;
-		/* haha, this thing is hacked to hell and back.
-			this is so ugly. */
-		s->dma_dac.ready = s->dma_dac.mapped = 0;
-		s->dma_adc.ready = s->dma_adc.mapped = 0;
-
-		/* alloc as big a chunk as we can */
-		for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--)
-			if((rawbuf = (void *)__get_free_pages(GFP_KERNEL|GFP_DMA, order)))
-
-				break;
-
-		if (!rawbuf)
-			return -ENOMEM;
-
-
-		/* we allocated both buffers */
-		s->dma_adc.rawbuf = rawbuf;
-		s->dma_dac.rawbuf = rawbuf + ( PAGE_SIZE << (order - 1) );
-
-		M_printk("maestro: allocated %ld bytes at %p\n",PAGE_SIZE<<order, db->rawbuf);
-
-		s->dma_adc.buforder = s->dma_dac.buforder = order - 1;
-
-		/* XXX these checks are silly now */
-#if 0
-		if ((virt_to_bus(db->rawbuf) ^ (virt_to_bus(db->rawbuf) + (PAGE_SIZE << order) - 1)) & ~0xffff)
-			printk(KERN_DEBUG "maestro: DMA buffer crosses 64k boundary: busaddr 0x%lx  size %ld\n", 
-			       virt_to_bus(db->rawbuf), PAGE_SIZE << order);
-
-#endif
-		if ((virt_to_bus(db->rawbuf) + (PAGE_SIZE << order) - 1) & ~0xffffff)
-			printk(KERN_DEBUG "maestro: DMA buffer beyond 16MB: busaddr 0x%lx  size %ld\n", 
-			       virt_to_bus(db->rawbuf), PAGE_SIZE << order);
-
-		/* now mark the pages as reserved; otherwise remap_page_range doesn't do what we want */
-		mapend = MAP_NR(db->rawbuf + (PAGE_SIZE << order) - 1);
-		for (map = MAP_NR(db->rawbuf); map <= mapend; map++)
-			set_bit(PG_reserved, &mem_map[map].flags);
-	}
 	bytepersec = rate << sample_shift[fmt];
 	bufs = PAGE_SIZE << db->buforder;
 	if (db->ossfragshift) {
@@ -1691,12 +1593,12 @@
 			db->fragshift = db->ossfragshift;
 	} else {
 	/*	lets hand out reasonable big ass buffers by default */
-		db->fragshift = (db->buforder + PAGE_SHIFT -2);
+		db->fragshift = (db->buforder - 2);
 #if 0
 		db->fragshift = ld2(bytepersec/100/(db->subdivision ? db->subdivision : 1));
+#endif
 		if (db->fragshift < 3)
 			db->fragshift = 3; 
-#endif
 	}
 	db->numfrag = bufs >> db->fragshift;
 	while (db->numfrag < 4 && db->fragshift > 3) {
@@ -1709,6 +1611,8 @@
 	db->fragsamples = db->fragsize >> sample_shift[fmt];
 	db->dmasize = db->numfrag << db->fragshift;
 
+	M_printk("maestro: setup oss: numfrag: %d fragsize: %d dmasize: %d\n",db->numfrag,db->fragsize,db->dmasize);
+
 	memset(db->rawbuf, (fmt & ESS_FMT_16BIT) ? 0 : 0x80, db->dmasize);
 
 	spin_lock_irqsave(&s->lock, flags);
@@ -1727,7 +1631,8 @@
 
 /* XXX haha, way broken with our split stereo setup.  giggle. */
 /* only called by ess_write (dac ness ) */
-extern __inline__ void clear_advance(struct ess_state *s)
+static __inline__ void 
+clear_advance(struct ess_state *s)
 {
 	unsigned char c = ((s->fmt >> ESS_DAC_SHIFT) & ESS_FMT_16BIT) ? 0 : 0x80;
 	unsigned char *buf = s->dma_dac.rawbuf;
@@ -1746,7 +1651,8 @@
 }
 
 /* call with spinlock held! */
-static void ess_update_ptr(struct ess_state *s)
+static void 
+ess_update_ptr(struct ess_state *s)
 {
 	unsigned hwptr;
 	int diff;
@@ -1771,7 +1677,6 @@
 			wake_up(&s->dma_adc.wait);
 		if (!s->dma_adc.mapped) {
 			if (s->dma_adc.count > (signed)(s->dma_adc.dmasize - ((3 * s->dma_adc.fragsize) >> 1))) {
-				s->enable &= ~ESS_ENABLE_RE;
 				/* FILL ME 
 				wrindir(s, SV_CIENABLE, s->enable); */
 				stop_adc(s); 
@@ -1796,7 +1701,6 @@
 			s->dma_dac.count -= diff;
 /*			M_printk("maestro: ess_update_ptr: diff: %d, count: %d\n", diff, s->dma_dac.count); */
 			if (s->dma_dac.count <= 0) {
-				s->enable &= ~ESS_ENABLE_PE;
 				/* FILL ME 
 				wrindir(s, SV_CIENABLE, s->enable); */
 				/* XXX how on earth can calling this with the lock held work.. */
@@ -1889,9 +1793,7 @@
 
 static int mixer_ioctl(struct ess_card *card, unsigned int cmd, unsigned long arg)
 {
-	unsigned long flags;
 	int i, val=0;
-	struct ess_state *s = &card->channels[0];
 
 	VALIDATE_CARD(card);
         if (cmd == SOUND_MIXER_INFO) {
@@ -1924,9 +1826,9 @@
 			if(!card->mix.recmask_io) {
 				val = 0;
 			} else {
-				spin_lock_irqsave(&s->lock, flags);
+				spin_lock(&card->lock);
 				val = card->mix.recmask_io(card,1,0);
-				spin_unlock_irqrestore(&s->lock, flags);
+				spin_unlock(&card->lock);
 			}
 			break;
 			
@@ -1953,9 +1855,9 @@
 				return -EINVAL;
 
 			/* do we ever want to touch the hardware? */
-/*			spin_lock_irqsave(&s->lock, flags);
+/*			spin_lock(&card->lock);
 			val = card->mix.read_mixer(card,i);
-			spin_unlock_irqrestore(&s->lock, flags);*/
+			spin_unlock(&card->lock);*/
 
 			val = card->mix.mixer_state[i];
 /*			M_printk("returned 0x%x for mixer %d\n",val,i);*/
@@ -1978,9 +1880,9 @@
 		if (!card->mix.recmask_io) return -EINVAL;
 		if(! (val &= card->mix.record_sources)) return -EINVAL;
 
-		spin_lock_irqsave(&s->lock, flags);
+		spin_lock(&card->lock);
 		card->mix.recmask_io(card,0,val);
-		spin_unlock_irqrestore(&s->lock, flags);
+		spin_unlock(&card->lock);
 		return 0;
 
 	default:
@@ -1989,9 +1891,9 @@
 		if ( ! supported_mixer(card,i)) 
 			return -EINVAL;
 
-		spin_lock_irqsave(&s->lock, flags);
+		spin_lock(&card->lock);
 		set_mixer(card,i,val);
-		spin_unlock_irqrestore(&s->lock, flags);
+		spin_unlock(&card->lock);
 
 		return 0;
 	}
@@ -2062,16 +1964,17 @@
 
 static int drain_dac(struct ess_state *s, int nonblock)
 {
-        DECLARE_WAITQUEUE(wait, current);
+	DECLARE_WAITQUEUE(wait,current);
 	unsigned long flags;
 	int count;
 	signed long tmo;
 
 	if (s->dma_dac.mapped || !s->dma_dac.ready)
 		return 0;
-        current->state = TASK_INTERRUPTIBLE;
+	current->state = TASK_INTERRUPTIBLE;
         add_wait_queue(&s->dma_dac.wait, &wait);
         for (;;) {
+		/* XXX uhm.. questionable locking*/
                 spin_lock_irqsave(&s->lock, flags);
 		count = s->dma_dac.count;
                 spin_unlock_irqrestore(&s->lock, flags);
@@ -2081,7 +1984,7 @@
                         break;
                 if (nonblock) {
                         remove_wait_queue(&s->dma_dac.wait, &wait);
-                        current->state = TASK_RUNNING;
+			current->state = TASK_RUNNING;
                         return -EBUSY;
                 }
 		tmo = (count * HZ) / s->ratedac;
@@ -2092,7 +1995,7 @@
 			M_printk(KERN_DEBUG "maestro: dma timed out?? %ld\n",jiffies);
         }
         remove_wait_queue(&s->dma_dac.wait, &wait);
-        current->state = TASK_RUNNING;
+	current->state = TASK_RUNNING;
         if (signal_pending(current))
                 return -ERESTARTSYS;
         return 0;
@@ -2100,7 +2003,8 @@
 
 /* --------------------------------------------------------------------- */
 /* Zach sez: "god this is gross.." */
-int comb_stereo(unsigned char *real_buffer,unsigned char  *tmp_buffer, int offset, 
+static int 
+comb_stereo(unsigned char *real_buffer,unsigned char  *tmp_buffer, int offset, 
 	int count, int bufsize)
 {  
 	/* No such thing as stereo recording, so we
@@ -2232,7 +2136,8 @@
 
 /* god this is gross..*/
 /* again, the mode passed is shifted/masked */
-int split_stereo(unsigned char *real_buffer,unsigned char  *tmp_buffer, int offset, 
+static int 
+split_stereo(unsigned char *real_buffer,unsigned char  *tmp_buffer, int offset, 
 	int count, int bufsize, int mode)
 {  
 	/* oh, bother.	stereo decoding APU's don't work in 16bit so we
@@ -2474,7 +2379,7 @@
 		return 0;
 
 	case SNDCTL_DSP_GETCAPS:
-		return put_user(0/*DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP*/, (int *)arg);
+		return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER /*| DSP_CAP_MMAP*/, (int *)arg);
 		
         case SNDCTL_DSP_RESET:
 		if (file->f_mode & FMODE_WRITE) {
@@ -2596,9 +2501,9 @@
 
         case SNDCTL_DSP_GETTRIGGER:
 		val = 0;
-		if (file->f_mode & FMODE_READ && s->enable & ESS_ENABLE_RE) 
+		if ((file->f_mode & FMODE_READ) && (s->enable & ADC_RUNNING))
 			val |= PCM_ENABLE_INPUT;
-		if (file->f_mode & FMODE_WRITE && s->enable & ESS_ENABLE_PE) 
+		if ((file->f_mode & FMODE_WRITE) && (s->enable & DAC_RUNNING)) 
 			val |= PCM_ENABLE_OUTPUT;
 		return put_user(val, (int *)arg);
 		
@@ -2625,7 +2530,7 @@
 	case SNDCTL_DSP_GETOSPACE:
 		if (!(file->f_mode & FMODE_WRITE))
 			return -EINVAL;
-		if (!(s->enable & ESS_ENABLE_PE) && (val = prog_dmabuf(s, 0)) != 0)
+		if (!(s->enable & DAC_RUNNING) && (val = prog_dmabuf(s, 0)) != 0)
 			return val;
 		spin_lock_irqsave(&s->lock, flags);
 		ess_update_ptr(s);
@@ -2639,7 +2544,7 @@
 	case SNDCTL_DSP_GETISPACE:
 		if (!(file->f_mode & FMODE_READ))
 			return -EINVAL;
-		if (!(s->enable & ESS_ENABLE_RE) && (val = prog_dmabuf(s, 1)) != 0)
+		if (!(s->enable & ADC_RUNNING) && (val = prog_dmabuf(s, 1)) != 0)
 			return val;
 		spin_lock_irqsave(&s->lock, flags);
 		ess_update_ptr(s);
@@ -2756,7 +2661,87 @@
 	return -EINVAL;
 }
 
-static int ess_open(struct inode *inode, struct file *file)
+static int
+allocate_buffers(struct ess_state *s)
+{
+	void *rawbuf=NULL;
+	int order,i;
+	unsigned long mapend,map;
+
+	/* alloc as big a chunk as we can */
+	for (order = (dsps_order + (15-PAGE_SHIFT) + 1); order >= (dsps_order + 2 + 1); order--)
+		if((rawbuf = (void *)__get_free_pages(GFP_KERNEL|GFP_DMA, order)))
+			break;
+
+	if (!rawbuf)
+		return 1;
+
+	M_printk("maestro: allocated %ld (%d) bytes at %p\n",PAGE_SIZE<<order,order, rawbuf);
+
+	if ((virt_to_bus(rawbuf) + (PAGE_SIZE << order) - 1) & ~((1<<28)-1)) /* silly limited pci poop */
+		printk(KERN_DEBUG "maestro: DMA buffer beyond 256MB: busaddr 0x%lx  size %ld\n",
+			virt_to_bus(rawbuf), PAGE_SIZE << order);
+
+	if ((PAGE_SIZE<<order) > (1<<22))
+		printk(KERN_DEBUG "maestro: %ld byte DMA buffer longer than APU can express!\n",PAGE_SIZE<<order);
+
+	s->card->dmapages = rawbuf;
+	s->card->dmaorder = order;
+
+	/* play bufs are in the same first region as record bufs */
+	wave_set_register(s, 0x01FC , ((virt_to_bus(rawbuf))&0xFFE00000)>>12);
+
+	M_printk("maestro: writing %lx (%lx) to the wp\n",virt_to_bus(rawbuf),
+		((virt_to_bus(rawbuf))&0xFFE00000)>>12);
+
+	for(i=0;i<NR_DSPS;i++) {
+		struct ess_state *ess = &s->card->channels[i];
+
+		if(ess->dev_audio == -1)
+			continue;
+
+		ess->dma_dac.ready = s->dma_dac.mapped = 0;
+		ess->dma_adc.ready = s->dma_adc.mapped = 0;
+		ess->dma_adc.buforder = ess->dma_dac.buforder = order - 1 - dsps_order - 1;
+		ess->dma_dac.rawbuf = rawbuf + (i * ( PAGE_SIZE << (ess->dma_dac.buforder + 1 )));
+		ess->dma_adc.rawbuf = ess->dma_dac.rawbuf + ( PAGE_SIZE << ess->dma_dac.buforder);
+		ess->mixbuf = rawbuf + (PAGE_SIZE<<order) - (512 * (i+1));
+
+		M_printk("maestro: setup apu %d: %p %p %p\n",i,ess->dma_dac.rawbuf,
+			ess->dma_adc.rawbuf, ess->mixbuf);
+
+	}
+
+	/* now mark the pages as reserved; otherwise remap_page_range doesn't do what we want */
+	mapend = MAP_NR(rawbuf + (PAGE_SIZE << order) - 1);
+	for (map = MAP_NR(rawbuf); map <= mapend; map++) {
+		set_bit(PG_reserved, &mem_map[map].flags);
+	}
+
+	return 0;
+} 
+static void
+free_buffers(struct ess_state *s)
+{
+	unsigned long map, mapend;
+
+	s->dma_dac.rawbuf = s->dma_adc.rawbuf = NULL;
+	s->dma_dac.mapped = s->dma_adc.mapped = 0;
+	s->dma_dac.ready = s->dma_adc.ready = 0;
+
+	M_printk("maestro: freeing %p\n",s->card->dmapages);
+	/* undo marking the pages as reserved */
+
+	mapend = MAP_NR(s->card->dmapages + (PAGE_SIZE << s->card->dmaorder) - 1);
+	for (map = MAP_NR(s->card->dmapages); map <= mapend; map++)
+		clear_bit(PG_reserved, &mem_map[map].flags);    
+
+	free_pages((unsigned long)s->card->dmapages,s->card->dmaorder);
+	s->card->dmapages = NULL;
+}
+
+static int 
+ess_open(struct inode *inode, struct file *file)
 {
 	int minor = MINOR(inode->i_rdev);
 	struct ess_card *c = devs;
@@ -2801,13 +2786,21 @@
 			return -ERESTARTSYS;
 		down(&s->open_sem);
 	}
+
+	/* under semaphore.. */
+	if ((s->card->dmapages==NULL) && allocate_buffers(s)) {
+		up(&s->open_sem);
+		return -ENOMEM;
+	}
+
 	if (file->f_mode & FMODE_READ) {
 /*
 		fmtm &= ~((ESS_FMT_STEREO | ESS_FMT_16BIT) << ESS_ADC_SHIFT);
 		if ((minor & 0xf) == SND_DEV_DSP16)
 			fmts |= ESS_FMT_16BIT << ESS_ADC_SHIFT; */
 
-		fmtm = (ESS_FMT_STEREO|ESS_FMT_16BIT) << ESS_ADC_SHIFT;
+		fmtm &= ~((ESS_FMT_STEREO|ESS_FMT_16BIT) << ESS_ADC_SHIFT);
+		fmts = (ESS_FMT_STEREO|ESS_FMT_16BIT) << ESS_ADC_SHIFT;
 
 		s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags = s->dma_adc.subdivision = 0;
 		set_adc_rate(s, 8000);
@@ -2816,6 +2809,7 @@
 		fmtm &= ~((ESS_FMT_STEREO | ESS_FMT_16BIT) << ESS_DAC_SHIFT);
 		if ((minor & 0xf) == SND_DEV_DSP16)
 			fmts |= ESS_FMT_16BIT << ESS_DAC_SHIFT;
+
 		s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags = s->dma_dac.subdivision = 0;
 		set_dac_rate(s, 8000);
 	}
@@ -2823,17 +2817,19 @@
 	s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
 
 	/* we're covered by the open_sem */
-	if( ! s->card->bob_running ) 
+	if( ! s->card->dsps_open )  {
 		start_bob(s);
-	s->card->bob_running++;
-	M_printk("maestro: open, %d bobs now\n",s->card->bob_running);
+	}
+	s->card->dsps_open++;
+	M_printk("maestro: open, %d bobs now\n",s->card->dsps_open);
 
 	up(&s->open_sem);
 	MOD_INC_USE_COUNT;
 	return 0;
 }
 
-static int ess_release(struct inode *inode, struct file *file)
+static int 
+ess_release(struct inode *inode, struct file *file)
 {
 	struct ess_state *s = (struct ess_state *)file->private_data;
 
@@ -2847,16 +2843,13 @@
 	if (file->f_mode & FMODE_READ) {
 		stop_adc(s);
 	}
-
-	/* free our shared dma buffers */
-	dealloc_dmabuf(&s->dma_adc);
-	dealloc_dmabuf(&s->dma_dac);
 		
 	s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
 	/* we're covered by the open_sem */
-	M_printk("maestro: %d -1 bob clients\n",s->card->bob_running);
-	if( --s->card->bob_running <= 0) {
+	M_printk("maestro: %d dsps now alive\n",s->card->dsps_open-1);
+	if( --s->card->dsps_open <= 0) {
 		stop_bob(s);
+		free_buffers(s);
 	}
 	up(&s->open_sem);
 	wake_up(&s->open_wait);
@@ -2864,7 +2857,7 @@
 	return 0;
 }
 
-static /*const*/ struct file_operations ess_audio_fops = {
+static struct file_operations ess_audio_fops = {
 	&ess_llseek,
 	&ess_read,
 	&ess_write,
@@ -2919,17 +2912,10 @@
 }
 #endif
 
-void free_mixpage(struct ess_card *card) {
-	if (card->mixpage) {
-		/* undo marking the page as reserved */
-		clear_bit(PG_reserved, &mem_map[MAP_NR(card->mixpage)].flags);	
-		/* free mixpage */
-		free_pages((unsigned long)card->mixpage, 1);
-	}
-}
 /* --------------------------------------------------------------------- */
 
-static int maestro_install(struct pci_dev *pcidev, int card_type)
+static int 
+maestro_install(struct pci_dev *pcidev, int card_type)
 {
 	u16 w;
 	u32 n;
@@ -2970,26 +2956,16 @@
 	
 	memset(card, 0, sizeof(*card));
 
-	/* allocate a page for the input mixer APUs 
-		512 * NR_DSPS must fit in here !!*/
-	if(!(card->mixpage = (void *)__get_free_pages(GFP_KERNEL|GFP_DMA, 1)))
-	{
-		printk(KERN_WARNING "maestro: can't allocate mixer page.\n");
-		kfree(card);
-		return 0;
-	}
-
 #ifdef CONFIG_APM
 	printk("reg_callback: %d\n",apm_register_callback(maestro_apm_callback));
 #endif
-	/* mark the page reserved */
-	set_bit(PG_reserved, &mem_map[MAP_NR(card->mixpage)].flags);
 
 	card->iobase = iobase;
 	card->card_type = card_type;
 	card->irq = pcidev->irq;
 	card->next = devs;
 	card->magic = ESS_CARD_MAGIC;
+	spin_lock_init(&card->lock);
 	devs = card;
 	
 	/* init our groups of 6 apus */
@@ -2997,10 +2973,13 @@
 	{
 		struct ess_state *s=&card->channels[i];
 
+		s->index = i;
+
 		s->card = card;
 		init_waitqueue_head(&s->dma_adc.wait);
 		init_waitqueue_head(&s->dma_dac.wait);
 		init_waitqueue_head(&s->open_wait);
+		spin_lock_init(&ess->lock);
 		init_MUTEX(&s->open_sem);
 		s->magic = ESS_STATE_MAGIC;
 		
@@ -3016,8 +2995,6 @@
 		/* register devices */
 		if ((s->dev_audio = register_sound_dsp(&ess_audio_fops, -1)) < 0)
 			break;
-		/* divide the page into smaller chunks */
-		s->mixbuf = card->mixpage + (i * 512);
 	}
 	
 	num = i;
@@ -3174,7 +3151,6 @@
 	n&=~0x000F;		/* ASSP off */
 	outl(n, iobase+0x34);
 	
-	
 	n=inl(iobase+0x34);
 	n|=(1<<29);		/* Enable ring bus */
 	outl(n, iobase+0x34);
@@ -3220,7 +3196,6 @@
 	w|=(1<<0);		/* SB IRQ on */
 	outw(w, iobase+0x18);
 
-
 #if 0 /* asp crap */
 	outb(0, iobase+0xA4); 
 	outb(3, iobase+0xA2); 
@@ -3324,7 +3299,6 @@
 			if(s->dev_audio != -1)
 				unregister_sound_dsp(s->dev_audio);
 		}
-		free_mixpage(card);
 		release_region(card->iobase, 256);		
 		kfree(card);
 		return 0;
@@ -3334,6 +3308,7 @@
 	return 1; 
 }
 
+/* XXX __init ? */
 #ifdef MODULE
 int init_module(void)
 #else
@@ -3349,13 +3324,21 @@
 
 	pcidev = NULL;
 
+	if (dsps_order < 0)   {
+		dsps_order = 1;
+		printk(KERN_WARNING "maestro: clipping dsps_order to %d\n",dsps_order);
+	}
+	else if (dsps_order > MAX_DSP_ORDER)  {
+		dsps_order = MAX_DSP_ORDER;
+		printk(KERN_WARNING "maestro: clipping dsps_order to %d\n",dsps_order);
+	}
+
 	/*
 	 *	Find the ESS Maestro 2.
 	 */
 
-	while( (pcidev = pci_find_device(PCI_VENDOR_ESS, PCI_DEVICE_ID_ESS_ESS1968, pcidev))!=NULL
-			&&
-		( maestro_install(pcidev, TYPE_MAESTRO2) )) {
+	while( (pcidev = pci_find_device(PCI_VENDOR_ESS, PCI_DEVICE_ID_ESS_ESS1968, pcidev))!=NULL ) {
+		if (maestro_install(pcidev, TYPE_MAESTRO2))
 			foundone=1;
 	}
 
@@ -3363,9 +3346,8 @@
 	 *	Find the ESS Maestro 2E
 	 */
 
-	while((pcidev = pci_find_device(PCI_VENDOR_ESS, PCI_DEVICE_ID_ESS_ESS1978, pcidev))!=NULL
-			&&
-		( maestro_install(pcidev, TYPE_MAESTRO2E) )) {
+	while( (pcidev = pci_find_device(PCI_VENDOR_ESS, PCI_DEVICE_ID_ESS_ESS1978, pcidev))!=NULL) {
+		if (maestro_install(pcidev, TYPE_MAESTRO2E))
 			foundone=1;
 	}
 
@@ -3373,24 +3355,25 @@
 	 *	ESS Maestro 1
 	 */
 
-	while((pcidev = pci_find_device(PCI_VENDOR_ESS_OLD, PCI_DEVICE_ID_ESS_ESS0100, pcidev))!=NULL
-			&&
-		( maestro_install(pcidev, TYPE_MAESTRO) )) {
+	while((pcidev = pci_find_device(PCI_VENDOR_ESS_OLD, PCI_DEVICE_ID_ESS_ESS0100, pcidev))!=NULL) {
+		if (maestro_install(pcidev, TYPE_MAESTRO))
 			foundone=1;
 	}
-	if( ! foundone )
+	if( ! foundone ) {
+		printk("maestro: no devices found.\n");
 		return -ENODEV;
+	}
 	return 0;
 }
 
 /* --------------------------------------------------------------------- */
 
 #ifdef MODULE
-
 MODULE_AUTHOR("Zach Brown <zab@redhat.com>, Alan Cox <alan@redhat.com>");
 MODULE_DESCRIPTION("ESS Maestro Driver");
 #ifdef M_DEBUG
 MODULE_PARM(debug,"i");
+MODULE_PARM(dsps_order,"i");
 #endif
 
 void cleanup_module(void)
@@ -3414,7 +3397,6 @@
 			if(ess->dev_audio != -1)
 				unregister_sound_dsp(ess->dev_audio);
 		}
-		free_mixpage(s);
 		release_region(s->iobase, 256);
 		kfree(s);
 	}
@@ -3422,4 +3404,3 @@
 }
 
 #endif /* MODULE */
-
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/Makefile linux/drivers/usb/Makefile
--- v2.3.21/linux/drivers/usb/Makefile	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/Makefile	Thu Oct 14 14:22:09 1999
@@ -98,21 +98,27 @@
 endif
 
 ifeq ($(CONFIG_USB_SERIAL),y)
-  L_OBJS += serial.o
+  L_OBJS += usb-serial.o
 endif
 
 ifeq ($(CONFIG_USB_SERIAL),m)
-  M_OBJS += serial.o
-  MIX_OBJS += serial.o  
+  M_OBJS += usb-serial.o
+  MIX_OBJS += usb-serial.o  
+endif
+
+ifneq ($(CONFIG_ADB_KEYBOARD),y)
+KEYMAP=keymap
+else
+KEYMAP=keymap-mac
 endif
 
 ifeq ($(CONFIG_USB_KBD),y)
-  L_OBJS += keyboard.o keymap.o
+  L_OBJS += keyboard.o $(KEYMAP).o
 endif
 
 ifeq ($(CONFIG_USB_KBD),m)
   M_OBJS += usb-keyboard.o
-  MIX_OBJS += keyboard.o keymap.o
+  MIX_OBJS += keyboard.o $(KEYMAP).o
 endif
 
 ifeq ($(CONFIG_USB_AUDIO),y)
@@ -177,13 +183,8 @@
 keymap-mac.c: maps/mac.map maps/usb.map
 	./mkmap.adb > $@
 
-ifneq ($(CONFIG_MAC_KEYBOARD),y)
-usb-keyboard.o: keymap.o keyboard.o
-	$(LD) $(LD_RFLAG) -r -o $@  keymap.o keyboard.o 
-else
-usb-keyboard.o: keymap-mac.o keyboard.o
-	$(LD) $(LD_RFLAG) -r -o $@  keymap-mac.o keyboard.o 
-endif
+usb-keyboard.o: $(KEYMAP).o keyboard.o
+	$(LD) $(LD_RFLAG) -r -o $@  $(KEYMAP).o keyboard.o 
 
 ifeq ($(CONFIG_USB_SCSI_DEBUG),y)
 usb-scsi.o: usb_scsi.o usb_scsi_debug.o
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/acm.c linux/drivers/usb/acm.c
--- v2.3.21/linux/drivers/usb/acm.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/acm.c	Tue Oct 12 13:25:07 1999
@@ -5,7 +5,7 @@
  *
  * version 0.8: Fixed endianity bug, some cleanups. I really hate to have
  * half of driver in form if (...) { info("x"); return y; }
- * 						Pavel Machek <pavel@suse.de>
+ * 						Pavel Machek <pavel@suse.cz>
  *
  * version 0.7: Added usb flow control. Fixed bug in uhci.c (what idiot
  * wrote this code? ...Oops that was me). Fixed module cleanup. Did some
@@ -65,7 +65,7 @@
 #include "usb.h"
 
 #define NR_PORTS 3
-#define ACM_MAJOR 166
+#define ACM_MAJOR 166	/* Wow, major is now officially allocated */
 
 //#define info(message...); printk(message);
 #define info(message...);
@@ -425,7 +425,7 @@
 		    interface->bNumEndpoints != 2)
 			continue;
 
-		endpoint = &interface->endpoint[0];
+		/* if ((endpoint->bEndpointAddress & 0x80) == 0x80) */
 		if ((endpoint->bEndpointAddress & 0x80) != 0x80)
 			swapped = 1;
 
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/ezusb.c linux/drivers/usb/ezusb.c
--- v2.3.21/linux/drivers/usb/ezusb.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/ezusb.c	Tue Oct 12 13:25:07 1999
@@ -37,7 +37,6 @@
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/socket.h>
-#include <linux/miscdevice.h>
 #include <linux/list.h>
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
@@ -967,10 +966,6 @@
 	NULL   /* lock */
 };
 
-static struct miscdevice ezusb_misc = {
-	192, "ezusb", &ezusb_fops
-};
-
 /* --------------------------------------------------------------------- */
 
 static int ezusb_probe(struct usb_device *usbdev)
@@ -1044,7 +1039,9 @@
         "ezusb",
         ezusb_probe,
         ezusb_disconnect,
-        { NULL, NULL }
+        { NULL, NULL },
+	&ezusb_fops,
+	32
 };
 
 /* --------------------------------------------------------------------- */
@@ -1062,11 +1059,6 @@
 		init_waitqueue_head(&ezusb[u].wait);
 		spin_lock_init(&ezusb[u].lock);
 	}
-	/* register misc device */
-	if (misc_register(&ezusb_misc)) {
-		printk(KERN_WARNING "ezusb: cannot register minor %d\n", ezusb_misc.minor);
-		return -1;
-	}
 	usb_register(&ezusb_driver);
         printk(KERN_INFO "ezusb: Anchorchip firmware download driver registered\n");
 	return 0;
@@ -1075,7 +1067,6 @@
 void ezusb_cleanup(void)
 {
 	usb_deregister(&ezusb_driver);
-	misc_deregister(&ezusb_misc);
 }
 
 /* --------------------------------------------------------------------- */
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/hp_scanner.c linux/drivers/usb/hp_scanner.c
--- v2.3.21/linux/drivers/usb/hp_scanner.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/hp_scanner.c	Tue Oct 12 13:25:07 1999
@@ -59,8 +59,6 @@
  * stuff may be some kind of maps and stuff but that's kinda rare.  */
 #define OBUF_SIZE 128
 
-#define USB_SCANNER_MAJOR 16
-
 struct hpscan_usb_data {
 	struct usb_device 	*hpscan_dev;            /* init: probe_scanner */
 	__u8			isopen;			/* nz if open */
@@ -279,14 +277,6 @@
 }
 
 static struct
-usb_driver scanner_driver = {
-	"usbscanner",
-	probe_scanner,
-	disconnect_scanner,
-	{ NULL, NULL }
-};
-
-static struct
 file_operations usb_scanner_fops = {
 	NULL,		/* seek */
 	read_scanner,
@@ -302,15 +292,19 @@
 	NULL,         /* fasync */
 };
 
+static struct
+usb_driver scanner_driver = {
+	"usbscanner",
+	probe_scanner,
+	disconnect_scanner,
+	{ NULL, NULL },
+	&usb_scanner_fops,
+	48
+};
+
 int
 usb_hp_scanner_init(void)
 {
-	int result;
-	
-	if ((result = register_chrdev(USB_SCANNER_MAJOR, "usbscanner", &usb_scanner_fops)) < 0) {
-		printk(KERN_WARNING "hp_scanner: Cannot register device\n");
-		return result;
-	}
 	usb_register(&scanner_driver);
 	printk(KERN_DEBUG "USB Scanner support registered.\n");
 	return 0;
@@ -324,7 +318,6 @@
 
 	hps->present = 0;
 	usb_deregister(&scanner_driver);
-	unregister_chrdev(USB_SCANNER_MAJOR, "usbscanner");
 }
 
 #ifdef MODULE
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/mouse.c linux/drivers/usb/mouse.c
--- v2.3.21/linux/drivers/usb/mouse.c	Mon Oct 11 15:38:15 1999
+++ linux/drivers/usb/mouse.c	Tue Oct 12 13:25:07 1999
@@ -34,7 +34,6 @@
 #include <linux/sched.h>
 #include <linux/signal.h>
 #include <linux/errno.h>
-#include <linux/miscdevice.h>
 #include <linux/random.h>
 #include <linux/poll.h>
 #include <linux/init.h>
@@ -44,8 +43,6 @@
 
 #include "usb.h"
 
-#define USB_MOUSE_MINOR 32
-
 struct mouse_state {
 	unsigned char buttons; /* current button state */
 	long dx; /* dx, dy, dz are change since last read */
@@ -109,7 +106,7 @@
 
 	/* if the USB mouse sends an interrupt, then something noteworthy
 	   must have happened */
-	mouse->buttons = data[0] & 0x07;
+	mouse->buttons = data[0] & 0x0f;
 	mouse->dx += data[1]; /* data[] is signed, so this works */
 	mouse->dy -= data[2]; /* y-axis is reversed */
 	mouse->dz -= data[3];
@@ -319,10 +316,6 @@
 	fasync_mouse,
 };
 
-static struct miscdevice usb_mouse = {
-	USB_MOUSE_MINOR, "USB mouse", &usb_mouse_fops
-};
-
 static int mouse_probe(struct usb_device *dev)
 {
 	struct usb_interface_descriptor *interface;
@@ -416,7 +409,9 @@
 	"mouse",
 	mouse_probe,
 	mouse_disconnect,
-	{ NULL, NULL }
+	{ NULL, NULL },
+	&usb_mouse_fops,
+	16
 };
 
 int usb_mouse_init(void)
@@ -428,8 +423,6 @@
 	init_waitqueue_head(&mouse->wait);
 	mouse->fasync = NULL;
 
-	misc_register(&usb_mouse);
-
 	usb_register(&mouse_driver);
 	printk(KERN_INFO "USB HID boot protocol mouse driver registered.\n");
 	return 0;
@@ -449,7 +442,6 @@
 
 	/* this, too, probably needs work */
 	usb_deregister(&mouse_driver);
-	misc_deregister(&usb_mouse);
 }
 
 #ifdef MODULE
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/ohci-hcd.c linux/drivers/usb/ohci-hcd.c
--- v2.3.21/linux/drivers/usb/ohci-hcd.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/ohci-hcd.c	Thu Oct 14 14:59:42 1999
@@ -179,7 +179,7 @@
 	return 0;
 }
                                                      
-static int sohci_request_irq(struct usb_device *usb_dev, unsigned int pipe, usb_device_irq handler, int period, void *dev_id, void **handle)
+static int sohci_request_irq(struct usb_device *usb_dev, unsigned int pipe, usb_device_irq handler, int period, void *dev_id, void **handle, long bustime)
 {
 	struct ohci * ohci = usb_dev->bus->hcpriv;
 	struct ohci_device * dev = usb_to_ohci(usb_dev);
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/ohci.c linux/drivers/usb/ohci.c
--- v2.3.21/linux/drivers/usb/ohci.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/ohci.c	Thu Oct 14 14:59:42 1999
@@ -24,7 +24,7 @@
  *
  * No filesystems were harmed in the development of this code.
  *
- * $Id: ohci.c,v 1.77 1999/09/16 04:30:19 greg Exp $
+ * $Id: ohci.c,v 1.80 1999/09/30 06:32:17 greg Exp $
  */
 
 #include <linux/config.h>
@@ -941,7 +941,7 @@
  * interrupt.  (It's really a pointer to the TD).
  */
 static int ohci_request_irq(struct usb_device *usb, unsigned int pipe,
-	usb_device_irq handler, int period, void *dev_id, void **handle)
+	usb_device_irq handler, int period, void *dev_id, void **handle, long bustime)
 {
 	struct ohci_device *dev = usb_to_ohci(usb);
 	struct ohci_td *td;
@@ -2511,7 +2511,6 @@
 		writel(OHCI_USB_SUSPEND, &ohci->regs->control);
 		free_page((unsigned long) root_hub->hcca);
 		kfree(ohci->bus->root_hub);
-		root_hub->hcca = NULL;
 		ohci->bus->root_hub = NULL;
 	}
 
@@ -2601,7 +2600,6 @@
 			spin_unlock_irq(&current->sigmask_lock);
 
 			if(signr == SIGUSR1) {
-				/* TODO: have it do a full ed/td queue dump? */
 				printk(KERN_DEBUG "OHCI status dump:\n");
 				show_ohci_status(ohci);
 			} else if (signr == SIGUSR2) {
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/printer.c linux/drivers/usb/printer.c
--- v2.3.21/linux/drivers/usb/printer.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/printer.c	Tue Oct 12 13:25:43 1999
@@ -1,8 +1,10 @@
 
 /* Driver for USB Printers
  * 
- * (C) Michael Gee (michael@linuxspecific.com) 1999
- * 
+ * Copyright 1999 Michael Gee (michael@linuxspecific.com)
+ * Copyright 1999 Pavel Machek (pavel@suse.cz)
+ *
+ * Distribute under GPL version 2 or later.
  */
 
 #include <linux/module.h>
@@ -23,12 +25,6 @@
 #define NAK_TIMEOUT (HZ)				/* stall wait for printer */
 #define MAX_RETRY_COUNT ((60*60*HZ)/NAK_TIMEOUT)	/* should not take 1 minute a page! */
 
-#ifndef USB_PRINTER_MAJOR
-#define USB_PRINTER_MAJOR 63
-#endif
-
-static int mymajor = USB_PRINTER_MAJOR;
-
 #define MAX_PRINTERS	8
 
 struct pp_usb_data {
@@ -375,13 +371,6 @@
 	dev->private = NULL;		/* just in case */
 }
 
-static struct usb_driver printer_driver = {
-	"printer",
-	printer_probe,
-	printer_disconnect,
-	{ NULL, NULL }
-};
-
 static struct file_operations usb_printer_fops = {
 	NULL,		/* seek */
 	read_printer,
@@ -397,17 +386,17 @@
 	NULL
 };
 
+static struct usb_driver printer_driver = {
+	"printer",
+	printer_probe,
+	printer_disconnect,
+	{ NULL, NULL },
+	&usb_printer_fops,
+	0
+};
+
 int usb_printer_init(void)
 {
-	int result;
-
-	if ((result = register_chrdev(USB_PRINTER_MAJOR, "usblp", &usb_printer_fops)) < 0) {
-		printk(KERN_WARNING "usbprinter: Cannot register device\n");
-		return result;
-	}
-	if (mymajor == 0) {
-		mymajor = result;
-	}
 	usb_register(&printer_driver);
 	printk(KERN_INFO "USB Printer support registered.\n");
 	return 0;
@@ -423,6 +412,5 @@
 void cleanup_module(void)
 {
 	usb_deregister(&printer_driver);
-	unregister_chrdev(mymajor, "usblp");
 }
 #endif
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/serial.c linux/drivers/usb/serial.c
--- v2.3.21/linux/drivers/usb/serial.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/serial.c	Wed Dec 31 16:00:00 1969
@@ -1,691 +0,0 @@
-/*
- * USB Serial Converter driver
- *
- * Greg Kroah-Hartman (greg@kroah.com)
- *
- * This was based on the ACM driver by Armin Fuerst (which was based
- * on a driver by Brad Keryan)
- *
- * Currently only works for the Belkin and Peracom Serial converters.
- * Should also work on the Etek serial converter, if anyone knows the
- * vendor and device ids for that device.
- *
- * 
- * version 0.1.1 (10/05/99) gkh
- *  Changed the major number to not conflict with anything else.
- *
- * version 0.1 (09/28/99) gkh
- *  Can recognize the two different devices and start up a read from
- * device when asked to. Writes also work. No control signals yet, this
- * all is vendor specific data (i.e. no spec), also no control for
- * different baud rates or other bit settings.
- * Currently we are using the same devid as the acm driver. This needs
- * to change.
- * 
- * (C) Copyright 1999 Greg Kroah-Hartman (greg@kroah.com)
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/signal.h>
-#include <linux/errno.h>
-#include <linux/poll.h>
-#include <linux/init.h>
-#include <linux/malloc.h>
-#include <linux/fcntl.h>
-#include <linux/tty_driver.h>
-#include <linux/tty_flip.h>
-#include <linux/tty.h>
-#include <linux/module.h>
-#include <linux/spinlock.h>
-
-
-#include "usb.h"
-/*#define SERIAL_DEBUG 1*/
-
-#ifdef SERIAL_DEBUG
-	#define debug_info(message); printk(message);
-#else
-	#define debug_info(message);
-#endif
-
-
-/* USB Serial devices vendor ids and device ids that this driver supports */
-#define BELKIN_VENDOR_ID		0x056c
-#define BELKIN_SERIAL_CONVERTER		0x8007
-#define PERACOM_VENDOR_ID		0x0565
-#define PERACOM_SERIAL_CONVERTER	0x0001
-
-
-#define SERIAL_MAJOR	240
-
-#define NUM_PORTS	4	/* Have to pick a number for now. Need to look */
-				/* into dynamically creating them at insertion time. */
-
-
-static int usb_serial_probe(struct usb_device *dev);
-static void usb_serial_disconnect(struct usb_device *dev);
-
-typedef enum {
-	unknown = 0,
-	Belkin = 1,
-	Peracom = 2
-	} SERIAL_TYPE;
-
-struct usb_serial_state {
-	struct usb_device *	dev;
-	SERIAL_TYPE		type;		/* what manufacturer's type of converter */
-	void *			irq_handle;
-	unsigned int		irqpipe;
-	struct tty_struct	*tty;		/* the coresponding tty for this device */
-	char			present;
-	char			active;
-
-	char			interrupt_in_inuse;
-	__u8			interrupt_in_endpoint;
-	__u8			interrupt_in_interval;
-	__u16			interrupt_in_size;
-	unsigned int		interrupt_in_pipe;
-	unsigned char *		interrupt_in_buffer;
-	void *			interrupt_in_transfer;
-
-	char			bulk_in_inuse;
-	__u8			bulk_in_endpoint;
-	__u8			bulk_in_interval;
-	__u16			bulk_in_size;
-	unsigned int		bulk_in_pipe;
-	unsigned char *		bulk_in_buffer;
-	void *			bulk_in_transfer;
-
-	char			bulk_out_inuse;
-	__u8			bulk_out_endpoint;
-	__u8			bulk_out_interval;
-	__u16			bulk_out_size;
-	unsigned int		bulk_out_pipe;
-	unsigned char *		bulk_out_buffer;
-	void *			bulk_out_transfer;
-};
-
-static struct usb_driver usb_serial_driver = {
-	"serial",
-	usb_serial_probe,
-	usb_serial_disconnect,
-	{ NULL, NULL }
-};
-
-static int			serial_refcount;
-static struct tty_driver 	serial_tty_driver;
-static struct tty_struct *	serial_tty[NUM_PORTS];
-static struct termios *		serial_termios[NUM_PORTS];
-static struct termios *		serial_termios_locked[NUM_PORTS];
-static struct usb_serial_state	serial_state_table[NUM_PORTS];
-
-
-
-static int serial_read_irq (int state, void *buffer, int count, void *dev_id)
-{
-	struct usb_serial_state *serial = (struct usb_serial_state *)dev_id;
-       	struct tty_struct *tty = serial->tty; 
-       	unsigned char* data = buffer;
-	int i;
-
-	debug_info("USB: serial_read_irq\n");
-
-#ifdef SERIAL_DEBUG
-	if (count) {
-		printk("%d %s\n", count, data);
-	}
-#endif
-
-	if (count) {
-		for (i=0;i<count;i++) {
-			 tty_insert_flip_char(tty,data[i],0);
-	  	}
-	  	tty_flip_buffer_push(tty);
-	}
-
-	/* Continue transfer */
-	/* return (1); */
-
-	/* No more transfer, let the irq schedule us again */
-	serial->bulk_in_inuse = 0;
-	return (0);
-}
-
-
-static int serial_write_irq (int state, void *buffer, int count, void *dev_id)
-{
-	struct usb_serial_state *serial = (struct usb_serial_state *) dev_id; 
-       	struct tty_struct *tty = serial->tty; 
-
-	debug_info("USB Serial: serial_write_irq\n");
-
-	if (!serial->bulk_out_inuse) {
-		debug_info("USB Serial: write irq for a finished pipe?\n");
-		return (0);
-		}
-
-	usb_terminate_bulk (serial->dev, serial->bulk_out_transfer);
-	serial->bulk_out_inuse = 0;
-
-	if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup)
-		(tty->ldisc.write_wakeup)(tty);
-
-	wake_up_interruptible(&tty->write_wait);
-	
-	return 0;
-}
-
-
-static int usb_serial_irq (int state, void *buffer, int len, void *dev_id)
-{
-//	struct usb_serial_state *serial = (struct usb_serial_state *) dev_id;
-
-	debug_info("USB Serial: usb_serial_irq\n");
-
-	/* ask for a bulk read */
-//	serial->bulk_in_inuse = 1;
-//	serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial);
-
-	return (1);
-}
-
-
-
-
-
-/* tty interface functions */
-static int serial_open (struct tty_struct *tty, struct file * filp)
-{
-	struct usb_serial_state *serial;
-	
-	debug_info("USB: serial_open\n");
-
-	serial = &serial_state_table [MINOR(tty->device)-tty->driver.minor_start];
-	tty->driver_data = serial;
-	serial->tty = tty;
-	 
-	if (!serial->present) {
-		debug_info("USB Serial: no device registered\n");
-		return -EINVAL;
-	}
-
-	if (serial->active) {
-		debug_info ("USB Serial: device already open\n");
-		return -EINVAL;
-	}
-	serial->active = 1;
- 
-	/*Start reading from the device*/
-	serial->bulk_in_inuse = 1;
-	serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial);
-
-	/* Need to do device specific setup here (control lines, baud rate, etc.) */
-	/* FIXME!!! */
-				                  
-	return (0);
-}
-
-
-static void serial_close(struct tty_struct *tty, struct file * filp)
-{
-	struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; 
-	debug_info("USB: serial_close\n");
-	
-	if (!serial->present) {
-		debug_info("USB Serial: no device registered\n");
-		return;
-	}
-
-	if (!serial->active) {
-		debug_info ("USB Serial: device already open\n");
-		return;
-	}
-
-	/* Need to change the control lines here */
-	/* FIXME */
-	
-	if (serial->bulk_out_inuse){
-		usb_terminate_bulk (serial->dev, serial->bulk_out_transfer);
-		serial->bulk_out_inuse = 0;
-	}
-	if (serial->bulk_in_inuse){
-		usb_terminate_bulk (serial->dev, serial->bulk_in_transfer);
-		serial->bulk_in_inuse = 0;
-	}
-
-	/* release the irq? */
-	
-	serial->active = 0;
-}
-
-
-static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count)
-{
-	struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; 
-	int written;
-	
-	debug_info("USB Serial: serial_write\n");
-
-	if (!serial->present) {
-		debug_info("USB Serial: device not registered\n");
-		return (-EINVAL);
-	}
-
-	if (!serial->active) {
-		debug_info ("USB Serial: device not opened\n");
-		return (-EINVAL);
-	}
-	
-	if (serial->bulk_out_inuse) {
-		debug_info ("USB Serial: already writing\n");
-		return (0);
-	}
-
-	written = (count > serial->bulk_out_size) ? serial->bulk_out_size : count;
-	  
-	if (from_user) {
-		copy_from_user(serial->bulk_out_buffer, buf, written);
-	}
-	else {
-		memcpy (serial->bulk_out_buffer, buf, written);
-	}  
-
-	/* send the data out the bulk port */
-	serial->bulk_out_inuse = 1;
-	serial->bulk_out_transfer = usb_request_bulk (serial->dev, serial->bulk_out_pipe, serial_write_irq, serial->bulk_out_buffer, written, serial);
-
-	return (written);
-} 
-
-
-static void serial_put_char (struct tty_struct *tty, unsigned char ch)
-{
-	struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; 
-	
-	debug_info("USB Serial: serial_put_char\n");
-	
-	if (!serial->present) {
-		debug_info("USB Serial: no device registered\n");
-		return;
-	}
-
-	if (!serial->active) {
-		debug_info ("USB Serial: device not open\n");
-		return;
-	}
-
-	if (serial->bulk_out_inuse) {
-		debug_info ("USB Serial: already writing\n");
-		return;
-	}
-
-	/* send the single character out the bulk port */
-	serial->bulk_out_buffer[0] = ch;
-	serial->bulk_out_inuse = 1;
-	serial->bulk_out_transfer = usb_request_bulk (serial->dev, serial->bulk_out_pipe, serial_write_irq, serial->bulk_out_buffer, 1, serial);
-
-	return;
-}                   
-
-
-static int serial_write_room (struct tty_struct *tty) 
-{
-	struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; 
-
-	debug_info("USB Serial: serial_write_room\n");
-	
-	if (!serial->present) {
-		debug_info("USB Serial: no device registered\n");
-		return (-EINVAL);
-	}
-
-	if (!serial->active) {
-		debug_info ("USB Serial: device not open\n");
-		return (-EINVAL);
-	}
-	
-	if (serial->bulk_out_inuse) {
-		return (0);
-	}
-
-	return serial->bulk_out_size;
-}
-
-
-static int serial_chars_in_buffer (struct tty_struct *tty) 
-{
-	struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; 
-
-	debug_info("USB Serial: serial_chars_in_buffer\n");
-	
-	if (!serial->present) {
-		debug_info("USB Serial: no device registered\n");
-		return (-EINVAL);
-	}
-
-	if (!serial->active) {
-		debug_info ("USB Serial: device not open\n");
-		return (-EINVAL);
-	}
-	
-	if (serial->bulk_out_inuse) {
-		return (serial->bulk_out_size);
-	}
-
-	return (0);
-}
-
-
-static void serial_throttle (struct tty_struct * tty)
-{
-	struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; 
-
-	debug_info("USB Serial: serial_throttle\n");
-	
-	if (!serial->present) {
-		debug_info("USB Serial: no device registered\n");
-		return;
-	}
-
-	if (!serial->active) {
-		debug_info ("USB Serial: device not open\n");
-		return;
-	}
-
-
-	/* Change the control signals */
-	/* FIXME!!! */
-
-	return;
-}
-
-
-static void serial_unthrottle (struct tty_struct * tty)
-{
-	struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; 
-
-	debug_info("USB Serial: serial_unthrottle\n");
-	
-	if (!serial->present) {
-		debug_info("USB Serial: no device registered\n");
-		return;
-	}
-
-	if (!serial->active) {
-		debug_info ("USB Serial: device not open\n");
-		return;
-	}
-
-
-	/* Change the control signals */
-	/* FIXME!!! */
-
-	return;
-}
-
-
-static int Get_Free_Serial (void)
-{
-	int i;
- 
-	for (i=0; i < NUM_PORTS; ++i) {
-		if (!serial_state_table[i].present)
-			return (i);
-	}
-	return (-1);
-}
-
-
-static int usb_serial_probe(struct usb_device *dev)
-{
-	struct usb_serial_state *serial;
-	struct usb_interface_descriptor *interface;
-	struct usb_endpoint_descriptor *endpoint;
-	SERIAL_TYPE type;
-	int serial_num;
-//	int ret;
-	int i;
-	
-	/* look at the device descriptor to see if it is a type that we	recognize */
-	type = unknown;
-	if ((dev->descriptor.idVendor == BELKIN_VENDOR_ID) &&
-	    (dev->descriptor.idProduct == BELKIN_SERIAL_CONVERTER)) {
-		/* This is the Belkin serial convertor */
-		type = Belkin;
-		}
-	
-	if ((dev->descriptor.idVendor == PERACOM_VENDOR_ID) &&
-	    (dev->descriptor.idProduct == PERACOM_SERIAL_CONVERTER)) {
-		/* This is the Peracom serial convertor */
-		type = Peracom;
-		}
-
-	if (type == unknown)
-		return (-1);	
-
-	printk (KERN_INFO "USB serial converter detected.\n");
-
-	if (usb_set_configuration(dev, dev->config[0].bConfigurationValue)) {
-		printk (KERN_INFO " Failed usb_set_configuration: serial\n");
-		return (-1);
-	}
-
-	if (0>(serial_num = Get_Free_Serial())) {
-		debug_info("USB Serial: Too many devices connected\n");
-		return (-1);
-	}
-	
-	serial = &serial_state_table[serial_num];
-
-       	memset(serial, 0, sizeof(serial));
-       	serial->dev = dev;
-	serial->type = type;
-       	dev->private = serial;
-
-	/* we should have 1 bulk in, 1 bulk out, and 1 interrupt in endpoints */
-	interface = &dev->config[0].interface[0].altsetting[0];
-	for (i = 0; i < interface->bNumEndpoints; ++i) {
-		endpoint = &interface->endpoint[i];
-		
-		if ((endpoint->bEndpointAddress & 0x80) &&
-		    ((endpoint->bmAttributes & 3) == 0x02)) {
-			/* we found the bulk in endpoint */
-			serial->bulk_in_inuse = 0;
-			serial->bulk_in_endpoint = endpoint->bEndpointAddress;
-			serial->bulk_in_size = endpoint->wMaxPacketSize;
-			serial->bulk_in_interval = endpoint->bInterval;
-			serial->bulk_in_pipe = usb_rcvbulkpipe (dev, serial->bulk_in_endpoint);
-			serial->bulk_in_buffer = kmalloc (serial->bulk_in_size, GFP_KERNEL);
-			if (!serial->bulk_in_buffer) {
-				printk("USB Serial: Couldn't allocate bulk_in_buffer\n");
-				goto probe_error;
-			}
-		}
-
-		if (((endpoint->bEndpointAddress & 0x80) == 0x00) &&
-		    ((endpoint->bmAttributes & 3) == 0x02)) {
-			/* we found the bulk out endpoint */
-			serial->bulk_out_inuse = 0;
-			serial->bulk_out_endpoint = endpoint->bEndpointAddress;
-			serial->bulk_out_size = endpoint->wMaxPacketSize;
-			serial->bulk_out_interval = endpoint->bInterval;
-			serial->bulk_out_pipe = usb_rcvbulkpipe (dev, serial->bulk_out_endpoint);
-			serial->bulk_out_buffer = kmalloc (serial->bulk_out_size, GFP_KERNEL);
-			if (!serial->bulk_out_buffer) {
-				printk("USB Serial: Couldn't allocate bulk_out_buffer\n");
-				goto probe_error;
-			}
-		}
-		
-		if ((endpoint->bEndpointAddress & 0x80) &&
-		    ((endpoint->bmAttributes & 3) == 0x03)) {
-			/* we found the interrupt in endpoint */
-			serial->interrupt_in_inuse = 0;
-			serial->interrupt_in_endpoint = endpoint->bEndpointAddress;
-			serial->interrupt_in_size = endpoint->wMaxPacketSize;
-			serial->interrupt_in_interval = endpoint->bInterval;
-			/* serial->interrupt_in_pipe = usb_rcvbulkpipe (dev, serial->bulk_in_endpoint); */
-			serial->interrupt_in_buffer = kmalloc (serial->bulk_in_size, GFP_KERNEL);
-			if (!serial->bulk_in_buffer) {
-				printk("USB Serial: Couldn't allocate interrupt_in_buffer\n");
-				goto probe_error;
-			}
-		}
-
-	}
-	
-
-	/* verify that we found all of the endpoints that we need */
-	if ((!serial->bulk_in_buffer) || 
-	    (!serial->bulk_out_buffer) ||
-	    (!serial->interrupt_in_buffer)) {
-		printk("USB Serial: did not find all of the required endpoints\n");
-		goto probe_error;
-	}
-		
-
-	/* set up an interrupt for out bulk in pipe */
-	/* ask for a bulk read */
-//	serial->bulk_in_inuse = 1;
-//	serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial);
-
-	/* set up our interrupt to be the time for the bulk in read */
-//	ret = usb_request_irq (dev, serial->bulk_in_pipe, usb_serial_irq, serial->bulk_in_interval, serial, &serial->irq_handle);
-//	if (ret) {
-//		printk(KERN_INFO "USB Serial failed usb_request_irq (0x%x)\n", ret);
-//		goto probe_error;
-//	}
-	
-	serial->present = 1;
-	MOD_INC_USE_COUNT;
-
-	return (0);
-
-probe_error:
-	if (serial) {
-		if (serial->bulk_in_buffer)
-			kfree (serial->bulk_in_buffer);
-		if (serial->bulk_out_buffer)
-			kfree (serial->bulk_out_buffer);
-		if (serial->interrupt_in_buffer)
-			kfree (serial->interrupt_in_buffer);
-	}
-	return (-1);
-}
-
-
-static void usb_serial_disconnect(struct usb_device *dev)
-{
-	struct usb_serial_state *serial = (struct usb_serial_state *)dev->private;
-
-	if (serial) {
-		if (!serial->present) {
-			/* something strange is going on */
-			debug_info("USB Serial: disconnect but not present?\n")
-			return;
-			}
-
-		/* need to stop any transfers...*/
-		if (serial->bulk_in_inuse) {
-			usb_terminate_bulk (serial->dev, serial->bulk_in_transfer);
-			serial->bulk_in_inuse = 0;
-		}
-		if (serial->bulk_out_inuse) {
-			usb_terminate_bulk (serial->dev, serial->bulk_out_transfer);
-			serial->bulk_out_inuse = 0;
-		}
-		// usb_release_irq (serial->dev, serial->irq_handle, serial->bulk_in_pipe);
-		if (serial->bulk_in_buffer)
-			kfree (serial->bulk_in_buffer);
-		if (serial->bulk_out_buffer)
-			kfree (serial->bulk_out_buffer);
-		if (serial->interrupt_in_buffer)
-			kfree (serial->interrupt_in_buffer);
-
-		serial->present = 0;
-		serial->active = 0;
-	}
-       	dev->private = NULL;
-	
-	MOD_DEC_USE_COUNT;
-
-	printk (KERN_INFO "USB Serial device disconnected.\n");
-}
-
-
-
-int usb_serial_init(void)
-{
-	int i;
-
-	/* Initalize our global data */
-	for (i = 0; i < NUM_PORTS; ++i) {
-		memset(&serial_state_table[i], 0x00, sizeof(struct usb_serial_state));
-	}
-
-	/* register the tty driver */
-	memset (&serial_tty_driver, 0, sizeof(struct tty_driver));
-	serial_tty_driver.magic			= TTY_DRIVER_MAGIC;
-	serial_tty_driver.driver_name		= "usb";
-	serial_tty_driver.name			= "ttyUSB";
-	serial_tty_driver.major			= SERIAL_MAJOR;
-	serial_tty_driver.minor_start		= 0;
-	serial_tty_driver.num			= NUM_PORTS;
-	serial_tty_driver.type			= TTY_DRIVER_TYPE_SERIAL;
-	serial_tty_driver.subtype		= SERIAL_TYPE_NORMAL;
-	serial_tty_driver.init_termios		= tty_std_termios;
-	serial_tty_driver.init_termios.c_cflag	= B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-	serial_tty_driver.flags			= TTY_DRIVER_REAL_RAW;
-	serial_tty_driver.refcount		= &serial_refcount;
-	serial_tty_driver.table			= serial_tty;
-	serial_tty_driver.termios		= serial_termios;
-	serial_tty_driver.termios_locked	= serial_termios_locked;
-	
-	serial_tty_driver.open			= serial_open;
-	serial_tty_driver.close			= serial_close;
-	serial_tty_driver.write			= serial_write;
-	serial_tty_driver.put_char		= serial_put_char;
-	serial_tty_driver.flush_chars		= NULL; //serial_flush_chars;
-	serial_tty_driver.write_room		= serial_write_room;
-	serial_tty_driver.ioctl			= NULL; //serial_ioctl;
-	serial_tty_driver.set_termios		= NULL; //serial_set_termios;
-	serial_tty_driver.set_ldisc		= NULL; 
-	serial_tty_driver.throttle		= serial_throttle;
-	serial_tty_driver.unthrottle		= serial_unthrottle;
-	serial_tty_driver.stop			= NULL; //serial_stop;
-	serial_tty_driver.start			= NULL; //serial_start;
-	serial_tty_driver.hangup		= NULL; //serial_hangup;
-	serial_tty_driver.break_ctl		= NULL; //serial_break;
-	serial_tty_driver.wait_until_sent	= NULL; //serial_wait_until_sent;
-	serial_tty_driver.send_xchar		= NULL; //serial_send_xchar;
-	serial_tty_driver.read_proc		= NULL; //serial_read_proc;
-	serial_tty_driver.chars_in_buffer	= serial_chars_in_buffer;
-	serial_tty_driver.flush_buffer		= NULL; //serial_flush_buffer;
-	if (tty_register_driver (&serial_tty_driver)) {
-		printk( "USB Serial: failed to register tty driver\n" );
-		return -EPERM;
-	}
-	
-	/* register the USB driver */
-	usb_register(&usb_serial_driver);
-	printk(KERN_INFO "USB Serial support registered.\n");
-	return 0;
-}
-
-
-#ifdef MODULE
-int init_module(void)
-{
-	return usb_serial_init();
-}
-
-void cleanup_module(void)
-{
-	tty_unregister_driver(&serial_tty_driver);
-	usb_deregister(&usb_serial_driver);
-}
-
-#endif
-
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/uhci.c linux/drivers/usb/uhci.c
--- v2.3.21/linux/drivers/usb/uhci.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/uhci.c	Thu Oct 14 14:59:46 1999
@@ -119,6 +119,7 @@
 
 	return USB_ST_INTERNALERROR;
 }
+
 /*
  * Return the result of a TD..
  */
@@ -189,12 +190,12 @@
 		if (!status)
 			return USB_ST_NOERROR;
 
-		/* APC BackUPS Pro kludge */
+		/* XXX FIXME APC BackUPS Pro kludge */
 		/* It tries to send all of the descriptor instead of */
 		/*  the amount we requested */
 		if (tmp->status & TD_CTRL_IOC &&
 		    tmp->status & TD_CTRL_ACTIVE &&
-		    tmp->status & TD_CTRL_NAK)
+		    tmp->status & TD_CTRL_NAK /* && its a control TD */)
 			return USB_ST_NOERROR;
 
 #if 0
@@ -627,9 +628,11 @@
  *
  * Returns 0 (success) or negative (failure).
  * Also returns/sets a "handle pointer" that release_irq can use to stop this
- * interrupt.  (It's really a pointer to the TD).
+ * interrupt.  (It's really a pointer to the TD.)
  */
-static int uhci_request_irq(struct usb_device *usb_dev, unsigned int pipe, usb_device_irq handler, int period, void *dev_id, void **handle)
+static int uhci_request_irq(struct usb_device *usb_dev, unsigned int pipe,
+			usb_device_irq handler, int period,
+			void *dev_id, void **handle, long bustime)
 {
 	struct uhci_device *dev = usb_to_uhci(usb_dev);
 	struct uhci_td *td = uhci_td_alloc(dev);
@@ -658,13 +661,15 @@
 	td->buffer = virt_to_bus(dev->data);
 	td->qh = qh;
 	td->dev = dev;
+	td->pipetype = PIPE_INTERRUPT;
+	td->bandwidth_alloc = bustime;
 
-	/* if period 0, insert into fast q */
+	/* if period 0, set _REMOVE flag */
 	if (period == 0) {
 		td->flags |= UHCI_TD_REMOVE;
-		qh->skel = &dev->uhci->skel_int2_qh;
-	} else
-		qh->skel = &dev->uhci->skel_int8_qh;
+	}
+
+	qh->skel = &dev->uhci->skelqh[__interval_to_skel(period)];
 
 	uhci_add_irq_list(dev->uhci, td, handler, dev_id);
 
@@ -964,6 +969,7 @@
 		td->info   = destination | ((frlen - 1) << 21);
 		td->buffer = virt_to_bus (bufptr);
 		td->dev    = dev;
+		td->pipetype = PIPE_ISOCHRONOUS;
 		td->isoc_td_number = ix;        /* 0-based; does not wrap/overflow back to 0 */
 
 		if (isocdesc->callback_frames &&
@@ -971,7 +977,7 @@
 			td->status |= TD_CTRL_IOC;
 			td->completed = isocdesc->callback_fn;
 			cb_frames = 0;
-			uhci_add_irq_list (dev->uhci, td, isocdesc->callback_fn, isocdesc->context);
+			uhci_add_irq_list (dev->uhci, td, isocdesc->callback_fn, isocdesc);
 		}
 
 		bufptr += fd->frame_length;  /* or isocdesc->frame_size; */
@@ -991,7 +997,7 @@
 	if (!(td->status & TD_CTRL_IOC)) {
 		td->status |= TD_CTRL_IOC;
 		td->completed = isocdesc->callback_fn;
-		uhci_add_irq_list(dev->uhci, td, isocdesc->callback_fn, isocdesc->context); /* TBD: D.K. ??? */
+		uhci_add_irq_list(dev->uhci, td, isocdesc->callback_fn, isocdesc); /* TBD: D.K. ??? */
 	}
 	return 0;
 } /* end uhci_run_isoc */
@@ -1158,6 +1164,7 @@
 	td->status = status;				/* Try forever */
 	td->info = destination | (7 << 21);		/* 8 bytes of data */
 	td->buffer = virt_to_bus(cmd);
+	td->pipetype = PIPE_CONTROL;
 
 	/*
 	 * If direction is "send", change the frame from SETUP (0x2D)
@@ -1191,6 +1198,7 @@
 		td->info = destination | ((pktsze - 1) << 21);		/* pktsze bytes of data */
 		td->buffer = virt_to_bus(data);
 		td->backptr = &prevtd->link;
+		td->pipetype = PIPE_CONTROL;
 
 		data += pktsze;
 		len -= pktsze;
@@ -1219,6 +1227,7 @@
 	td->buffer = 0;
 	td->backptr = &prevtd->link;
 	td->link = UHCI_PTR_TERM;			/* Terminate */
+	td->pipetype = PIPE_CONTROL;
 
 	/* Start it up.. */
 	ret = uhci_run_control(dev, first, td, timeout);
@@ -1349,6 +1358,7 @@
 				usb_pipeout(pipe)) << TD_TOKEN_TOGGLE); /* pktsze bytes of data */
 		td->buffer = virt_to_bus(data);
 		td->backptr = &prevtd->link;
+		td->pipetype = PIPE_BULK;
 
 		data += maxsze;
 		len -= maxsze;
@@ -1429,6 +1439,7 @@
 		td->backptr = &prevtd->link;
 		td->qh = bulk_qh;
 		td->dev = dev;
+		td->pipetype = PIPE_BULK;
 		data += pktsze;
 		len -= pktsze;
 
@@ -1467,11 +1478,11 @@
 {
 	/* none found? there is nothing to remove! */
 	if (!first)
-		return 0;
+		return USB_ST_REMOVED;
 
 	uhci_remove_transfer(first, 1);
 
-	return 1;
+	return USB_ST_NOERROR;
 }
 
 struct usb_operations uhci_device_operations = {
@@ -1698,7 +1709,7 @@
 				uhci_packetout(td->info)) << 19; /* toggle between data0 and data1 */
 			td->status = (td->status & 0x2F000000) | TD_CTRL_ACTIVE | TD_CTRL_IOC;
 			/* The HC only removes it when it completed */
-			/* successfully, so force remove and readd it */
+			/* successfully, so force remove and re-add it */
 			uhci_remove_td(td);
 			uhci_insert_td_in_qh(td->qh, td);
 		} else if (td->flags & UHCI_TD_REMOVE) {
@@ -1710,6 +1721,8 @@
 			uhci_remove_qh(td->qh->skel, td->qh);
 			uhci_qh_free(td->qh);
 			uhci_td_free(td);
+			if (td->pipetype == PIPE_INTERRUPT)
+				usb_release_bandwidth(usb_dev, td->bandwidth_alloc);
 		}
 
 		/* If completed does not wants to reactivate, then */
@@ -1790,6 +1803,7 @@
 	td->info = (15 << 21) | (0x7f << 8) | USB_PID_IN;	/* (ignored) input packet, 16 bytes, device 127 */
 	td->buffer = 0;
 	td->qh = NULL;
+	td->pipetype = -1;
 
 	uhci->fl->frame[0] = virt_to_bus(td);
 
@@ -1931,16 +1945,21 @@
 	usb->maxchild = port;
 	usb_init_root_hub(usb);
 
-	/* 8 Interrupt queues */
-	for (i = 0; i < 8; i++) {
+	/*
+	 * 9 Interrupt queues; link int2 thru int256 to int1 first,
+	 * then link int1 to control and control to bulk
+	 */
+	for (i = 1; i < 9; i++) {
 		struct uhci_qh *qh = &uhci->skelqh[i];
 
-		qh->link = virt_to_bus(&uhci->skel_control_qh) | UHCI_PTR_QH;
+		qh->link = virt_to_bus(&uhci->skel_int1_qh) | UHCI_PTR_QH;
 		qh->element = UHCI_PTR_TERM;
 	}
 
-	uhci->skel_control_qh.link = virt_to_bus(&uhci->skel_bulk_qh) |
-		UHCI_PTR_QH;
+	uhci->skel_int1_qh.link = virt_to_bus(&uhci->skel_control_qh) | UHCI_PTR_QH;
+	uhci->skel_int1_qh.element = UHCI_PTR_TERM;
+
+	uhci->skel_control_qh.link = virt_to_bus(&uhci->skel_bulk_qh) | UHCI_PTR_QH;
 	uhci->skel_control_qh.element = UHCI_PTR_TERM;
 
 	uhci->skel_bulk_qh.link = UHCI_PTR_TERM;
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/uhci.h linux/drivers/usb/uhci.h
--- v2.3.21/linux/drivers/usb/uhci.h	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/uhci.h	Thu Oct 14 14:59:46 1999
@@ -166,6 +166,9 @@
 	struct uhci_qh *qh;		/* QH this TD is a part of (ignored for Isochronous) */
 	int flags;			/* Remove, etc */
 	int isoc_td_number;		/* 0-relative number within a usb_isoc_desc. */
+	int pipetype;			/* Control, Bulk, Interrupt, or Isoc */
+	int bandwidth_alloc;		/* in microsecs; used only for Interrupt
+					 * transfers, to return its bandwidth */
 } __attribute__((aligned(16)));
 
 
@@ -225,13 +228,14 @@
  * be scared, it kinda makes sense. Look at this wonderful picture care of
  * Linus:
  *
- *  generic-iso-QH  ->  dev1-iso-QH  ->  generic-irq-QH  ->  dev1-irq-QH  -> ...
- *       |                  |                  |                   |
- *      End             dev1-iso-TD1          End            dev1-irq-TD1
- *                          |
- *                      dev1-iso-TD2
- *                          |
- *                        ....
+ *  generic-  ->  dev1-  ->  generic-  ->  dev1-  ->  control-  ->  bulk- -> ...
+ *   iso-QH      iso-QH       irq-QH      irq-QH        QH           QH
+ *      |           |            |           |           |            |
+ *     End     dev1-iso-TD1     End     dev1-irq-TD1    ...          ... 
+ *                  |
+ *             dev1-iso-TD2
+ *                  |
+ *                ....
  *
  * This may vary a bit (the UHCI docs don't explicitly say you can put iso
  * transfers in QH's and all of their pictures don't have that either) but
@@ -242,20 +246,62 @@
  * To keep with Linus' nomenclature, this is called the QH skeleton. These
  * labels (below) are only signficant to the root hub's QH's
  */
-#define UHCI_NUM_SKELQH		10
+#define UHCI_NUM_SKELQH		11
 
-#define skel_int2_qh		skelqh[0]
-#define skel_int4_qh		skelqh[1]
-#define skel_int8_qh		skelqh[2]
-#define skel_int16_qh		skelqh[3]
-#define skel_int32_qh		skelqh[4]
-#define skel_int64_qh		skelqh[5]
-#define skel_int128_qh		skelqh[6]
-#define skel_int256_qh		skelqh[7]
+#define skel_int1_qh		skelqh[0]
+#define skel_int2_qh		skelqh[1]
+#define skel_int4_qh		skelqh[2]
+#define skel_int8_qh		skelqh[3]
+#define skel_int16_qh		skelqh[4]
+#define skel_int32_qh		skelqh[5]
+#define skel_int64_qh		skelqh[6]
+#define skel_int128_qh		skelqh[7]
+#define skel_int256_qh		skelqh[8]
 
-#define skel_control_qh		skelqh[8]
+#define skel_control_qh		skelqh[9]
 
-#define skel_bulk_qh		skelqh[9]
+#define skel_bulk_qh		skelqh[10]
+
+/*
+ * Search tree for determining where <interval> fits in the
+ * skelqh[] skeleton.
+ *
+ * An interrupt request should be placed into the slowest skelqh[]
+ * which meets the interval/period/frequency requirement.
+ * An interrupt request is allowed to be faster than <interval> but not slower.
+ *
+ * For a given <interval>, this function returns the appropriate/matching
+ * skelqh[] index value.
+ *
+ * NOTE: For UHCI, we don't really need int256_qh since the maximum interval
+ * is 255 ms.  However, we do need an int1_qh since 1 is a valid interval
+ * and we should meet that frequency when requested to do so.
+ * This will require some change(s) to the UHCI skeleton.
+ */
+static inline int __interval_to_skel(interval)
+{
+	if (interval < 16) {
+		if (interval < 4) {
+			if (interval < 2) {
+				return 0;	/* int1 for 0-1 ms */
+			}
+			return 1;		/* int2 for 2-3 ms */
+		}
+		if (interval < 8) {
+			return 2;		/* int4 for 4-7 ms */
+		}
+		return 3;			/* int 8 for 8-15 ms */
+	}
+	if (interval < 64) {
+		if (interval < 32) {
+			return 4;		/* int16 for 16-31 ms */
+		}
+		return 5;			/* int32 for 32-63 ms */
+	}
+	if (interval < 128)
+		return 6;			/* int64 for 64-127 ms */
+	return 7;				/* int128 for 128-255 ms (Max.) */
+}
 
 /*
  * This describes the full uhci information.
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/usb-core.c linux/drivers/usb/usb-core.c
--- v2.3.21/linux/drivers/usb/usb-core.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/usb-core.c	Tue Oct 12 13:25:07 1999
@@ -30,6 +30,7 @@
 
 int usb_init(void)
 {
+	usb_major_init();
 #ifdef CONFIG_USB_PROC
 	proc_usb_init ();
 #endif
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/usb-serial.c linux/drivers/usb/usb-serial.c
--- v2.3.21/linux/drivers/usb/usb-serial.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/usb/usb-serial.c	Fri Oct  8 10:06:21 1999
@@ -0,0 +1,691 @@
+/*
+ * USB Serial Converter driver
+ *
+ * Greg Kroah-Hartman (greg@kroah.com)
+ *
+ * This was based on the ACM driver by Armin Fuerst (which was based
+ * on a driver by Brad Keryan)
+ *
+ * Currently only works for the Belkin and Peracom Serial converters.
+ * Should also work on the Etek serial converter, if anyone knows the
+ * vendor and device ids for that device.
+ *
+ * 
+ * version 0.1.1 (10/05/99) gkh
+ *  Changed the major number to not conflict with anything else.
+ *
+ * version 0.1 (09/28/99) gkh
+ *  Can recognize the two different devices and start up a read from
+ * device when asked to. Writes also work. No control signals yet, this
+ * all is vendor specific data (i.e. no spec), also no control for
+ * different baud rates or other bit settings.
+ * Currently we are using the same devid as the acm driver. This needs
+ * to change.
+ * 
+ * (C) Copyright 1999 Greg Kroah-Hartman (greg@kroah.com)
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/signal.h>
+#include <linux/errno.h>
+#include <linux/poll.h>
+#include <linux/init.h>
+#include <linux/malloc.h>
+#include <linux/fcntl.h>
+#include <linux/tty_driver.h>
+#include <linux/tty_flip.h>
+#include <linux/tty.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+
+
+#include "usb.h"
+/*#define SERIAL_DEBUG 1*/
+
+#ifdef SERIAL_DEBUG
+	#define debug_info(message); printk(message);
+#else
+	#define debug_info(message);
+#endif
+
+
+/* USB Serial devices vendor ids and device ids that this driver supports */
+#define BELKIN_VENDOR_ID		0x056c
+#define BELKIN_SERIAL_CONVERTER		0x8007
+#define PERACOM_VENDOR_ID		0x0565
+#define PERACOM_SERIAL_CONVERTER	0x0001
+
+
+#define SERIAL_MAJOR	240
+
+#define NUM_PORTS	4	/* Have to pick a number for now. Need to look */
+				/* into dynamically creating them at insertion time. */
+
+
+static int usb_serial_probe(struct usb_device *dev);
+static void usb_serial_disconnect(struct usb_device *dev);
+
+typedef enum {
+	unknown = 0,
+	Belkin = 1,
+	Peracom = 2
+	} SERIAL_TYPE;
+
+struct usb_serial_state {
+	struct usb_device *	dev;
+	SERIAL_TYPE		type;		/* what manufacturer's type of converter */
+	void *			irq_handle;
+	unsigned int		irqpipe;
+	struct tty_struct	*tty;		/* the coresponding tty for this device */
+	char			present;
+	char			active;
+
+	char			interrupt_in_inuse;
+	__u8			interrupt_in_endpoint;
+	__u8			interrupt_in_interval;
+	__u16			interrupt_in_size;
+	unsigned int		interrupt_in_pipe;
+	unsigned char *		interrupt_in_buffer;
+	void *			interrupt_in_transfer;
+
+	char			bulk_in_inuse;
+	__u8			bulk_in_endpoint;
+	__u8			bulk_in_interval;
+	__u16			bulk_in_size;
+	unsigned int		bulk_in_pipe;
+	unsigned char *		bulk_in_buffer;
+	void *			bulk_in_transfer;
+
+	char			bulk_out_inuse;
+	__u8			bulk_out_endpoint;
+	__u8			bulk_out_interval;
+	__u16			bulk_out_size;
+	unsigned int		bulk_out_pipe;
+	unsigned char *		bulk_out_buffer;
+	void *			bulk_out_transfer;
+};
+
+static struct usb_driver usb_serial_driver = {
+	"serial",
+	usb_serial_probe,
+	usb_serial_disconnect,
+	{ NULL, NULL }
+};
+
+static int			serial_refcount;
+static struct tty_driver 	serial_tty_driver;
+static struct tty_struct *	serial_tty[NUM_PORTS];
+static struct termios *		serial_termios[NUM_PORTS];
+static struct termios *		serial_termios_locked[NUM_PORTS];
+static struct usb_serial_state	serial_state_table[NUM_PORTS];
+
+
+
+static int serial_read_irq (int state, void *buffer, int count, void *dev_id)
+{
+	struct usb_serial_state *serial = (struct usb_serial_state *)dev_id;
+       	struct tty_struct *tty = serial->tty; 
+       	unsigned char* data = buffer;
+	int i;
+
+	debug_info("USB: serial_read_irq\n");
+
+#ifdef SERIAL_DEBUG
+	if (count) {
+		printk("%d %s\n", count, data);
+	}
+#endif
+
+	if (count) {
+		for (i=0;i<count;i++) {
+			 tty_insert_flip_char(tty,data[i],0);
+	  	}
+	  	tty_flip_buffer_push(tty);
+	}
+
+	/* Continue transfer */
+	/* return (1); */
+
+	/* No more transfer, let the irq schedule us again */
+	serial->bulk_in_inuse = 0;
+	return (0);
+}
+
+
+static int serial_write_irq (int state, void *buffer, int count, void *dev_id)
+{
+	struct usb_serial_state *serial = (struct usb_serial_state *) dev_id; 
+       	struct tty_struct *tty = serial->tty; 
+
+	debug_info("USB Serial: serial_write_irq\n");
+
+	if (!serial->bulk_out_inuse) {
+		debug_info("USB Serial: write irq for a finished pipe?\n");
+		return (0);
+		}
+
+	usb_terminate_bulk (serial->dev, serial->bulk_out_transfer);
+	serial->bulk_out_inuse = 0;
+
+	if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup)
+		(tty->ldisc.write_wakeup)(tty);
+
+	wake_up_interruptible(&tty->write_wait);
+	
+	return 0;
+}
+
+
+static int usb_serial_irq (int state, void *buffer, int len, void *dev_id)
+{
+//	struct usb_serial_state *serial = (struct usb_serial_state *) dev_id;
+
+	debug_info("USB Serial: usb_serial_irq\n");
+
+	/* ask for a bulk read */
+//	serial->bulk_in_inuse = 1;
+//	serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial);
+
+	return (1);
+}
+
+
+
+
+
+/* tty interface functions */
+static int serial_open (struct tty_struct *tty, struct file * filp)
+{
+	struct usb_serial_state *serial;
+	
+	debug_info("USB: serial_open\n");
+
+	serial = &serial_state_table [MINOR(tty->device)-tty->driver.minor_start];
+	tty->driver_data = serial;
+	serial->tty = tty;
+	 
+	if (!serial->present) {
+		debug_info("USB Serial: no device registered\n");
+		return -EINVAL;
+	}
+
+	if (serial->active) {
+		debug_info ("USB Serial: device already open\n");
+		return -EINVAL;
+	}
+	serial->active = 1;
+ 
+	/*Start reading from the device*/
+	serial->bulk_in_inuse = 1;
+	serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial);
+
+	/* Need to do device specific setup here (control lines, baud rate, etc.) */
+	/* FIXME!!! */
+				                  
+	return (0);
+}
+
+
+static void serial_close(struct tty_struct *tty, struct file * filp)
+{
+	struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; 
+	debug_info("USB: serial_close\n");
+	
+	if (!serial->present) {
+		debug_info("USB Serial: no device registered\n");
+		return;
+	}
+
+	if (!serial->active) {
+		debug_info ("USB Serial: device already open\n");
+		return;
+	}
+
+	/* Need to change the control lines here */
+	/* FIXME */
+	
+	if (serial->bulk_out_inuse){
+		usb_terminate_bulk (serial->dev, serial->bulk_out_transfer);
+		serial->bulk_out_inuse = 0;
+	}
+	if (serial->bulk_in_inuse){
+		usb_terminate_bulk (serial->dev, serial->bulk_in_transfer);
+		serial->bulk_in_inuse = 0;
+	}
+
+	/* release the irq? */
+	
+	serial->active = 0;
+}
+
+
+static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count)
+{
+	struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; 
+	int written;
+	
+	debug_info("USB Serial: serial_write\n");
+
+	if (!serial->present) {
+		debug_info("USB Serial: device not registered\n");
+		return (-EINVAL);
+	}
+
+	if (!serial->active) {
+		debug_info ("USB Serial: device not opened\n");
+		return (-EINVAL);
+	}
+	
+	if (serial->bulk_out_inuse) {
+		debug_info ("USB Serial: already writing\n");
+		return (0);
+	}
+
+	written = (count > serial->bulk_out_size) ? serial->bulk_out_size : count;
+	  
+	if (from_user) {
+		copy_from_user(serial->bulk_out_buffer, buf, written);
+	}
+	else {
+		memcpy (serial->bulk_out_buffer, buf, written);
+	}  
+
+	/* send the data out the bulk port */
+	serial->bulk_out_inuse = 1;
+	serial->bulk_out_transfer = usb_request_bulk (serial->dev, serial->bulk_out_pipe, serial_write_irq, serial->bulk_out_buffer, written, serial);
+
+	return (written);
+} 
+
+
+static void serial_put_char (struct tty_struct *tty, unsigned char ch)
+{
+	struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; 
+	
+	debug_info("USB Serial: serial_put_char\n");
+	
+	if (!serial->present) {
+		debug_info("USB Serial: no device registered\n");
+		return;
+	}
+
+	if (!serial->active) {
+		debug_info ("USB Serial: device not open\n");
+		return;
+	}
+
+	if (serial->bulk_out_inuse) {
+		debug_info ("USB Serial: already writing\n");
+		return;
+	}
+
+	/* send the single character out the bulk port */
+	serial->bulk_out_buffer[0] = ch;
+	serial->bulk_out_inuse = 1;
+	serial->bulk_out_transfer = usb_request_bulk (serial->dev, serial->bulk_out_pipe, serial_write_irq, serial->bulk_out_buffer, 1, serial);
+
+	return;
+}                   
+
+
+static int serial_write_room (struct tty_struct *tty) 
+{
+	struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; 
+
+	debug_info("USB Serial: serial_write_room\n");
+	
+	if (!serial->present) {
+		debug_info("USB Serial: no device registered\n");
+		return (-EINVAL);
+	}
+
+	if (!serial->active) {
+		debug_info ("USB Serial: device not open\n");
+		return (-EINVAL);
+	}
+	
+	if (serial->bulk_out_inuse) {
+		return (0);
+	}
+
+	return serial->bulk_out_size;
+}
+
+
+static int serial_chars_in_buffer (struct tty_struct *tty) 
+{
+	struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; 
+
+	debug_info("USB Serial: serial_chars_in_buffer\n");
+	
+	if (!serial->present) {
+		debug_info("USB Serial: no device registered\n");
+		return (-EINVAL);
+	}
+
+	if (!serial->active) {
+		debug_info ("USB Serial: device not open\n");
+		return (-EINVAL);
+	}
+	
+	if (serial->bulk_out_inuse) {
+		return (serial->bulk_out_size);
+	}
+
+	return (0);
+}
+
+
+static void serial_throttle (struct tty_struct * tty)
+{
+	struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; 
+
+	debug_info("USB Serial: serial_throttle\n");
+	
+	if (!serial->present) {
+		debug_info("USB Serial: no device registered\n");
+		return;
+	}
+
+	if (!serial->active) {
+		debug_info ("USB Serial: device not open\n");
+		return;
+	}
+
+
+	/* Change the control signals */
+	/* FIXME!!! */
+
+	return;
+}
+
+
+static void serial_unthrottle (struct tty_struct * tty)
+{
+	struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; 
+
+	debug_info("USB Serial: serial_unthrottle\n");
+	
+	if (!serial->present) {
+		debug_info("USB Serial: no device registered\n");
+		return;
+	}
+
+	if (!serial->active) {
+		debug_info ("USB Serial: device not open\n");
+		return;
+	}
+
+
+	/* Change the control signals */
+	/* FIXME!!! */
+
+	return;
+}
+
+
+static int Get_Free_Serial (void)
+{
+	int i;
+ 
+	for (i=0; i < NUM_PORTS; ++i) {
+		if (!serial_state_table[i].present)
+			return (i);
+	}
+	return (-1);
+}
+
+
+static int usb_serial_probe(struct usb_device *dev)
+{
+	struct usb_serial_state *serial;
+	struct usb_interface_descriptor *interface;
+	struct usb_endpoint_descriptor *endpoint;
+	SERIAL_TYPE type;
+	int serial_num;
+//	int ret;
+	int i;
+	
+	/* look at the device descriptor to see if it is a type that we	recognize */
+	type = unknown;
+	if ((dev->descriptor.idVendor == BELKIN_VENDOR_ID) &&
+	    (dev->descriptor.idProduct == BELKIN_SERIAL_CONVERTER)) {
+		/* This is the Belkin serial convertor */
+		type = Belkin;
+		}
+	
+	if ((dev->descriptor.idVendor == PERACOM_VENDOR_ID) &&
+	    (dev->descriptor.idProduct == PERACOM_SERIAL_CONVERTER)) {
+		/* This is the Peracom serial convertor */
+		type = Peracom;
+		}
+
+	if (type == unknown)
+		return (-1);	
+
+	printk (KERN_INFO "USB serial converter detected.\n");
+
+	if (usb_set_configuration(dev, dev->config[0].bConfigurationValue)) {
+		printk (KERN_INFO " Failed usb_set_configuration: serial\n");
+		return (-1);
+	}
+
+	if (0>(serial_num = Get_Free_Serial())) {
+		debug_info("USB Serial: Too many devices connected\n");
+		return (-1);
+	}
+	
+	serial = &serial_state_table[serial_num];
+
+       	memset(serial, 0, sizeof(serial));
+       	serial->dev = dev;
+	serial->type = type;
+       	dev->private = serial;
+
+	/* we should have 1 bulk in, 1 bulk out, and 1 interrupt in endpoints */
+	interface = &dev->config[0].interface[0].altsetting[0];
+	for (i = 0; i < interface->bNumEndpoints; ++i) {
+		endpoint = &interface->endpoint[i];
+		
+		if ((endpoint->bEndpointAddress & 0x80) &&
+		    ((endpoint->bmAttributes & 3) == 0x02)) {
+			/* we found the bulk in endpoint */
+			serial->bulk_in_inuse = 0;
+			serial->bulk_in_endpoint = endpoint->bEndpointAddress;
+			serial->bulk_in_size = endpoint->wMaxPacketSize;
+			serial->bulk_in_interval = endpoint->bInterval;
+			serial->bulk_in_pipe = usb_rcvbulkpipe (dev, serial->bulk_in_endpoint);
+			serial->bulk_in_buffer = kmalloc (serial->bulk_in_size, GFP_KERNEL);
+			if (!serial->bulk_in_buffer) {
+				printk("USB Serial: Couldn't allocate bulk_in_buffer\n");
+				goto probe_error;
+			}
+		}
+
+		if (((endpoint->bEndpointAddress & 0x80) == 0x00) &&
+		    ((endpoint->bmAttributes & 3) == 0x02)) {
+			/* we found the bulk out endpoint */
+			serial->bulk_out_inuse = 0;
+			serial->bulk_out_endpoint = endpoint->bEndpointAddress;
+			serial->bulk_out_size = endpoint->wMaxPacketSize;
+			serial->bulk_out_interval = endpoint->bInterval;
+			serial->bulk_out_pipe = usb_rcvbulkpipe (dev, serial->bulk_out_endpoint);
+			serial->bulk_out_buffer = kmalloc (serial->bulk_out_size, GFP_KERNEL);
+			if (!serial->bulk_out_buffer) {
+				printk("USB Serial: Couldn't allocate bulk_out_buffer\n");
+				goto probe_error;
+			}
+		}
+		
+		if ((endpoint->bEndpointAddress & 0x80) &&
+		    ((endpoint->bmAttributes & 3) == 0x03)) {
+			/* we found the interrupt in endpoint */
+			serial->interrupt_in_inuse = 0;
+			serial->interrupt_in_endpoint = endpoint->bEndpointAddress;
+			serial->interrupt_in_size = endpoint->wMaxPacketSize;
+			serial->interrupt_in_interval = endpoint->bInterval;
+			/* serial->interrupt_in_pipe = usb_rcvbulkpipe (dev, serial->bulk_in_endpoint); */
+			serial->interrupt_in_buffer = kmalloc (serial->bulk_in_size, GFP_KERNEL);
+			if (!serial->bulk_in_buffer) {
+				printk("USB Serial: Couldn't allocate interrupt_in_buffer\n");
+				goto probe_error;
+			}
+		}
+
+	}
+	
+
+	/* verify that we found all of the endpoints that we need */
+	if ((!serial->bulk_in_buffer) || 
+	    (!serial->bulk_out_buffer) ||
+	    (!serial->interrupt_in_buffer)) {
+		printk("USB Serial: did not find all of the required endpoints\n");
+		goto probe_error;
+	}
+		
+
+	/* set up an interrupt for out bulk in pipe */
+	/* ask for a bulk read */
+//	serial->bulk_in_inuse = 1;
+//	serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial);
+
+	/* set up our interrupt to be the time for the bulk in read */
+//	ret = usb_request_irq (dev, serial->bulk_in_pipe, usb_serial_irq, serial->bulk_in_interval, serial, &serial->irq_handle);
+//	if (ret) {
+//		printk(KERN_INFO "USB Serial failed usb_request_irq (0x%x)\n", ret);
+//		goto probe_error;
+//	}
+	
+	serial->present = 1;
+	MOD_INC_USE_COUNT;
+
+	return (0);
+
+probe_error:
+	if (serial) {
+		if (serial->bulk_in_buffer)
+			kfree (serial->bulk_in_buffer);
+		if (serial->bulk_out_buffer)
+			kfree (serial->bulk_out_buffer);
+		if (serial->interrupt_in_buffer)
+			kfree (serial->interrupt_in_buffer);
+	}
+	return (-1);
+}
+
+
+static void usb_serial_disconnect(struct usb_device *dev)
+{
+	struct usb_serial_state *serial = (struct usb_serial_state *)dev->private;
+
+	if (serial) {
+		if (!serial->present) {
+			/* something strange is going on */
+			debug_info("USB Serial: disconnect but not present?\n")
+			return;
+			}
+
+		/* need to stop any transfers...*/
+		if (serial->bulk_in_inuse) {
+			usb_terminate_bulk (serial->dev, serial->bulk_in_transfer);
+			serial->bulk_in_inuse = 0;
+		}
+		if (serial->bulk_out_inuse) {
+			usb_terminate_bulk (serial->dev, serial->bulk_out_transfer);
+			serial->bulk_out_inuse = 0;
+		}
+		// usb_release_irq (serial->dev, serial->irq_handle, serial->bulk_in_pipe);
+		if (serial->bulk_in_buffer)
+			kfree (serial->bulk_in_buffer);
+		if (serial->bulk_out_buffer)
+			kfree (serial->bulk_out_buffer);
+		if (serial->interrupt_in_buffer)
+			kfree (serial->interrupt_in_buffer);
+
+		serial->present = 0;
+		serial->active = 0;
+	}
+       	dev->private = NULL;
+	
+	MOD_DEC_USE_COUNT;
+
+	printk (KERN_INFO "USB Serial device disconnected.\n");
+}
+
+
+
+int usb_serial_init(void)
+{
+	int i;
+
+	/* Initalize our global data */
+	for (i = 0; i < NUM_PORTS; ++i) {
+		memset(&serial_state_table[i], 0x00, sizeof(struct usb_serial_state));
+	}
+
+	/* register the tty driver */
+	memset (&serial_tty_driver, 0, sizeof(struct tty_driver));
+	serial_tty_driver.magic			= TTY_DRIVER_MAGIC;
+	serial_tty_driver.driver_name		= "usb";
+	serial_tty_driver.name			= "ttyUSB";
+	serial_tty_driver.major			= SERIAL_MAJOR;
+	serial_tty_driver.minor_start		= 0;
+	serial_tty_driver.num			= NUM_PORTS;
+	serial_tty_driver.type			= TTY_DRIVER_TYPE_SERIAL;
+	serial_tty_driver.subtype		= SERIAL_TYPE_NORMAL;
+	serial_tty_driver.init_termios		= tty_std_termios;
+	serial_tty_driver.init_termios.c_cflag	= B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+	serial_tty_driver.flags			= TTY_DRIVER_REAL_RAW;
+	serial_tty_driver.refcount		= &serial_refcount;
+	serial_tty_driver.table			= serial_tty;
+	serial_tty_driver.termios		= serial_termios;
+	serial_tty_driver.termios_locked	= serial_termios_locked;
+	
+	serial_tty_driver.open			= serial_open;
+	serial_tty_driver.close			= serial_close;
+	serial_tty_driver.write			= serial_write;
+	serial_tty_driver.put_char		= serial_put_char;
+	serial_tty_driver.flush_chars		= NULL; //serial_flush_chars;
+	serial_tty_driver.write_room		= serial_write_room;
+	serial_tty_driver.ioctl			= NULL; //serial_ioctl;
+	serial_tty_driver.set_termios		= NULL; //serial_set_termios;
+	serial_tty_driver.set_ldisc		= NULL; 
+	serial_tty_driver.throttle		= serial_throttle;
+	serial_tty_driver.unthrottle		= serial_unthrottle;
+	serial_tty_driver.stop			= NULL; //serial_stop;
+	serial_tty_driver.start			= NULL; //serial_start;
+	serial_tty_driver.hangup		= NULL; //serial_hangup;
+	serial_tty_driver.break_ctl		= NULL; //serial_break;
+	serial_tty_driver.wait_until_sent	= NULL; //serial_wait_until_sent;
+	serial_tty_driver.send_xchar		= NULL; //serial_send_xchar;
+	serial_tty_driver.read_proc		= NULL; //serial_read_proc;
+	serial_tty_driver.chars_in_buffer	= serial_chars_in_buffer;
+	serial_tty_driver.flush_buffer		= NULL; //serial_flush_buffer;
+	if (tty_register_driver (&serial_tty_driver)) {
+		printk( "USB Serial: failed to register tty driver\n" );
+		return -EPERM;
+	}
+	
+	/* register the USB driver */
+	usb_register(&usb_serial_driver);
+	printk(KERN_INFO "USB Serial support registered.\n");
+	return 0;
+}
+
+
+#ifdef MODULE
+int init_module(void)
+{
+	return usb_serial_init();
+}
+
+void cleanup_module(void)
+{
+	tty_unregister_driver(&serial_tty_driver);
+	usb_deregister(&usb_serial_driver);
+}
+
+#endif
+
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/usb.c linux/drivers/usb/usb.c
--- v2.3.21/linux/drivers/usb/usb.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/usb.c	Thu Oct 14 14:59:46 1999
@@ -31,18 +31,24 @@
 static void usb_check_support(struct usb_device *);
 static void usb_driver_purge(struct usb_driver *, struct usb_device *);
 
-
 /*
  * We have a per-interface "registered driver" list.
  */
 static LIST_HEAD(usb_driver_list);
 static LIST_HEAD(usb_bus_list);
 
+static struct usb_driver *usb_minors[16];
+
 int usb_register(struct usb_driver *new_driver)
 {
 	struct list_head *tmp;
 
 	printk("usbcore: Registering new driver %s\n", new_driver->name);
+	if (new_driver->fops != NULL) {
+		if (usb_minors[new_driver->minor/16])
+			BUG();
+		usb_minors[new_driver->minor/16] = new_driver;
+	}
 
 	/* Add it to the list of known drivers */
 	list_add(&new_driver->driver_list, &usb_driver_list);
@@ -69,6 +75,8 @@
 	struct list_head *tmp;
 
 	printk("usbcore: Deregistering driver %s\n", driver->name);
+	if (driver->fops != NULL)
+		usb_minors[driver->minor/16] = NULL;
 
 	/*
 	 * first we remove the driver, to be sure it doesn't get used by
@@ -1131,9 +1139,9 @@
 
         dr.requesttype = requesttype;
         dr.request = request;
-        dr.value = cpu_to_le16p(&value);
-        dr.index = cpu_to_le16p(&index);
-        dr.length = cpu_to_le16p(&size);
+        dr.value = value;
+        dr.index = index;
+        dr.length = size;
 
         return dev->bus->op->control_msg(dev, pipe, &dr, data, size, timeout);
 }
@@ -1152,7 +1160,7 @@
 	if (check_bandwidth_alloc (dev->bus->bandwidth_allocated, bustime))
 		return (USB_ST_BANDWIDTH_ERROR);
 
-	ret = dev->bus->op->request_irq(dev, pipe, handler, period, dev_id, handle);
+	ret = dev->bus->op->request_irq(dev, pipe, handler, period, dev_id, handle, bustime);
 
 	/* Claim the USB bandwidth if no error. */
 	if (!ret) {
@@ -1177,6 +1185,21 @@
 	return dev->bus->op->terminate_bulk(dev, first);
 }
 
+/*
+ * usb_release_bandwidth():
+ *
+ * called to release an interrupt pipe's bandwidth (in microseconds)
+ */
+void usb_release_bandwidth(struct usb_device *dev, int bw_alloc)
+{
+	dev->bus->bandwidth_allocated -= bw_alloc;
+	dev->bus->bandwidth_int_reqs--;
+	PRINTD ("bw_alloc reduced to %d for %d requesters",
+		dev->bus->bandwidth_allocated,
+		dev->bus->bandwidth_int_reqs +
+		dev->bus->bandwidth_isoc_reqs);
+}
+
 int usb_release_irq(struct usb_device *dev, void *handle, unsigned int pipe)
 {
 	long    bustime;
@@ -1188,13 +1211,8 @@
 	if (!err) {
 		bustime = calc_bus_time (usb_pipeslow(pipe), usb_pipein(pipe), 0,
 				usb_maxpacket(dev, pipe, usb_pipeout(pipe)));
-		bustime = NS_TO_US(bustime);
-		dev->bus->bandwidth_allocated -= bustime;
-		dev->bus->bandwidth_int_reqs--;
-		PRINTD ("bw_alloc reduced to %d for %d requesters",
-			dev->bus->bandwidth_allocated,
-			dev->bus->bandwidth_int_reqs +
-			dev->bus->bandwidth_isoc_reqs);
+		bustime = NS_TO_US(bustime);	/* work in microseconds */
+		usb_release_bandwidth(dev, bustime);
 	}
 
 	return err;
@@ -1276,6 +1294,41 @@
 	return isocdesc->usb_dev->bus->op->kill_isoc (isocdesc);
 }
 
+static int usb_open(struct inode * inode, struct file * file)
+{
+	int minor = MINOR(inode->i_rdev);
+	struct usb_driver *c = usb_minors[minor/16];
+	file->f_op = NULL;
+
+	if ((file->f_op = c->fops) && file->f_op->open)
+		return file->f_op->open(inode,file);
+	else
+		return -ENODEV;
+}
+
+static struct file_operations usb_fops = {
+        NULL,		/* seek */
+	NULL,		/* read */
+	NULL,		/* write */
+	NULL,		/* readdir */
+	NULL,		/* poll */
+	NULL,		/* ioctl */
+	NULL,		/* mmap */
+        usb_open,
+	NULL,		/* flush */
+        NULL		/* release */
+};
+
+void usb_major_init(void)
+{
+	if (register_chrdev(180,"usb",&usb_fops)) {
+		printk("unable to get major %d for usb devices\n",
+		       MISC_MAJOR);
+		return -EIO;
+	}
+}
+
+
 #ifdef CONFIG_PROC_FS
 struct list_head *usb_driver_get_list(void)
 {
@@ -1308,6 +1361,7 @@
 EXPORT_SYMBOL(usb_new_device);
 EXPORT_SYMBOL(usb_connect);
 EXPORT_SYMBOL(usb_disconnect);
+EXPORT_SYMBOL(usb_release_bandwidth);
 
 EXPORT_SYMBOL(usb_set_address);
 EXPORT_SYMBOL(usb_get_descriptor);
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/usb.h linux/drivers/usb/usb.h
--- v2.3.21/linux/drivers/usb/usb.h	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/usb.h	Thu Oct 14 14:59:46 1999
@@ -351,6 +351,9 @@
 	void (*disconnect)(struct usb_device *);
 
 	struct list_head driver_list;
+
+	struct file_operations *fops;
+	int minor;
 };
 
 /*
@@ -455,7 +458,7 @@
 	int (*deallocate)(struct usb_device *);
 	int (*control_msg)(struct usb_device *, unsigned int, devrequest *, void *, int, int);
 	int (*bulk_msg)(struct usb_device *, unsigned int, void *, int, unsigned long *, int);
-	int (*request_irq)(struct usb_device *, unsigned int, usb_device_irq, int, void *, void **);
+	int (*request_irq)(struct usb_device *, unsigned int, usb_device_irq, int, void *, void **, long);
 	int (*release_irq)(struct usb_device *, void *);
 	void *(*request_bulk)(struct usb_device *, unsigned int, usb_device_irq,
  void *, int, void *);
@@ -548,6 +551,7 @@
 extern void usb_free_dev(struct usb_device *);
 extern void usb_inc_dev_use(struct usb_device *);
 #define usb_dec_dev_use usb_free_dev
+extern void usb_release_bandwidth(struct usb_device *, int);
 
 extern int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout);
 
@@ -611,6 +615,11 @@
  * appropriately.
  */
 
+#define PIPE_ISOCHRONOUS		0
+#define PIPE_INTERRUPT			1
+#define PIPE_CONTROL			2
+#define PIPE_BULK			3
+
 #define usb_maxpacket(dev, pipe, out)	(out \
 				? (dev)->epmaxpacketout[usb_pipeendpoint(pipe)] \
 				: (dev)->epmaxpacketin [usb_pipeendpoint(pipe)] )
@@ -624,10 +633,10 @@
 #define usb_pipedata(pipe)	(((pipe) >> 19) & 1)
 #define usb_pipeslow(pipe)	(((pipe) >> 26) & 1)
 #define usb_pipetype(pipe)	(((pipe) >> 30) & 3)
-#define usb_pipeisoc(pipe)	(usb_pipetype((pipe)) == 0)
-#define usb_pipeint(pipe)	(usb_pipetype((pipe)) == 1)
-#define usb_pipecontrol(pipe)	(usb_pipetype((pipe)) == 2)
-#define usb_pipebulk(pipe)	(usb_pipetype((pipe)) == 3)
+#define usb_pipeisoc(pipe)	(usb_pipetype((pipe)) == PIPE_ISOCHRONOUS)
+#define usb_pipeint(pipe)	(usb_pipetype((pipe)) == PIPE_INTERRUPT)
+#define usb_pipecontrol(pipe)	(usb_pipetype((pipe)) == PIPE_CONTROL)
+#define usb_pipebulk(pipe)	(usb_pipetype((pipe)) == PIPE_BULK)
 
 #define PIPE_DEVEP_MASK		0x0007ff00
 
@@ -653,14 +662,14 @@
 }
 
 /* Create various pipes... */
-#define usb_sndctrlpipe(dev,endpoint)	((2 << 30) | __create_pipe(dev,endpoint))
-#define usb_rcvctrlpipe(dev,endpoint)	((2 << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
-#define usb_sndisocpipe(dev,endpoint)	((0 << 30) | __create_pipe(dev,endpoint))
-#define usb_rcvisocpipe(dev,endpoint)	((0 << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
-#define usb_sndbulkpipe(dev,endpoint)	((3 << 30) | __create_pipe(dev,endpoint))
-#define usb_rcvbulkpipe(dev,endpoint)	((3 << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
-#define usb_snddefctrl(dev)		((2 << 30) | __default_pipe(dev))
-#define usb_rcvdefctrl(dev)		((2 << 30) | __default_pipe(dev) | USB_DIR_IN)
+#define usb_sndctrlpipe(dev,endpoint)	((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint))
+#define usb_rcvctrlpipe(dev,endpoint)	((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
+#define usb_sndisocpipe(dev,endpoint)	((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint))
+#define usb_rcvisocpipe(dev,endpoint)	((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
+#define usb_sndbulkpipe(dev,endpoint)	((PIPE_BULK << 30) | __create_pipe(dev,endpoint))
+#define usb_rcvbulkpipe(dev,endpoint)	((PIPE_BULK << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
+#define usb_snddefctrl(dev)		((PIPE_CONTROL << 30) | __default_pipe(dev))
+#define usb_rcvdefctrl(dev)		((PIPE_CONTROL << 30) | __default_pipe(dev) | USB_DIR_IN)
 
 /*
  * Send and receive control messages..
@@ -739,4 +748,3 @@
 #endif  /* __KERNEL__ */
 
 #endif
-
diff -u --recursive --new-file v2.3.21/linux/drivers/usb/usb_scsi.c linux/drivers/usb/usb_scsi.c
--- v2.3.21/linux/drivers/usb/usb_scsi.c	Sat Oct  9 11:47:50 1999
+++ linux/drivers/usb/usb_scsi.c	Thu Oct 14 14:59:46 1999
@@ -3,7 +3,7 @@
  * 
  * (C) Michael Gee (michael@linuxspecific.com) 1999
  *
- * This driver is scitzoid  - it makes a USB device appear as both a SCSI device
+ * This driver is schizoid  - it makes a USB device appear as both a SCSI device
  * and a character device. The latter is only available if the device has an
  * interrupt endpoint, and is used specifically to receive interrupt events.
  *
@@ -21,7 +21,7 @@
  *	Also, for certain devices, the interrupt endpoint is used to convey
  *	status of a command.
  *
- *	Basically, this stuff is WIERD!!
+ *	Basically, this stuff is WEIRD!!
  *
  */
 
@@ -64,7 +64,7 @@
 int usbscsi_debug = 1;
 
 struct us_data {
-	struct us_data	*next;			/* next device */
+	struct us_data		*next;			/* next device */
 	struct usb_device 	*pusb_dev;
 	struct usb_scsi_filter  *filter;		/* filter driver */
 	void 			*fdata;			/* filter data */
@@ -140,7 +140,7 @@
 	this_xfer = length > max_size ? max_size : length;
 	length -= this_xfer;
 	do {
-	    /*US_DEBUGP("Bulk xfer %x(%d)\n", (unsigned int)buf, this_xfer);*/
+	    /* US_DEBUGP("Bulk xfer %x(%d)\n", (unsigned int)buf, this_xfer); */
 	    result = us->pusb_dev->bus->op->bulk_msg(us->pusb_dev, pipe, buf, 
 						    this_xfer, &partial, HZ*5);
 
@@ -149,9 +149,9 @@
 			  result, partial, this_xfer);
 
 	    if (result == USB_ST_STALL) {
-		US_DEBUGP("clearing endpoing halt for pipe %x\n", pipe);
+		US_DEBUGP("clearing endpoint halt for pipe %x\n", pipe);
 		usb_clear_halt(us->pusb_dev,
-			       usb_pipeendpoint(pipe) | (pipe & 0x80));
+			       usb_pipeendpoint(pipe) | (pipe & USB_DIR_IN));
 	    }
 
 	    /* we want to retry if the device reported NAK */
@@ -179,8 +179,8 @@
 	    return result;
 	buf += this_xfer;
     }
-    return 0;
 
+    return 0;
 }
 
 static int us_transfer(Scsi_Cmnd *srb, int dir_in)
@@ -238,7 +238,6 @@
     }
     else
 	return srb->request_bufflen;
-
 }
 
 static int pop_CBI_irq(int state, void *buffer, int len, void *dev_id)
@@ -254,36 +253,31 @@
 	wake_up(&us->ip_waitq);
     }
 
-    /* we dont want another interrupt */
-
+    /* we don't want another interrupt */
     return 0;
 }
 
 static int pop_CB_reset(struct us_data *us)
 {
     unsigned char cmd[12];
-    devrequest dr;
+    int result;
 
     US_DEBUGP("pop_CB_reset\n");
-    dr.requesttype = USB_TYPE_CLASS | USB_RT_INTERFACE;
-    dr.request = US_CBI_ADSC;
-    dr.value = 0;
-    dr.index = us->pusb_dev->ifnum;
-    dr.length = 12;
+
     memset(cmd, -1, sizeof(cmd));
     cmd[0] = SEND_DIAGNOSTIC;
     cmd[1] = 4;
-    us->pusb_dev->bus->op->control_msg(us->pusb_dev, 
-					usb_sndctrlpipe(us->pusb_dev,0),
-					&dr, cmd, 12, HZ);
+    result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0),
+			US_CBI_ADSC, USB_TYPE_CLASS | USB_RT_INTERFACE,
+			0, us->pusb_dev->ifnum, cmd, sizeof(cmd), HZ*5);
 
     /* long wait for reset */
 
-    schedule_timeout(HZ*5);
+    schedule_timeout(HZ*6);
 
     US_DEBUGP("pop_CB_reset: clearing endpoint halt\n");
-    usb_clear_halt(us->pusb_dev, us->ep_in | 0x80);
-    usb_clear_halt(us->pusb_dev, us->ep_out);
+    usb_clear_halt(us->pusb_dev, us->ep_in | USB_DIR_IN);
+    usb_clear_halt(us->pusb_dev, us->ep_out | USB_DIR_OUT);
 
     US_DEBUGP("pop_CB_reset done\n");
     return 0;
@@ -292,21 +286,14 @@
 static int pop_CB_command(Scsi_Cmnd *srb)
 {
     struct us_data *us = (struct us_data *)srb->host_scribble;
-    devrequest dr;
     unsigned char cmd[16];
     int result;
     int retry = 5;
     int done_start = 0;
 
     while (retry--) {
-	dr.requesttype = USB_TYPE_CLASS | USB_RT_INTERFACE;
-	dr.request = US_CBI_ADSC;
-	dr.value = 0;
-	dr.index = us->pusb_dev->ifnum;
-	dr.length = srb->cmd_len;
-    
+
 	if (us->flags & US_FL_FIXED_COMMAND) {
-	    dr.length = us->fixedlength;
 	    memset(cmd, 0, us->fixedlength);
 
 	    /* fix some commands */
@@ -335,9 +322,10 @@
 		memcpy(cmd, srb->cmnd, srb->cmd_len);
 		break;
 	    }
-	    result = us->pusb_dev->bus->op->control_msg(us->pusb_dev, 
-						  usb_sndctrlpipe(us->pusb_dev,0),
-						  &dr, cmd, us->fixedlength, HZ);
+	    result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0),
+				US_CBI_ADSC, USB_TYPE_CLASS | USB_RT_INTERFACE,
+				0, us->pusb_dev->ifnum,
+				cmd, us->fixedlength, HZ*5);
 	    if (!done_start && (us->subclass == US_SC_UFI /*|| us->subclass == US_SC_8070*/)
 		 && cmd[0] == TEST_UNIT_READY && result) {
 		/* as per spec try a start command, wait and retry */
@@ -346,20 +334,24 @@
 		memset(cmd, 0, sizeof(cmd));
 		cmd[0] = START_STOP;
 		cmd[4] = 1;		/* start */
-		result = us->pusb_dev->bus->op->control_msg(us->pusb_dev, 
-						      usb_sndctrlpipe(us->pusb_dev,0),
-						      &dr, cmd, us->fixedlength, HZ);
+		result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0),
+				US_CBI_ADSC, USB_TYPE_CLASS | USB_RT_INTERFACE,
+				0, us->pusb_dev->ifnum,
+				cmd, us->fixedlength, HZ*5);
 		wait_ms(100);
 		retry++;
 		continue;
 	    }
-	} else
-	    result = us->pusb_dev->bus->op->control_msg(us->pusb_dev, 
-						  usb_sndctrlpipe(us->pusb_dev,0),
-						  &dr, srb->cmnd, srb->cmd_len, HZ);
+	} else {
+	    result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0),
+				US_CBI_ADSC, USB_TYPE_CLASS | USB_RT_INTERFACE,
+				0, us->pusb_dev->ifnum,
+	    			srb->cmnd, srb->cmd_len, HZ*5);
+	}
 	if (/*result != USB_ST_STALL &&*/ result != USB_ST_TIMEOUT)
 	    return result;
     }
+
     return result;
 }
 
@@ -372,7 +364,6 @@
     struct us_data *us = (struct us_data *)srb->host_scribble;
     int result;
     __u8 status[2];
-    devrequest dr;
     int retry = 5;
 
     US_DEBUGP("pop_CB_status, proto=%x\n", us->protocol);
@@ -381,14 +372,10 @@
 	/* get from control */
 
 	while (retry--) {
-	    dr.requesttype = USB_DIR_IN | USB_TYPE_STANDARD | USB_RT_DEVICE;
-	    dr.request = USB_REQ_GET_STATUS;
-	    dr.index = 0;
-	    dr.value = 0;
-	    dr.length = 2;
-	    result = us->pusb_dev->bus->op->control_msg(us->pusb_dev, 
-						  usb_rcvctrlpipe(us->pusb_dev,0),
-						  &dr, status, sizeof(status), HZ);
+	    result = usb_control_msg(us->pusb_dev, usb_rcvctrlpipe(us->pusb_dev,0),
+	    			USB_REQ_GET_STATUS, USB_DIR_IN | USB_TYPE_STANDARD | USB_RT_DEVICE,
+				0, 0,
+				status, sizeof(status), HZ*5);
 	    if (result != USB_ST_TIMEOUT)
 		break;
 	}
@@ -410,11 +397,11 @@
 	/* add interrupt transfer, marked for removal */
 	us->ip_wanted = 1;
 	us->irqpipe = usb_rcvctrlpipe(us->pusb_dev, us->ep_int);
-	result = us->pusb_dev->bus->op->request_irq(us->pusb_dev, us->irqpipe,
-						pop_CBI_irq, 0,
-						(void *)us, &us->irq_handle);
+	result = usb_request_irq(us->pusb_dev, us->irqpipe, pop_CBI_irq,
+				0, (void *)us, &us->irq_handle);
 	if (result) {
-	    US_DEBUGP("usb_scsi: usb_request_irq failed (0x%x), No interrupt for CBI\n", result);
+	    US_DEBUGP("usb_request_irq failed (0x%x), No interrupt for CBI\n",
+		result);
 	    return DID_ABORT << 16;
 	}
 
@@ -468,7 +455,7 @@
     if (us_transfer_length(srb)) {
 	result = us_transfer(srb, US_DIRECTION(srb->cmnd[0]));
 	if (result && result != USB_ST_DATAUNDERRUN && result != USB_ST_STALL) {
-	    US_DEBUGP("CBI  transfer %x\n", result);
+	    US_DEBUGP("CBI transfer %x\n", result);
 	    return DID_ERROR << 16;
 	}
 #if 0
@@ -483,33 +470,29 @@
     }
 
     /* get status */
-
     return pop_CB_status(srb);
 }
 
 static int pop_Bulk_reset(struct us_data *us)
 {
-    devrequest dr;
     int result;
 
-    dr.requesttype = USB_TYPE_CLASS | USB_RT_INTERFACE;
-    dr.request = US_BULK_RESET;
-    dr.value = US_BULK_RESET_HARD;
-    dr.index = 0;
-    dr.length = 0;
-
-    result = us->pusb_dev->bus->op->control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), &dr, NULL, 0, HZ);
+    result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0),
+			US_BULK_RESET, USB_TYPE_CLASS | USB_RT_INTERFACE,
+			US_BULK_RESET_HARD, 0,
+			NULL, 0, HZ*5);
     if (result)
 	US_DEBUGP("Bulk hard reset failed %d\n", result);
-    usb_clear_halt(us->pusb_dev, us->ep_in | 0x80);
-    usb_clear_halt(us->pusb_dev, us->ep_out);
+    usb_clear_halt(us->pusb_dev, us->ep_in | USB_DIR_IN);
+    usb_clear_halt(us->pusb_dev, us->ep_out | USB_DIR_OUT);
 
     /* long wait for reset */
 
-    schedule_timeout(HZ*5);
+    schedule_timeout(HZ*6);
 
     return result;
 }
+
 /*
  * The bulk only protocol handler.
  * 	Uses the in and out endpoints to transfer commands and data (nasty)
@@ -540,8 +523,9 @@
 
     /* send it to out endpoint */
 
-    US_DEBUGP("Bulk command S %x T %x L %d F %d CL %d\n", bcb.Signature,
-	      bcb.Tag, bcb.DataTransferLength, bcb.Flags, bcb.Length);
+    US_DEBUGP("Bulk command S %x T %x L %d F %d CL %d\n",
+		bcb.Signature, bcb.Tag, bcb.DataTransferLength,
+		bcb.Flags, bcb.Length);
     result = us->pusb_dev->bus->op->bulk_msg(us->pusb_dev,
 		     usb_sndbulkpipe(us->pusb_dev, us->ep_out), &bcb, 
 					    US_BULK_CB_WRAP_LEN, &partial, HZ*5);
@@ -563,7 +547,6 @@
 
     /* get status */
 
-
     stall = 0;
     do {
 	result = us->pusb_dev->bus->op->bulk_msg(us->pusb_dev,
@@ -581,8 +564,8 @@
 
     /* check bulk status */
 
-    US_DEBUGP("Bulk status S %x T %x R %d V %x\n", bcs.Signature, bcs.Tag,
-	      bcs.Residue, bcs.Status);
+    US_DEBUGP("Bulk status S %x T %x R %d V %x\n",
+		bcs.Signature, bcs.Tag, bcs.Residue, bcs.Status);
     if (bcs.Signature != US_BULK_CS_SIGN || bcs.Tag != bcb.Tag ||
 	bcs.Status > US_BULK_STAT_PHASE) {
 	US_DEBUGP("Bulk logical error\n");
@@ -602,8 +585,8 @@
     case US_BULK_STAT_PHASE:
 	return DID_ERROR << 16;
     }
-    return (DID_OK << 16) | 2;		/* check sense required */
 
+    return (DID_OK << 16) | 2;		/* check sense required */
 }
 
 /* Host functions */
@@ -660,7 +643,7 @@
 
     /* FIXME - leaves hanging host template copy */
     /* (because scsi layer uses it after removal !!!) */
-    while(prev->next != us)
+    while (prev->next != us)
 	prev = prev->next;
     prev->next = us->next;
     return 0;
@@ -713,7 +696,6 @@
     return 0;
 }
 
-
 #undef SPRINTF
 #define SPRINTF(args...) { if (pos < (buffer + length)) pos += sprintf (pos, ## args); }
 
@@ -863,10 +845,11 @@
 	    us->action = 0;
 
 	    switch (action) {
-	    case US_ACT_COMMAND       :
+	    case US_ACT_COMMAND:
 		if (us->srb->target || us->srb->lun) {
 		    /* bad device */
-		    US_DEBUGP( "Bad device number (%d/%d) or dev %x\n", us->srb->target, us->srb->lun, (unsigned int)us->pusb_dev);
+		    US_DEBUGP( "Bad device number (%d/%d) or dev %x\n",
+			us->srb->target, us->srb->lun, (unsigned int)us->pusb_dev);
 		    us->srb->result = DID_BAD_TARGET << 16;
 		} else if (!us->pusb_dev) {
 
@@ -934,7 +917,7 @@
 
 			default:
 			    break;
-			}
+			} /* end switch on cmnd[0] */
 		        us->srb->result = us->pop(us->srb);
 
 			if (savelen != us->srb->request_bufflen &&
@@ -971,9 +954,10 @@
 				us->srb->cmnd[7] = length >> 8;
 				us->srb->cmnd[8] = length;
 				break;
-			    }
+			    } /* end switch on cmnd[0] */
 
-			    US_DEBUGP("Old/New length = %d/%d\n", savelen, length);
+			    US_DEBUGP("Old/New length = %d/%d\n",
+				savelen, length);
 
 			    if (us->srb->request_bufflen != length) {
 			        US_DEBUGP("redoing cmd with len=%d\n", length);
@@ -1004,7 +988,7 @@
 				us->srb->cmnd[7] = saveallocation >> 8;
 				us->srb->cmnd[8] = saveallocation;
 				break;
-			    }
+			    } /* end switch on cmnd[0] */
 			}
 			/* force attention on first command */
 			if (!us->attention_done) {
@@ -1032,31 +1016,31 @@
 		us->srb = NULL;
 		break;
 
-	    case US_ACT_ABORT         :
+	    case US_ACT_ABORT:
 		break;
 
-	    case US_ACT_DEVICE_RESET  :
+	    case US_ACT_DEVICE_RESET:
 		break;
 
-	    case US_ACT_BUS_RESET     :
+	    case US_ACT_BUS_RESET:
 		break;
 
-	    case US_ACT_HOST_RESET    :
+	    case US_ACT_HOST_RESET:
 		break;
 
-	    }
+	    } /* end switch on action */
 
-	    if(signal_pending(current)) {
+	    if (signal_pending(current)) {
 		    /* sending SIGUSR1 makes us print out some info */
 		    spin_lock_irq(&current->sigmask_lock);
 		    signr = dequeue_signal(&current->blocked, &info);
 		    spin_unlock_irq(&current->sigmask_lock);
 
 		    if (signr == SIGUSR2) {
-			    printk("USBSCSI debug toggle\n");
 			    usbscsi_debug = !usbscsi_debug;
+			    printk(USB_SCSI "debug toggle = %d\n", usbscsi_debug);
 		    } else {
-			    break;
+			    break;	/* exit the loop on any other signal */
 		    }
 	    }
     }
@@ -1114,7 +1098,8 @@
 	    protocol = US_PR_CB;
 	    subclass = US_SC_8070;	/* an assumption */
 	} else if (dev->descriptor.bDeviceClass != 0 ||
-	    dev->config[0].interface[0].altsetting[0].bInterfaceClass != 8 ||
+	    dev->config[0].interface[0].altsetting[0].bInterfaceClass !=
+		USB_CLASS_MASS_STORAGE ||
 	    dev->config[0].interface[0].altsetting[0].bInterfaceSubClass < US_SC_MIN ||
 	    dev->config[0].interface[0].altsetting[0].bInterfaceSubClass > US_SC_MAX) {
 	    return -1;
@@ -1132,7 +1117,8 @@
 	}
 	for (ss = us_list; ss; ss = ss->next) {
 	    if (!ss->pusb_dev && GUID_EQUAL(guid, ss->guid))	{
-		US_DEBUGP("Found existing GUID " GUID_FORMAT "\n", GUID_ARGS(guid));
+		US_DEBUGP("Found existing GUID " GUID_FORMAT "\n",
+			GUID_ARGS(guid));
 		flags = ss->flags;
 		break;
 	    }
@@ -1192,16 +1178,22 @@
      */
 
     for (i = 0; i < interface->bNumEndpoints; i++) { 
-	    if (interface->endpoint[i].bmAttributes == 0x02) {
+	    if ((interface->endpoint[i].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
+			== USB_ENDPOINT_XFER_BULK) {
 		    if (interface->endpoint[i].bEndpointAddress & USB_DIR_IN)
-			    ss->ep_in = interface->endpoint[i].bEndpointAddress & 0x0f;
+			    ss->ep_in = interface->endpoint[i].bEndpointAddress &
+				USB_ENDPOINT_NUMBER_MASK;
 		    else
-			    ss->ep_out = interface->endpoint[i].bEndpointAddress & 0x0f;
-	    } else if (interface->endpoint[i].bmAttributes == 0x03) {
-		    ss->ep_int = interface->endpoint[i].bEndpointAddress & 0x0f;
+			    ss->ep_out = interface->endpoint[i].bEndpointAddress &
+				USB_ENDPOINT_NUMBER_MASK;
+	    } else if ((interface->endpoint[i].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
+			== USB_ENDPOINT_XFER_INT) {
+		    ss->ep_int = interface->endpoint[i].bEndpointAddress &
+				USB_ENDPOINT_NUMBER_MASK;
 	    }
     }
-    US_DEBUGP("Endpoints In %d Out %d Int %d\n", ss->ep_in, ss->ep_out, ss->ep_int);
+    US_DEBUGP("Endpoints In %d Out %d Int %d\n",
+		ss->ep_in, ss->ep_out, ss->ep_int);
 
     /* exit if strange looking */
 
@@ -1221,9 +1213,11 @@
     }
 
     if (dev->config[0].iConfiguration && usb_string(dev, dev->config[0].iConfiguration))
-	US_DEBUGP("Configuration %s\n", usb_string(dev, dev->config[0].iConfiguration));
+	US_DEBUGP("Configuration %s\n",
+		usb_string(dev, dev->config[0].iConfiguration));
     if (interface->iInterface && usb_string(dev, interface->iInterface))
-	US_DEBUGP("Interface %s\n", usb_string(dev, interface->iInterface));
+	US_DEBUGP("Interface %s\n",
+		usb_string(dev, interface->iInterface));
 
     ss->pusb_dev = dev;
 
@@ -1284,31 +1278,26 @@
 
 	if (dev->descriptor.idVendor == 0x04e6 &&
 	    dev->descriptor.idProduct == 0x0001) {
-	    devrequest dr;
 	    __u8 qstat[2];
 	    int result;
 
 	    /* shuttle E-USB */
-	    dr.requesttype = 0xC0;
-	    dr.request = 1;
-	    dr.index = 0;
-	    dr.value = 0;
-	    dr.length = 0;
-	    ss->pusb_dev->bus->op->control_msg(ss->pusb_dev, usb_rcvctrlpipe(dev,0), &dr, qstat, 2, HZ);
+	    result = usb_control_msg(ss->pusb_dev, usb_rcvctrlpipe(dev,0),
+			1, 0xC0,
+			0, 0,
+			qstat, 2, HZ*5);
 	    US_DEBUGP("C0 status %x %x\n", qstat[0], qstat[1]);
 	    init_waitqueue_head(&ss->ip_waitq);
 	    ss->irqpipe = usb_rcvctrlpipe(ss->pusb_dev, ss->ep_int);
-	    result = ss->pusb_dev->bus->op->request_irq(ss->pusb_dev, ss->irqpipe,
-						pop_CBI_irq, 0,
-						(void *)ss, &ss->irq_handle);
+	    result = usb_request_irq(ss->pusb_dev, ss->irqpipe, pop_CBI_irq,
+				0, (void *)ss, &ss->irq_handle);
 	    if (result)
 	    	return -1;
-	    interruptible_sleep_on_timeout(&ss->ip_waitq, HZ*5);
+	    interruptible_sleep_on_timeout(&ss->ip_waitq, HZ*6);
 
 	} else if (ss->protocol == US_PR_CBI)
 	    init_waitqueue_head(&ss->ip_waitq);
 
-
 	/* start up our thread */
 
 	{
@@ -1343,10 +1332,8 @@
 	while (prev->next)
 	    prev = prev->next;
 	prev->next = ss;
-
     }
 
-
     printk(KERN_INFO "USB SCSI device found at address %d\n", dev->devnum);
 
     dev->private = ss;
@@ -1368,20 +1355,20 @@
 
 int usb_scsi_init(void)
 {
-
 	MOD_INC_USE_COUNT;
+
 #ifdef CONFIG_USB_HP4100
 	hp4100_init();
 #endif
 #ifdef CONFIG_USB_ZIP
 	usb_zip_init();
 #endif
+
 	usb_register(&scsi_driver);
 	printk(KERN_INFO "USB SCSI support registered.\n");
 	return 0;
 }
 
-
 int usb_scsi_register(struct usb_scsi_filter *filter)
 {
 	struct usb_scsi_filter *prev = (struct usb_scsi_filter *)&filters;
@@ -1405,7 +1392,6 @@
 #ifdef MODULE
 int init_module(void)
 {
-
 	return usb_scsi_init();
 }
 
diff -u --recursive --new-file v2.3.21/linux/fs/Config.in linux/fs/Config.in
--- v2.3.21/linux/fs/Config.in	Sat Oct  9 11:47:50 1999
+++ linux/fs/Config.in	Fri Oct 15 11:49:37 1999
@@ -4,15 +4,15 @@
 mainmenu_option next_comment
 comment 'Filesystems'
 
-bool	 'Quota support' CONFIG_QUOTA
+bool 'Quota support' CONFIG_QUOTA
 tristate 'Kernel automounter support' CONFIG_AUTOFS_FS
 
 
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'ADFS filesystem support (read only) (EXPERIMENTAL)' CONFIG_ADFS_FS
+   tristate 'ADFS filesystem support (read only) (EXPERIMENTAL)' CONFIG_ADFS_FS
 fi
 tristate 'Amiga FFS filesystem support' CONFIG_AFFS_FS
-tristate 'Apple Macintosh filesystem support (experimental)' CONFIG_HFS_FS
+tristate 'Apple Macintosh filesystem support (EXPERIMENTAL)' CONFIG_HFS_FS
 # msdos filesystems
 tristate 'DOS FAT fs support' CONFIG_FAT_FS
 dep_tristate '  MSDOS fs support' CONFIG_MSDOS_FS $CONFIG_FAT_FS
@@ -20,51 +20,51 @@
 dep_tristate '  VFAT (Windows-95) fs support' CONFIG_VFAT_FS $CONFIG_FAT_FS
 
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'EFS filesystem support (read only) (experimental)' CONFIG_EFS_FS
+   tristate 'EFS filesystem support (read only) (EXPERIMENTAL)' CONFIG_EFS_FS
 fi
 
 tristate 'ISO 9660 CDROM filesystem support' CONFIG_ISO9660_FS
 if [ "$CONFIG_ISO9660_FS" != "n" ]; then
-  bool 'Microsoft Joliet CDROM extensions' CONFIG_JOLIET
+   bool '  Microsoft Joliet CDROM extensions' CONFIG_JOLIET
 else
-  # needed by nls/Config.in
-  define_bool CONFIG_JOLIET n
+   # needed by nls/Config.in
+   define_bool CONFIG_JOLIET n
 fi
 
-tristate 'UDF filesystem support' CONFIG_UDF_FS
+tristate 'UDF filesystem support (read only)' CONFIG_UDF_FS
 if [ "$CONFIG_UDF_FS" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  bool '   UDF read-write support (EXPERIMENTAL)' CONFIG_UDF_RW
+   bool '  UDF write support (DANGEROUS)' CONFIG_UDF_RW
 fi
 
 tristate 'Minix fs support' CONFIG_MINIX_FS
 tristate 'NTFS filesystem support (read only)' CONFIG_NTFS_FS
 if [ "$CONFIG_NTFS_FS" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  bool '   NTFS read-write support (DANGEROUS)' CONFIG_NTFS_RW
+   bool '  NTFS write support (DANGEROUS)' CONFIG_NTFS_RW
 fi
-tristate 'OS/2 HPFS filesystem support (read/write) (NEW)' CONFIG_HPFS_FS
+tristate 'OS/2 HPFS filesystem support' CONFIG_HPFS_FS
 bool '/proc filesystem support' CONFIG_PROC_FS
 if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then
-  # It compiles as a module for testing only.  It should not be used
-  # as a module in general.  If we make this "tristate", a bunch of people
-  # who don't know what they are doing turn it on and complain when it
-  # breaks.
-  bool '/dev/pts filesystem for Unix98 PTYs' CONFIG_DEVPTS_FS
+   # It compiles as a module for testing only.  It should not be used
+   # as a module in general.  If we make this "tristate", a bunch of people
+   # who don't know what they are doing turn it on and complain when it
+   # breaks.
+   bool '/dev/pts filesystem for Unix98 PTYs' CONFIG_DEVPTS_FS
 fi
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'QNX filesystem support (EXPERIMENTAL)' CONFIG_QNX4FS_FS
-  if [ "$CONFIG_QNX4FS_FS" != "n" ]; then
-    bool '   QNXFS read-write support (FOR TESTING ONLY)' CONFIG_QNX4FS_RW
-  fi    
+   tristate 'QNX filesystem support (read only) (EXPERIMENTAL)' CONFIG_QNX4FS_FS
+   if [ "$CONFIG_QNX4FS_FS" != "n" ]; then
+      bool '  QNXFS write support (DANGEROUS)' CONFIG_QNX4FS_RW
+   fi    
 fi
 tristate 'ROM filesystem support' CONFIG_ROMFS_FS
 tristate 'Second extended fs support' CONFIG_EXT2_FS
 tristate 'System V and Coherent filesystem support' CONFIG_SYSV_FS
 if [ "$CONFIG_SYSV_FS" != "n" -a "$CONFIG_EXPERIMENTAL" ]; then
-  bool '   SYSV filesystem write support (DANGEROUS)' CONFIG_SYSV_FS_WRITE
+   bool '  SYSV filesystem write support (DANGEROUS)' CONFIG_SYSV_FS_WRITE
 fi
-tristate 'UFS filesystem support' CONFIG_UFS_FS
-if [ "$CONFIG_UFS_FS" != "n" ]; then
-  bool '   UFS filesystem write support (experimental)' CONFIG_UFS_FS_WRITE
+tristate 'UFS filesystem support (read only)' CONFIG_UFS_FS
+if [ "$CONFIG_UFS_FS" != "n" -a "$CONFIG_EXPERIMENTAL" ]; then
+   bool '  UFS filesystem write support (DANGEROUS)' CONFIG_UFS_FS_WRITE
 fi
 
 
@@ -74,35 +74,36 @@
 comment 'Network File Systems'
 
 if [ "$CONFIG_INET" = "y" ]; then
-  tristate 'Coda filesystem support (advanced network fs)' CONFIG_CODA_FS
-  tristate 'NFS filesystem support' CONFIG_NFS_FS
-  if [ "$CONFIG_NFS_FS" = "y" -a "$CONFIG_IP_PNP" = "y" ]; then
-    bool '   Root file system on NFS' CONFIG_ROOT_NFS
-  fi
-  # considering that RedHat-6.0 ships with this on, I guess it's not really experimental
-  tristate 'NFS server support' CONFIG_NFSD
-  if [ "$CONFIG_NFSD" != "n" ]; then
-    bool '   Emulate SUN NFS server' CONFIG_NFSD_SUN
-  fi
-  if [ "$CONFIG_NFS_FS" = "y" -o "$CONFIG_NFSD" = "y" ]; then
-    define_bool CONFIG_SUNRPC y
-    define_bool CONFIG_LOCKD y
-  else
-    if [ "$CONFIG_NFS_FS" = "m" -o "$CONFIG_NFSD" = "m" ]; then
-      define_bool CONFIG_SUNRPC m
-      define_bool CONFIG_LOCKD m
-    else
-      define_bool CONFIG_SUNRPC n
-      define_bool CONFIG_LOCKD n
-    fi
-  fi
-  tristate 'SMB filesystem support (to mount WfW shares etc.)' CONFIG_SMB_FS
+   tristate 'Coda filesystem support (advanced network fs)' CONFIG_CODA_FS
+   tristate 'NFS filesystem support' CONFIG_NFS_FS
+   if [ "$CONFIG_NFS_FS" = "y" -a "$CONFIG_IP_PNP" = "y" ]; then
+      bool '  Root file system on NFS' CONFIG_ROOT_NFS
+   fi
+   if [ "$CONFIG_EXPERIMENTAL" ]; then
+      tristate 'NFS server support (EXPERIMENTAL)' CONFIG_NFSD
+      if [ "$CONFIG_NFSD" != "n" ]; then
+	 bool '  Emulate SUN NFS server' CONFIG_NFSD_SUN
+      fi
+   fi
+   if [ "$CONFIG_NFS_FS" = "y" -o "$CONFIG_NFSD" = "y" ]; then
+      define_bool CONFIG_SUNRPC y
+      define_bool CONFIG_LOCKD y
+   else
+      if [ "$CONFIG_NFS_FS" = "m" -o "$CONFIG_NFSD" = "m" ]; then
+	 define_bool CONFIG_SUNRPC m
+	 define_bool CONFIG_LOCKD m
+   else
+	 define_bool CONFIG_SUNRPC n
+	 define_bool CONFIG_LOCKD n
+      fi
+   fi
+   tristate 'SMB filesystem support (to mount WfW shares etc.)' CONFIG_SMB_FS
 fi
 if [ "$CONFIG_IPX" != "n" -o "$CONFIG_INET" != "n" ]; then
-  tristate 'NCP filesystem support (to mount NetWare volumes)' CONFIG_NCP_FS
-  if [ "$CONFIG_NCP_FS" != "n" ]; then
-    source fs/ncpfs/Config.in
-  fi
+   tristate 'NCP filesystem support (to mount NetWare volumes)' CONFIG_NCP_FS
+   if [ "$CONFIG_NCP_FS" != "n" ]; then
+      source fs/ncpfs/Config.in
+   fi
 fi
 
 endmenu
diff -u --recursive --new-file v2.3.21/linux/fs/binfmt_aout.c linux/fs/binfmt_aout.c
--- v2.3.21/linux/fs/binfmt_aout.c	Tue Aug 31 17:29:14 1999
+++ linux/fs/binfmt_aout.c	Wed Oct 13 10:32:35 1999
@@ -270,6 +270,7 @@
 	unsigned long fd_offset;
 	unsigned long rlim;
 	int retval;
+	static unsigned long error_time=0;
 
 	ex = *((struct exec *) bprm->buf);		/* exec-header */
 	if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != OMAGIC &&
@@ -283,7 +284,11 @@
 
 #ifdef __i386__
 	if (N_MAGIC(ex) == ZMAGIC && fd_offset != BLOCK_SIZE) {
-		printk(KERN_NOTICE "N_TXTOFF != BLOCK_SIZE. See a.out.h.\n");
+		if((jiffies-error_time) >5)
+		{
+			printk(KERN_NOTICE "N_TXTOFF != BLOCK_SIZE. See a.out.h.\n");
+			error_time=jiffies;
+		}
 		return -ENOEXEC;
 	}
 
@@ -291,7 +296,11 @@
 	    bprm->dentry->d_inode->i_op &&
 	    bprm->dentry->d_inode->i_op->get_block &&
 	    (fd_offset < bprm->dentry->d_inode->i_sb->s_blocksize)) {
-		printk(KERN_NOTICE "N_TXTOFF < BLOCK_SIZE. Please convert binary.\n");
+		if((jiffies-error_time) >5)
+		{
+			printk(KERN_NOTICE "N_TXTOFF < BLOCK_SIZE. Please convert binary.\n");
+			error_time=jiffies;
+		}
 		return -ENOEXEC;
 	}
 #endif
diff -u --recursive --new-file v2.3.21/linux/fs/buffer.c linux/fs/buffer.c
--- v2.3.21/linux/fs/buffer.c	Mon Oct 11 15:38:15 1999
+++ linux/fs/buffer.c	Wed Oct 13 10:32:35 1999
@@ -1158,7 +1158,7 @@
 	goto try_again;
 }
 
-static int create_page_buffers(int rw, struct page *page, kdev_t dev, int b[], int size, int bmap)
+static int create_page_buffers(int rw, struct page *page, kdev_t dev, int b[], int size)
 {
 	struct buffer_head *head, *bh, *tail;
 	int block;
@@ -1186,17 +1186,6 @@
 		bh->b_dev = dev;
 		bh->b_blocknr = block;
 
-		/*
-		 * When we use bmap, we define block zero to represent
-		 * a hole.  ll_rw_page, however, may legitimately
-		 * access block zero, and we need to distinguish the
-		 * two cases.
-		 */
-		if (bmap && !block) {
-			memset(bh->b_data, 0, size);
-			set_bit(BH_Uptodate, &bh->b_state);
-			continue;
-		}
 		set_bit(BH_Mapped, &bh->b_state);
 	}
 	tail->b_this_page = head;
@@ -1251,7 +1240,7 @@
 
 	/*
 	 * subtle. We release buffer-heads only if this is
-	 * the 'final' flushpage. We have invalidated the bmap
+	 * the 'final' flushpage. We have invalidated the get_block
 	 * cached value unconditionally, so real IO is not
 	 * possible anymore.
 	 *
@@ -1770,7 +1759,7 @@
  */
 
 int brw_kiovec(int rw, int nr, struct kiobuf *iovec[], 
-	       kdev_t dev, unsigned long b[], int size, int bmap)
+	       kdev_t dev, unsigned long b[], int size)
 {
 	int		err;
 	int		length;
@@ -1893,7 +1882,7 @@
 	return err;
 
  error:
-	/* We got an error allocation the bh'es.  Just free the current
+	/* We got an error allocating the bh'es.  Just free the current
            buffer_heads and exit. */
 	spin_lock(&unused_list_lock);
 	for (i = bhind; --i >= 0; ) {
@@ -1915,7 +1904,7 @@
  * FIXME: we need a swapper_inode->get_block function to remove
  *        some of the bmap kludges and interface ugliness here.
  */
-int brw_page(int rw, struct page *page, kdev_t dev, int b[], int size, int bmap)
+int brw_page(int rw, struct page *page, kdev_t dev, int b[], int size)
 {
 	struct buffer_head *head, *bh, *arr[MAX_BUF_PER_PAGE];
 	int nr, fresh /* temporary debugging flag */, block;
@@ -1929,7 +1918,7 @@
 	 */
 	fresh = 0;
 	if (!page->buffers) {
-		create_page_buffers(rw, page, dev, b, size, bmap);
+		create_page_buffers(rw, page, dev, b, size);
 		fresh = 1;
 	}
 	if (!page->buffers)
@@ -1947,16 +1936,9 @@
 		if (rw == READ) {
 			if (!fresh)
 				BUG();
-			if (bmap && !block) {
-				if (block)
-					BUG();
-			} else {
-				if (bmap && !block)
-					BUG();
-				if (!buffer_uptodate(bh)) {
-					arr[nr++] = bh;
-					atomic_inc(&bh->b_count);
-				}
+			if (!buffer_uptodate(bh)) {
+				arr[nr++] = bh;
+				atomic_inc(&bh->b_count);
 			}
 		} else { /* WRITE */
 			if (!bh->b_blocknr) {
@@ -1994,7 +1976,7 @@
 
 /*
  * Generic "read page" function for block devices that have the normal
- * bmap functionality. This is most of the block device filesystems.
+ * get_block functionality. This is most of the block device filesystems.
  * Reads the page asynchronously --- the unlock_buffer() and
  * mark_buffer_uptodate() functions propagate buffer state into the
  * page struct once IO has completed.
diff -u --recursive --new-file v2.3.21/linux/fs/namei.c linux/fs/namei.c
--- v2.3.21/linux/fs/namei.c	Thu Aug 26 13:05:40 1999
+++ linux/fs/namei.c	Thu Oct 14 14:19:56 1999
@@ -857,7 +857,7 @@
 
 	lock_kernel();
 	error = -EPERM;
-	if (S_ISDIR(mode) || (!S_ISFIFO(mode) && !capable(CAP_SYS_ADMIN)))
+	if (S_ISDIR(mode) || (!S_ISFIFO(mode) && !capable(CAP_MKNOD)))
 		goto out;
 	tmp = getname(filename);
 	error = PTR_ERR(tmp);
diff -u --recursive --new-file v2.3.21/linux/fs/nfs/file.c linux/fs/nfs/file.c
--- v2.3.21/linux/fs/nfs/file.c	Sat Jun 26 12:04:39 1999
+++ linux/fs/nfs/file.c	Thu Oct 14 14:22:09 1999
@@ -222,7 +222,7 @@
 nfs_lock(struct file *filp, int cmd, struct file_lock *fl)
 {
 	struct inode * inode = filp->f_dentry->d_inode;
-	int	status;
+	int	status = 0;
 
 	dprintk("NFS: nfs_lock(f=%4x/%ld, t=%x, fl=%x, r=%ld:%ld)\n",
 			inode->i_dev, inode->i_ino,
@@ -237,8 +237,11 @@
 		return -ENOLCK;
 
 	/* Fake OK code if mounted without NLM support */
-	if (NFS_SERVER(inode)->flags & NFS_MOUNT_NONLM)
-		return 0;
+	if (NFS_SERVER(inode)->flags & NFS_MOUNT_NONLM) {
+		if (cmd == F_GETLK)
+			status = LOCK_USE_CLNT;
+		goto out_ok;
+	}
 
 	/*
 	 * No BSD flocks over NFS allowed.
@@ -260,11 +263,14 @@
 
 	if ((status = nlmclnt_proc(inode, cmd, fl)) < 0)
 		return status;
+	else
+		status = 0;
 
 	/*
 	 * Make sure we re-validate anything we've got cached.
 	 * This makes locking act as a cache coherency point.
 	 */
+ out_ok:
 	NFS_CACHEINV(inode);
-	return 0;
+	return status;
 }
diff -u --recursive --new-file v2.3.21/linux/fs/nfsd/export.c linux/fs/nfsd/export.c
--- v2.3.21/linux/fs/nfsd/export.c	Tue Jun  8 10:47:58 1999
+++ linux/fs/nfsd/export.c	Tue Oct 12 22:59:34 1999
@@ -627,7 +627,7 @@
 	{ NFSEXP_UIDMAP, {"uidmap", ""}},
 	{ NFSEXP_KERBEROS, { "kerberos", ""}},
 	{ NFSEXP_SUNSECURE, { "sunsecure", ""}},
-	{ NFSEXP_CROSSMNT, {"crossmnt", ""}},
+	{ NFSEXP_CROSSMNT, {"nohide", ""}},
 	{ 0, {"", ""}}
 };
 
diff -u --recursive --new-file v2.3.21/linux/fs/nfsd/vfs.c linux/fs/nfsd/vfs.c
--- v2.3.21/linux/fs/nfsd/vfs.c	Tue Sep  7 12:14:07 1999
+++ linux/fs/nfsd/vfs.c	Tue Oct 12 22:59:34 1999
@@ -137,6 +137,14 @@
 /*
  * Look up one component of a pathname.
  * N.B. After this call _both_ fhp and resfh need an fh_put
+ *
+ * If the lookup would cross a mountpoint, and the mounted filesystem
+ * is exported to the client with NFSEXP_CROSSMNT, then the lookup is
+ * accepted as it stands and the mounted directory is
+ * returned. Otherwise the covered directory is returned.
+ * NOTE: this mountpoint crossing is not supported properly by all
+ *   clients and is explicitly disallowed for NFSv3
+ *      NeilBrown <neilb@cse.unsw.edu.au>
  */
 int
 nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
@@ -176,18 +184,27 @@
 	 * check if we have crossed a mount point ...
 	 */
 	if (dchild->d_sb != dparent->d_sb) {
-		struct dentry *tdentry;
-		tdentry = dchild->d_covers;
-		if (tdentry == dchild)
-			goto out_dput;
-	        dput(dchild);
-		dchild = dget(tdentry);
-	        if (dchild->d_sb != dparent->d_sb) {
-printk("nfsd_lookup: %s/%s crossed mount point!\n", dparent->d_name.name, dchild->d_name.name);
-			goto out_dput;
+		struct svc_export *exp2 = NULL;
+		exp2 = exp_get(rqstp->rq_client,
+			       dchild->d_inode->i_dev,
+			       dchild->d_inode->i_ino);
+		if (exp2 && EX_CROSSMNT(exp2))
+			/* successfully crossed mount point */
+			exp = exp2;
+		else if (dchild->d_covers->d_sb == dparent->d_sb) {
+			/* stay in the original filesystem */
+			struct dentry *tdentry = dget(dchild->d_covers);
+			dput(dchild);
+			dchild = tdentry;
+		} else {
+			/* This cannot possibly happen */
+			printk("nfsd_lookup: %s/%s impossible mount point!\n", dparent->d_name.name, dchild->d_name.name);
+			dput(dchild);
+			err = nfserr_acces;
+			goto out;
+
 		}
 	}
-
 	/*
 	 * Note: we compose the file handle now, but as the
 	 * dentry may be negative, it may need to be updated.
@@ -201,10 +218,6 @@
 
 out_nfserr:
 	err = nfserrno(-PTR_ERR(dchild));
-	goto out;
-out_dput:
-	dput(dchild);
-	err = nfserr_acces;
 	goto out;
 }
 
diff -u --recursive --new-file v2.3.21/linux/fs/proc/array.c linux/fs/proc/array.c
--- v2.3.21/linux/fs/proc/array.c	Tue Aug 31 17:29:14 1999
+++ linux/fs/proc/array.c	Fri Oct 15 11:49:37 1999
@@ -38,7 +38,6 @@
  *
  * aeb@cwi.nl        :  /proc/partitions
  *
- *
  * Alan Cox	     :  security fixes.
  *			<Alan.Cox@linux.org>
  *
@@ -46,6 +45,11 @@
  *
  * Gerhard Wichert   :  added BIGMEM support
  * Siemens AG           <Gerhard.Wichert@pdb.siemens.de>
+ *
+ * Chuck Lever       :  safe handling of task_struct
+ *                      <cel@monkey.org>
+ *
+ * Andrea Arcangeli  :	SMP race/security fixes.
  */
 
 #include <linux/types.h>
@@ -67,6 +71,7 @@
 #include <linux/slab.h>
 #include <linux/smp.h>
 #include <linux/signal.h>
+#include <linux/smp_lock.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -469,7 +474,7 @@
 				return result;
 			}
 		} while (addr & ~PAGE_MASK);
-		kunmap(addr, KM_READ);
+		kunmap(addr-1, KM_READ);
 	}
 	return result;
 }
@@ -478,7 +483,9 @@
 {
 	struct task_struct *p;
 	struct mm_struct *mm = NULL;
-	
+
+	/* need kernel lock to avoid the tsk->mm to go away under us */
+	lock_kernel();
 	read_lock(&tasklist_lock);
 	p = find_task_by_pid(pid);
 	if (p)
@@ -486,10 +493,10 @@
 	if (mm)
 		atomic_inc(&mm->mm_users);
 	read_unlock(&tasklist_lock);
+	unlock_kernel();
 	return mm;
 }
 
-
 static int get_env(int pid, char * buffer)
 {
 	struct mm_struct *mm = get_mm(pid);
@@ -842,6 +849,9 @@
 	return buffer;
 }
 
+/*
+ * These next two assume that the task's sigmask_lock is held by the caller.
+ */
 static void collect_sigign_sigcatch(struct task_struct *p, sigset_t *ign,
 				    sigset_t *catch)
 {
@@ -894,77 +904,115 @@
 			    cap_t(p->cap_effective));
 }
 
-
+/*
+ * This is somewhat safer than it was before.  However...
+ *
+ * Embedded pointers in the task structure may reference data that
+ * can be changed or that is no longer valid after the tasklist
+ * lock is released, or that isn't even protected by the tasklist
+ * lock.  Eg. tsk->tty, tsk->sig, and tsk->p_pptr can change after
+ * we make our own copy of the task structure.  This doesn't matter
+ * unless we are trying to use the pointed-to data as an address.
+ * So there are still a few safety issues to be addressed here.
+ */
 static int get_status(int pid, char * buffer)
 {
 	char * orig = buffer;
 	struct task_struct *tsk;
 	struct mm_struct *mm = NULL;
 
+	/*
+	 * We lock the whole kernel here because p->files and p->mm are still
+	 * protected by the global kernel lock.
+	 */
+	lock_kernel();
+
 	read_lock(&tasklist_lock);
 	tsk = find_task_by_pid(pid);
-	if (tsk)
+	if (tsk) {
 		mm = tsk->mm;
-	if (mm)
-		atomic_inc(&mm->mm_users);
-	read_unlock(&tasklist_lock);	/* FIXME!! This should be done after the last use */
-	if (!tsk)
-		return 0;
-	buffer = task_name(tsk, buffer);
-	buffer = task_state(tsk, buffer);
-	if (mm)
+		if (mm)
+			atomic_inc(&mm->mm_users);
+
+		buffer = task_name(tsk, buffer);
+		buffer = task_state(tsk, buffer);
+
+		spin_lock_irq(&tsk->sigmask_lock);
+		buffer = task_sig(tsk, buffer);
+		spin_unlock_irq(&tsk->sigmask_lock);
+
+		buffer = task_cap(tsk, buffer);
+	}
+	read_unlock(&tasklist_lock);
+
+	unlock_kernel();
+
+	/*
+	 * We can't hold the tasklist_lock and jiggle the mmap_sem --
+	 * that can result in a deadlock.
+	 */
+	if (mm) {
 		buffer = task_mem(mm, buffer);
-	buffer = task_sig(tsk, buffer);
-	buffer = task_cap(tsk, buffer);
-	if (mm)
 		mmput(mm);
+	}
+
+	/*
+	 * (buffer - orig) will be zero on an error exit.
+	 */
 	return buffer - orig;
 }
 
 static int get_stat(int pid, char * buffer)
 {
 	struct task_struct *tsk;
-	struct mm_struct *mm = NULL;
+	struct mm_struct *mm;
 	unsigned long vsize, eip, esp, wchan;
 	long priority, nice;
-	int tty_pgrp;
+	pid_t ppid = 0;
 	sigset_t sigign, sigcatch;
 	char state;
-	int res;
+	int res = 0;
+	unsigned int tty_device;
+	int tty_pgrp;
 
 	read_lock(&tasklist_lock);
 	tsk = find_task_by_pid(pid);
-	if (tsk)
-		mm = tsk->mm;
+	if (!tsk)
+		goto out_unlock;
+	/* avoid the task list to go away under us (security) */
+	get_page(MAP_NR(tsk) + mem_map);
+	ppid = tsk->p_pptr->pid;
+	read_unlock(&tasklist_lock);
+
+	/* we need the big kernel lock to avoid tsk->mm and tsk->tty
+	   to change under us */
+	lock_kernel();
+	mm = tsk->mm;
 	if (mm)
 		atomic_inc(&mm->mm_users);
-	read_unlock(&tasklist_lock);	/* FIXME!! This should be done after the last use */
-	if (!tsk)
-		return 0;
+	tty_device = tsk->tty ? kdev_t_to_nr(tsk->tty->device) : 0;
+	tty_pgrp = tsk->tty ? tsk->tty->pgrp : -1;
+	unlock_kernel();
+
+	spin_lock_irq(&tsk->sigmask_lock);
+	collect_sigign_sigcatch(tsk, &sigign, &sigcatch);
+	spin_unlock_irq(&tsk->sigmask_lock);
+
+	eip = KSTK_EIP(tsk);
+	esp = KSTK_ESP(tsk);
+	wchan = get_wchan(tsk);
+
 	state = *get_task_state(tsk);
 	vsize = eip = esp = 0;
-	if (mm) {
+	if (mm)
+	{
 		struct vm_area_struct *vma;
 		down(&mm->mmap_sem);
-		vma = mm->mmap;
-		while (vma) {
+		for (vma = mm->mmap; vma; vma = vma->vm_next)
 			vsize += vma->vm_end - vma->vm_start;
-			vma = vma->vm_next;
-		}
-		eip = KSTK_EIP(tsk);
-		esp = KSTK_ESP(tsk);
 		up(&mm->mmap_sem);
 	}
 
-	wchan = get_wchan(tsk);
-
-	collect_sigign_sigcatch(tsk, &sigign, &sigcatch);
-
-	if (tsk->tty)
-		tty_pgrp = tsk->tty->pgrp;
-	else
-		tty_pgrp = -1;
-
 	/* scale priority and nice values from timeslices to -20..20 */
 	/* to make it look like a "normal" Unix priority/nice value  */
 	priority = tsk->counter;
@@ -978,10 +1026,10 @@
 		pid,
 		tsk->comm,
 		state,
-		tsk->p_pptr->pid,
+		ppid,
 		tsk->pgrp,
 		tsk->session,
-	        tsk->tty ? kdev_t_to_nr(tsk->tty->device) : 0,
+		tty_device,
 		tty_pgrp,
 		tsk->flags,
 		tsk->min_flt,
@@ -1018,9 +1066,16 @@
 		tsk->cnswap,
 		tsk->exit_signal,
 		tsk->processor);
+
 	if (mm)
 		mmput(mm);
+	free_task_struct(tsk);
 	return res;
+
+out_unlock:
+	read_unlock(&tasklist_lock);
+	unlock_kernel();
+	return 0;
 }
 		
 static inline void statm_pte_range(pmd_t * pmd, unsigned long address, unsigned long size,
@@ -1168,11 +1223,11 @@
 			  size_t count, loff_t *ppos)
 {
 	struct task_struct *p;
+	struct mm_struct *mm = NULL;
 	struct vm_area_struct * map, * next;
 	char * destptr = buf, * buffer;
 	loff_t lineno;
 	ssize_t column, i;
-	int volatile_task;
 	long retval;
 
 	/*
@@ -1184,24 +1239,30 @@
 		goto out;
 
 	retval = -EINVAL;
+	lock_kernel();
 	read_lock(&tasklist_lock);
 	p = find_task_by_pid(pid);
-	read_unlock(&tasklist_lock);	/* FIXME!! This should be done after the last use */
+	if (p) {
+		mm = p->mm;
+		if (mm)
+			atomic_inc(&mm->mm_users);
+	}
+	read_unlock(&tasklist_lock);
+	unlock_kernel();
 	if (!p)
 		goto freepage_out;
 
-	if (!p->mm || count == 0)
+	/* nothing to map */
+	if (!mm || count == 0)
 		goto getlen_out;
 
-	/* Check whether the mmaps could change if we sleep */
-	volatile_task = (p != current || atomic_read(&p->mm->mm_users) > 1);
-
 	/* decode f_pos */
 	lineno = *ppos >> MAPS_LINE_SHIFT;
 	column = *ppos & (MAPS_LINE_LENGTH-1);
 
-	/* quickly go to line lineno */
-	for (map = p->mm->mmap, i = 0; map && (i < lineno); map = map->vm_next, i++)
+	down(&mm->mmap_sem);
+	/* quickly go to line "lineno" */
+	for (map = mm->mmap, i = 0; map && (i < lineno); map = map->vm_next, i++)
 		continue;
 
 	for ( ; map ; map = next ) {
@@ -1272,17 +1333,13 @@
 		/* done? */
 		if (count == 0)
 			break;
-
-		/* By writing to user space, we might have slept.
-		 * Stop the loop, to avoid a race condition.
-		 */
-		if (volatile_task)
-			break;
 	}
+	up(&mm->mmap_sem);
 
 	/* encode f_pos */
 	*ppos = (lineno << MAPS_LINE_SHIFT) + column;
 
+	mmput(mm);
 getlen_out:
 	retval = destptr - buf;
 
@@ -1295,28 +1352,31 @@
 #ifdef __SMP__
 static int get_pidcpu(int pid, char * buffer)
 {
-	struct task_struct * tsk = current ;
-	int i, len;
+	struct task_struct * tsk;
+	int i, len = 0;
 
+	/*
+	 * Hold the tasklist_lock to guarantee that the task_struct
+	 * address will remain valid while we examine its contents.
+	 */
 	read_lock(&tasklist_lock);
-	if (pid != tsk->pid)
-		tsk = find_task_by_pid(pid);
-	read_unlock(&tasklist_lock);	/* FIXME!! This should be done after the last use */
-
-	if (tsk == NULL)
-		return 0;
-
-	len = sprintf(buffer,
-		"cpu  %lu %lu\n",
-		tsk->times.tms_utime,
-		tsk->times.tms_stime);
+	tsk = find_task_by_pid(pid);
+	if (tsk)
+		get_page(MAP_NR(tsk) + mem_map);
+	read_unlock(&tasklist_lock);
+	if (tsk) {
+		len = sprintf(buffer,
+			"cpu  %lu %lu\n",
+			tsk->times.tms_utime,
+			tsk->times.tms_stime);
 		
-	for (i = 0 ; i < smp_num_cpus; i++)
-		len += sprintf(buffer + len, "cpu%d %lu %lu\n",
-			i,
-			tsk->per_cpu_utime[cpu_logical_map(i)],
-			tsk->per_cpu_stime[cpu_logical_map(i)]);
-
+		for (i = 0 ; i < smp_num_cpus; i++)
+			len += sprintf(buffer + len, "cpu%d %lu %lu\n",
+				i,
+				tsk->per_cpu_utime[cpu_logical_map(i)],
+				tsk->per_cpu_stime[cpu_logical_map(i)]);
+		free_task_struct(tsk);
+	}
 	return len;
 }
 #endif
@@ -1453,12 +1513,6 @@
 	int ok = 0;
 		
 	read_lock(&tasklist_lock);
-	
-	/*
-	 *	Grab the lock, find the task, save the uid and
-	 *	check it has an mm still (ie its not dead)
-	 */
-	
 	p = find_task_by_pid(pid);
 	if (p) {
 		euid=p->euid;
@@ -1466,9 +1520,7 @@
 		if(!cap_issubset(p->cap_permitted, current->cap_permitted))
 			ok=0;			
 	}
-		
 	read_unlock(&tasklist_lock);
-
 	if (!p)
 		return 1;
 
diff -u --recursive --new-file v2.3.21/linux/fs/proc/proc_devtree.c linux/fs/proc/proc_devtree.c
--- v2.3.21/linux/fs/proc/proc_devtree.c	Sat Jun 26 12:04:40 1999
+++ linux/fs/proc/proc_devtree.c	Tue Oct 12 10:00:58 1999
@@ -165,7 +165,7 @@
 		 * add a symlink with the name property as its name.
 		 */
 		for (sib = np->child; sib != child; sib = sib->sibling)
-			if (strcmp(sib->name, child->name) == 0)
+			if (sib->name && strcmp(sib->name, child->name) == 0)
 				break;
 		if (sib == child && strncmp(p, child->name, l) != 0) {
 			al = kmalloc(sizeof(struct proc_dir_entry),
diff -u --recursive --new-file v2.3.21/linux/fs/proc/root.c linux/fs/proc/root.c
--- v2.3.21/linux/fs/proc/root.c	Fri Sep 10 23:57:36 1999
+++ linux/fs/proc/root.c	Thu Oct 14 14:33:10 1999
@@ -898,6 +898,8 @@
 		}
 		pid *= 10;
 		pid += c;
+		if (!pid)
+			break;
 		if (pid & 0xffff0000) {
 			pid = 0;
 			break;
diff -u --recursive --new-file v2.3.21/linux/fs/smbfs/cache.c linux/fs/smbfs/cache.c
--- v2.3.21/linux/fs/smbfs/cache.c	Mon Oct 11 15:38:15 1999
+++ linux/fs/smbfs/cache.c	Fri Oct 15 08:49:42 1999
@@ -34,7 +34,7 @@
 		len = 80;
 	strncpy(buf, name, len);
 	buf[len] = 0;
-	printk(buf);
+	printk("%s", buf);
 }
 #endif
 
diff -u --recursive --new-file v2.3.21/linux/fs/smbfs/inode.c linux/fs/smbfs/inode.c
--- v2.3.21/linux/fs/smbfs/inode.c	Tue Aug 31 17:29:14 1999
+++ linux/fs/smbfs/inode.c	Thu Oct 14 14:22:09 1999
@@ -75,6 +75,8 @@
 	pr_debug("smb_iget: %p\n", fattr);
 
 	result = get_empty_inode();
+	if (!result)
+		return result;
 	result->i_sb = sb;
 	result->i_dev = sb->s_dev;
 	result->i_ino = fattr->f_ino;
diff -u --recursive --new-file v2.3.21/linux/fs/super.c linux/fs/super.c
--- v2.3.21/linux/fs/super.c	Tue Aug 31 17:29:14 1999
+++ linux/fs/super.c	Thu Oct 14 14:22:09 1999
@@ -1186,6 +1186,8 @@
 
 	memset(&filp, 0, sizeof(filp));
 	d_inode = get_empty_inode();
+	if (!d_inode)
+		panic(__FUNCTION__ ": unable to allocate root inode");
 	d_inode->i_rdev = ROOT_DEV;
 	filp.f_dentry = NULL;
 	if ( root_mountflags & MS_RDONLY)
diff -u --recursive --new-file v2.3.21/linux/include/asm-alpha/pgtable.h linux/include/asm-alpha/pgtable.h
--- v2.3.21/linux/include/asm-alpha/pgtable.h	Fri Sep 10 23:57:36 1999
+++ linux/include/asm-alpha/pgtable.h	Wed Oct 13 10:32:35 1999
@@ -622,6 +622,6 @@
 #define kern_addr_valid(addr)	(1)
 
 #define io_remap_page_range(start, busaddr, size, prot) \
-	remap_page_range(start, virt_to_phys(ioremap(busaddr)), size, prot)
+	remap_page_range(start, virt_to_phys(__ioremap(busaddr)), size, prot)
 
 #endif /* _ALPHA_PGTABLE_H */
diff -u --recursive --new-file v2.3.21/linux/include/asm-alpha/processor.h linux/include/asm-alpha/processor.h
--- v2.3.21/linux/include/asm-alpha/processor.h	Wed Aug  4 15:48:00 1999
+++ linux/include/asm-alpha/processor.h	Wed Oct 13 10:32:35 1999
@@ -114,6 +114,8 @@
 /* Do necessary setup to start up a newly executed thread.  */
 extern void start_thread(struct pt_regs *, unsigned long, unsigned long);
 
+struct task_struct;
+
 /* Free all resources held by a thread. */
 extern void release_thread(struct task_struct *);
 
diff -u --recursive --new-file v2.3.21/linux/include/asm-ppc/keyboard.h linux/include/asm-ppc/keyboard.h
--- v2.3.21/linux/include/asm-ppc/keyboard.h	Sat Oct  9 11:47:50 1999
+++ linux/include/asm-ppc/keyboard.h	Tue Oct 12 10:00:58 1999
@@ -19,6 +19,10 @@
 #include <linux/adb.h>
 #include <asm/machdep.h>
 
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <asm/io.h>
+
 #define KEYBOARD_IRQ			1
 #define DISABLE_KBD_DURING_INTERRUPTS	0
 #define INIT_KBD
@@ -71,6 +75,31 @@
 #define kbd_sysrq_xlate	(ppc_md.ppc_kbd_sysrq_xlate)
 
 extern unsigned long SYSRQ_KEY;
+
+/* resource allocation */
+#define kbd_request_region()
+#define kbd_request_irq(handler) request_irq(KEYBOARD_IRQ, handler, 0, \
+                                             "keyboard", NULL)
+
+/* How to access the keyboard macros on this platform.  */
+#define kbd_read_input() inb(KBD_DATA_REG)
+#define kbd_read_status() inb(KBD_STATUS_REG)
+#define kbd_write_output(val) outb(val, KBD_DATA_REG)
+#define kbd_write_command(val) outb(val, KBD_CNTL_REG)
+
+/* Some stoneage hardware needs delays after some operations.  */
+#define kbd_pause() do { } while(0)
+
+/*
+ * Machine specific bits for the PS/2 driver
+ */
+
+#define AUX_IRQ 12
+
+#define aux_request_irq(hand, dev_id)					\
+	request_irq(AUX_IRQ, hand, SA_SHIRQ, "PS/2 Mouse", dev_id)
+
+#define aux_free_irq(dev_id) free_irq(AUX_IRQ, dev_id)
 
 #endif /* __KERNEL__ */
 
diff -u --recursive --new-file v2.3.21/linux/include/asm-ppc/uaccess.h linux/include/asm-ppc/uaccess.h
--- v2.3.21/linux/include/asm-ppc/uaccess.h	Tue Aug 31 17:29:14 1999
+++ linux/include/asm-ppc/uaccess.h	Tue Oct 12 10:00:58 1999
@@ -259,7 +259,26 @@
  * Return 0 for error
  */
 
-extern long strlen_user(const char *);
+extern int __strnlen_user(const char *str, long len, unsigned long top);
+
+/*
+ * Returns the length of the string at str (including the null byte),
+ * or 0 if we hit a page we can't access,
+ * or something > len if we didn't find a null byte.
+ *
+ * The `top' parameter to __strnlen_user is to make sure that
+ * we can never overflow from the user area into kernel space.
+ */
+extern __inline__ int strnlen_user(const char *str, long len)
+{
+	unsigned long top = __kernel_ok? ~0UL: TASK_SIZE - 1;
+
+	if ((unsigned long)str > top)
+		return 0;
+	return __strnlen_user(str, len, top);
+}
+
+#define strlen_user(str)	strnlen_user((str), 0x7ffffffe)
 
 #endif  /* __ASSEMBLY__ */
 
diff -u --recursive --new-file v2.3.21/linux/include/linux/adb.h linux/include/linux/adb.h
--- v2.3.21/linux/include/linux/adb.h	Wed Dec 31 16:00:00 1969
+++ linux/include/linux/adb.h	Tue Oct 12 10:00:58 1999
@@ -0,0 +1,95 @@
+/*
+ * Definitions for ADB (Apple Desktop Bus) support.
+ */
+#ifndef __ADB_H
+#define __ADB_H
+
+/* ADB commands */
+#define ADB_BUSRESET		0
+#define ADB_FLUSH(id)		(0x01 | ((id) << 4))
+#define ADB_WRITEREG(id, reg)	(0x08 | (reg) | ((id) << 4))
+#define ADB_READREG(id, reg)	(0x0C | (reg) | ((id) << 4))
+
+/* ADB default device IDs (upper 4 bits of ADB command byte) */
+#define ADB_DONGLE	1	/* "software execution control" devices */
+#define ADB_KEYBOARD	2
+#define ADB_MOUSE	3
+#define ADB_TABLET	4
+#define ADB_MODEM	5
+#define ADB_MISC	7	/* maybe a monitor */
+
+#define ADB_RET_OK	0
+#define ADB_RET_TIMEOUT	3
+
+/* The kind of ADB request. The controller may emulate some
+   or all of those CUDA/PMU packet kinds */
+#define ADB_PACKET	0
+#define CUDA_PACKET	1
+#define ERROR_PACKET	2
+#define TIMER_PACKET	3
+#define POWER_PACKET	4
+#define MACIIC_PACKET	5
+#define PMU_PACKET	6
+
+#ifdef __KERNEL__
+
+struct adb_request {
+	unsigned char data[32];
+	int nbytes;
+	unsigned char reply[32];
+	int reply_len;
+	unsigned char reply_expected;
+	unsigned char sent;
+	unsigned char complete;
+	void (*done)(struct adb_request *);
+	void *arg;
+	struct adb_request *next;
+};
+
+struct adb_ids {
+	int nids;
+	unsigned char id[16];
+};
+
+/* Structure which encapsulates a low-level ADB driver */
+
+struct adb_driver {
+	char name[16];
+	int (*probe)(void);
+	int (*init)(void);
+	int (*send_request)(struct adb_request *req, int sync);
+	/*int (*write)(struct adb_request *req);*/
+	int (*autopoll)(int devs);
+	void (*poll)(void);
+	int (*reset_bus)(void);
+};
+
+/* Values for adb_request flags */
+#define ADBREQ_REPLY	1	/* expect reply */
+#define ADBREQ_SYNC	2	/* poll until done */
+#define ADBREQ_NOSEND	4	/* build the request, but don't send it */
+
+/* Messages sent thru the client_list notifier. You should NOT stop
+   the operation, at least not with this version */
+enum adb_message {
+    ADB_MSG_POWERDOWN,	/* Currently called before sleep only */
+    ADB_MSG_PRE_RESET,	/* Called before resetting the bus */
+    ADB_MSG_POST_RESET	/* Called after resetting the bus (re-do init & register) */
+};
+extern struct adb_driver *adb_controller;
+extern struct notifier_block *adb_client_list;
+
+int adb_request(struct adb_request *req, void (*done)(struct adb_request *),
+		int flags, int nbytes, ...);
+int adb_register(int default_id,int handler_id,struct adb_ids *ids,
+		 void (*handler)(unsigned char *, int, struct pt_regs *, int));
+void adb_poll(void);
+void adb_input(unsigned char *, int, struct pt_regs *, int);
+int adb_reset_bus(void);
+
+int adb_try_handler_change(int address, int new_id);
+int adb_get_infos(int address, int *original_address, int *handler_id);
+
+#endif /* __KERNEL__ */
+
+#endif /* __ADB_H */
diff -u --recursive --new-file v2.3.21/linux/include/linux/adb_mouse.h linux/include/linux/adb_mouse.h
--- v2.3.21/linux/include/linux/adb_mouse.h	Wed Dec 31 16:00:00 1969
+++ linux/include/linux/adb_mouse.h	Tue Oct 12 10:00:58 1999
@@ -0,0 +1,23 @@
+#ifndef _LINUX_ADB_MOUSE_H
+#define _LINUX_ADB_MOUSE_H
+
+/*
+ * linux/include/linux/mac_mouse.h
+ * header file for Macintosh ADB mouse driver
+ * 27-10-97 Michael Schmitz
+ * copied from:
+ * header file for Atari Mouse driver
+ * by Robert de Vries (robert@and.nl) on 19Jul93
+ */
+
+struct mouse_status {
+	char		buttons;
+	short		dx;
+	short		dy;
+	int		ready;
+	int		active;
+	struct wait_queue *wait;
+	struct fasync_struct *fasyncptr;
+};
+
+#endif
diff -u --recursive --new-file v2.3.21/linux/include/linux/capability.h linux/include/linux/capability.h
--- v2.3.21/linux/include/linux/capability.h	Tue Aug 31 17:29:14 1999
+++ linux/include/linux/capability.h	Fri Oct 15 09:29:43 1999
@@ -193,7 +193,6 @@
 
 /* Allow configuration of the secure attention key */
 /* Allow administration of the random device */
-/* Allow device administration (mknod)*/
 /* Allow examination and configuration of disk quotas */
 /* Allow configuring the kernel's syslog (printk behaviour) */
 /* Allow setting the domainname */
@@ -265,6 +264,10 @@
 /* Allow vhangup() of tty */
 
 #define CAP_SYS_TTY_CONFIG   26
+
+/* Allow the privileged aspects of mknod() */
+
+#define CAP_MKNOD            27
 
 #ifdef __KERNEL__
 /* 
diff -u --recursive --new-file v2.3.21/linux/include/linux/console.h linux/include/linux/console.h
--- v2.3.21/linux/include/linux/console.h	Thu Feb 25 10:02:12 1999
+++ linux/include/linux/console.h	Wed Oct 13 10:32:35 1999
@@ -51,6 +51,7 @@
 extern struct consw dummy_con;	/* dummy console buffer */
 extern struct consw fb_con;	/* frame buffer based console */
 extern struct consw vga_con;	/* VGA text console */
+extern struct consw newport_con;	/* SGI Newport console  */
 extern struct consw prom_con;	/* SPARC PROM console */
 
 void take_over_console(struct consw *sw, int first, int last, int deflt);
diff -u --recursive --new-file v2.3.21/linux/include/linux/cuda.h linux/include/linux/cuda.h
--- v2.3.21/linux/include/linux/cuda.h	Wed Dec 31 16:00:00 1969
+++ linux/include/linux/cuda.h	Tue Oct 12 10:00:58 1999
@@ -0,0 +1,36 @@
+/*
+ * Definitions for talking to the CUDA.  The CUDA is a microcontroller
+ * which controls the ADB, system power, RTC, and various other things.
+ *
+ * Copyright (C) 1996 Paul Mackerras.
+ */
+
+/* CUDA commands (2nd byte) */
+#define CUDA_WARM_START		0
+#define CUDA_AUTOPOLL		1
+#define CUDA_GET_6805_ADDR	2
+#define CUDA_GET_TIME		3
+#define CUDA_GET_PRAM		7
+#define CUDA_SET_6805_ADDR	8
+#define CUDA_SET_TIME		9
+#define CUDA_POWERDOWN		0xa
+#define CUDA_POWERUP_TIME	0xb
+#define CUDA_SET_PRAM		0xc
+#define CUDA_MS_RESET		0xd
+#define CUDA_SEND_DFAC		0xe
+#define CUDA_RESET_SYSTEM	0x11
+#define CUDA_SET_IPL		0x12
+#define CUDA_SET_AUTO_RATE	0x14
+#define CUDA_GET_AUTO_RATE	0x16
+#define CUDA_SET_DEVICE_LIST	0x19
+#define CUDA_GET_DEVICE_LIST	0x1a
+#define CUDA_GET_SET_IIC	0x22
+
+#ifdef __KERNEL__
+
+void find_via_cuda(void);
+extern int cuda_request(struct adb_request *req,
+			void (*done)(struct adb_request *), int nbytes, ...);
+extern void cuda_poll(void);
+
+#endif	/* __KERNEL */
diff -u --recursive --new-file v2.3.21/linux/include/linux/elf.h linux/include/linux/elf.h
--- v2.3.21/linux/include/linux/elf.h	Tue Aug 31 17:29:14 1999
+++ linux/include/linux/elf.h	Fri Oct 15 09:31:59 1999
@@ -29,6 +29,13 @@
 #define PT_PHDR    6
 #define PT_LOPROC  0x70000000
 #define PT_HIPROC  0x7fffffff
+#define PT_MIPS_REGINFO		0x70000000
+
+/* Flags in the e_flags field of the header */
+#define EF_MIPS_NOREORDER 0x00000001
+#define EF_MIPS_PIC       0x00000002
+#define EF_MIPS_CPIC      0x00000004
+#define EF_MIPS_ARCH      0xf0000000
 
 /* These constants define the different elf file types */
 #define ET_NONE   0
@@ -36,8 +43,8 @@
 #define ET_EXEC   2
 #define ET_DYN    3
 #define ET_CORE   4
-#define ET_LOPROC 5
-#define ET_HIPROC 6
+#define ET_LOPROC 0xff00
+#define ET_HIPROC 0xffff
 
 /* These constants define the various ELF target machines */
 #define EM_NONE  0
@@ -99,6 +106,25 @@
 #define DT_JMPREL	23
 #define DT_LOPROC	0x70000000
 #define DT_HIPROC	0x7fffffff
+#define DT_MIPS_RLD_VERSION	0x70000001
+#define DT_MIPS_TIME_STAMP	0x70000002
+#define DT_MIPS_ICHECKSUM	0x70000003
+#define DT_MIPS_IVERSION	0x70000004
+#define DT_MIPS_FLAGS		0x70000005
+  #define RHF_NONE		  0
+  #define RHF_HARDWAY		  1
+  #define RHF_NOTPOT		  2
+#define DT_MIPS_BASE_ADDRESS	0x70000006
+#define DT_MIPS_CONFLICT	0x70000008
+#define DT_MIPS_LIBLIST		0x70000009
+#define DT_MIPS_LOCAL_GOTNO	0x7000000a
+#define DT_MIPS_CONFLICTNO	0x7000000b
+#define DT_MIPS_LIBLISTNO	0x70000010
+#define DT_MIPS_SYMTABNO	0x70000011
+#define DT_MIPS_UNREFEXTNO	0x70000012
+#define DT_MIPS_GOTSYM		0x70000013
+#define DT_MIPS_HIPAGENO	0x70000014
+#define DT_MIPS_RLD_MAP		0x70000016
 
 /* This info is needed when parsing the symbol table */
 #define STB_LOCAL  0
@@ -167,6 +193,55 @@
 #define R_386_GOTPC	10
 #define R_386_NUM	11
 
+#define R_MIPS_NONE		0
+#define R_MIPS_16		1
+#define R_MIPS_32		2
+#define R_MIPS_REL32		3
+#define R_MIPS_26		4
+#define R_MIPS_HI16		5
+#define R_MIPS_LO16		6
+#define R_MIPS_GPREL16		7
+#define R_MIPS_LITERAL		8
+#define R_MIPS_GOT16		9
+#define R_MIPS_PC16		10
+#define R_MIPS_CALL16		11
+#define R_MIPS_GPREL32		12
+/* The remaining relocs are defined on Irix, although they are not
+   in the MIPS ELF ABI.  */
+#define R_MIPS_UNUSED1		13
+#define R_MIPS_UNUSED2		14
+#define R_MIPS_UNUSED3		15
+#define R_MIPS_SHIFT5		16
+#define R_MIPS_SHIFT6		17
+#define R_MIPS_64		18
+#define R_MIPS_GOT_DISP		19
+#define R_MIPS_GOT_PAGE		20
+#define R_MIPS_GOT_OFST		21
+/*
+ * The following two relocation types are specified in the the MIPS ABI
+ * conformance guide version 1.2 but not yet in the psABI.
+ */
+#define R_MIPS_GOTHI16		22
+#define R_MIPS_GOTLO16		23
+#define R_MIPS_SUB		24
+#define R_MIPS_INSERT_A		25
+#define R_MIPS_INSERT_B		26
+#define R_MIPS_DELETE		27
+#define R_MIPS_HIGHER		28
+#define R_MIPS_HIGHEST		29
+/*
+ * The following two relocation types are specified in the the MIPS ABI
+ * conformance guide version 1.2 but not yet in the psABI.
+ */
+#define R_MIPS_CALLHI16		30
+#define R_MIPS_CALLLO16		31
+/*
+ * This range is reserved for vendor specific relocations.
+ */
+#define R_MIPS_LOVENDOR		100
+#define R_MIPS_HIVENDOR		127
+
+
 /*
  * Sparc ELF relocation types
  */
@@ -404,12 +479,17 @@
 #define SHT_HIPROC	0x7fffffff
 #define SHT_LOUSER	0x80000000
 #define SHT_HIUSER	0xffffffff
+#define SHT_MIPS_LIST		0x70000000
+#define SHT_MIPS_CONFLICT	0x70000002
+#define SHT_MIPS_GPTAB		0x70000003
+#define SHT_MIPS_UCODE		0x70000004
 
 /* sh_flags */
 #define SHF_WRITE	0x1
 #define SHF_ALLOC	0x2
 #define SHF_EXECINSTR	0x4
 #define SHF_MASKPROC	0xf0000000
+#define SHF_MIPS_GPREL	0x10000000
 
 /* special section indexes */
 #define SHN_UNDEF	0
@@ -419,6 +499,7 @@
 #define SHN_ABS		0xfff1
 #define SHN_COMMON	0xfff2
 #define SHN_HIRESERVE	0xffff
+#define SHN_MIPS_ACCOMON	0xff00
  
 typedef struct {
   Elf32_Word	sh_name;
diff -u --recursive --new-file v2.3.21/linux/include/linux/fs.h linux/include/linux/fs.h
--- v2.3.21/linux/include/linux/fs.h	Mon Oct 11 15:38:15 1999
+++ linux/include/linux/fs.h	Fri Oct 15 09:29:43 1999
@@ -916,7 +916,7 @@
 extern struct buffer_head * bread(kdev_t, int, int);
 extern struct buffer_head * breada(kdev_t, int, int, unsigned int, unsigned int);
 
-extern int brw_page(int, struct page *, kdev_t, int [], int, int);
+extern int brw_page(int, struct page *, kdev_t, int [], int);
 
 typedef int (*writepage_t)(struct file *, struct page *, unsigned long, unsigned long, const char *);
 
diff -u --recursive --new-file v2.3.21/linux/include/linux/iobuf.h linux/include/linux/iobuf.h
--- v2.3.21/linux/include/linux/iobuf.h	Wed Aug 18 16:43:56 1999
+++ linux/include/linux/iobuf.h	Fri Oct 15 09:29:55 1999
@@ -75,6 +75,6 @@
 /* fs/buffer.c */
 
 int	brw_kiovec(int rw, int nr, struct kiobuf *iovec[], 
-		   kdev_t dev, unsigned long b[], int size, int bmap);
+		   kdev_t dev, unsigned long b[], int size);
 
 #endif /* __LINUX_IOBUF_H */
diff -u --recursive --new-file v2.3.21/linux/include/linux/lp.h linux/include/linux/lp.h
--- v2.3.21/linux/include/linux/lp.h	Thu Jul  1 14:22:57 1999
+++ linux/include/linux/lp.h	Wed Oct 13 10:32:35 1999
@@ -5,6 +5,7 @@
  * usr/include/linux/lp.h c.1991-1992 James Wiegand
  * many modifications copyright (C) 1992 Michael K. Johnson
  * Interrupt support added 1993 Nigel Gamble
+ * Removed 8255 status defines from inside __KERNEL__ Marcelo Tosatti 
  */
 
 /*
@@ -28,6 +29,17 @@
 #define LP_HAVE_PORT_BIT   12 /* (0x1000) Port is claimed. */
 #define LP_PORT_BUSY   (1<<13) /* Reading or writing. */
 
+/* 
+ * bit defines for 8255 status port
+ * base + 1
+ * accessed with LP_S(minor), which gets the byte...
+ */
+#define LP_PBUSY	0x80  /* inverted input, active high */
+#define LP_PACK		0x40  /* unchanged input, active low */
+#define LP_POUTPA	0x20  /* unchanged input, active high */
+#define LP_PSELECD	0x10  /* unchanged input, active high */
+#define LP_PERRORP	0x08  /* unchanged input, active low */
+
 /* timeout for each character.  This is relative to bus cycles -- it
  * is the count in a busy loop.  THIS IS THE VALUE TO CHANGE if you
  * have extremely slow printing, or if the machine seems to slow down
@@ -143,16 +155,6 @@
  * gets inverted, but it is also active low.
  */
 
-/* 
- * bit defines for 8255 status port
- * base + 1
- * accessed with LP_S(minor), which gets the byte...
- */
-#define LP_PBUSY	0x80  /* inverted input, active high */
-#define LP_PACK		0x40  /* unchanged input, active low */
-#define LP_POUTPA	0x20  /* unchanged input, active high */
-#define LP_PSELECD	0x10  /* unchanged input, active high */
-#define LP_PERRORP	0x08  /* unchanged input, active low */
 
 /* 
  * defines for 8255 control port
diff -u --recursive --new-file v2.3.21/linux/include/linux/parport.h linux/include/linux/parport.h
--- v2.3.21/linux/include/linux/parport.h	Sat Oct  9 11:47:50 1999
+++ linux/include/linux/parport.h	Fri Oct 15 10:15:33 1999
@@ -71,6 +71,10 @@
 #define IEEE1284_MODE_EPPSL             (1<<11) /* EPP 1.7 */
 #define IEEE1284_MODE_EPPSWE            (1<<12) /* Software-emulated */
 #define IEEE1284_DEVICEID               (1<<2)  /* This is a flag */
+#define IEEE1284_EXT_LINK               (1<<14) /* This flag causes the
+						 * extensibility link to
+						 * be requested, using
+						 * bits 0-6. */
 
 /* For the benefit of parport_read/write, you can use these with
  * parport_negotiate to use address operations.  They have no effect
diff -u --recursive --new-file v2.3.21/linux/include/linux/pci.h linux/include/linux/pci.h
--- v2.3.21/linux/include/linux/pci.h	Sat Oct  9 11:47:50 1999
+++ linux/include/linux/pci.h	Fri Oct 15 09:29:43 1999
@@ -553,5 +553,10 @@
 
 void pci_fixup_device(int pass, struct pci_dev *dev);
 
+extern int pci_pci_problems;
+#define PCIPCI_FAIL		1
+#define PCIPCI_TRITON		2
+#define PCIPCI_NATOMA		4
+
 #endif /* __KERNEL__ */
 #endif /* LINUX_PCI_H */
diff -u --recursive --new-file v2.3.21/linux/include/linux/pci_ids.h linux/include/linux/pci_ids.h
--- v2.3.21/linux/include/linux/pci_ids.h	Sat Oct  9 11:47:50 1999
+++ linux/include/linux/pci_ids.h	Thu Oct 14 15:59:32 1999
@@ -560,6 +560,9 @@
 #define PCI_DEVICE_ID_MACRONIX_MX98713	0x0512
 #define PCI_DEVICE_ID_MACRONIX_MX987x5	0x0531
 
+#define PCI_VENDOR_ID_TCONRAD		0x10da
+#define PCI_DEVICE_ID_TCONRAD_TOKENRING	0x0508
+
 #define PCI_VENDOR_ID_CERN		0x10dc
 #define PCI_DEVICE_ID_CERN_SPSB_PMC	0x0001
 #define PCI_DEVICE_ID_CERN_SPSB_PCI	0x0002
@@ -1073,8 +1076,8 @@
 #define PCI_VENDOR_ID_HOLTEK		0x9412
 #define PCI_DEVICE_ID_HOLTEK_6565	0x6565
 
-#define PCI_VENDOR_ID_EXSYS		0xd84d
-#define PCI_DEVICE_ID_EXSYS_4014		0x4014
+#define PCI_SUBVENDOR_ID_EXSYS		0xd84d
+#define PCI_SUBDEVICE_ID_EXSYS_4014	0x4014
 
 #define PCI_VENDOR_ID_TIGERJET		0xe159
 #define PCI_DEVICE_ID_TIGERJET_300	0x0001
diff -u --recursive --new-file v2.3.21/linux/include/linux/pmu.h linux/include/linux/pmu.h
--- v2.3.21/linux/include/linux/pmu.h	Wed Dec 31 16:00:00 1969
+++ linux/include/linux/pmu.h	Tue Oct 12 10:00:58 1999
@@ -0,0 +1,135 @@
+/*
+ * Definitions for talking to the PMU.  The PMU is a microcontroller
+ * which controls battery charging and system power on PowerBook 3400
+ * and 2400 models as well as the RTC and various other things.
+ *
+ * Copyright (C) 1998 Paul Mackerras.
+ */
+
+#include <linux/config.h>
+/*
+ * PMU commands
+ */
+#define PMU_POWER_CTRL		0x11	/* control power of some devices */
+#define PMU_ADB_CMD		0x20	/* send ADB packet */
+#define PMU_ADB_POLL_OFF	0x21	/* disable ADB auto-poll */
+#define PMU_WRITE_NVRAM		0x33	/* write non-volatile RAM */
+#define PMU_READ_NVRAM		0x3b	/* read non-volatile RAM */
+#define PMU_SET_RTC		0x30	/* set real-time clock */
+#define PMU_READ_RTC		0x38	/* read real-time clock */
+#define PMU_SET_VOLBUTTON	0x40	/* set volume up/down position */
+#define PMU_BACKLIGHT_BRIGHT	0x41	/* set backlight brightness */
+#define PMU_GET_VOLBUTTON	0x48	/* get volume up/down position */
+#define PMU_PCEJECT		0x4c	/* eject PC-card from slot */
+#define PMU_BATTERY_STATE	0x6b	/* report battery state etc. */
+#define PMU_SET_INTR_MASK	0x70	/* set PMU interrupt mask */
+#define PMU_INT_ACK		0x78	/* read interrupt bits */
+#define PMU_SHUTDOWN		0x7e	/* turn power off */
+#define PMU_SLEEP		0x7f	/* put CPU to sleep */
+#define PMU_RESET		0xd0	/* reset CPU */
+#define PMU_GET_BRIGHTBUTTON	0xd9	/* report brightness up/down pos */
+#define PMU_GET_COVER		0xdc	/* report cover open/closed */
+
+/* Bits to use with the PMU_POWER_CTRL command */
+#define PMU_POW_ON		0x80	/* OR this to power ON the device */
+#define PMU_POW_OFF		0x00	/* leave bit 7 to 0 to power it OFF */
+#define PMU_POW_BACKLIGHT	0x01	/* backlight power */
+#define PMU_POW_IRLED		0x04	/* IR led power (on wallstreet) */
+
+/* Bits in PMU interrupt and interrupt mask bytes */
+#define PMU_INT_ADB_AUTO	0x04	/* ADB autopoll, when PMU_INT_ADB */
+#define PMU_INT_PCEJECT		0x04	/* PC-card eject buttons */
+#define PMU_INT_SNDBRT		0x08	/* sound/brightness up/down buttons */
+#define PMU_INT_ADB		0x10	/* ADB autopoll or reply data */
+#define PMU_INT_BATTERY		0x20
+#define PMU_INT_WAKEUP		0x40
+#define PMU_INT_TICK		0x80	/* 1-second tick interrupt */
+
+/* Kind of PMU (model) */
+enum {
+	PMU_UNKNOWN,
+	PMU_OHARE_BASED,	/* 2400, 3400, 3500 (old G3 powerbook) */
+	PMU_HEATHROW_BASED,	/* PowerBook G3 series */
+	PMU_PADDINGTON_BASED,	/* 1999 PowerBook G3 */
+};
+
+/*
+ * Ioctl commands for the /dev/pmu device
+ */
+#include <linux/ioctl.h>
+
+/* no param */
+#define PMU_IOC_SLEEP		_IO('B', 0)
+/* out param: u32*	backlight value: 0 to 31 */
+#define PMU_IOC_GET_BACKLIGHT	_IOR('B', 1, sizeof(__u32*))
+/* in param: u32	backlight value: 0 to 31 */
+#define PMU_IOC_SET_BACKLIGHT	_IOW('B', 2, sizeof(__u32))
+/* out param: u32*	backlight value: 0 to 31 */
+#define PMU_IOC_GET_MODEL	_IOR('B', 3, sizeof(__u32*))
+
+#ifdef __KERNEL__
+
+int find_via_pmu(void);
+int via_pmu_init(void);
+
+int pmu_request(struct adb_request *req,
+		void (*done)(struct adb_request *), int nbytes, ...);
+void pmu_poll(void);
+
+void pmu_enable_backlight(int on);
+void pmu_set_brightness(int level);
+
+void pmu_enable_irled(int on);
+
+void pmu_restart(void);
+void pmu_shutdown(void);
+
+int pmu_present(void);
+int pmu_get_model(void);
+
+#ifdef CONFIG_PMAC_PBOOK
+/*
+ * Stuff for putting the powerbook to sleep and waking it again.
+ *
+ */
+#include <linux/list.h>
+
+struct pmu_sleep_notifier
+{
+	int (*notifier_call)(struct pmu_sleep_notifier *self, int when);
+	int priority;
+	struct list_head list;
+};
+
+/* Code values for calling sleep/wakeup handlers
+ *
+ * Note: If a sleep request got cancelled, all drivers will get
+ * the PBOOK_SLEEP_REJECT, even those who didn't get the PBOOK_SLEEP_REQUEST.
+ */
+#define PBOOK_SLEEP_REQUEST	1
+#define PBOOK_SLEEP_NOW		2
+#define PBOOK_SLEEP_REJECT	3
+#define PBOOK_WAKE		4
+
+/* Result codes returned by the notifiers */
+#define PBOOK_SLEEP_OK		0
+#define PBOOK_SLEEP_REFUSE	-1
+
+/* priority levels in notifiers */
+#define SLEEP_LEVEL_VIDEO	100	/* Video driver (first wake) */
+#define SLEEP_LEVEL_SOUND	90	/* Sound driver */
+#define SLEEP_LEVEL_MEDIABAY	80	/* Media bay driver */
+#define SLEEP_LEVEL_BLOCK	70	/* IDE, SCSI */
+#define SLEEP_LEVEL_NET		60	/* bmac */
+#define SLEEP_LEVEL_ADB		50	/* ADB */
+#define SLEEP_LEVEL_MISC	30	/* Anything */
+#define SLEEP_LEVEL_LAST	0	/* Anything */
+
+/* special register notifier functions */
+int pmu_register_sleep_notifier(struct pmu_sleep_notifier* notifier);
+int pmu_unregister_sleep_notifier(struct pmu_sleep_notifier* notifier);
+
+#endif /* CONFIG_PMAC_PBOOK */
+
+
+#endif	/* __KERNEL */
diff -u --recursive --new-file v2.3.21/linux/include/linux/ppp_channel.h linux/include/linux/ppp_channel.h
--- v2.3.21/linux/include/linux/ppp_channel.h	Fri Aug  6 10:44:11 1999
+++ linux/include/linux/ppp_channel.h	Tue Oct 12 09:58:43 1999
@@ -14,10 +14,10 @@
  *  as published by the Free Software Foundation; either version
  *  2 of the License, or (at your option) any later version.
  *
- * ==FILEVERSION 990717==
+ * ==FILEVERSION 990909==
  */
 
-/* $Id$ */
+/* $Id: ppp_channel.h,v 1.2 1999/09/15 11:21:53 paulus Exp $ */
 
 #include <linux/list.h>
 #include <linux/skbuff.h>
@@ -37,6 +37,7 @@
 	int		xmit_qlen;	/* length of transmit queue (bytes) */
 	int		speed;		/* transfer rate (bytes/second) */
 	int		latency;	/* overhead time in milliseconds */
+	int		hdrlen;		/* amount of headroom channel needs */
 	struct list_head list;		/* link in list of channels per unit */
 	void		*ppp;		/* opaque to channel */
 };
diff -u --recursive --new-file v2.3.21/linux/include/linux/sched.h linux/include/linux/sched.h
--- v2.3.21/linux/include/linux/sched.h	Mon Oct 11 15:38:15 1999
+++ linux/include/linux/sched.h	Fri Oct 15 09:29:47 1999
@@ -699,6 +699,8 @@
 extern void exit_files(struct task_struct *);
 extern void exit_sighand(struct task_struct *);
 
+extern void daemonize(void);
+
 extern int do_execve(char *, char **, char **, struct pt_regs *);
 extern int do_fork(unsigned long, unsigned long, struct pt_regs *);
 
diff -u --recursive --new-file v2.3.21/linux/include/linux/sunrpc/xprt.h linux/include/linux/sunrpc/xprt.h
--- v2.3.21/linux/include/linux/sunrpc/xprt.h	Sat Oct  9 11:47:50 1999
+++ linux/include/linux/sunrpc/xprt.h	Fri Oct 15 09:29:58 1999
@@ -17,7 +17,7 @@
 /*
  * Maximum number of iov's we use.
  */
-#define MAX_IOVEC	8
+#define MAX_IOVEC	10
 
 /*
  * The transport code maintains an estimate on the maximum number of out-
@@ -44,7 +44,7 @@
 #define RPC_MAXCWND		(RPC_MAXCONG * RPC_CWNDSCALE)
 #define RPC_INITCWND		RPC_CWNDSCALE
 #define RPCXPRT_CONGESTED(xprt) \
-	((xprt)->cong >= ((xprt)->nocong? RPC_MAXCWND : (xprt)->cwnd))
+	((xprt)->cong >= (xprt)->cwnd)
 
 /* Default timeout values */
 #define RPC_MAX_UDP_TIMEOUT	(6*HZ)
@@ -124,10 +124,8 @@
 struct rpc_xprt {
 	struct rpc_xprt *	link;		/* list of all clients */
 	struct rpc_xprt *	rx_pending;	/* receive pending list */
-	struct rpc_xprt *	tx_pending;	/* transmit pending list */
 	
 	int 			rx_pending_flag;/* are we on the rcv pending list ? */
-	int 			tx_pending_flag;/* are we on the xmit pending list ? */
 
 	struct file *		file;		/* VFS layer */
 	struct socket *		sock;		/* BSD socket layer */
@@ -170,16 +168,16 @@
 	u32			tcp_copied;	/* copied to request */
 
 	/*
-	 * TCP send stuff
+	 * Send stuff
 	 */
-	struct rpc_iov		snd_buf;	/* send buffer */
 	struct rpc_task *	snd_task;	/* Task blocked in send */
-	u32			snd_sent;	/* Bytes we have sent */
 
 
 	void			(*old_data_ready)(struct sock *, int);
 	void			(*old_state_change)(struct sock *);
 	void			(*old_write_space)(struct sock *);
+
+	wait_queue_head_t	cong_wait;
 };
 #define tcp_reclen		tcp_recm.header[0]
 #define tcp_xid			tcp_recm.header[1]
@@ -202,6 +200,9 @@
 int			xprt_adjust_timeout(struct rpc_timeout *);
 void			xprt_release(struct rpc_task *);
 void			xprt_reconnect(struct rpc_task *);
+int			xprt_clear_backlog(struct rpc_xprt *);
+
+int			xprt_tcp_pending(void);
 
 #endif /* __KERNEL__*/
 
diff -u --recursive --new-file v2.3.21/linux/include/linux/wanrouter.h linux/include/linux/wanrouter.h
--- v2.3.21/linux/include/linux/wanrouter.h	Wed Aug 18 16:45:49 1999
+++ linux/include/linux/wanrouter.h	Fri Oct 15 09:32:16 1999
@@ -305,6 +305,7 @@
 	char mc;			/* Multicast on or off */
 	char local_addr[WAN_ADDRESS_SZ+1];/* local media address, ASCIIZ */
 	unsigned char port;		/* board port */
+	unsigned char protocol;		/* prococol used in this channel (TCPOX25 or X25) */
 	int reserved[8];		/* reserved for future extensions */
 } wanif_conf_t;
 
diff -u --recursive --new-file v2.3.21/linux/init/main.c linux/init/main.c
--- v2.3.21/linux/init/main.c	Sat Oct  9 11:47:50 1999
+++ linux/init/main.c	Tue Oct 12 10:05:53 1999
@@ -632,15 +632,14 @@
 	/* Networking initialization needs a process context */ 
 	sock_init();
 
-	do_initcalls();
-
 #ifdef CONFIG_BLK_DEV_INITRD
-
 	real_root_dev = ROOT_DEV;
 	real_root_mountflags = root_mountflags;
 	if (initrd_start && mount_initrd) root_mountflags &= ~MS_RDONLY;
 	else mount_initrd =0;
 #endif
+
+	do_initcalls();
 
 	/* .. filesystems .. */
 	filesystem_setup();
diff -u --recursive --new-file v2.3.21/linux/kernel/ksyms.c linux/kernel/ksyms.c
--- v2.3.21/linux/kernel/ksyms.c	Tue Sep  7 12:14:07 1999
+++ linux/kernel/ksyms.c	Thu Oct 14 14:55:24 1999
@@ -364,6 +364,7 @@
 EXPORT_SYMBOL(get_random_bytes);
 EXPORT_SYMBOL(securebits);
 EXPORT_SYMBOL(cap_bset);
+EXPORT_SYMBOL(daemonize);
 
 /* Program loader interfaces */
 EXPORT_SYMBOL(setup_arg_pages);
@@ -423,3 +424,5 @@
 
 /* library functions */
 EXPORT_SYMBOL(strnicmp);
+
+EXPORT_SYMBOL(init_task_union);
diff -u --recursive --new-file v2.3.21/linux/kernel/sched.c linux/kernel/sched.c
--- v2.3.21/linux/kernel/sched.c	Thu Aug 26 13:05:42 1999
+++ linux/kernel/sched.c	Thu Oct 14 14:28:12 1999
@@ -510,6 +510,7 @@
 			printk(KERN_ERR "schedule_timeout: wrong timeout "
 			       "value %lx from %p\n", timeout,
 			       __builtin_return_address(0));
+			current->state = TASK_RUNNING;
 			goto out;
 		}
 	}
@@ -1181,7 +1182,7 @@
 static inline void do_process_times(struct task_struct *p,
 	unsigned long user, unsigned long system)
 {
-	long psecs;
+	unsigned long psecs;
 
 	psecs = (p->times.tms_utime += user);
 	psecs += (p->times.tms_stime += system);
@@ -1806,6 +1807,35 @@
 	for_each_task(p)
 		show_task(p);
 	read_unlock(&tasklist_lock);
+}
+
+/*
+ *	Put all the gunge required to become a kernel thread without
+ *	attached user resources in one place where it belongs.
+ */
+
+void daemonize(void)
+{
+	struct fs_struct *fs;
+
+
+	/*
+	 * If we were started as result of loading a module, close all of the
+	 * user space pages.  We don't need them, and if we didn't close them
+	 * they would be locked into memory.
+	 */
+	exit_mm(current);
+
+	current->session = 1;
+	current->pgrp = 1;
+
+	/* Become as one with the init task */
+
+	exit_fs(current);	/* current->fs->count--; */
+	fs = init_task.fs;
+	current->fs = fs;
+	atomic_inc(&fs->count);
+
 }
 
 void __init init_idle(void)
diff -u --recursive --new-file v2.3.21/linux/mm/mmap.c linux/mm/mmap.c
--- v2.3.21/linux/mm/mmap.c	Tue Sep  7 12:14:07 1999
+++ linux/mm/mmap.c	Wed Oct 13 15:12:26 1999
@@ -66,7 +66,6 @@
 	free += atomic_read(&page_cache_size);
 	free += nr_free_pages;
 	free += nr_swap_pages;
-	free -= (page_cache.min_percent + buffer_mem.min_percent + 2)*num_physpages/100; 
 	return free > pages;
 }
 
diff -u --recursive --new-file v2.3.21/linux/mm/page_io.c linux/mm/page_io.c
--- v2.3.21/linux/mm/page_io.c	Tue Aug 31 17:29:15 1999
+++ linux/mm/page_io.c	Wed Oct 13 10:32:35 1999
@@ -118,7 +118,7 @@
  	}
 
  	/* block_size == PAGE_SIZE/zones_used */
- 	brw_page(rw, page, dev, zones, block_size, 0);
+ 	brw_page(rw, page, dev, zones, block_size);
 
  	/* Note! For consistency we do all of the logic,
  	 * decrementing the page count, and unlocking the page in the
diff -u --recursive --new-file v2.3.21/linux/mm/swap_state.c linux/mm/swap_state.c
--- v2.3.21/linux/mm/swap_state.c	Tue Aug 31 17:29:15 1999
+++ linux/mm/swap_state.c	Thu Oct 14 08:41:19 1999
@@ -13,6 +13,7 @@
 #include <linux/swapctl.h>
 #include <linux/init.h>
 #include <linux/pagemap.h>
+#include <linux/smp_lock.h>
 
 #include <asm/pgtable.h>
 
@@ -234,7 +235,9 @@
 		   page_address(page), page_count(page), entry);
 #endif
 	remove_from_swap_cache (page);
+	lock_kernel();
 	swap_free (entry);
+	unlock_kernel();
 }
 
 static void delete_from_swap_cache_nolock(struct page *page)
diff -u --recursive --new-file v2.3.21/linux/net/Config.in linux/net/Config.in
--- v2.3.21/linux/net/Config.in	Fri Sep 10 23:57:37 1999
+++ linux/net/Config.in	Fri Oct 15 11:49:37 1999
@@ -5,85 +5,86 @@
 comment 'Networking options'
 tristate 'Packet socket' CONFIG_PACKET
 if [ "$CONFIG_PACKET" != "n" ]; then
-  bool 'Packet socket: mmapped IO' CONFIG_PACKET_MMAP
+   bool '  Packet socket: mmapped IO' CONFIG_PACKET_MMAP
 fi
 bool 'Kernel/User netlink socket' CONFIG_NETLINK
 if [ "$CONFIG_NETLINK" = "y" ]; then
-  bool 'Routing messages' CONFIG_RTNETLINK
-  tristate 'Netlink device emulation' CONFIG_NETLINK_DEV
+   bool '  Routing messages' CONFIG_RTNETLINK
+   tristate '  Netlink device emulation' CONFIG_NETLINK_DEV
 fi
 bool 'Network packet filtering (replaces ipchains)' CONFIG_NETFILTER
 if [ "$CONFIG_NETFILTER" = "y" ]; then
-  bool 'Network packet filtering debugging' CONFIG_NETFILTER_DEBUG
+   bool '  Network packet filtering debugging' CONFIG_NETFILTER_DEBUG
 fi
 bool 'Socket Filtering'  CONFIG_FILTER
 tristate 'Unix domain sockets' CONFIG_UNIX
 bool 'TCP/IP networking' CONFIG_INET
 if [ "$CONFIG_INET" = "y" ]; then
-  source net/ipv4/Config.in
-  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-#   Sorry, but IPv6 as module is still invalid.
-    tristate 'The IPv6 protocol (EXPERIMENTAL)' CONFIG_IPV6
-#   bool 'The IPv6 protocol (EXPERIMENTAL)' CONFIG_IPV6
-    if [ "$CONFIG_IPV6" != "n" ]; then
-	    source net/ipv6/Config.in
-    fi
-  fi
-  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-	source net/khttpd/Config.in
-  fi
+   source net/ipv4/Config.in
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+#   IPv6 as module will cause a CRASH if you try to unload it
+      tristate '  The IPv6 protocol (EXPERIMENTAL)' CONFIG_IPV6
+      if [ "$CONFIG_IPV6" != "n" ]; then
+	 source net/ipv6/Config.in
+      fi
+   fi
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+      source net/khttpd/Config.in
+   fi
 fi
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  bool 'Asynchronous Transfer Mode (ATM, EXPERIMENTAL)' CONFIG_ATM y
-  if [ "$CONFIG_ATM" = "y" ]; then
-    if [ "$CONFIG_INET" = "y" ]; then
-      bool '  Classical IP over ATM' CONFIG_ATM_CLIP y
-      if [ "$CONFIG_ATM_CLIP" = "y" ]; then
-	bool '    Do NOT send ICMP if no neighbour' CONFIG_ATM_CLIP_NO_ICMP n
+   bool 'Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)' CONFIG_ATM
+   if [ "$CONFIG_ATM" = "y" ]; then
+      if [ "$CONFIG_INET" = "y" ]; then
+	 bool '  Classical IP over ATM' CONFIG_ATM_CLIP
+	 if [ "$CONFIG_ATM_CLIP" = "y" ]; then
+	    bool '    Do NOT send ICMP if no neighbour' CONFIG_ATM_CLIP_NO_ICMP
+	 fi
+      fi
+      tristate '  LAN Emulation (LANE) support' CONFIG_ATM_LANE
+      if [ "$CONFIG_INET" = "y" -a "$CONFIG_ATM_LANE" != "n" ]; then
+	 tristate '    Multi-Protocol Over ATM (MPOA) support' CONFIG_ATM_MPOA
       fi
-    fi
-    tristate '  LAN Emulation (LANE) support' CONFIG_ATM_LANE y
-    if [ "$CONFIG_INET" = "y" -a "$CONFIG_ATM_LANE" != "n" ]; then
-      tristate '  Multi-Protocol Over ATM (MPOA) support' CONFIG_ATM_MPOA y
-    fi
-  fi
+   fi
 fi
 
 comment ' '
 tristate 'The IPX protocol' CONFIG_IPX
 if [ "$CONFIG_IPX" != "n" ]; then
-  source net/ipx/Config.in
+   source net/ipx/Config.in
 fi
 tristate 'Appletalk DDP' CONFIG_ATALK
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'DECnet Support (EXPERIMENTAL)' CONFIG_DECNET
-  if [ "$CONFIG_DECNET" != "n" ]; then
-    source net/decnet/Config.in
-  fi
-  tristate 'CCITT X.25 Packet Layer (EXPERIMENTAL)' CONFIG_X25
-  tristate 'LAPB Data Link Driver (EXPERIMENTAL)' CONFIG_LAPB
-  bool 'Bridging (EXPERIMENTAL)' CONFIG_BRIDGE
-  bool '802.2 LLC (EXPERIMENTAL)' CONFIG_LLC
-#  if [ "$CONFIG_LLC" = "y" ]; then
-#   bool 'Netbeui (EXPERIMENTAL)' CONFIG_NETBEUI
-#  fi
-  tristate 'Acorn Econet/AUN protocols (EXPERIMENTAL)' CONFIG_ECONET
-  if [ "$CONFIG_ECONET" != "n" ]; then
-    bool '  AUN over UDP' CONFIG_ECONET_AUNUDP
-    bool '  Native Econet' CONFIG_ECONET_NATIVE
-  fi
-  tristate 'WAN router' CONFIG_WAN_ROUTER
-  bool 'Fast switching (read help!)' CONFIG_NET_FASTROUTE
-  bool 'Forwarding between high speed interfaces' CONFIG_NET_HW_FLOWCONTROL
-  if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  mainmenu_option next_comment
-  comment 'QoS and/or fair queueing'
-  bool 'QoS and/or fair queueing' CONFIG_NET_SCHED
-  if [ "$CONFIG_NET_SCHED" = "y" ]; then
-    source net/sched/Config.in
-  fi
-#  bool 'Network code profiler' CONFIG_NET_PROFILE
-  endmenu
-  fi
+   tristate 'DECnet Support (EXPERIMENTAL)' CONFIG_DECNET
+   if [ "$CONFIG_DECNET" != "n" ]; then
+      source net/decnet/Config.in
+   fi
+   tristate 'CCITT X.25 Packet Layer (EXPERIMENTAL)' CONFIG_X25
+   tristate 'LAPB Data Link Driver (EXPERIMENTAL)' CONFIG_LAPB
+   bool 'Bridging (EXPERIMENTAL)' CONFIG_BRIDGE
+   bool '802.2 LLC (EXPERIMENTAL)' CONFIG_LLC
+#   if [ "$CONFIG_LLC" = "y" ]; then
+#      bool '  Netbeui (EXPERIMENTAL)' CONFIG_NETBEUI
+#   fi
+   if [ "$CONFIG_INET" = "y" ]; then
+      tristate 'Acorn Econet/AUN protocols (EXPERIMENTAL)' CONFIG_ECONET
+   fi
+   if [ "$CONFIG_ECONET" != "n" ]; then
+      bool '  AUN over UDP' CONFIG_ECONET_AUNUDP
+      bool '  Native Econet' CONFIG_ECONET_NATIVE
+   fi
+   tristate 'WAN router' CONFIG_WAN_ROUTER
+   bool 'Fast switching (read help!)' CONFIG_NET_FASTROUTE
+   bool 'Forwarding between high speed interfaces' CONFIG_NET_HW_FLOWCONTROL
+   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+      mainmenu_option next_comment
+      comment 'QoS and/or fair queueing'
+      bool 'QoS and/or fair queueing (EXPERIMENTAL)' CONFIG_NET_SCHED
+      if [ "$CONFIG_NET_SCHED" = "y" ]; then
+	 source net/sched/Config.in
+      fi
+#      bool 'Network code profiler' CONFIG_NET_PROFILE
+      endmenu
+   fi
 fi
 endmenu
diff -u --recursive --new-file v2.3.21/linux/net/ax25/Config.in linux/net/ax25/Config.in
--- v2.3.21/linux/net/ax25/Config.in	Wed Aug  4 09:27:34 1999
+++ linux/net/ax25/Config.in	Thu Oct 14 14:22:09 1999
@@ -10,21 +10,26 @@
 comment 'Amateur Radio support'
 bool 'Amateur Radio support' CONFIG_HAMRADIO
 
-if [ "$CONFIG_HAMRADIO" != "n" ] ; then
-  if [ "$CONFIG_NET" != "n" ] ; then
-    comment 'Packet Radio protocols'
-    tristate 'Amateur Radio AX.25 Level 2 protocol' CONFIG_AX25
-    if [ "$CONFIG_AX25" != "n" ]; then
-      bool '   AX.25 DAMA Slave support' CONFIG_AX25_DAMA_SLAVE
-#     bool '   AX.25 DAMA Master support' CONFIG_AX25_DAMA_MASTER
-      dep_tristate '   Amateur Radio NET/ROM protocol' CONFIG_NETROM $CONFIG_AX25
-      dep_tristate '   Amateur Radio X.25 PLP (Rose)' CONFIG_ROSE $CONFIG_AX25
-    fi
+if [ "$CONFIG_HAMRADIO" != "n" ]; then
+   if [ "$CONFIG_NET" != "n" ]; then
+      comment 'Packet Radio protocols'
+      tristate '  Amateur Radio AX.25 Level 2 protocol' CONFIG_AX25
+      if [ "$CONFIG_AX25" != "n" ]; then
+	 bool '    AX.25 DAMA Slave support' CONFIG_AX25_DAMA_SLAVE
+#	 bool '    AX.25 DAMA Master support' CONFIG_AX25_DAMA_MASTER
+	 dep_tristate '    Amateur Radio NET/ROM protocol' CONFIG_NETROM $CONFIG_AX25
+	 dep_tristate '    Amateur Radio X.25 PLP (Rose)' CONFIG_ROSE $CONFIG_AX25
+      fi
 
-    if [ "$CONFIG_AX25" != "n" ]; then
-      source drivers/net/hamradio/Config.in
-    fi
-  fi
+      if [ "$CONFIG_AX25" != "n" ]; then
+	 mainmenu_option next_comment
+	 comment 'AX.25 network device drivers'
+
+	 source drivers/net/hamradio/Config.in
+
+	 endmenu
+      fi
+   fi
 
 fi
 
diff -u --recursive --new-file v2.3.21/linux/net/core/dev.c linux/net/core/dev.c
--- v2.3.21/linux/net/core/dev.c	Tue Aug 31 17:29:15 1999
+++ linux/net/core/dev.c	Thu Oct 14 14:22:09 1999
@@ -1327,7 +1327,7 @@
 			       stats->qual.level,
 			       stats->qual.updated & 2 ? '.' : ' ',
 			       stats->qual.noise,
-			       stats->qual.updated & 3 ? '.' : ' ',
+			       stats->qual.updated & 4 ? '.' : ' ',
 			       stats->discard.nwid,
 			       stats->discard.code,
 			       stats->discard.misc);
diff -u --recursive --new-file v2.3.21/linux/net/decnet/Config.in linux/net/decnet/Config.in
--- v2.3.21/linux/net/decnet/Config.in	Thu Aug 26 13:05:45 1999
+++ linux/net/decnet/Config.in	Thu Oct 14 14:22:09 1999
@@ -1,6 +1,8 @@
 #
 # DECnet configuration
 #
-bool 'DECnet: SIOCGIFCONF support' CONFIG_DECNET_SIOCGIFCONF 
-bool 'DECnet: router support (VERY VERY EXPERIMENTAL)' CONFIG_DECNET_ROUTER
-bool 'DECnet: raw socket support' CONFIG_DECNET_RAW
+bool '  DECnet: SIOCGIFCONF support' CONFIG_DECNET_SIOCGIFCONF 
+if [ "$CONFIG_EXPERIMENTAL" ]; then
+   bool '  DECnet: router support (EXPERIMENTAL)' CONFIG_DECNET_ROUTER
+fi
+bool '  DECnet: raw socket support' CONFIG_DECNET_RAW
diff -u --recursive --new-file v2.3.21/linux/net/ipv4/Config.in linux/net/ipv4/Config.in
--- v2.3.21/linux/net/ipv4/Config.in	Thu Aug 26 13:05:45 1999
+++ linux/net/ipv4/Config.in	Fri Oct 15 11:49:37 1999
@@ -1,56 +1,55 @@
 #
 # IP configuration
 #
-bool 'IP: multicasting' CONFIG_IP_MULTICAST
-bool 'IP: advanced router' CONFIG_IP_ADVANCED_ROUTER
+bool '  IP: multicasting' CONFIG_IP_MULTICAST
+bool '  IP: advanced router' CONFIG_IP_ADVANCED_ROUTER
 if [ "$CONFIG_IP_ADVANCED_ROUTER" = "y" ]; then
-  define_bool CONFIG_RTNETLINK y	
-  define_bool CONFIG_NETLINK y
-  bool 'IP: policy routing' CONFIG_IP_MULTIPLE_TABLES
-  bool 'IP: equal cost multipath' CONFIG_IP_ROUTE_MULTIPATH
-  bool 'IP: use TOS value as routing key' CONFIG_IP_ROUTE_TOS
-  bool 'IP: verbose route monitoring' CONFIG_IP_ROUTE_VERBOSE
-  bool 'IP: large routing tables' CONFIG_IP_ROUTE_LARGE_TABLES
-  if [ "$CONFIG_IP_MULTIPLE_TABLES" = "y" ]; then
-    bool 'IP: fast network address translation' CONFIG_IP_ROUTE_NAT
-  fi
+   define_bool CONFIG_RTNETLINK y	
+   define_bool CONFIG_NETLINK y
+   bool '    IP: policy routing' CONFIG_IP_MULTIPLE_TABLES
+   if [ "$CONFIG_IP_MULTIPLE_TABLES" = "y" ]; then
+      bool '  IP: use FWMARK value as routing key' CONFIG_IP_ROUTE_FWMARK
+   fi
+   bool '    IP: equal cost multipath' CONFIG_IP_ROUTE_MULTIPATH
+   bool '    IP: use TOS value as routing key' CONFIG_IP_ROUTE_TOS
+   bool '    IP: verbose route monitoring' CONFIG_IP_ROUTE_VERBOSE
+   bool '    IP: large routing tables' CONFIG_IP_ROUTE_LARGE_TABLES
+   if [ "$CONFIG_IP_MULTIPLE_TABLES" = "y" ]; then
+      bool '      IP: fast network address translation' CONFIG_IP_ROUTE_NAT
+   fi
 fi
-if [ "$CONFIG_IP_MULTIPLE_TABLES" = "y" ]; then
-  bool 'IP: use FWMARK value as routing key' CONFIG_IP_ROUTE_FWMARK
-fi
-bool 'IP: kernel level autoconfiguration' CONFIG_IP_PNP
+bool '  IP: kernel level autoconfiguration' CONFIG_IP_PNP
 if [ "$CONFIG_IP_PNP" = "y" ]; then
-  bool '      BOOTP support' CONFIG_IP_PNP_BOOTP
-  bool '      RARP support' CONFIG_IP_PNP_RARP
+   bool '    BOOTP support' CONFIG_IP_PNP_BOOTP
+   bool '    RARP support' CONFIG_IP_PNP_RARP
 # not yet ready..
-#  bool '      ARP support' CONFIG_IP_PNP_ARP		
+#   bool '    ARP support' CONFIG_IP_PNP_ARP		
 fi
-bool 'IP: optimize as router not host' CONFIG_IP_ROUTER
-tristate 'IP: tunneling' CONFIG_NET_IPIP
-tristate 'IP: GRE tunnels over IP' CONFIG_NET_IPGRE
+bool '  IP: optimize as router not host' CONFIG_IP_ROUTER
+tristate '  IP: tunneling' CONFIG_NET_IPIP
+tristate '  IP: GRE tunnels over IP' CONFIG_NET_IPGRE
 if [ "$CONFIG_IP_MULTICAST" = "y" ]; then
-  if [ "$CONFIG_NET_IPGRE" != "n" ]; then
-    bool 'IP: broadcast GRE over IP' CONFIG_NET_IPGRE_BROADCAST
-  fi
-  bool 'IP: multicast routing' CONFIG_IP_MROUTE
-  if [ "$CONFIG_IP_MROUTE" = "y" ]; then
-    bool 'IP: PIM-SM version 1 support' CONFIG_IP_PIMSM_V1
-    bool 'IP: PIM-SM version 2 support' CONFIG_IP_PIMSM_V2
-  fi
+   if [ "$CONFIG_NET_IPGRE" != "n" ]; then
+      bool '    IP: broadcast GRE over IP' CONFIG_NET_IPGRE_BROADCAST
+   fi
+   bool '  IP: multicast routing' CONFIG_IP_MROUTE
+   if [ "$CONFIG_IP_MROUTE" = "y" ]; then
+      bool '    IP: PIM-SM version 1 support' CONFIG_IP_PIMSM_V1
+      bool '    IP: PIM-SM version 2 support' CONFIG_IP_PIMSM_V2
+   fi
 fi
-bool 'IP: aliasing support' CONFIG_IP_ALIAS
+bool '  IP: aliasing support' CONFIG_IP_ALIAS
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  if [ "$CONFIG_RTNETLINK" = "y" ]; then
-    bool 'IP: ARP daemon support (EXPERIMENTAL)' CONFIG_ARPD
-  fi
+   if [ "$CONFIG_RTNETLINK" = "y" ]; then
+      bool '  IP: ARP daemon support (EXPERIMENTAL)' CONFIG_ARPD
+   fi
 fi
-bool 'IP: TCP syncookie support (not enabled per default)' CONFIG_SYN_COOKIES
+bool '  IP: TCP syncookie support (disabled per default)' CONFIG_SYN_COOKIES
 comment '(it is safe to leave these untouched)'
-#bool 'IP: PC/TCP compatibility mode' CONFIG_INET_PCTCP
-#bool 'IP: Path MTU Discovery (normally enabled)' CONFIG_PATH_MTU_DISCOVERY
-#bool 'IP: Disable NAGLE algorithm (normally enabled)' CONFIG_TCP_NAGLE_OFF
-bool 'IP: Allow large windows (not recommended if <16Mb of memory)' CONFIG_SKB_LARGE
+#bool '  IP: PC/TCP compatibility mode' CONFIG_INET_PCTCP
+#bool '  IP: Path MTU Discovery (normally enabled)' CONFIG_PATH_MTU_DISCOVERY
+#bool '  IP: Disable NAGLE algorithm (normally enabled)' CONFIG_TCP_NAGLE_OFF
+bool '  IP: Allow large windows (not recommended if <16Mb of memory)' CONFIG_SKB_LARGE
 #if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then 
-#bool 'IP: support experimental checksum copy to user for UDP'  CONFIG_UDP_DELAY_CSUM
+#   bool '  IP: support checksum copy to user for UDP (EXPERIMENTAL)'  CONFIG_UDP_DELAY_CSUM
 #fi
-
diff -u --recursive --new-file v2.3.21/linux/net/ipv6/Config.in linux/net/ipv6/Config.in
--- v2.3.21/linux/net/ipv6/Config.in	Thu Feb 19 14:46:16 1998
+++ linux/net/ipv6/Config.in	Fri Oct 15 11:49:37 1999
@@ -1,14 +1,14 @@
 #
 # IPv6 configuration
 # 
-bool 'IPv6: enable EUI-64 token format' CONFIG_IPV6_EUI64
+bool '    IPv6: enable EUI-64 token format' CONFIG_IPV6_EUI64
 if [ "$CONFIG_IPV6_EUI64" = "y" ]; then
-  bool 'IPv6: disable provider based addresses' CONFIG_IPV6_NO_PB
+   bool '    IPv6: disable provider based addresses' CONFIG_IPV6_NO_PB
 fi
 if [ "$CONFIG_NETLINK" = "y" ]; then
-  if [ "$CONFIG_RTNETLINK" = "n" ]; then
-    bool 'IPv6: routing messages via old netlink' CONFIG_IPV6_NETLINK
-  fi
+   if [ "$CONFIG_RTNETLINK" = "n" ]; then
+      bool '    IPv6: routing messages via old netlink' CONFIG_IPV6_NETLINK
+   fi
 fi
-#bool 'IPv6: flow policy support' CONFIG_RT6_POLICY
-#bool 'IPv6: firewall support' CONFIG_IPV6_FIREWALL
+#bool '    IPv6: flow policy support' CONFIG_RT6_POLICY
+#bool '    IPv6: firewall support' CONFIG_IPV6_FIREWALL
diff -u --recursive --new-file v2.3.21/linux/net/ipx/af_spx.c linux/net/ipx/af_spx.c
--- v2.3.21/linux/net/ipx/af_spx.c	Tue Sep  7 12:14:07 1999
+++ linux/net/ipx/af_spx.c	Thu Oct 14 14:22:09 1999
@@ -15,6 +15,11 @@
  *				made static the ipx ops. Removed the hack
  *				ipx methods interface. Dropped AF_SPX - its
  *				the wrong abstraction.
+ *	Eduardo Trapani	:	Added a check for the return value of
+ *				ipx_if_offset that crashed sock_alloc_send_skb.
+ *				Added spx_datagram_poll() so that select()
+ *				works now on SPX sockets.  Added updating
+ *				of the alloc count to follow rmt_seq.
  *
  *	This program is free software; you can redistribute it and/or
  *      modify it under the terms of the GNU General Public License
@@ -36,6 +41,7 @@
 #include <asm/uaccess.h>
 #include <linux/uio.h>
 #include <linux/unistd.h>
+#include <linux/poll.h>
 
 static struct proto_ops *ipx_operations;
 static struct proto_ops spx_ops;
@@ -49,6 +55,45 @@
 
 extern void ipx_remove_socket(struct sock *sk);
 
+/* Datagram poll:	the same code as datagram_poll() in net/core
+			but the right spx buffers are looked at and
+			there is no question on the type of the socket
+			*/
+static unsigned int spx_datagram_poll(struct file * file, struct socket *sock, poll_table *wait)
+{
+	struct sock *sk = sock->sk;
+	struct spx_opt *pdata = &sk->tp_pinfo.af_spx;
+	unsigned int mask;
+
+	poll_wait(file, sk->sleep, wait);
+	mask = 0;
+
+	/* exceptional events? */
+	if (sk->err || !skb_queue_empty(&sk->error_queue))
+		mask |= POLLERR;
+	if (sk->shutdown & RCV_SHUTDOWN)
+		mask |= POLLHUP;
+
+	/* readable? */
+	if (!skb_queue_empty(&pdata->rcv_queue))
+		mask |= POLLIN | POLLRDNORM;
+
+	/* Need to check for termination and startup */
+	if (sk->state==TCP_CLOSE)
+		mask |= POLLHUP;
+	/* connection hasn't started yet? */
+	if (sk->state == TCP_SYN_SENT)
+		return mask;
+
+	/* writable? */
+	if (sock_writeable(sk))
+		mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
+	else
+		sk->socket->flags |= SO_NOSPACE;
+
+	return mask;
+}
+
 /* Create the SPX specific data */
 static int spx_sock_init(struct sock *sk)
 {
@@ -390,6 +435,9 @@
 		int offset  = ipx_if_offset(pdata->dest_addr.net);
         	int size    = offset + sizeof(struct ipxspxhdr);
 
+        	if (offset < 0) /* ENETUNREACH */
+        		return(-ENETUNREACH);
+
 		save_flags(flags);
 		cli();
         	skb = sock_alloc_send_skb(sk, size, 1, 0, &err);
@@ -649,6 +697,7 @@
 			{
 				pdata->rmt_seq = ntohs(ipxh->spx.sequence);
 				pdata->rmt_ack = ntohs(ipxh->spx.ackseq);
+				pdata->alloc   = pdata->rmt_seq + 3;
 				if(pdata->rmt_ack > 0 || pdata->rmt_ack == 0)
 					spx_retransmit_chk(pdata,pdata->rmt_ack, ACK);
 
@@ -842,7 +891,7 @@
         sock_no_socketpair,
         spx_accept,
 	spx_getname,
-        datagram_poll,  /* this does seqpacket too */
+        spx_datagram_poll,
 	spx_ioctl,
         spx_listen,
         sock_no_shutdown,
diff -u --recursive --new-file v2.3.21/linux/net/khttpd/Config.in linux/net/khttpd/Config.in
--- v2.3.21/linux/net/khttpd/Config.in	Wed Aug 18 09:45:10 1999
+++ linux/net/khttpd/Config.in	Thu Oct 14 14:22:09 1999
@@ -1,4 +1,4 @@
 #
 # kHTTPd
 #
-tristate 'Kernel httpd acceleration (experimental)' CONFIG_KHTTPD
+tristate '  Kernel httpd acceleration (EXPERIMENTAL)' CONFIG_KHTTPD
diff -u --recursive --new-file v2.3.21/linux/net/sched/Config.in linux/net/sched/Config.in
--- v2.3.21/linux/net/sched/Config.in	Thu Aug 26 13:05:46 1999
+++ linux/net/sched/Config.in	Fri Oct 15 11:49:37 1999
@@ -8,7 +8,7 @@
 #tristate 'H-PFQ packet scheduler' CONFIG_NET_SCH_HPFQ
 #tristate 'H-FSC packet scheduler' CONFIG_NET_SCH_HFCS
 if [ "$CONFIG_ATM" = "y" ]; then
-    bool 'ATM pseudo-scheduler' CONFIG_NET_SCH_ATM
+   bool 'ATM pseudo-scheduler' CONFIG_NET_SCH_ATM
 fi
 tristate 'The simplest PRIO pseudoscheduler' CONFIG_NET_SCH_PRIO
 tristate 'RED queue' CONFIG_NET_SCH_RED
@@ -17,20 +17,20 @@
 tristate 'TBF queue' CONFIG_NET_SCH_TBF
 bool 'QoS support' CONFIG_NET_QOS
 if [ "$CONFIG_NET_QOS" = "y" ]; then
-    bool 'Rate estimator' CONFIG_NET_ESTIMATOR
+    bool '  Rate estimator' CONFIG_NET_ESTIMATOR
 fi
 bool 'Packet classifier API' CONFIG_NET_CLS
 if [ "$CONFIG_NET_CLS" = "y" ]; then
-  tristate 'Routing table based classifier' CONFIG_NET_CLS_ROUTE4
-  if [ "$CONFIG_NET_CLS_ROUTE4" != "n" ]; then
-    define_bool CONFIG_NET_CLS_ROUTE y
-  fi
-  tristate 'Firewall based classifier' CONFIG_NET_CLS_FW
-  tristate 'U32 classifier' CONFIG_NET_CLS_U32
-  if [ "$CONFIG_NET_QOS" = "y" ]; then
-    tristate 'Special RSVP classifier' CONFIG_NET_CLS_RSVP
-    tristate 'Special RSVP classifier for IPv6' CONFIG_NET_CLS_RSVP6
-    bool 'Ingres traffic policing' CONFIG_NET_CLS_POLICE
-  fi
+   tristate '  Routing table based classifier' CONFIG_NET_CLS_ROUTE4
+   if [ "$CONFIG_NET_CLS_ROUTE4" != "n" ]; then
+      define_bool CONFIG_NET_CLS_ROUTE y
+   fi
+   tristate '  Firewall based classifier' CONFIG_NET_CLS_FW
+   tristate '  U32 classifier' CONFIG_NET_CLS_U32
+   if [ "$CONFIG_NET_QOS" = "y" ]; then
+      tristate '  Special RSVP classifier' CONFIG_NET_CLS_RSVP
+      tristate '  Special RSVP classifier for IPv6' CONFIG_NET_CLS_RSVP6
+      bool '  Ingres traffic policing' CONFIG_NET_CLS_POLICE
+   fi
 fi
 
diff -u --recursive --new-file v2.3.21/linux/net/sunrpc/auth.c linux/net/sunrpc/auth.c
--- v2.3.21/linux/net/sunrpc/auth.c	Tue Jun  1 23:25:48 1999
+++ linux/net/sunrpc/auth.c	Fri Oct 15 08:45:36 1999
@@ -15,6 +15,7 @@
 #include <linux/errno.h>
 #include <linux/socket.h>
 #include <linux/sunrpc/clnt.h>
+#include <linux/spinlock.h>
 
 #ifdef RPC_DEBUG
 # define RPCDBG_FACILITY	RPCDBG_AUTH
@@ -71,6 +72,8 @@
 	auth->au_ops->destroy(auth);
 }
 
+spinlock_t rpc_credcache_lock = SPIN_LOCK_UNLOCKED;
+
 /*
  * Initialize RPC credential cache
  */
@@ -94,6 +97,7 @@
 	if (!(destroy = auth->au_ops->crdestroy))
 		destroy = (void (*)(struct rpc_cred *)) rpc_free;
 
+	spin_lock(&rpc_credcache_lock);
 	for (i = 0; i < RPC_CREDCACHE_NR; i++) {
 		q = &auth->au_credcache[i];
 		while ((cred = *q) != NULL) {
@@ -101,6 +105,7 @@
 			destroy(cred);
 		}
 	}
+	spin_unlock(&rpc_credcache_lock);
 }
 
 /*
@@ -113,6 +118,7 @@
 	int		i, safe = 0;
 
 	dprintk("RPC: gc'ing RPC credentials for auth %p\n", auth);
+	spin_lock(&rpc_credcache_lock);
 	for (i = 0; i < RPC_CREDCACHE_NR; i++) {
 		q = &auth->au_credcache[i];
 		while ((cred = *q) != NULL) {
@@ -129,6 +135,7 @@
 			q = &cred->cr_next;
 		}
 	}
+	spin_unlock(&rpc_credcache_lock);
 	while ((cred = free) != NULL) {
 		free = cred->cr_next;
 		rpc_free(cred);
@@ -145,10 +152,12 @@
 	int		nr;
 
 	nr = (cred->cr_uid % RPC_CREDCACHE_NR);
+	spin_lock(&rpc_credcache_lock);
 	cred->cr_next = auth->au_credcache[nr];
 	auth->au_credcache[nr] = cred;
 	cred->cr_expire = jiffies + auth->au_expire;
 	cred->cr_count++;
+	spin_unlock(&rpc_credcache_lock);
 }
 
 /*
@@ -166,6 +175,7 @@
 	if (time_before(auth->au_nextgc, jiffies))
 		rpcauth_gc_credcache(auth);
 
+	spin_lock(&rpc_credcache_lock);
 	q = &auth->au_credcache[nr];
 	while ((cred = *q) != NULL) {
 		if (auth->au_ops->crmatch(task, cred)) {
@@ -174,6 +184,7 @@
 		}
 		q = &cred->cr_next;
 	}
+	spin_unlock(&rpc_credcache_lock);
 
 	if (!cred)
 		cred = auth->au_ops->crcreate(task);
@@ -194,6 +205,7 @@
 	int		nr;
 
 	nr = (cred->cr_uid % RPC_CREDCACHE_NR);
+	spin_lock(&rpc_credcache_lock);
 	q = &auth->au_credcache[nr];
 	while ((cr = *q) != NULL) {
 		if (cred == cr) {
@@ -202,6 +214,7 @@
 		}
 		q = &cred->cr_next;
 	}
+	spin_unlock(&rpc_credcache_lock);
 }
 
 struct rpc_cred *
diff -u --recursive --new-file v2.3.21/linux/net/sunrpc/sched.c linux/net/sunrpc/sched.c
--- v2.3.21/linux/net/sunrpc/sched.c	Tue May 11 14:37:40 1999
+++ linux/net/sunrpc/sched.c	Fri Oct 15 09:26:19 1999
@@ -18,6 +18,7 @@
 #include <linux/unistd.h>
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
+#include <linux/spinlock.h>
 
 #include <linux/sunrpc/clnt.h>
 
@@ -74,6 +75,16 @@
 static int			swap_buffer_used = 0;
 
 /*
+ * Spinlock for wait queues. Access to the latter also has to be
+ * interrupt-safe in order to allow timers to wake up sleeping tasks.
+ */
+spinlock_t rpc_queue_lock = SPIN_LOCK_UNLOCKED;
+/*
+ * Spinlock for other critical sections of code.
+ */
+spinlock_t rpc_sched_lock = SPIN_LOCK_UNLOCKED;
+
+/*
  * Add new request to wait queue.
  *
  * Swapper tasks always get inserted at the head of the queue.
@@ -81,8 +92,8 @@
  * improve overall performance.
  * Everyone else gets appended to the queue to ensure proper FIFO behavior.
  */
-int
-rpc_add_wait_queue(struct rpc_wait_queue *queue, struct rpc_task *task)
+static int
+__rpc_add_wait_queue(struct rpc_wait_queue *queue, struct rpc_task *task)
 {
 	if (task->tk_rpcwait) {
 		if (task->tk_rpcwait != queue)
@@ -104,12 +115,24 @@
 	return 0;
 }
 
+int
+rpc_add_wait_queue(struct rpc_wait_queue *q, struct rpc_task *task)
+{
+	unsigned long oldflags;
+	int result;
+
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
+	result = __rpc_add_wait_queue(q, task);
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
+	return result;
+}
+
 /*
  * Remove request from queue.
- * Note: must be called with interrupts disabled.
+ * Note: must be called with spin lock held.
  */
-void
-rpc_remove_wait_queue(struct rpc_task *task)
+static void
+__rpc_remove_wait_queue(struct rpc_task *task)
 {
 	struct rpc_wait_queue *queue;
 
@@ -122,6 +145,16 @@
 				task->tk_pid, queue, rpc_qname(queue));
 }
 
+void
+rpc_remove_wait_queue(struct rpc_task *task)
+{
+	unsigned long oldflags;
+
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
+	__rpc_remove_wait_queue(task);
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
+}
+
 /*
  * Set up a timer for the current task.
  */
@@ -165,7 +198,7 @@
  * Make an RPC task runnable.
  *
  * Note: If the task is ASYNC, this must be called with 
- * interrupts disabled to protect the wait queue operation.
+ * the spinlock held to protect the wait queue operation.
  */
 static inline void
 rpc_make_runnable(struct rpc_task *task)
@@ -177,7 +210,7 @@
 	task->tk_flags |= RPC_TASK_RUNNING;
 	if (RPC_IS_ASYNC(task)) {
 		int status;
-		status = rpc_add_wait_queue(&schedq, task);
+		status = __rpc_add_wait_queue(&schedq, task);
 		if (status)
 		{
 			printk(KERN_WARNING "RPC: failed to add task to queue: error: %d!\n", status);
@@ -214,18 +247,12 @@
 __rpc_sleep_on(struct rpc_wait_queue *q, struct rpc_task *task,
 			rpc_action action, rpc_action timer)
 {
-	unsigned long	oldflags;
 	int status;
 
 	dprintk("RPC: %4d sleep_on(queue \"%s\" time %ld)\n", task->tk_pid,
 				rpc_qname(q), jiffies);
 
-	/*
-	 * Protect the execution below.
-	 */
-	save_flags(oldflags); cli();
-
-	status = rpc_add_wait_queue(q, task);
+	status = __rpc_add_wait_queue(q, task);
 	if (status)
 	{
 		printk(KERN_WARNING "RPC: failed to add task to queue: error: %d!\n", status);
@@ -240,7 +267,6 @@
 		task->tk_flags &= ~RPC_TASK_RUNNING;
 	}
 
-	restore_flags(oldflags);
 	return;
 }
 
@@ -248,11 +274,17 @@
 rpc_sleep_on(struct rpc_wait_queue *q, struct rpc_task *task,
 				rpc_action action, rpc_action timer)
 {
+	unsigned long	oldflags;
+	/*
+	 * Protect the queue operations.
+	 */
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
 	__rpc_sleep_on(q, task, action, timer);
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 }
 
 /*
- * Wake up a single task -- must be invoked with bottom halves off.
+ * Wake up a single task -- must be invoked with spin lock held.
  *
  * It would probably suffice to cli/sti the del_timer and remove_wait_queue
  * operations individually.
@@ -272,7 +304,7 @@
 #endif
 	rpc_del_timer(task);
 	if (task->tk_rpcwait != &schedq)
-		rpc_remove_wait_queue(task);
+		__rpc_remove_wait_queue(task);
 	if (!RPC_IS_RUNNING(task)) {
 		task->tk_flags |= RPC_TASK_CALLBACK;
 		rpc_make_runnable(task);
@@ -289,7 +321,7 @@
 	dprintk("RPC: %d timeout (default timer)\n", task->tk_pid);
 	task->tk_status = -ETIMEDOUT;
 	task->tk_timeout = 0;
-	__rpc_wake_up(task);
+	rpc_wake_up_task(task);
 }
 
 /*
@@ -300,9 +332,9 @@
 {
 	unsigned long	oldflags;
 
-	save_flags(oldflags); cli();
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
 	__rpc_wake_up(task);
-	restore_flags(oldflags);
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 }
 
 /*
@@ -315,10 +347,10 @@
 	struct rpc_task	*task;
 
 	dprintk("RPC:      wake_up_next(%p \"%s\")\n", queue, rpc_qname(queue));
-	save_flags(oldflags); cli();
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
 	if ((task = queue->task) != 0)
 		__rpc_wake_up(task);
-	restore_flags(oldflags);
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 
 	return task;
 }
@@ -331,10 +363,10 @@
 {
 	unsigned long	oldflags;
 
-	save_flags(oldflags); cli();
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
 	while (queue->task)
 		__rpc_wake_up(queue->task);
-	restore_flags(oldflags);
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 }
 
 /*
@@ -346,12 +378,12 @@
 	struct rpc_task	*task;
 	unsigned long	oldflags;
 
-	save_flags(oldflags); cli();
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
 	while ((task = queue->task) != NULL) {
 		task->tk_status = status;
 		__rpc_wake_up(task);
 	}
-	restore_flags(oldflags);
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 }
 
 /*
@@ -369,7 +401,7 @@
 __rpc_atrun(struct rpc_task *task)
 {
 	task->tk_status = 0;
-	__rpc_wake_up(task);
+	rpc_wake_up_task(task);
 }
 
 /*
@@ -432,13 +464,13 @@
 		 * and the RPC reply arrives before we get here, it will
 		 * have state RUNNING, but will still be on schedq.
 		 */
-		save_flags(oldflags); cli();
+		spin_lock_irqsave(&rpc_queue_lock, oldflags);
 		if (RPC_IS_RUNNING(task)) {
 			if (task->tk_rpcwait == &schedq)
-				rpc_remove_wait_queue(task);
+				__rpc_remove_wait_queue(task);
 		} else while (!RPC_IS_RUNNING(task)) {
 			if (RPC_IS_ASYNC(task)) {
-				restore_flags(oldflags);
+				spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 				return 0;
 			}
 
@@ -448,9 +480,9 @@
 			if (current->pid == rpciod_pid)
 				printk(KERN_ERR "RPC: rpciod waiting on sync task!\n");
 
-			sti();
+			spin_unlock_irq(&rpc_queue_lock);
 			__wait_event(task->tk_wait, RPC_IS_RUNNING(task));
-			cli();
+			spin_lock_irq(&rpc_queue_lock);
 
 			/*
 			 * When the task received a signal, remove from
@@ -462,7 +494,7 @@
 			dprintk("RPC: %4d sync task resuming\n",
 							task->tk_pid);
 		}
-		restore_flags(oldflags);
+		spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 
 		/*
 		 * When a sync task receives a signal, it exits with
@@ -522,15 +554,16 @@
 	int need_resched = current->need_resched;
 
 	dprintk("RPC:      rpc_schedule enter\n");
-	save_flags(oldflags);
 	while (1) {
-		cli();
-		if (!(task = schedq.task))
+		spin_lock_irqsave(&rpc_queue_lock, oldflags);
+		if (!(task = schedq.task)) {
+			spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 			break;
+		}
 		rpc_del_timer(task);
-		rpc_remove_wait_queue(task);
+		__rpc_remove_wait_queue(task);
 		task->tk_flags |= RPC_TASK_RUNNING;
-		restore_flags(oldflags);
+		spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 
 		__rpc_execute(task);
 
@@ -541,7 +574,6 @@
 		if (need_resched)
 			schedule();
 	}
-	restore_flags(oldflags);
 	dprintk("RPC:      rpc_schedule leave\n");
 }
 
@@ -626,11 +658,13 @@
 	task->tk_suid_retry = 1;
 
 	/* Add to global list of all tasks */
+	spin_lock(&rpc_sched_lock);
 	task->tk_next_task = all_tasks;
 	task->tk_prev_task = NULL;
 	if (all_tasks)
 		all_tasks->tk_prev_task = task;
 	all_tasks = task;
+	spin_unlock(&rpc_sched_lock);
 
 	if (clnt)
 		clnt->cl_users++;
@@ -679,10 +713,12 @@
 rpc_release_task(struct rpc_task *task)
 {
 	struct rpc_task	*next, *prev;
+	unsigned long	oldflags;
 
 	dprintk("RPC: %4d release task\n", task->tk_pid);
 
 	/* Remove from global task list */
+	spin_lock(&rpc_sched_lock);
 	prev = task->tk_prev_task;
 	next = task->tk_next_task;
 	if (next)
@@ -691,6 +727,19 @@
 		prev->tk_next_task = next;
 	else
 		all_tasks = next;
+	task->tk_next_task = task->tk_prev_task = NULL;
+	spin_unlock(&rpc_sched_lock);
+
+	/* Protect the execution below. */
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
+
+	/* Delete any running timer */
+	rpc_del_timer(task);
+
+	/* Remove from any wait queue we're still on */
+	__rpc_remove_wait_queue(task);
+
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 
 	/* Release resources */
 	if (task->tk_rqstp)
@@ -738,12 +787,15 @@
 static void
 rpc_child_exit(struct rpc_task *child)
 {
+	unsigned long	oldflags;
 	struct rpc_task	*parent;
 
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
 	if ((parent = rpc_find_parent(child)) != NULL) {
 		parent->tk_status = child->tk_status;
-		rpc_wake_up_task(parent);
+		__rpc_wake_up(parent);
 	}
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 	rpc_release_task(child);
 }
 
@@ -772,11 +824,11 @@
 {
 	unsigned long oldflags;
 
-	save_flags(oldflags); cli();
-	rpc_make_runnable(child);
-	restore_flags(oldflags);
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
 	/* N.B. Is it possible for the child to have already finished? */
-	rpc_sleep_on(&childq, task, func, NULL);
+	__rpc_sleep_on(&childq, task, func, NULL);
+	rpc_make_runnable(child);
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
 }
 
 /*
@@ -789,8 +841,11 @@
 	struct rpc_task	**q, *rovr;
 
 	dprintk("RPC:      killing all tasks for client %p\n", clnt);
-	/* N.B. Why bother to inhibit? Nothing blocks here ... */
-	rpc_inhibit++;
+
+	/*
+	 * Spin lock all_tasks to prevent changes...
+	 */
+	spin_lock(&rpc_sched_lock);
 	for (q = &all_tasks; (rovr = *q); q = &rovr->tk_next_task) {
 		if (!clnt || rovr->tk_client == clnt) {
 			rovr->tk_flags |= RPC_TASK_KILLED;
@@ -798,11 +853,18 @@
 			rpc_wake_up_task(rovr);
 		}
 	}
-	rpc_inhibit--;
+	spin_unlock(&rpc_sched_lock);
 }
 
 static DECLARE_MUTEX_LOCKED(rpciod_running);
 
+static inline int
+rpciod_task_pending(void)
+{
+	return schedq.task != NULL || xprt_tcp_pending();
+}
+
+
 /*
  * This is the rpciod kernel thread
  */
@@ -810,7 +872,6 @@
 rpciod(void *ptr)
 {
 	wait_queue_head_t *assassin = (wait_queue_head_t*) ptr;
-	unsigned long	oldflags;
 	int		rounds = 0;
 
 	MOD_INC_USE_COUNT;
@@ -845,18 +906,15 @@
 			schedule();
 			rounds = 0;
 		}
-		save_flags(oldflags); cli();
 		dprintk("RPC: rpciod running checking dispatch\n");
 		rpciod_tcp_dispatcher();
 
-		if (!schedq.task) {
+		if (!rpciod_task_pending()) {
 			dprintk("RPC: rpciod back to sleep\n");
-			interruptible_sleep_on(&rpciod_idle);
+			wait_event_interruptible(rpciod_idle, rpciod_task_pending());
 			dprintk("RPC: switch to rpciod\n");
-			rpciod_tcp_dispatcher();
 			rounds = 0;
 		}
-		restore_flags(oldflags);
 	}
 
 	dprintk("RPC: rpciod shutdown commences\n");
@@ -983,8 +1041,12 @@
 	struct rpc_task *t = all_tasks, *next;
 	struct nfs_wreq *wreq;
 
-	if (!t)
+	spin_lock(&rpc_sched_lock);
+	t = all_tasks;
+	if (!t) {
+		spin_unlock(&rpc_sched_lock);
 		return;
+	}
 	printk("-pid- proc flgs status -client- -prog- --rqstp- -timeout "
 		"-rpcwait -action- --exit--\n");
 	for (; t; t = next) {
@@ -1007,5 +1069,6 @@
 			wreq->wb_file->f_dentry->d_parent->d_name.name,
 			wreq->wb_file->f_dentry->d_name.name);
 	}
+	spin_unlock(&rpc_sched_lock);
 }
 #endif
diff -u --recursive --new-file v2.3.21/linux/net/sunrpc/xprt.c linux/net/sunrpc/xprt.c
--- v2.3.21/linux/net/sunrpc/xprt.c	Sat Oct  9 11:47:50 1999
+++ linux/net/sunrpc/xprt.c	Fri Oct 15 09:15:26 1999
@@ -31,12 +31,16 @@
  *  primitives that `transparently' work for processes as well as async
  *  tasks that rely on callbacks.
  *
- *  Copyright (C) 1995, 1996, Olaf Kirch <okir@monad.swb.de>
+ *  Copyright (C) 1995-1997, Olaf Kirch <okir@monad.swb.de>
  *
  *  TCP callback races fixes (C) 1998 Red Hat Software <alan@redhat.com>
  *  TCP send fixes (C) 1998 Red Hat Software <alan@redhat.com>
  *  TCP NFS related read + write fixes
  *   (C) 1999 Dave Airlie, University of Limerick, Ireland <airlied@linux.ie>
+ *
+ *  Rewrite of larges part of the code in order to stabilize TCP stuff.
+ *  Fix behaviour when socket buffer is full.
+ *   (C) 1999 Trond Myklebust <trond.myklebust@fys.uio.no>
  */
 
 #define __KERNEL_SYSCALLS__
@@ -62,6 +66,8 @@
 #include <asm/uaccess.h>
 
 #define SOCK_HAS_USER_DATA
+/* Following value should be > 32k + RPC overhead */
+#define XPRT_MIN_WRITE_SPACE 35000
 
 /*
  * Local variables
@@ -70,6 +76,9 @@
 static struct rpc_xprt *	sock_list = NULL;
 #endif
 
+/* Spinlock for critical sections in the code. */
+spinlock_t xprt_lock = SPIN_LOCK_UNLOCKED;
+
 #ifdef RPC_DEBUG
 # undef  RPC_DEBUG_DATA
 # define RPCDBG_FACILITY	RPCDBG_XPRT
@@ -84,11 +93,13 @@
  * Local functions
  */
 static void	xprt_request_init(struct rpc_task *, struct rpc_xprt *);
+static void	do_xprt_transmit(struct rpc_task *);
 static void	xprt_transmit_status(struct rpc_task *task);
+static void	xprt_transmit_timeout(struct rpc_task *task);
 static void	xprt_receive_status(struct rpc_task *task);
 static void	xprt_reserve_status(struct rpc_task *task);
+static void	xprt_disconnect(struct rpc_xprt *);
 static void	xprt_reconn_timeout(struct rpc_task *task);
-static void	xprt_reconn_status(struct rpc_task *task);
 static struct socket *xprt_create_socket(int, struct sockaddr_in *,
 					struct rpc_timeout *);
 
@@ -144,39 +155,35 @@
  *	Adjust the iovec to move on 'n' bytes
  */
  
-extern inline void xprt_move_iov(struct msghdr *msg, struct iovec *niv, int amount)
+extern inline void
+xprt_move_iov(struct msghdr *msg, struct iovec *niv, int amount)
 {
 	struct iovec *iv=msg->msg_iov;
+	int i;
 	
 	/*
 	 *	Eat any sent iovecs
 	 */
-
-	while(iv->iov_len < amount)
-	{
-		amount-=iv->iov_len;
+	while(iv->iov_len <= amount) {
+		amount -= iv->iov_len;
 		iv++;
 		msg->msg_iovlen--;
 	}
-	
-	msg->msg_iov=niv;
-	
+
 	/*
 	 *	And chew down the partial one
 	 */
-
 	niv[0].iov_len = iv->iov_len-amount;
 	niv[0].iov_base =((unsigned char *)iv->iov_base)+amount;
 	iv++;
-	
+
 	/*
 	 *	And copy any others
 	 */
-	 
-	for(amount=1;amount<msg->msg_iovlen; amount++)
-	{
-		niv[amount]=*iv++;
-	}
+	for(i = 1; i < msg->msg_iovlen; i++)
+		niv[i]=*iv++;
+
+	msg->msg_iov=niv;
 }
  
 /*
@@ -184,43 +191,42 @@
  */
 
 static inline int
-xprt_sendmsg(struct rpc_xprt *xprt)
+xprt_sendmsg(struct rpc_xprt *xprt, struct rpc_rqst *req)
 {
 	struct socket	*sock = xprt->sock;
 	struct msghdr	msg;
 	mm_segment_t	oldfs;
 	int		result;
+	int		slen = req->rq_slen - req->rq_bytes_sent;
 	struct iovec	niv[MAX_IOVEC];
 
+	if (slen == 0)
+		return 0;
+
 	xprt_pktdump("packet data:",
-				xprt->snd_buf.io_vec->iov_base,
-				xprt->snd_buf.io_vec->iov_len);
+				req->rq_svec->iov_base,
+				req->rq_svec->iov_len);
 
 	msg.msg_flags   = MSG_DONTWAIT;
-	msg.msg_iov	= xprt->snd_buf.io_vec;
-	msg.msg_iovlen	= xprt->snd_buf.io_nr;
+	msg.msg_iov	= req->rq_svec;
+	msg.msg_iovlen	= req->rq_snr;
 	msg.msg_name	= (struct sockaddr *) &xprt->addr;
 	msg.msg_namelen = sizeof(xprt->addr);
 	msg.msg_control = NULL;
 	msg.msg_controllen = 0;
 
 	/* Dont repeat bytes */
-	
-	if(xprt->snd_sent)
-		xprt_move_iov(&msg, niv, xprt->snd_sent);
-		
+	if (req->rq_bytes_sent)
+		xprt_move_iov(&msg, niv, req->rq_bytes_sent);
+
 	oldfs = get_fs(); set_fs(get_ds());
-	result = sock_sendmsg(sock, &msg, xprt->snd_buf.io_len);
+	result = sock_sendmsg(sock, &msg, slen);
 	set_fs(oldfs);
 
-	dprintk("RPC:      xprt_sendmsg(%d) = %d\n",
-				xprt->snd_buf.io_len, result);
+	dprintk("RPC:      xprt_sendmsg(%d) = %d\n", slen, result);
 
-	if (result >= 0) {
-		xprt->snd_buf.io_len -= result;
-		xprt->snd_sent += result;
+	if (result >= 0)
 		return result;
-	}
 
 	switch (result) {
 	case -ECONNREFUSED:
@@ -229,9 +235,14 @@
 		 */
 		break;
 	case -EAGAIN:
-		return 0;
-	case -ENOTCONN: case -EPIPE:
+		if (sock->flags & SO_NOSPACE)
+			result = -ENOMEM;
+		break;
+	case -ENOTCONN:
+	case -EPIPE:
 		/* connection broken */
+		if (xprt->stream)
+			result = -ENOTCONN;
 		break;
 	default:
 		printk(KERN_NOTICE "RPC: sendmsg returned error %d\n", -result);
@@ -252,7 +263,6 @@
 	mm_segment_t	oldfs;
 	int		result;
 
-#if LINUX_VERSION_CODE >= 0x020100
 	msg.msg_flags   = MSG_DONTWAIT;
 	msg.msg_iov	= iov;
 	msg.msg_iovlen	= nr;
@@ -264,20 +274,6 @@
 	oldfs = get_fs(); set_fs(get_ds());
 	result = sock_recvmsg(sock, &msg, len, MSG_DONTWAIT);
 	set_fs(oldfs);
-#else
-	int		alen = sizeof(sin);
-	msg.msg_flags   = 0;
-	msg.msg_iov	= iov;
-	msg.msg_iovlen	= nr;
-	msg.msg_name	= &sin;
-	msg.msg_namelen = sizeof(sin);
-	msg.msg_control = NULL;
-	msg.msg_controllen = 0;
-
-	oldfs = get_fs(); set_fs(get_ds());
-	result = sock->ops->recvmsg(sock, &msg, len, 1, 0, &alen);
-	set_fs(oldfs);
-#endif
 
 	dprintk("RPC:      xprt_recvmsg(iov %p, len %d) = %d\n",
 						iov, len, result);
@@ -354,13 +350,15 @@
 {
 	struct sock	*sk = xprt->inet;
 
+	xprt_disconnect(xprt);
+
 #ifdef SOCK_HAS_USER_DATA
 	sk->user_data    = NULL;
 #endif
 	sk->data_ready   = xprt->old_data_ready;
-	sk->no_check 	 = 0;
 	sk->state_change = xprt->old_state_change;
 	sk->write_space  = xprt->old_write_space;
+	sk->no_check	 = 0;
 
 	sock_release(xprt->sock);
 	/*
@@ -378,9 +376,16 @@
 xprt_disconnect(struct rpc_xprt *xprt)
 {
 	dprintk("RPC:      disconnected transport %p\n", xprt);
+	xprt->connected = 0;
+	xprt->tcp_offset = 0;
+	xprt->tcp_more = 0;
+	xprt->tcp_total = 0;
+	xprt->tcp_reclen = 0;
+	xprt->tcp_copied = 0;
+	xprt->tcp_rqstp  = NULL;
+	xprt->rx_pending_flag = 0;
 	rpc_wake_up_status(&xprt->pending, -ENOTCONN);
 	rpc_wake_up_status(&xprt->sending, -ENOTCONN);
-	xprt->connected = 0;
 }
 
 /*
@@ -398,22 +403,33 @@
 				task->tk_pid, xprt, xprt->connected);
 	task->tk_status = 0;
 
+	if (xprt->shutdown)
+		return;
+
+	if (!xprt->stream)
+		return;
+
+	start_bh_atomic();
+	if (xprt->connected) {
+		end_bh_atomic();
+		return;
+	}
 	if (xprt->connecting) {
 		task->tk_timeout = xprt->timeout.to_maxval;
 		rpc_sleep_on(&xprt->reconn, task, NULL, NULL);
+		end_bh_atomic();
 		return;
 	}
 	xprt->connecting = 1;
+	end_bh_atomic();
 
 	/* Create an unconnected socket */
-	if (!(sock = xprt_create_socket(xprt->prot, NULL, &xprt->timeout)))
+	if (!(sock = xprt_create_socket(xprt->prot, NULL, &xprt->timeout))) {
+		xprt->connecting = 0;
 		goto defer;
+	}
 
-#if LINUX_VERSION_CODE >= 0x020100
 	inet = sock->sk;
-#else
-	inet = (struct sock *) sock->data;
-#endif
 	inet->data_ready   = xprt->inet->data_ready;
 	inet->state_change = xprt->inet->state_change;
 	inet->write_space  = xprt->inet->write_space;
@@ -422,18 +438,18 @@
 #endif
 
 	dprintk("RPC: %4d closing old socket\n", task->tk_pid);
-	xprt_disconnect(xprt);
 	xprt_close(xprt);
 
-	/* Reset to new socket and default congestion */
+	/* Reset to new socket */
 	xprt->sock = sock;
 	xprt->inet = inet;
-	xprt->cwnd = RPC_INITCWND;
 
 	/* Now connect it asynchronously. */
 	dprintk("RPC: %4d connecting new socket\n", task->tk_pid);
 	status = sock->ops->connect(sock, (struct sockaddr *) &xprt->addr,
 				sizeof(xprt->addr), O_NONBLOCK);
+
+	xprt->connecting = 0;
 	if (status < 0) {
 		if (status != -EINPROGRESS && status != -EALREADY) {
 			printk("RPC: TCP connect error %d!\n", -status);
@@ -447,37 +463,19 @@
 		start_bh_atomic();
 		if (!xprt->connected) {
 			rpc_sleep_on(&xprt->reconn, task,
-				xprt_reconn_status, xprt_reconn_timeout);
+				NULL, xprt_reconn_timeout);
 			end_bh_atomic();
 			return;
 		}
 		end_bh_atomic();
 	}
 
-	xprt->connecting = 0;
-	rpc_wake_up(&xprt->reconn);
-	return;
 
 defer:
-	task->tk_timeout = 30 * HZ;
-	rpc_sleep_on(&xprt->reconn, task, NULL, NULL);
-	xprt->connecting = 0;
-}
-
-/*
- * Reconnect status
- */
-static void
-xprt_reconn_status(struct rpc_task *task)
-{
-	struct rpc_xprt	*xprt = task->tk_xprt;
-
-	dprintk("RPC: %4d xprt_reconn_status %d\n",
-				task->tk_pid, task->tk_status);
-	if (!xprt->connected && task->tk_status != -ETIMEDOUT) {
-		task->tk_timeout = 30 * HZ;
-		rpc_sleep_on(&xprt->reconn, task, NULL, xprt_reconn_timeout);
-	}
+	start_bh_atomic();
+	if (!xprt->connected)
+		rpc_wake_up_next(&xprt->reconn);
+	end_bh_atomic();
 }
 
 /*
@@ -490,11 +488,19 @@
 	dprintk("RPC: %4d xprt_reconn_timeout %d\n",
 				task->tk_pid, task->tk_status);
 	task->tk_status = -ENOTCONN;
-	task->tk_xprt->connecting = 0;
+	start_bh_atomic();
+	if (task->tk_xprt->connecting)
+		task->tk_xprt->connecting = 0;
+	if (!task->tk_xprt->connected)
+		task->tk_status = -ENOTCONN;
+	else
+		task->tk_status = -ETIMEDOUT;
+	end_bh_atomic();
 	task->tk_timeout = 0;
 	rpc_wake_up_task(task);
 }
 
+extern spinlock_t rpc_queue_lock;
 /*
  * Look up the RPC request corresponding to a reply.
  */
@@ -503,22 +509,28 @@
 {
 	struct rpc_task	*head, *task;
 	struct rpc_rqst	*req;
+	unsigned long	oldflags;
 	int		safe = 0;
 
+	spin_lock_irqsave(&rpc_queue_lock, oldflags);
 	if ((head = xprt->pending.task) != NULL) {
 		task = head;
 		do {
 			if ((req = task->tk_rqstp) && req->rq_xid == xid)
-				return req;
+				goto out;
 			task = task->tk_next;
 			if (++safe > 100) {
 				printk("xprt_lookup_rqst: loop in Q!\n");
-				return NULL;
+				goto out_bad;
 			}
 		} while (task != head);
 	}
 	dprintk("RPC:      unknown XID %08x in reply.\n", xid);
-	return NULL;
+ out_bad:
+	req = NULL;
+ out:
+	spin_unlock_irqrestore(&rpc_queue_lock, oldflags);
+	return req;
 }
 
 /*
@@ -559,11 +571,13 @@
 	dprintk("RPC: %4d has input (%d bytes)\n", task->tk_pid, copied);
 	task->tk_status = copied;
 
-	rpc_wake_up_task(task);
+	if (!RPC_IS_RUNNING(task))
+		rpc_wake_up_task(task);
 	return;
 }
 
-/* We have set things up such that we perform the checksum of the UDP
+/*
+ * We have set things up such that we perform the checksum of the UDP
  * packet in parallel with the copies into the RPC client iovec.  -DaveM
  */
 static int csum_partial_copy_to_page_cache(struct iovec *iov,
@@ -609,7 +623,8 @@
 	return 0;
 }
 
-/* Input handler for RPC replies. Called from a bottom half and hence
+/*
+ * Input handler for RPC replies. Called from a bottom half and hence
  * atomic.
  */
 static inline void
@@ -621,12 +636,15 @@
 	int		err, repsize, copied;
 
 	dprintk("RPC:      udp_data_ready...\n");
-	if (!(xprt = xprt_from_sock(sk)))
+	if (!(xprt = xprt_from_sock(sk))) {
+		printk("RPC:      udp_data_ready request not found!\n");
 		return;
+	}
+
 	dprintk("RPC:      udp_data_ready client %p\n", xprt);
 
 	if ((skb = skb_recv_datagram(sk, 0, 1, &err)) == NULL)
-		return;
+		goto out_err;
 
 	repsize = skb->len - sizeof(struct udphdr);
 	if (repsize < 4) {
@@ -646,6 +664,7 @@
 	if ((copied = rovr->rq_rlen) > repsize)
 		copied = repsize;
 
+	rovr->rq_damaged  = 1;
 	/* Suck it into the iovec, verify checksum if not done by hw. */
 	if (csum_partial_copy_to_page_cache(rovr->rq_rvec, skb, copied))
 		goto dropit;
@@ -658,6 +677,8 @@
 dropit:
 	skb_free_datagram(sk, skb);
 	return;
+out_err:
+	return;
 }
 
 /*
@@ -679,6 +700,7 @@
 	int		result, maxcpy, reclen, avail, want;
 
 	dprintk("RPC:      tcp_input_record\n");
+
 	offset = xprt->tcp_offset;
 	result = -EAGAIN;
 	if (offset < 4 || (!xprt->tcp_more && offset < 8)) {
@@ -687,11 +709,6 @@
 		riov.iov_base = xprt->tcp_recm.data + offset;
 		riov.iov_len  = want;
 		result = xprt_recvmsg(xprt, &riov, 1, want);
-		if (!result)
-		{
-			dprintk("RPC: empty TCP record.\n");
-			return -ENOTCONN;
-		}
 		if (result < 0)
 			goto done;
 		offset += result;
@@ -733,9 +750,9 @@
 
 		dprintk("RPC: %4d TCP receiving %d bytes\n",
 					req->rq_task->tk_pid, want);
+		/* Request must be re-encoded before retransmit */
+		req->rq_damaged = 1;
 		result = xprt_recvmsg(xprt, xprt->tcp_iovec, req->rq_rnr, want);
-		if (!result && want)
-			result = -EAGAIN;
 		if (result < 0)
 			goto done;
 		xprt->tcp_copied += result;
@@ -754,12 +771,10 @@
 			xprt->tcp_copied = 0;
 			xprt->tcp_rqstp  = NULL;
 		}
-		/* Request must be re-encoded before retransmit */
-		req->rq_damaged = 1;
 	}
 
 	/* Skip over any trailing bytes on short reads */
-	while (avail) {
+	while (avail > 0) {
 		static u8	dummy[64];
 
 		want = MIN(avail, sizeof(dummy));
@@ -767,8 +782,6 @@
 		riov.iov_len  = want;
 		dprintk("RPC:      TCP skipping %d bytes\n", want);
 		result = xprt_recvmsg(xprt, &riov, 1, want);
-		if (!result && want)
-			result=-EAGAIN;
 		if (result < 0)
 			goto done;
 		offset += result;
@@ -789,55 +802,40 @@
 	return result;
 }
 
-static __inline__ void tcp_output_record(struct rpc_xprt *xprt)
-{
-	if(xprt->snd_sent && xprt->snd_task)
-		dprintk("RPC: write space\n");
-	if(xprt->write_space == 0)
-	{
-		xprt->write_space = 1;
-		if (xprt->snd_task && !RPC_IS_RUNNING(xprt->snd_task))
-		{
-			if(xprt->snd_sent)
-				dprintk("RPC: Write wakeup snd_sent =%d\n",
-					xprt->snd_sent);
-			rpc_wake_up_task(xprt->snd_task);			
-		}
-	}
-}
-
 /*
  *	TCP task queue stuff
  */
  
-static struct rpc_xprt *rpc_rx_xprt_pending = NULL;	/* Chain by rx_pending of rpc_xprt's */
-static struct rpc_xprt *rpc_tx_xprt_pending = NULL;	/* Chain by tx_pending of rpc_xprt's */
+static struct rpc_xprt *rpc_xprt_pending = NULL;	/* Chain by rx_pending of rpc_xprt's */
 
 /*
  *	This is protected from tcp_data_ready and the stack as its run
  *	inside of the RPC I/O daemon
  */
-
-void rpciod_tcp_dispatcher(void)
+static void
+do_rpciod_tcp_dispatcher(void)
 {
 	struct rpc_xprt *xprt;
 	int result;
 
 	dprintk("rpciod_tcp_dispatcher: Queue Running\n");
-	
+
 	/*
 	 *	Empty each pending socket
 	 */
-	 
-	while((xprt=rpc_rx_xprt_pending)!=NULL)
-	{
+ 
+	while(1) {
 		int safe_retry=0;
-		
-		rpc_rx_xprt_pending=xprt->rx_pending;
-		xprt->rx_pending_flag=0;
-		
+
+		if ((xprt = rpc_xprt_pending) == NULL) {
+			break;
+		}
+		xprt->rx_pending_flag = 0;
+		rpc_xprt_pending=xprt->rx_pending;
+		xprt->rx_pending = NULL;
+
 		dprintk("rpciod_tcp_dispatcher: Processing %p\n", xprt);
-		
+
 		do 
 		{
 			if (safe_retry++ > 50)
@@ -845,28 +843,30 @@
 			result = tcp_input_record(xprt);
 		}
 		while (result >= 0);
-	
+
 		switch (result) {
 			case -EAGAIN:
-				continue;
 			case -ENOTCONN:
 			case -EPIPE:
-				xprt_disconnect(xprt);
 				continue;
 			default:
 				printk(KERN_WARNING "RPC: unexpected error %d from tcp_input_record\n",
 					result);
 		}
 	}
+}
 
-	while((xprt=rpc_tx_xprt_pending)!=NULL)
-	{
-		rpc_tx_xprt_pending = xprt->tx_pending;
-		xprt->tx_pending_flag = 0;
-		tcp_output_record(xprt);
-	}
+void rpciod_tcp_dispatcher(void)
+{
+	start_bh_atomic();
+	do_rpciod_tcp_dispatcher();
+	end_bh_atomic();
 }
 
+int xprt_tcp_pending(void)
+{
+	return rpc_xprt_pending != NULL;
+}
 
 extern inline void tcp_rpciod_queue(void)
 {
@@ -890,6 +890,7 @@
 		printk("Not a socket with xprt %p\n", sk);
 		return;
 	}
+
 	dprintk("RPC:      tcp_data_ready client %p\n", xprt);
 	dprintk("RPC:      state %x conn %d dead %d zapped %d\n",
 				sk->state, xprt->connected,
@@ -898,24 +899,16 @@
 	 *	If we are not waiting for the RPC bh run then
 	 *	we are now
 	 */
-	if (!xprt->rx_pending_flag)
-	{
-		int start_queue=0;
+	if (!xprt->rx_pending_flag) {
+		dprintk("RPC:     xprt queue %p\n", rpc_xprt_pending);
 
-		dprintk("RPC:     xprt queue %p\n", rpc_rx_xprt_pending);
-		if(rpc_rx_xprt_pending==NULL)
-			start_queue=1;
+		xprt->rx_pending=rpc_xprt_pending;
+		rpc_xprt_pending=xprt;
 		xprt->rx_pending_flag=1;
-		xprt->rx_pending=rpc_rx_xprt_pending;
-		rpc_rx_xprt_pending=xprt;
-		if (start_queue)
-		  {
-		    tcp_rpciod_queue();
-		    start_queue=0;
-		  }
-	}
-	else
+	} else
 		dprintk("RPC:     xprt queued already %p\n", xprt);
+	tcp_rpciod_queue();
+
 }
 
 
@@ -931,17 +924,32 @@
 				sk->state, xprt->connected,
 				sk->dead, sk->zapped);
 
-	if (sk->state == TCP_ESTABLISHED && !xprt->connected) {
+	switch(sk->state) {
+	case TCP_ESTABLISHED:
+		if (xprt->connected)
+			break;
 		xprt->connected = 1;
 		xprt->connecting = 0;
 		rpc_wake_up(&xprt->reconn);
-	} else if (sk->zapped) {
-		rpc_wake_up_status(&xprt->pending, -ENOTCONN);
-		rpc_wake_up_status(&xprt->sending, -ENOTCONN);
+		rpc_wake_up_next(&xprt->sending);
+		tcp_rpciod_queue();
+		break;
+	case TCP_CLOSE:
+		if (xprt->connecting)
+			break;
+		xprt_disconnect(xprt);
 		rpc_wake_up_status(&xprt->reconn,  -ENOTCONN);
+		break;
+	default:
+		break;
 	}
+
 }
 
+/*
+ * The following 2 routines allow a task to sleep while socket memory is
+ * low.
+ */
 static void
 tcp_write_space(struct sock *sk)
 {
@@ -949,17 +957,43 @@
 
 	if (!(xprt = xprt_from_sock(sk)))
 		return;
-	if (!xprt->tx_pending_flag) {
-		int start_queue = 0;
 
-		if (rpc_tx_xprt_pending == NULL)
-			start_queue = 1;
-		xprt->tx_pending_flag = 1;
-		xprt->tx_pending = rpc_tx_xprt_pending;
-		rpc_tx_xprt_pending = xprt;
-		if (start_queue)
-			tcp_rpciod_queue();
-	}
+	/* Wait until we have enough socket memory */
+	if (sock_wspace(sk) < min(sk->sndbuf,XPRT_MIN_WRITE_SPACE))
+		return;
+
+	if (xprt->write_space)
+		return;
+
+	xprt->write_space = 1;
+
+	if (!xprt->snd_task)
+		rpc_wake_up_next(&xprt->sending);
+	else if (!RPC_IS_RUNNING(xprt->snd_task))
+		rpc_wake_up_task(xprt->snd_task);
+}
+
+static void
+udp_write_space(struct sock *sk)
+{
+	struct rpc_xprt *xprt;
+
+	if (!(xprt = xprt_from_sock(sk)))
+		return;
+
+
+	/* Wait until we have enough socket memory */
+	if (sock_wspace(sk) < min(sk->sndbuf,XPRT_MIN_WRITE_SPACE))
+		return;
+
+	if (xprt->write_space)
+		return;
+
+	xprt->write_space = 1;
+	if (!xprt->snd_task)
+		rpc_wake_up_next(&xprt->sending);
+	else if (!RPC_IS_RUNNING(xprt->snd_task))
+		rpc_wake_up_task(xprt->snd_task);
 }
 
 /*
@@ -982,32 +1016,50 @@
 	rpc_wake_up_task(task);
 }
 
+
 /*
- * (Partly) transmit the RPC packet
- * Note that task->tk_status is either 0 or negative on return.
- * Only when the reply is received will the status be set to a
- * positive value.
+ * Serialize access to sockets, in order to prevent different
+ * requests from interfering with each other.
  */
-static inline int
-xprt_transmit_some(struct rpc_xprt *xprt, struct rpc_task *task)
+static int
+xprt_down_transmit(struct rpc_task *task)
 {
+	struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt;
 	struct rpc_rqst	*req = task->tk_rqstp;
-	int		result;
 
-	task->tk_status = 0;
-	if ((result = xprt_sendmsg(xprt)) >= 0) {
-		if (!xprt->snd_buf.io_len || !xprt->stream) {
-			rpc_wake_up_next(&xprt->sending);
-			return req->rq_slen;
-		}
-		result = -EAGAIN;
-	} else if (xprt->stream) {
-		if (result == -ENOTCONN || result == -EPIPE) {
-			xprt_disconnect(xprt);
-			result = -ENOTCONN;
-		}
+	start_bh_atomic();
+	spin_lock(&xprt_lock);
+	if (xprt->snd_task && xprt->snd_task != task) {
+		dprintk("RPC: %4d TCP write queue full (task %d)\n",
+			task->tk_pid, xprt->snd_task->tk_pid);
+		task->tk_timeout = req->rq_timeout.to_current;
+		rpc_sleep_on(&xprt->sending, task, xprt_transmit, NULL);
+	} else if (!xprt->snd_task) {
+		xprt->snd_task = task;
+#ifdef RPC_PROFILE
+		req->rq_xtime = jiffies;
+#endif
+		req->rq_bytes_sent = 0;
+	}
+	spin_unlock(&xprt_lock);
+	end_bh_atomic();
+	return xprt->snd_task == task;
+}
+
+/*
+ * Releases the socket for use by other requests.
+ */
+static void
+xprt_up_transmit(struct rpc_task *task)
+{
+	struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt;
+
+	if (xprt->snd_task && xprt->snd_task == task) {
+		start_bh_atomic();
+		xprt->snd_task = NULL;
+		rpc_wake_up_next(&xprt->sending);
+		end_bh_atomic();
 	}
-	return task->tk_status = result;
 }
 
 /*
@@ -1020,71 +1072,65 @@
 	struct rpc_timeout *timeo;
 	struct rpc_rqst	*req = task->tk_rqstp;
 	struct rpc_xprt	*xprt = req->rq_xprt;
-	int status;
 
 	dprintk("RPC: %4d xprt_transmit(%x)\n", task->tk_pid, 
 				*(u32 *)(req->rq_svec[0].iov_base));
 
-	if (xprt->shutdown) {
+	if (xprt->shutdown)
 		task->tk_status = -EIO;
+
+	if (task->tk_status < 0)
 		return;
+
+	/* Reset timeout parameters */
+	timeo = &req->rq_timeout;
+	if (timeo->to_retries < 0) {
+		dprintk("RPC: %4d xprt_transmit reset timeo\n",
+					task->tk_pid);
+		timeo->to_retries = xprt->timeout.to_retries;
+		timeo->to_current = timeo->to_initval;
 	}
 
-	/* If we're not already in the process of transmitting our call,
-	 * set up everything as needed. */
-	if (xprt->snd_task != task) {
-		/* Write the record marker */
-		if (xprt->stream) {
-			u32	marker;
+	/* set up everything as needed. */
+	/* Write the record marker */
+	if (xprt->stream) {
+		u32	marker;
 
-			if (!xprt->connected) {
-				task->tk_status = -ENOTCONN;
-				return;
-			}
-			marker = htonl(0x80000000|(req->rq_slen-4));
-			*((u32 *) req->rq_svec[0].iov_base) = marker;
-		}
+		marker = htonl(0x80000000|(req->rq_slen-4));
+		*((u32 *) req->rq_svec[0].iov_base) = marker;
 
-		/* Reset timeout parameters */
-		timeo = &req->rq_timeout;
-		if (timeo->to_retries < 0) {
-			dprintk("RPC: %4d xprt_transmit reset timeo\n",
-						task->tk_pid);
-			timeo->to_retries = xprt->timeout.to_retries;
-			timeo->to_current = timeo->to_initval;
-		}
+	}
 
-#ifdef RPC_PROFILE
-		req->rq_xtime = jiffies;
-#endif
-		req->rq_gotit = 0;
+	if (!xprt_down_transmit(task))
+		return;
 
-		if (xprt->snd_task) {
-			dprintk("RPC: %4d TCP write queue full (task %d)\n",
-					task->tk_pid, xprt->snd_task->tk_pid);
-			rpc_sleep_on(&xprt->sending, task,
-					xprt_transmit_status, NULL);
-			return;
-		}
-		xprt->snd_buf  = req->rq_snd_buf;
-		xprt->snd_task = task;
-		xprt->snd_sent = 0;
+	do_xprt_transmit(task);
+}
+
+static void
+do_xprt_transmit(struct rpc_task *task)
+{
+	struct rpc_rqst	*req = task->tk_rqstp;
+	struct rpc_xprt	*xprt = req->rq_xprt;
+	int status, retry = 0;
+
+	if (xprt->shutdown) {
+		task->tk_status = -EIO;
+		goto out_release;
 	}
 
 	/* For fast networks/servers we have to put the request on
 	 * the pending list now:
 	 */
-	start_bh_atomic();
+	req->rq_gotit = 0;
 	status = rpc_add_wait_queue(&xprt->pending, task);
 	if (!status)
 		task->tk_callback = NULL;
-	end_bh_atomic();
 
-	if (status)
-	{
+	if (status) {
 		printk(KERN_WARNING "RPC: failed to add task to queue: error: %d!\n", status);
 		task->tk_status = status;
-		return;
+		goto out_release;
 	}
 
 	/* Continue transmitting the packet/record. We must be careful
@@ -1093,27 +1139,55 @@
 	 */
 	while (1) {
 		xprt->write_space = 0;
-		if (xprt_transmit_some(xprt, task) != -EAGAIN) {
+		status = xprt_sendmsg(xprt, req);
+
+		if (status < 0)
+			break;
+
+		if (xprt->stream) {
+			req->rq_bytes_sent += status;
+
+			if (req->rq_bytes_sent >= req->rq_slen)
+				goto out_release;
+		}
+
+		if (status < req->rq_slen)
+			status = -EAGAIN;
+
+		if (status >= 0 || !xprt->stream) {
 			dprintk("RPC: %4d xmit complete\n", task->tk_pid);
-			xprt->snd_task = NULL;
-			return;
+			goto out_release;
 		}
 
-		/*d*/dprintk("RPC: %4d xmit incomplete (%d left of %d)\n",
-				task->tk_pid, xprt->snd_buf.io_len,
+		dprintk("RPC: %4d xmit incomplete (%d left of %d)\n",
+				task->tk_pid, req->rq_slen - req->rq_bytes_sent,
 				req->rq_slen);
-		task->tk_status = 0;
-		start_bh_atomic();
-		if (!xprt->write_space) {
-			/* Remove from pending */
-			rpc_remove_wait_queue(task);
-			rpc_sleep_on(&xprt->sending, task,
-					xprt_transmit_status, NULL);
-			end_bh_atomic();
-			return;
-		}
+
+		if (retry++ > 50)
+			break;
+	}
+
+	task->tk_status = (status == -ENOMEM) ? -EAGAIN : status;
+
+	/* We don't care if we got a reply, so don't protect
+	 * against bh. */
+	if (task->tk_rpcwait == &xprt->pending)
+		rpc_remove_wait_queue(task);
+
+	/* Protect against (udp|tcp)_write_space */
+	start_bh_atomic();
+	if (status == -ENOMEM || status == -EAGAIN) {
+		task->tk_timeout = req->rq_timeout.to_current;
+		if (!xprt->write_space)
+			rpc_sleep_on(&xprt->sending, task, xprt_transmit_status,
+				     xprt_transmit_timeout);
 		end_bh_atomic();
+		return;
 	}
+	end_bh_atomic();
+
+out_release:
+	xprt_up_transmit(task);
 }
 
 /*
@@ -1126,19 +1200,27 @@
 	struct rpc_xprt	*xprt = task->tk_client->cl_xprt;
 
 	dprintk("RPC: %4d transmit_status %d\n", task->tk_pid, task->tk_status);
-	if (xprt->snd_task == task) 
-	{
-		if (task->tk_status < 0)
-		{
-			xprt->snd_task = NULL;
-			xprt_disconnect(xprt);
-		}
-		else
-			xprt_transmit(task);
+	if (xprt->snd_task == task) {
+		task->tk_status = 0;
+		do_xprt_transmit(task);
+		return;
 	}
 }
 
 /*
+ * RPC transmit timeout handler.
+ */
+static void
+xprt_transmit_timeout(struct rpc_task *task)
+{
+	dprintk("RPC: %4d transmit_timeout %d\n", task->tk_pid, task->tk_status);
+	task->tk_status  = -ETIMEDOUT;
+	task->tk_timeout = 0;
+	rpc_wake_up_task(task);
+	xprt_up_transmit(task);
+}
+
+/*
  * Wait for the reply to our call.
  * When the callback is invoked, the congestion window should have
  * been updated already.
@@ -1150,25 +1232,33 @@
 	struct rpc_xprt	*xprt = req->rq_xprt;
 
 	dprintk("RPC: %4d xprt_receive\n", task->tk_pid);
-	if (xprt->connected == 0) {
-		task->tk_status = -ENOTCONN;
-		return;
-	}
 
 	/*
-	 * Wait until rq_gotit goes non-null, or timeout elapsed.
+         * Wait until rq_gotit goes non-null, or timeout elapsed.
 	 */
 	task->tk_timeout = req->rq_timeout.to_current;
 
 	start_bh_atomic();
+	if (task->tk_rpcwait)
+		rpc_remove_wait_queue(task);
+
+	if (task->tk_status < 0 || xprt->shutdown) {
+		end_bh_atomic();
+		goto out;
+	}
+
 	if (!req->rq_gotit) {
 		rpc_sleep_on(&xprt->pending, task,
 				xprt_receive_status, xprt_timer);
+		end_bh_atomic();
+		return;
 	}
 	end_bh_atomic();
 
 	dprintk("RPC: %4d xprt_receive returns %d\n",
 				task->tk_pid, task->tk_status);
+ out:
+	xprt_receive_status(task);
 }
 
 static void
@@ -1176,8 +1266,9 @@
 {
 	struct rpc_xprt	*xprt = task->tk_xprt;
 
-	if (xprt->stream && xprt->tcp_rqstp == task->tk_rqstp)
+	if (xprt->tcp_rqstp == task->tk_rqstp)
 		xprt->tcp_rqstp = NULL;
+
 }
 
 /*
@@ -1194,7 +1285,7 @@
 
 	dprintk("RPC: %4d xprt_reserve cong = %ld cwnd = %ld\n",
 				task->tk_pid, xprt->cong, xprt->cwnd);
-	if ((!RPCXPRT_CONGESTED(xprt) && xprt->free)) {
+	if (!RPCXPRT_CONGESTED(xprt) && xprt->free) {
 		xprt_reserve_status(task);
 		task->tk_timeout = 0;
 	} else if (!task->tk_timeout) {
@@ -1223,40 +1314,30 @@
 		/* NOP */
 	} else if (task->tk_rqstp) {
 		/* We've already been given a request slot: NOP */
-	} else if (!RPCXPRT_CONGESTED(xprt)) {
+	} else if (!RPCXPRT_CONGESTED(xprt) && xprt->free) {
 		/* OK: There's room for us. Grab a free slot and bump
 		 * congestion value */
-		req = xprt->free;
-		if (!req)
-			goto bad_list;
-		if (req->rq_xid)
-			goto bad_used;
+		spin_lock(&xprt_lock);
+		if (!(req = xprt->free)) {
+			spin_unlock(&xprt_lock);
+			goto out_nofree;
+		}
 		xprt->free     = req->rq_next;
+		req->rq_next   = NULL;
+		spin_unlock(&xprt_lock);
 		xprt->cong    += RPC_CWNDSCALE;
 		task->tk_rqstp = req;
-		req->rq_next   = NULL;
 		xprt_request_init(task, xprt);
-	} else {
-		task->tk_status = -EAGAIN;
-	}
 
-	if (xprt->free && !RPCXPRT_CONGESTED(xprt))
-		rpc_wake_up_next(&xprt->backlog);
+		if (xprt->free)
+			xprt_clear_backlog(xprt);
+	} else
+		goto out_nofree;
 
 	return;
 
-bad_list:
-	printk(KERN_ERR 
-		"RPC: %4d inconsistent free list (cong %ld cwnd %ld)\n",
-		task->tk_pid, xprt->cong, xprt->cwnd);
-	rpc_debug = ~0;
-	goto bummer;
-bad_used:
-	printk(KERN_ERR "RPC: used rqst slot %p on free list!\n", req);
-bummer:
-	task->tk_status = -EIO;
-	xprt->free = NULL;
-	return;
+out_nofree:
+	task->tk_status = -EAGAIN;
 }
 
 /*
@@ -1298,13 +1379,15 @@
 
 	dprintk("RPC: %4d release request %p\n", task->tk_pid, req);
 
+	spin_lock(&xprt_lock);
+	req->rq_next = xprt->free;
+	xprt->free   = req;
+	spin_unlock(&xprt_lock);
+
 	/* remove slot from queue of pending */
 	start_bh_atomic();
 	if (task->tk_rpcwait) {
 		printk("RPC: task of released request still queued!\n");
-#ifdef RPC_DEBUG
-		printk("RPC: (task is on %s)\n", rpc_qname(task->tk_rpcwait));
-#endif
 		rpc_del_timer(task);
 		rpc_remove_wait_queue(task);
 	}
@@ -1313,31 +1396,7 @@
 	/* Decrease congestion value. */
 	xprt->cong -= RPC_CWNDSCALE;
 
-#if 0
-	/* If congestion threshold is not yet reached, pass on the request slot.
-	 * This looks kind of kludgy, but it guarantees backlogged requests
-	 * are served in order.
-	 * N.B. This doesn't look completely safe, as the task is still
-	 * on the backlog list after wake-up.
-	 */
-	if (!RPCXPRT_CONGESTED(xprt)) {
-		struct rpc_task	*next = rpc_wake_up_next(&xprt->backlog);
-
-		if (next && next->tk_rqstp == 0) {
-			xprt->cong += RPC_CWNDSCALE;
-			next->tk_rqstp = req;
-			xprt_request_init(next, xprt);
-			return;
-		}
-	}
-#endif
-
-	req->rq_next = xprt->free;
-	xprt->free   = req;
-
-	/* If not congested, wake up the next backlogged process */
-	if (!RPCXPRT_CONGESTED(xprt))
-		rpc_wake_up_next(&xprt->backlog);
+	xprt_clear_backlog(xprt);
 }
 
 /*
@@ -1382,11 +1441,7 @@
 	dprintk("RPC:      setting up %s transport...\n",
 				proto == IPPROTO_UDP? "UDP" : "TCP");
 
-#if LINUX_VERSION_CODE >= 0x020100
 	inet = sock->sk;
-#else
-	inet = (struct sock *) sock->data;
-#endif
 
 	if ((xprt = kmalloc(sizeof(struct rpc_xprt), GFP_KERNEL)) == NULL)
 		return NULL;
@@ -1398,7 +1453,8 @@
 	xprt->addr = *ap;
 	xprt->prot = proto;
 	xprt->stream = (proto == IPPROTO_TCP)? 1 : 0;
-	xprt->cwnd = RPC_INITCWND;
+	xprt->congtime = jiffies;
+	init_waitqueue_head(&xprt->cong_wait);
 #ifdef SOCK_HAS_USER_DATA
 	inet->user_data = xprt;
 #else
@@ -1410,11 +1466,14 @@
 	xprt->old_write_space = inet->write_space;
 	if (proto == IPPROTO_UDP) {
 		inet->data_ready = udp_data_ready;
+		inet->write_space = udp_write_space;
 		inet->no_check = UDP_CSUM_NORCV;
+		xprt->cwnd = RPC_INITCWND;
 	} else {
 		inet->data_ready = tcp_data_ready;
 		inet->state_change = tcp_state_change;
 		inet->write_space = tcp_write_space;
+		xprt->cwnd = RPC_MAXCWND;
 		xprt->nocong = 1;
 	}
 	xprt->connected = 1;
@@ -1487,6 +1546,7 @@
 			   (proto == IPPROTO_UDP)? "udp" : "tcp", proto);
 
 	type = (proto == IPPROTO_UDP)? SOCK_DGRAM : SOCK_STREAM;
+
 	if ((err = sock_create(PF_INET, type, proto, &sock)) < 0) {
 		printk("RPC: can't create socket (%d).\n", -err);
 		goto failed;
@@ -1543,6 +1603,21 @@
 	rpc_wake_up(&xprt->pending);
 	rpc_wake_up(&xprt->backlog);
 	rpc_wake_up(&xprt->reconn);
+	wake_up(&xprt->cong_wait);
+}
+
+/*
+ * Clear the xprt backlog queue
+ */
+int
+xprt_clear_backlog(struct rpc_xprt *xprt) {
+	if (!xprt)
+		return 0;
+	if (RPCXPRT_CONGESTED(xprt))
+		return 0;
+	rpc_wake_up_next(&xprt->backlog);
+	wake_up(&xprt->cong_wait);
+	return 1;
 }
 
 /*
diff -u --recursive --new-file v2.3.21/linux/net/unix/af_unix.c linux/net/unix/af_unix.c
--- v2.3.21/linux/net/unix/af_unix.c	Mon Oct 11 15:38:15 1999
+++ linux/net/unix/af_unix.c	Tue Oct 12 10:05:53 1999
@@ -572,7 +572,7 @@
 
 		/* Do not believe to VFS, grab kernel lock */
 		lock_kernel();
-		dentry = open_namei(sunname->sun_path, 2, S_IFSOCK);
+		dentry = open_namei(sunname->sun_path, 2|O_NOFOLLOW, S_IFSOCK);
 		if (IS_ERR(dentry)) {
 			*error = PTR_ERR(dentry);
 			unlock_kernel();
diff -u --recursive --new-file v2.3.21/linux/net/x25/af_x25.c linux/net/x25/af_x25.c
--- v2.3.21/linux/net/x25/af_x25.c	Tue Sep  7 12:14:07 1999
+++ linux/net/x25/af_x25.c	Thu Oct 14 14:22:09 1999
@@ -848,7 +848,11 @@
 	unsigned char *asmptr;
 	int size, qbit = 0;
 
-	if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_OOB))
+	if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_OOB | MSG_EOR))
+		return -EINVAL;
+
+	/* we currently don't support segments at the user interface */ 
+	if (!(msg->msg_flags & MSG_EOR))
 		return -EINVAL;
 
 	if (sk->zapped)
diff -u --recursive --new-file v2.3.21/linux/net/x25/x25_in.c linux/net/x25/x25_in.c
--- v2.3.21/linux/net/x25/x25_in.c	Mon Oct 11 15:38:15 1999
+++ linux/net/x25/x25_in.c	Thu Oct 14 14:22:09 1999
@@ -278,7 +278,7 @@
 					kill_proc(sk->proc, SIGURG, 1);
 				else
 					kill_pg(-sk->proc, SIGURG, 1);
-				sock_wake_async(sk, 3, POLL_PRI);
+				sock_wake_async(sk->socket, 3, POLL_PRI);
 			}
 			x25_write_internal(sk, X25_INTERRUPT_CONFIRMATION);
 			break;
