W: http://www.linux-usb.org
S: Supported
-USB HUB AND UHCI DRIVERS
+USB HUB
P: Johannes Erdfelt
M: jerdfelt@sventech.com
L: linux-usb@suse.com
S: Maintained (not yet usable)
W: http://suitenine.com/usb/
+USB UHCI DRIVER
+P: Georg Acher
+M: usb@in.tum.de
+L: linux-usb@suse.com
+W: http://usb.in.tum.de
+S: Maintained
+
VFAT FILESYSTEM:
P: Gordon Chaffee
M: chaffee@cs.berkeley.edu
--- /dev/null
+ List of maintainers and how to submit kernel changes
+
+Please try to follow the guidelines below. This will make things
+easier on the maintainers. Not all of these guidelines matter for every
+trivial patch so apply some common sense.
+
+1. Always _test_ your changes, however small, on at least 4 or
+ 5 people, preferably many more.
+
+2. Try to release a few ALPHA test versions to the net. Announce
+ them onto the kernel channel and await results. This is especially
+ important for device drivers, because often that's the only way
+ you will find things like the fact version 3 firmware needs
+ a magic fix you didn't know about, or some clown changed the
+ chips on a board and not its name. (Don't laugh! Look at the
+ SMC etherpower for that.)
+
+3. Make sure your changes compile correctly in multiple
+ configurations. In particular check that changes work both as a
+ module and built into the kernel.
+
+4. When you are happy with a change make it generally available for
+ testing and await feedback.
+
+5. Make a patch available to the relevant maintainer in the list. Use
+ 'diff -u' to make the patch easy to merge. Be prepared to get your
+ changes sent back with seemingly silly requests about formatting
+ and variable names. These aren't as silly as they seem. One
+ job the maintainers (and especially Linus) do is to keep things
+ looking the same. Sometimes this means that the clever hack in
+ your driver to get around a problem actually needs to become a
+ generalized kernel feature ready for next time. See
+ Documentation/CodingStyle for guidance here.
+
+ PLEASE try to include any credit lines you want added with the
+ patch. It avoids people being missed off by mistake and makes
+ it easier to know who wants adding and who doesn't.
+
+ PLEASE document known bugs. If it doesn't work for everything
+ or does something very odd once a month document it.
+
+6. Make sure you have the right to send any changes you make. If you
+ do changes at work you may find your employer owns the patch
+ not you.
+
+7. Happy hacking.
+
+ -----------------------------------
+
+Maintainers List (try to look for most precise areas first)
+
+Note: For the hard of thinking, this list is meant to remain in alphabetical
+order. If you could add yourselves to it in alphabetical order that would
+so much easier [Ed]
+
+P: Person
+M: Mail patches to
+L: Mailing list that is relevant to this area
+W: Web-page with status/info
+S: Status, one of the following:
+
+ Supported: Someone is actually paid to look after this.
+ Maintained: Someone actually looks after it.
+ Odd Fixes: It has a maintainer but they don't have time to do
+ much other than throw the odd patch in. See below..
+ Orphan: No current maintainer [but maybe you could take the
+ role as you write your new code].
+ Obsolete: Old code. Something tagged obsolete generally means
+ it has been replaced by a better system and you
+ should be using that.
+
+3C501 NETWORK DRIVER
+P: Alan Cox
+M: alan@the.3c501.cabal.tm
+L: linux-net@vger.rutgers.edu
+S: Maintained
+
+3C505 NETWORK DRIVER
+P: Philip Blundell
+M: Philip.Blundell@pobox.com
+L: linux-net@vger.rutgers.edu
+S: Maintained
+
+6PACK NETWORK DRIVER FOR AX.25
+P: Andreas Koensgen
+M: ajk@iehk.rwth-aachen.de
+L: linux-hams@vger.rutgers.edu
+S: Maintained
+
+8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.]
+P: Paul Gortmaker
+M: p_gortmaker@yahoo.com
+L: linux-net@vger.rutgers.edu
+S: Maintained
+
+ACPI
+P: Andrew Henroid
+M: andy_henroid@yahoo.com
+L: acpi@phobos.fs.tum.de
+W: http://phobos.fs.tum.de/acpi/index.html
+S: Maintained
+
+AD1816 SOUND DRIVER
+P: Thorsten Knabe
+M: Thorsten Knabe <tek@rbg.informatik.tu-darmstadt.de>
+M: Thorsten Knabe <tek01@hrzpub.tu-darmstadt.de>
+W: http://www.student.informatik.tu-darmstadt.de/~tek/projects/linux.html
+W: http://www.tu-darmstadt.de/~tek01/projects/linux.html
+S: Maintained
+
+ADVANSYS SCSI DRIVER
+P: Bob Frey
+M: linux@advansys.com
+W: http://www.advansys.com/linux.html
+L: linux-scsi@vger.rutgers.edu
+S: Maintained
+
+AEDSP16 DRIVER
+P: Riccardo Facchetti
+M: fizban@tin.it
+S: Maintained
+
+AHA152X SCSI DRIVER
+P: Juergen E. Fischer
+M: Juergen Fischer <fischer@et-inf.fho-emden.de>
+L: linux-scsi@vger.rutgers.edu
+S: Maintained
+
+APM DRIVER
+P: Stephen Rothwell
+M: sfr@linuxcare.com
+L: linux-laptop@vger.rutgers.edu
+W: http://linuxcare.com.au/apm/
+S: Supported
+
+APPLETALK NETWORK LAYER
+P: Jay Schulist
+M: Jay.Schulist@spacs.k12.wi.us
+L: linux-atalk@netspace.org
+S: Maintained
+
+ARM MFM AND FLOPPY DRIVERS
+P: Dave Gilbert
+M: linux@treblig.org
+S: Maintained
+
+ARM PORT
+P: Russell King
+M: linux@arm.linux.org.uk
+L: linux-arm@vger.rutgers.edu
+W: http://www.arm.linux.org.uk/~rmk/armlinux.html
+S: Maintained
+
+ARPD SUPPORT
+P: Jonathan Layes
+M: layes@loran.com
+L: linux-net@vger.rutgers.edu
+S: Maintained
+
+AX.25 NETWORK LAYER
+P: Matthias Welwarsky
+M: dg2fef@afthd.tu-darmstadt.de
+L: linux-hams@vger.rutgers.edu
+S: Maintained
+
+BAYCOM/HDLCDRV/SOUNDMODEM DRIVERS FOR AX.25
+P: Thomas Sailer
+M: sailer@ife.ee.ethz.ch
+L: linux-hams@vger.rutgers.edu
+W: http://www.ife.ee.ethz.ch/~sailer/ham/ham.html
+S: Maintained
+
+BERKSHIRE PRODUCTS PC WATCHDOG DRIVER
+P: Kenji Hollis
+M: kenji@bitgate.com
+W: http://ftp.bitgate.com/pcwd/
+S: Maintained
+
+BFS FILE SYSTEM
+P: Tigran A. Aivazian
+M: tigran@ocston.org
+L: linux-kernel@vger.rutgers.edu
+W: http://www.ocston.org/~tigran/patches/bfs
+S: Maintained
+
+BUSLOGIC SCSI DRIVER
+P: Leonard N. Zubkoff
+M: Leonard N. Zubkoff <lnz@dandelion.com>
+L: linux-scsi@vger.rutgers.edu
+W: http://www.dandelion.com/Linux/
+S: Maintained
+
+CIRRUS LOGIC GENERIC FBDEV DRIVER
+P: Jeff Garzik
+M: jgarzik@pobox.com
+L: linux-fbdev@vuser.vu.union.edu
+S: Maintained
+
+COMPAQ SMART2 RAID DRIVER
+P: Charles White
+M: Charles White <arrays@compaq.com>
+L: compaqandlinux@yps.org
+S: Maintained
+
+COMPUTONE INTELLIPORT MULTIPORT CARD
+P: Doug McNash
+P: Michael H. Warfield
+M: Doug McNash <dmcnash@computone.com>
+M: Michael H. Warfield <mhw@wittsend.com>
+W: http://www.computone.com/
+W: http://www.wittsend.com/computone.html
+L: linux-computone@lazuli.wittsend.com
+S: Supported
+
+CONFIGURE, MENUCONFIG, XCONFIG
+P: Michael Elizabeth Chastain
+M: mec@shout.net
+L: linux-kbuild@torque.net
+S: Maintained
+
+CONFIGURE.HELP
+P: Axel Boldt
+M: boldt@math.ucsb.edu
+S: Maintained
+
+COSA/SRP SYNC SERIAL DRIVER
+P: Jan "Yenya" Kasprzak
+M: kas@fi.muni.cz
+W: http://www.fi.muni.cz/~kas/cosa/
+S: Maintained
+
+CREDITS FILE
+P: John A. Martin
+M: jam@acm.org
+S: Maintained
+
+CYCLADES 2X SYNC CARD DRIVER
+P: Arnaldo Carvalho de Melo
+M: acme@conectiva.com.br
+W: http://www.conectiva.com.br/~acme
+L: cycsyn-devel@bazar.conectiva.com.br
+S: Maintained
+
+CYCLADES ASYNC MUX DRIVER
+P: Ivan Passos
+M: Ivan Passos <ivan@cyclades.com>
+W: http://www.cyclades.com/
+S: Supported
+
+DAMA SLAVE for AX.25
+P: Joerg Reuter
+M: jreuter@poboxes.com
+W: http://poboxes.com/jreuter/
+W: http://qsl.net/dl1bke/
+L: linux-hams@vger.rutgers.edu
+S: Maintained
+
+DC390/AM53C974 SCSI driver
+P: Kurt Garloff
+M: kurt@garloff.de
+W: http://www.garloff.de/kurt/linux/dc390/
+S: Maintained
+
+DECnet NETWORK LAYER
+P: Steven Whitehouse
+M: SteveW@ACM.org
+W: http://www.sucs.swan.ac.uk/~rohan/
+W: http://www-sigproc.eng.cam.ac.uk/~sjw44/
+L: netdev@oss.sgi.com
+S: Maintained
+
+DEVICE NUMBER REGISTRY
+P: H. Peter Anvin
+M: hpa@zytor.com
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+DIGI INTL. EPCA DRIVER
+P: Chad Schwartz
+M: support@dgii.com
+M: chads@dgii.com
+L: digilnux@dgii.com
+S: Maintained
+
+DIGI RIGHTSWITCH NETWORK DRIVER
+P: Rick Richardson
+M: rick@dgii.com
+L: linux-net@vger.rutgers.edu
+W: http://www.dgii.com/linux/
+S: Maintained
+
+DISKQUOTA:
+P: Marco van Wieringen
+M: mvw@planets.elm.net
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+DOUBLETALK DRIVER
+P: James R. Van Zandt
+M: jrv@vanzandt.mv.com
+L: blinux-list@redhat.com
+S: Maintained
+
+EATA-DMA SCSI DRIVER
+P: Michael Neuffer
+M: mike@i-Connect.Net
+L: linux-eata@i-connect.net, linux-scsi@vger.rutgers.edu
+S: Maintained
+
+EATA ISA/EISA/PCI SCSI DRIVER
+P: Dario Ballabio
+M: dario@milano.europe.dg.com
+L: linux-scsi@vger.rutgers.edu
+S: Maintained
+
+EATA-PIO SCSI DRIVER
+P: Michael Neuffer
+M: mike@i-Connect.Net
+L: linux-eata@i-connect.net, linux-scsi@vger.rutgers.edu
+S: Maintained
+
+ETHEREXPRESS-16 NETWORK DRIVER
+P: Philip Blundell
+M: Philip.Blundell@pobox.com
+L: linux-net@vger.rutgers.edu
+S: Maintained
+
+ETHERTEAM 16I DRIVER
+P: Mika Kuoppala
+M: miku@iki.fi
+S: Maintained
+
+EXT2 FILE SYSTEM
+P: Remy Card
+M: Remy.Card@linux.org
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+FILE LOCKING (flock() and fcntl()/lockf())
+P: Andy Walker
+M: andy@lysaker.kvaerner.no
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+FPU EMULATOR
+P: Bill Metzenthen
+M: billm@suburbia.net
+W: http://suburbia.net/~billm/floating-point/emulator/
+S: Maintained
+
+FRAME RELAY DLCI/FRAD (Sangoma drivers too)
+P: Mike McLagan
+M: mike.mclagan@linux.org
+L: linux-net@vger.rutgers.edu
+S: Maintained
+
+FTAPE/QIC-117
+P: Claus-Justus Heine
+M: claus@momo.math.rwth-aachen.de
+L: linux-tape@vger.rutgers.edu
+W: http://www-math.math.rwth-aachen.de/~LBFM/claus/ftape/
+S: Maintained
+
+FUTURE DOMAIN TMC-16x0 SCSI DRIVER (16-bit)
+P: Rik Faith
+M: faith@cs.unc.edu
+L: linux-scsi@vger.rutgers.edu
+S: Odd fixes (e.g., new signatures)
+
+GDT SCSI DISK ARRAY CONTROLLER DRIVER
+P: Achim Leubner
+M: achim@vortex.de
+L: linux-scsi@vger.rutgers.edu
+W: http://www.icp-vortex.com/
+S: Supported
+
+HAYES ESP SERIAL DRIVER
+P: Andrew J. Robinson
+M: arobinso@nyx.net
+L: linux-kernel@vger.rutgers.edu
+W: http://www.nyx.net/~arobinso
+S: Maintained
+
+HFS FILESYSTEM
+P: Adrian Sun
+M: asun@cobaltnet.com
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+HIGH-SPEED SCC DRIVER FOR AX.25
+P: Klaus Kudielka
+M: oe1kib@oe1kib.ampr.org
+L: linux-hams@vger.rutgers.edu
+S: Maintained
+
+HIPPI
+P: Jes Sorensen
+M: Jes.Sorensen@cern.ch
+L: linux-hippi@sunsite.auc.dk
+S: Maintained
+
+HP100: Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series
+P: Jaroslav Kysela
+M: perex@suse.cz
+S: Maintained
+
+HPFS FILESYSTEM
+P: Mikulas Patocka
+M: mikulas@artax.karlin.mff.cuni.cz
+W: http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi
+S: Maintained
+
+i386 BOOT CODE
+P: Riley H. Williams
+M: rhw@memalpha.cx
+L: Linux-Kernel@vger.rutgers.edu
+S: Maintained
+
+IBM MCA SCSI SUBSYSTEM DRIVER
+P: Michael Lang
+M: langa2@kph.uni-mainz.de
+W: http://www.uni-mainz.de/~langm000/linux.html
+S: Maintained
+
+IBM ServeRAID RAID DRIVER
+P: Keith Mitchell
+M: ipslinux@us.ibm.com
+W: http://www.developer.ibm.com/welcome/netfinity/serveraid_beta.html
+S: Supported
+
+IDE DRIVER [GENERAL]
+P: Andre Hedrick
+M: andre@suse.com
+L: linux-kernel@vger.rutgers.edu
+W: http://linux.kernel.org/pub/linux/kernel/people/hedrick/
+S: Supported
+
+IDE/ATAPI CDROM DRIVER
+P: Jens Axboe
+M: axboe@image.dk
+L: linux-kernel@vger.rutgers.edu
+W: http://www.kernel.dk
+S: Maintained
+
+IDE/ATAPI TAPE/FLOPPY DRIVERS
+P: Gadi Oxman
+M: Gadi Oxman <gadio@netvision.net.il>
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+INTEL APIC/IOAPIC, LOWLEVEL X86 SMP SUPPORT
+P: Ingo Molnar
+M: mingo@redhat.com
+S: Maintained
+
+IP MASQUERADING:
+P: Juanjo Ciarlante
+M: jjciarla@raiz.uncu.edu.ar
+S: Maintained
+
+IPX/SPX NETWORK LAYER
+P: Jay Schulist
+M: Jay Schulist <Jay.Schulist@spacs.k12.wi.us>
+L: linux-net@vger.rutgers.edu
+S: Maintained
+
+IRDA SUBSYSTEM
+P: Dag Brattli
+M: Dag Brattli <dagb@cs.uit.no>
+L: linux-irda@pasta.cs.uit.no
+W: http://www.cs.uit.no/linux-irda/
+S: Maintained
+
+ISAPNP
+P: Jaroslav Kysela
+M: perex@suse.cz
+S: Maintained
+
+ISDN SUBSYSTEM (general)
+P: Fritz Elfert
+M: fritz@isdn4linux.de
+L: isdn4linux@listserv.isdn4linux.de
+W: http://www.isdn4linux.de
+S: Maintained
+
+ISDN SUBSYSTEM (card drivers)
+P: Karsten Keil
+M: kkeil@suse.de
+L: isdn4linux@listserv.isdn4linux.de
+W: http://www.isdn4linux.de
+S: Maintained
+
+JOYSTICK DRIVER
+P: Vojtech Pavlik
+M: vojtech@suse.cz
+L: linux-joystick@atrey.karlin.mff.cuni.cz
+W: http://www.suse.cz/development/joystick/
+S: Maintained
+
+KERNEL AUTOMOUNTER (AUTOFS)
+P: H. Peter Anvin
+M: hpa@zytor.com
+L: autofs@linux.kernel.org
+S: Maintained
+
+KERNEL NFSD
+P: G. Allen Morris III
+M: gam3@acm.org
+L: nfs-devel@linux.kernel.org (Linux NFS)
+W: http://csua.berkeley.edu/~gam3/knfsd
+S: Maintained
+
+LAPB module
+P: Henner Eisen
+M: eis@baty.hanse.de
+L: linux-x25@vger.rutgers.edu
+S: Maintained
+
+LINUX FOR POWERPC
+P: Cort Dougan
+M: cort@ppc.kernel.org
+W: http://www.ppc.kernel.org/
+S: Maintained
+
+LINUX FOR POWER MACINTOSH
+P: Paul Mackerras
+M: paulus@linuxcare.com
+W: http://www.linuxppc.org/
+L: linuxppc-dev@lists.linuxppc.org
+S: Maintained
+
+M68K
+P: Jes Sorensen
+M: Jes.Sorensen@cern.ch
+W: http://www.clark.net/pub/lawrencc/linux/index.html
+L: linux-m68k@lists.linux-m68k.org
+S: Maintained
+
+M68K ON APPLE MACINTOSH
+P: Alan Cox
+M: Alan.Cox@linux.org
+W: http://www.mac.linux-m68k.org/home.html
+L: linux-mac68k@wave.lm.com
+S: As time permits [Michael confess, you are the mac68k maintainer 8)]
+
+M68K ON HP9000/300
+P: Philip Blundell
+M: philb@gnu.org
+W: http://www.tazenda.demon.co.uk/phil/linux-hp
+S: Maintained
+
+MIPS
+P: Ralf Baechle
+M: ralf@gnu.ai.mit.edu
+W: http://lena.fnet.fr/
+L: linux-mips@fnet.fr
+S: Maintained
+
+MISCELLANEOUS MCA-SUPPORT
+P: David Weinehall
+M: tao@acc.umu.se (personal)
+W: http://www.acc.umu.se/~tao/
+W: http://www.acc.umu.se/~mcalinux/
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+MODULE SUPPORT [GENERAL], KERNELD
+P: Richard Henderson
+M: richard@gnu.ai.mit.edu
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+MOUSE AND MISC DEVICES [GENERAL]
+P: Alessandro Rubini
+M: rubini@ipvvis.unipv.it
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+MTRR AND SIMILAR SUPPORT [i386]
+P: Richard Gooch
+M: rgooch@atnf.csiro.au
+L: linux-kernel@vger.rutgers.edu
+W: http://www.atnf.csiro.au/~rgooch/linux/kernel-patches.html
+S: Maintained
+
+MULTISOUND SOUND DRIVER
+P: Andrew Veliath
+M: andrewtv@usa.net
+S: Maintained
+
+NCP FILESYSTEM
+P: Petr Vandrovec
+M: vandrove@vc.cvut.cz
+P: Volker Lendecke
+M: vl@kki.org
+L: linware@sh.cvut.cz
+S: Maintained
+
+NETFILTER
+P: Rusty Russell
+M: Rusty.Russell@rustcorp.com.au
+W: http://www.samba.org/netfilter/
+W: http://netfilter.kernelnotes.org
+W: http://antarctica.penguincomputing.com/~netfilter/
+L: netfilter@lists.samba.org
+S: Supported
+
+NETROM NETWORK LAYER
+P: Tomi Manninen
+M: Tomi.Manninen@hut.fi
+L: linux-hams@vger.rutgers.edu
+S: Maintained
+
+NETWORK BLOCK DEVICE
+P: Pavel Machek
+M: pavel@atrey.karlin.mff.cuni.cz
+S: Maintained
+
+NETWORKING [GENERAL]
+P: Networking Teak
+M: netdev@oss.sgi.com
+L: linux-net@vger.rutgers.edu
+W: http://www.uk.linux.org/NetNews.html (2.0 only)
+S: Maintained
+
+NETWORKING [IPv4/IPv6]
+P: David S. Miller
+M: davem@redhat.com
+P: Andi Kleen
+M: ak@muc.de
+P: Alexey Kuznetsov
+M: kuznet@ms2.inr.ac.ru
+L: netdev@oss.sgi.com
+S: Maintained
+
+NFS CLIENT
+P: Trond Myklebust
+M: trond.myklebust@fys.uio.no
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+NI5010 NETWORK DRIVER
+P: Jan-Pascal van Best and Andreas Mohr
+M: jvbest@qv3pluto.leidenuniv.nl (Best)
+M: 100.30936@germany.net (Mohr)
+L: linux-net@vger.rutgers.edu
+S: Maintained
+
+NON-IDE/NON-SCSI CDROM DRIVERS [GENERAL] (come on, crew - mark your responsibility)
+P: Eberhard Moenkeberg
+M: emoenke@gwdg.de
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+OLYMPIC NETWORK DRIVER
+P: Peter De Shrijver
+M: p2@ace.ulyssis.sutdent.kuleuven.ac.be
+P: Mike Phillips
+M: phillim@amtrak.com
+L: linux-net@vger.rutgers.edu
+L: linux-tr@emissary.aus-etc.com
+W: http://www.linuxtr.net
+S: Maintained
+
+OPL3-SA2, SA3, and SAx DRIVER
+P: Scott Murray
+M: scottm@interlog.com
+L: linux-sound@vger.rutgers.edu
+S: Maintained
+
+PARALLEL PORT SUPPORT
+P: Phil Blundell
+M: Philip.Blundell@pobox.com
+P: Tim Waugh
+M: tim@cyberelk.demon.co.uk
+P: David Campbell
+M: campbell@torque.net
+P: Andrea Arcangeli
+M: andrea@e-mind.com
+L: linux-parport@torque.net
+W: http://www.cyberelk.demon.co.uk/parport.html
+S: Maintained
+
+PARIDE DRIVERS FOR PARALLEL PORT IDE DEVICES
+P: Grant Guenther
+M: grant@torque.net
+L: linux-parport@torque.net
+W: http://www.torque.net/linux-pp.html
+S: Maintained
+
+PCI ID DATABASE
+P: Jens Maurer
+M: jmaurer@cck.uni-kl.de
+S: Maintained
+
+PCI SOUND DRIVERS (ES1370, ES1371 and SONICVIBES)
+P: Thomas Sailer
+M: sailer@ife.ee.ethz.ch
+L: linux-sound@vger.rutgers.edu
+W: http://www.ife.ee.ethz.ch/~sailer/linux/pciaudio.html
+S: Maintained
+
+PCI SUBSYSTEM
+P: Martin Mares
+M: mj@suse.cz
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+PCMCIA SUBSYSTEM
+P: David Hinds
+M: dhinds@zen.stanford.edu
+L: linux-kernel@vger.rutgers.edu
+W: http://pcmcia.sourceforge.org
+S: Maintained
+
+PCNET32 NETWORK DRIVER
+P: Thomas Bogendörfer
+M: tsbogend@alpha.franken.de
+L: linux-net@vger.rutgers.edu
+S: Maintained
+
+PNP SUPPORT
+P: Tom Lees
+M: tom@lpsg.demon.co.uk
+L: pnp-users@ferret.lmh.ox.ac.uk
+L: pnp-devel@ferret.lmh.ox.ac.uk
+W: http://www-jcr.lmh.ox.ac.uk/~pnp/
+S: Maintained
+
+PPP PROTOCOL DRIVERS AND COMPRESSORS
+P: Al Longyear
+M: longyear@pobox.com
+L: linux-ppp@vger.rutgers.edu
+S: Maintained
+
+PROMISE DC4030 CACHING DISK CONTROLLER DRIVER
+P: Peter Denison
+M: promise@pnd-pc.demon.co.uk
+W: http://www.pnd-pc.demon.co.uk/promise/
+S: Maintained
+
+RAYLINK/WEBGEAR 802.11 WIRELESS LAN DRIVER
+P: Corey Thomas
+M: corey@world.std.com
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+REAL TIME CLOCK DRIVER
+P: Paul Gortmaker
+M: p_gortmaker@yahoo.com
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+ROSE NETWORK LAYER
+P: Frederic Rible
+M: frible@teaser.fr
+L: linux-hams@vger.rutgers.edu
+S: Maintained
+
+RISCOM8 DRIVER
+P: Dmitry Gorodchanin
+M: pgmdsg@ibi.com
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+SBPCD CDROM DRIVER
+P: Eberhard Moenkeberg
+M: emoenke@gwdg.de
+L: linux-kernel@vger.rutgers.edu
+S: Maintained
+
+SCSI CDROM DRIVER
+P: Jens Axboe
+M: axboe@image.dk
+L: linux-scsi@vger.rutgers.edu
+W: http://www.kernel.dk
+S: Maintained
+
+SCSI SG DRIVER
+P: Doug Gilbert
+M: dgilbert@interlog.com
+L: linux-scsi@vger.rutgers.edu
+W: http://www.torque.net/sg
+S: Maintained
+
+SCSI SUBSYSTEM
+L: linux-scsi@vger.rutgers.edu
+S: Unmaintained
+
+SCSI TAPE DRIVER
+P: Kai Mdkisara
+M: Kai.Makisara@metla.fi
+L: linux-scsi@vger.rutgers.edu
+S: Maintained
+
+SGI VISUAL WORKSTATION 320 AND 540
+P: Bent Hagemark
+M: bh@sgi.com
+P: Ingo Molnar
+M: mingo@redhat.com
+S: Maintained
+
+SIS 900/7016 FAST ETHERNET DRIVER
+P: Ollie Lho
+M: ollie@sis.com.tw
+L: linux-net@vger.rutgers.edu
+S: Supported
+
+SMB FILESYSTEM
+P: Andrew Tridgell
+M: tridge@samba.org
+W: http://samba.org/
+L: samba@samba.org
+S: Maintained
+
+SMP: (except SPARC)
+P: Linus Torvalds
+M: torvalds@transmeta.com
+L: linux-smp@vger.rutgers.edu
+S: Maintained
+
+SONIC NETWORK DRIVER
+P: Thomas Bogendoerfer
+M: tsbogend@alpha.franken.de
+L: linux-net@vger.rutgers.edu
+S: Maintained
+
+SOUND
+P: Alan Cox
+M: alan@redhat.com
+S: Supported
+
+SPARC:
+P: David S. Miller
+M: davem@redhat.com
+P: Eddie C. Dost
+M: ecd@skynet.be
+P: Jakub Jelinek
+M: jj@sunsite.ms.mff.cuni.cz
+P: Anton Blanchard
+M: anton@progsoc.uts.edu.au
+L: sparclinux@vger.rutgers.edu
+L: ultralinux@vger.rutgers.edu
+W: http://ultra.linux.cz
+W: http://www.geog.ubc.ca/s_linux.html
+S: Maintained
+
+SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
+P: Roger Wolff
+M: R.E.Wolff@BitWizard.nl
+M: io8-linux@specialix.co.uk
+L: linux-kernel@vger.rutgers.edu ?
+S: Supported
+
+SPX NETWORK LAYER
+P: Jay Schulist
+M: Jay.Schulist@spacs.k12.wi.us
+L: linux-net@vger.rutgers.edu
+S: Supported
+
+STALLION TECHNOLOGIES MULTIPORT SERIAL BOARDS
+M: support@stallion.oz.au
+W: http://www.stallion.com
+S: Supported
+
+STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
+W: http://mosquitonet.Stanford.EDU/strip.html
+S: Unsupported ?
+
+SUPERH
+P: Niibe Yutaka
+M: gniibe@chroot.org
+P: Kazumoto Kojima
+M: kkojima@rr.iij4u.or.jp
+L: linux-sh@m17n.org
+W: http://www.m17n.org/linux-sh/
+W: http://www.rr.iij4u.or.jp/~kkojima/linux-sh4.html
+S: Maintained
+
+SVGA HANDLING
+P: Martin Mares
+M: mj@atrey.karlin.mff.cuni.cz
+L: linux-video@atrey.karlin.mff.cuni.cz
+S: Maintained
+
+SYSV FILESYSTEM
+P: Krzysztof G. Baranowski
+M: kgb@manjak.knm.org.pl
+S: Maintained
+
+TLAN NETWORK DRIVER
+P: Torben Mathiasen
+M: torben.mathiasen@compaq.com
+L: tlan@vuser.vu.union.edu
+S: Maintained
+
+TOKEN-RING NETWORK DRIVER
+P: Paul Norton
+M: pnorton@ieee.org
+L: linux-net@vger.rutgers.edu
+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
+P: Dario Ballabio
+M: dario@milano.europe.dg.com
+L: linux-scsi@vger.rutgers.edu
+S: Maintained
+
+UDF FILESYSTEM
+P: Ben Fennema
+M: bfennema@falcon.csc.calpoly.edu
+P: Dave Boynton
+M: dave@trylinux.com
+L: linux_udf@hootie.lvld.hp.com
+W: http://www.trylinux.com/projects/udf/index.html
+S: Maintained
+
+UMSDOS FILESYSTEM
+P: Matija Nalis
+M: Matija Nalis <mnalis-umsdos@voyager.hr>
+L: linux-kernel@vger.rutgers.edu
+W: http://www.voyager.hr/~mnalis/umsdos/
+S: Maintained
+
+UNIFORM CDROM DRIVER
+P: Jens Axboe
+M: axboe@image.dk
+L: linux-kernel@vger.rutgers.edu
+W: http://www.kernel.dk
+S: Maintained
+
+USB SUBSYSTEM
+P: Randy Dunlap
+M: randy.dunlap@intel.com
+L: linux-usb@suse.com
+W: http://www.linux-usb.org
+S: Supported
+
+USB HUB AND UHCI DRIVERS
+P: Johannes Erdfelt
+M: jerdfelt@sventech.com
+L: linux-usb@suse.com
+S: Maintained
+
+USB OHCI DRIVER
+P: Gregory P. Smith
+M: greg@electricrain.com
+M: greg@suitenine.com
+L: linux-usb@suse.com
+S: Maintained (not yet usable)
+W: http://suitenine.com/usb/
+
+VFAT FILESYSTEM:
+P: Gordon Chaffee
+M: chaffee@cs.berkeley.edu
+L: linux-kernel@vger.rutgers.edu
+W: http://bmrc.berkeley.edu/people/chaffee
+S: Maintained
+
+VIA 82Cxxx AUDIO DRIVER
+P: Jeff Garzik
+M: jgarzik@pobox.com
+S: Maintained
+
+VIDEO FOR LINUX
+P: Alan Cox
+M: Alan.Cox@linux.org
+W: http://roadrunner.swansea.linux.org.uk/v4l.shtml
+S: Maintained
+
+WAN ROUTER & SANGOMA WANPIPE DRIVERS & API (X.25, FRAME RELAY, PPP, CISCO HDLC)
+P: Jaspreet Singh
+M: jaspreet@sangoma.com
+M: dm@sangoma.com
+W: http://www.sangoma.com
+S: Supported
+
+WAVELAN NETWORK DRIVER & WIRELESS EXTENSIONS
+P: Jean Tourrilhes
+M: jt@hpl.hp.com
+W: http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/
+S: Maintained
+
+WD7000 SCSI DRIVER
+P: Miroslav Zagorac
+M: zaga@fly.cc.fer.hr
+L: linux-scsi@vger.rutgers.edu
+S: Maintained
+
+X.25 NETWORK LAYER
+P: Henner Eisen
+M: eis@baty.hanse.de
+L: linux-x25@vger.rutgers.edu
+S: Maintained
+
+Z85230 SYNCHRONOUS DRIVER
+P: Alan Cox
+M: alan@redhat.com
+W: http://roadrunner.swansea.linux.org.uk/synchronous.shtml
+S: Maintained
+
+Z8530 DRIVER FOR AX.25
+P: Joerg Reuter
+M: jreuter@poboxes.com
+W: http://poboxes.com/jreuter/
+W: http://qsl.net/dl1bke/
+L: linux-hams@vger.rutgers.edu
+S: Maintained
+
+ZR36120 VIDEO FOR LINUX DRIVER
+P: Pauline Middelink
+M: middelin@polyware.nl
+W: http://www.polyware.nl/~middelin/En/hobbies.html
+W: http://www.polyware.nl/~middelin/hobbies.html
+S: Maintained
+
+THE REST
+P: Linus Torvalds
+S: Buried alive in reporters
# CONFIG_BLK_DEV_OFFBOARD is not set
# CONFIG_BLK_DEV_AEC6210 is not set
CONFIG_BLK_DEV_PIIX=y
-# CONFIG_BLK_DEV_PIIX_TUNING is not set
# CONFIG_IDE_CHIPSETS is not set
# CONFIG_BLK_CPQ_DA is not set
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=256
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
#
# Mice
#
drive->scsi = 1;
goto done;
#else
-#warning ide scsi-emulation selected but no SCSI-subsystem in kernel
drive->scsi = 0;
goto bad_option;
#endif /* defined(CONFIG_BLK_DEV_IDESCSI) && defined(CONFIG_SCSI) */
* Released under terms of General Public License
*/
+#include <linux/config.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
ifeq ($(CONFIG_SK98LIN),y)
SUB_DIRS += sk98lin
-MOD_IN_SUB_DIRS += sk98lin
-L_OBJS += sk98lin/sk98lin.o
+obj-y += sk98lin/sk98lin.o
else
ifeq ($(CONFIG_SK98LIN),m)
MOD_IN_SUB_DIRS += sk98lin
# USB device configuration
#
mainmenu_option next_comment
-comment 'Support for USB'
+comment 'USB support'
tristate 'Support for USB' CONFIG_USB
if [ ! "$CONFIG_USB" = "n" ]; then
comment 'Miscellaneous USB options'
if [ "$CONFIG_PROC_FS" != "n" ]; then
- bool ' Preliminary /proc/bus/usb support' CONFIG_USB_PROC
+ bool ' /proc/bus/usb support' CONFIG_USB_PROC
fi
dep_tristate ' EZUSB Firmware downloader' CONFIG_USB_EZUSB $CONFIG_USB
This serial driver currently only works with the Belkin and Peracom USB
Serial devices. It should also work for the Etek converter, but I do
-not know the vendor id, and device id of that device (if anyone does,
+not know the vendor id and device id of that device (if anyone does,
please let me know.)
If your device is not compatible with the above models, you can try
Peracom, and eTek devices, and the raw dumps from the Win98 driver are
confusing, and eTek keeps giving me the run around, no control signals are
currently handled, and the data will most likely come through on a baud
-rate that you are not expecting.
-
-The major number that the driver uses is 240 (in the local/experimental
-range.) It will stay there until some agreements are reached on how to
-handle the configuration problem that USB provides.
-
-To use the driver, create the following nodes:
-mknod /dev/ttyUSB0 c 240 0
-mknod /dev/ttyUSB1 c 240 1
-mknod /dev/ttyUSB2 c 240 2
-mknod /dev/ttyUSB3 c 240 3
+rate that you are not expecting. So if you have these devices, do not
+expect the correct data to show up at either end.
+
+The major number that the driver uses is 188 so to use the driver, create
+the following nodes:
+mknod /dev/ttyUSB0 c 188 0
+mknod /dev/ttyUSB1 c 188 1
+mknod /dev/ttyUSB2 c 188 2
+mknod /dev/ttyUSB3 c 188 3
then plug in a device and use your friendly terminal program to see what
happens.
{
unsigned char *data;
struct acm_state *acm = (struct acm_state *)dev_id;
- devrequest *dr;
+ devrequest *dr;
info("ACM_USB_IRQ\n");
if (!acm->active)
return 1;
- dr = __buffer;
+ dr = __buffer;
data = __buffer;
data += sizeof(dr);
#if 0
- printk("reqtype: %02X\n",dr->requesttype);
- printk("request: %02X\n",dr->request);
+ printk("reqtype: %02X\n",dr->requesttype);
+ printk("request: %02X\n",dr->request);
printk("wValue: %02X\n",dr->value);
printk("wIndex: %02X\n",dr->index);
printk("wLength: %02X\n",dr->length);
/* Only use CDC */
if (dev->descriptor.bDeviceClass != 2 ||
dev->descriptor.bDeviceSubClass != 0 ||
- dev->descriptor.bDeviceProtocol != 0)
+ dev->descriptor.bDeviceProtocol != 0)
return NULL;
#define IFCLASS(if) ((if->bInterfaceClass << 24) | (if->bInterfaceSubClass << 16) | (if->bInterfaceProtocol << 8) | (if->bNumEndpoints))
/*****************************************************************************/
/*
- * audio.c -- USB Audio Class driver
+ * audio.c -- USB Audio Class driver
*
- * Copyright (C) 1999
- * Alan Cox (alan@lxorguk.ukuu.org.uk)
- * Thomas Sailer (sailer@ife.ee.ethz.ch)
+ * Copyright (C) 1999
+ * Alan Cox (alan@lxorguk.ukuu.org.uk)
+ * Thomas Sailer (sailer@ife.ee.ethz.ch)
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
*
* 1999-09-07: Alan Cox
- * Parsing Audio descriptor patch
+ * Parsing Audio descriptor patch
* 1999-09-08: Thomas Sailer
- * Added OSS compatible data io functions; both parts of the
- * driver remain to be glued together
+ * Added OSS compatible data io functions; both parts of the
+ * driver remain to be glued together
* 1999-09-10: Thomas Sailer
- * Beautified the driver. Added sample format conversions.
- * Still not properly glued with the parsing code.
- * The parsing code seems to have its problems btw,
- * Since it parses all available configs but doesn't
- * store which iface/altsetting belongs to which config.
+ * Beautified the driver. Added sample format conversions.
+ * Still not properly glued with the parsing code.
+ * The parsing code seems to have its problems btw,
+ * Since it parses all available configs but doesn't
+ * store which iface/altsetting belongs to which config.
* 1999-09-20: Thomas Sailer
- * Threw out Alan's parsing code and implemented my own one.
- * You cannot reasonnably linearly parse audio descriptors,
- * especially the AudioClass descriptors have to be considered
- * pointer lists. Mixer parsing untested, due to lack of device.
- * First stab at synch pipe implementation, the Dallas USB DAC
- * wants to use an Asynch out pipe. usb_audio_state now basically
- * only contains lists of mixer and wave devices. We can therefore
- * now have multiple mixer/wave devices per USB device.
+ * Threw out Alan's parsing code and implemented my own one.
+ * You cannot reasonnably linearly parse audio descriptors,
+ * especially the AudioClass descriptors have to be considered
+ * pointer lists. Mixer parsing untested, due to lack of device.
+ * First stab at synch pipe implementation, the Dallas USB DAC
+ * wants to use an Asynch out pipe. usb_audio_state now basically
+ * only contains lists of mixer and wave devices. We can therefore
+ * now have multiple mixer/wave devices per USB device.
* 1999-10-28: Thomas Sailer
- * Converted to URB API. Fixed a taskstate/wakeup semantics mistake
- * that made the driver consume all available CPU cycles.
- * Now runs stable on UHCI-Acher/Fliegl/Sailer.
+ * Converted to URB API. Fixed a taskstate/wakeup semantics mistake
+ * that made the driver consume all available CPU cycles.
+ * Now runs stable on UHCI-Acher/Fliegl/Sailer.
* 1999-10-31: Thomas Sailer
- * Audio can now be unloaded if it is not in use by any mixer
- * or dsp client (formerly you had to disconnect the audio devices
- * from the USB port)
- * Finally, about three months after ordering, my "Maxxtro SPK222"
- * speakers arrived, isn't disdata a great mail order company 8-)
- * Parse class specific endpoint descriptor of the audiostreaming
- * interfaces and take the endpoint attributes from there.
- * Unbelievably, the Philips USB DAC has a sampling rate range
- * of over a decade, yet does not support the sampling rate control!
- * No wonder it sounds so bad, has very audible sampling rate
- * conversion distortion. Don't try to listen to it using
- * decent headphones!
- * "Let's make things better" -> but please Philips start with your
- * own stuff!!!!
+ * Audio can now be unloaded if it is not in use by any mixer
+ * or dsp client (formerly you had to disconnect the audio devices
+ * from the USB port)
+ * Finally, about three months after ordering, my "Maxxtro SPK222"
+ * speakers arrived, isn't disdata a great mail order company 8-)
+ * Parse class specific endpoint descriptor of the audiostreaming
+ * interfaces and take the endpoint attributes from there.
+ * Unbelievably, the Philips USB DAC has a sampling rate range
+ * of over a decade, yet does not support the sampling rate control!
+ * No wonder it sounds so bad, has very audible sampling rate
+ * conversion distortion. Don't try to listen to it using
+ * decent headphones!
+ * "Let's make things better" -> but please Philips start with your
+ * own stuff!!!!
* 1999-11-02: It takes the Philips boxes several seconds to acquire synchronisation
- * that means they won't play short sounds. Should probably maintain
- * the ISO datastream even if there's nothing to play.
- * Fix counting the total_bytes counter, RealPlayer G2 depends on it.
+ * that means they won't play short sounds. Should probably maintain
+ * the ISO datastream even if there's nothing to play.
+ * Fix counting the total_bytes counter, RealPlayer G2 depends on it.
*
*/
struct usb_audio_state *state;
int remove_pending;
- /* soundcore stuff */
- int dev_audio;
+ /* soundcore stuff */
+ int dev_audio;
/* wave stuff */
- mode_t open_mode;
+ mode_t open_mode;
spinlock_t lock; /* DMA buffer access spinlock */
struct usbin {
- unsigned int interface; /* Interface number */
+ int interface; /* Interface number, -1 means not used */
unsigned int format; /* USB data format */
unsigned int datapipe; /* the data input pipe */
unsigned int syncpipe; /* the synchronisation pipe - 0 for anything but adaptive IN mode */
} usbin;
struct usbout {
- unsigned int interface; /* Interface number */
+ int interface; /* Interface number, -1 means not used */
unsigned int format; /* USB data format */
unsigned int datapipe; /* the data input pipe */
unsigned int syncpipe; /* the synchronisation pipe - 0 for anything but asynchronous OUT mode */
struct list_head list;
struct usb_audio_state *state;
- /* soundcore stuff */
- int dev_mixer;
+ /* soundcore stuff */
+ int dev_mixer;
unsigned char iface; /* interface number of the AudioControl interface */
/* USB format descriptions */
- unsigned int numch, modcnt;
+ unsigned int numch, modcnt;
/* mixch is last and gets allocated dynamically */
struct mixerchannel ch[0];
extern inline unsigned ld2(unsigned int x)
{
- unsigned r = 0;
-
- if (x >= 0x10000) {
- x >>= 16;
- r += 16;
- }
- if (x >= 0x100) {
- x >>= 8;
- r += 8;
- }
- if (x >= 0x10) {
- x >>= 4;
- r += 4;
- }
- if (x >= 4) {
- x >>= 2;
- r += 2;
- }
- if (x >= 2)
- r++;
- return r;
+ unsigned r = 0;
+
+ if (x >= 0x10000) {
+ x >>= 16;
+ r += 16;
+ }
+ if (x >= 0x100) {
+ x >>= 8;
+ r += 8;
+ }
+ if (x >= 0x10) {
+ x >>= 4;
+ r += 4;
+ }
+ if (x >= 4) {
+ x >>= 2;
+ r += 2;
+ }
+ if (x >= 2)
+ r++;
+ return r;
}
/* --------------------------------------------------------------------- */
free_page((unsigned long)p);
db->sgbuf[nr] = NULL;
}
- db->mapped = db->ready = 0;
+ db->mapped = db->ready = 0;
}
static int dmabuf_init(struct dmabuf *db)
{
- unsigned int nr, bytepersec, bufs;
+ unsigned int nr, bytepersec, bufs;
void *p;
/* initialize some fields */
- db->rdptr = db->wrptr = db->total_bytes = db->count = db->error = 0;
+ db->rdptr = db->wrptr = db->total_bytes = db->count = db->error = 0;
/* calculate required buffer size */
bytepersec = db->srate << AFMT_BYTESSHIFT(db->format);
bufs = 1U << DMABUFSHIFT;
- if (db->ossfragshift) {
- if ((1000 << db->ossfragshift) < bytepersec)
- db->fragshift = ld2(bytepersec/1000);
- else
- db->fragshift = db->ossfragshift;
- } else {
- db->fragshift = ld2(bytepersec/100/(db->subdivision ? db->subdivision : 1));
- if (db->fragshift < 3)
- db->fragshift = 3;
- }
- db->numfrag = bufs >> db->fragshift;
- while (db->numfrag < 4 && db->fragshift > 3) {
- db->fragshift--;
- db->numfrag = bufs >> db->fragshift;
- }
- db->fragsize = 1 << db->fragshift;
- if (db->ossmaxfrags >= 4 && db->ossmaxfrags < db->numfrag)
- db->numfrag = db->ossmaxfrags;
- db->dmasize = db->numfrag << db->fragshift;
+ if (db->ossfragshift) {
+ if ((1000 << db->ossfragshift) < bytepersec)
+ db->fragshift = ld2(bytepersec/1000);
+ else
+ db->fragshift = db->ossfragshift;
+ } else {
+ db->fragshift = ld2(bytepersec/100/(db->subdivision ? db->subdivision : 1));
+ if (db->fragshift < 3)
+ db->fragshift = 3;
+ }
+ db->numfrag = bufs >> db->fragshift;
+ while (db->numfrag < 4 && db->fragshift > 3) {
+ db->fragshift--;
+ db->numfrag = bufs >> db->fragshift;
+ }
+ db->fragsize = 1 << db->fragshift;
+ if (db->ossmaxfrags >= 4 && db->ossmaxfrags < db->numfrag)
+ db->numfrag = db->ossmaxfrags;
+ db->dmasize = db->numfrag << db->fragshift;
for(nr = 0; nr < NRSGBUF; nr++) {
if (!db->sgbuf[nr]) {
p = (void *)get_free_page(GFP_KERNEL);
break;
}
db->bufsize = nr << PAGE_SHIFT;
- db->ready = 1;
+ db->ready = 1;
printk(KERN_DEBUG "dmabuf_init: bytepersec %d bufs %d ossfragshift %d ossmaxfrags %d "
"fragshift %d fragsize %d numfrag %d dmasize %d bufsize %d\n",
bytepersec, bufs, db->ossfragshift, db->ossmaxfrags, db->fragshift, db->fragsize,
db->numfrag, db->dmasize, db->bufsize);
- return 0;
+ return 0;
}
static int dmabuf_mmap(struct dmabuf *db, unsigned long start, unsigned long size, pgprot_t prot)
static void usbin_stop(struct usb_audiodev *as)
{
struct usbin *u = &as->usbin;
- unsigned long flags;
+ unsigned long flags;
unsigned int i, notkilled = 1;
- spin_lock_irqsave(&as->lock, flags);
+ spin_lock_irqsave(&as->lock, flags);
u->flags &= ~FLG_RUNNING;
i = u->flags;
- spin_unlock_irqrestore(&as->lock, flags);
+ spin_unlock_irqrestore(&as->lock, flags);
while (i & (FLG_URB0RUNNING|FLG_URB1RUNNING|FLG_SYNC0RUNNING|FLG_SYNC1RUNNING)) {
set_current_state(notkilled ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
schedule_timeout(1);
u->flags &= ~FLG_RUNNING;
}
}
- spin_unlock_irqrestore(&as->lock, flags);
+ spin_unlock_irqrestore(&as->lock, flags);
return 0;
}
static void usbout_stop(struct usb_audiodev *as)
{
struct usbout *u = &as->usbout;
- unsigned long flags;
+ unsigned long flags;
unsigned int i, notkilled = 1;
- spin_lock_irqsave(&as->lock, flags);
+ spin_lock_irqsave(&as->lock, flags);
u->flags &= ~FLG_RUNNING;
i = u->flags;
- spin_unlock_irqrestore(&as->lock, flags);
+ spin_unlock_irqrestore(&as->lock, flags);
while (i & (FLG_URB0RUNNING|FLG_URB1RUNNING|FLG_SYNC0RUNNING|FLG_SYNC1RUNNING)) {
set_current_state(notkilled ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
schedule_timeout(1);
u->flags &= ~FLG_RUNNING;
}
}
- spin_unlock_irqrestore(&as->lock, flags);
+ spin_unlock_irqrestore(&as->lock, flags);
return 0;
}
static int set_format_in(struct usb_audiodev *as)
{
- struct usb_device *dev = as->state->usbdev;
- struct usb_config_descriptor *config = dev->actconfig;
- struct usb_interface_descriptor *alts;
- struct usb_interface *iface;
+ struct usb_device *dev = as->state->usbdev;
+ struct usb_config_descriptor *config = dev->actconfig;
+ struct usb_interface_descriptor *alts;
+ struct usb_interface *iface;
struct usbin *u = &as->usbin;
struct dmabuf *d = &u->dma;
struct audioformat *fmt;
static int set_format_out(struct usb_audiodev *as)
{
- struct usb_device *dev = as->state->usbdev;
- struct usb_config_descriptor *config = dev->actconfig;
- struct usb_interface_descriptor *alts;
- struct usb_interface *iface;
+ struct usb_device *dev = as->state->usbdev;
+ struct usb_config_descriptor *config = dev->actconfig;
+ struct usb_interface_descriptor *alts;
+ struct usb_interface *iface;
struct usbout *u = &as->usbout;
struct dmabuf *d = &u->dma;
struct audioformat *fmt;
ch->value = v1 | (v2 << 8);
v1 = (v1 * v3) / 100 + ch->minval;
v2 = (v2 * v3) / 100 + ch->minval;
- switch (ch->selector) {
- case 0: /* mixer unit request */
+ switch (ch->selector) {
+ case 0: /* mixer unit request */
data[0] = v1;
data[1] = v1 >> 8;
- if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
- (ch->chnum << 8) | 1, ms->iface | (ch->unitid << 8), data, 2, HZ) < 0)
- goto err;
+ if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
+ (ch->chnum << 8) | 1, ms->iface | (ch->unitid << 8), data, 2, HZ) < 0)
+ goto err;
if (!(ch->flags & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT)))
return 0;
data[0] = v2;
if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
((ch->chnum + !!(ch->flags & MIXFLG_STEREOIN)) << 8) | (1 + !!(ch->flags & MIXFLG_STEREOOUT)),
ms->iface | (ch->unitid << 8), data, 2, HZ) < 0)
- goto err;
+ goto err;
return 0;
- /* various feature unit controls */
- case VOLUME_CONTROL:
+ /* various feature unit controls */
+ case VOLUME_CONTROL:
data[0] = v1;
data[1] = v1 >> 8;
- if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
- (ch->selector << 8) | ch->chnum, ms->iface | (ch->unitid << 8), data, 2, HZ) < 0)
- goto err;
+ if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
+ (ch->selector << 8) | ch->chnum, ms->iface | (ch->unitid << 8), data, 2, HZ) < 0)
+ goto err;
if (ch->chnum == 0)
return 0;
data[0] = v2;
(ch->selector << 8) | (ch->chnum + 1), ms->iface | (ch->unitid << 8), data, 2, HZ) < 0)
goto err;
return 0;
-
- case BASS_CONTROL:
- case MID_CONTROL:
- case TREBLE_CONTROL:
+
+ case BASS_CONTROL:
+ case MID_CONTROL:
+ case TREBLE_CONTROL:
data[0] = v1 >> 8;
if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
- (ch->selector << 8) | ch->chnum, ms->iface | (ch->unitid << 8), data, 1, HZ) < 0)
- goto err;
+ (ch->selector << 8) | ch->chnum, ms->iface | (ch->unitid << 8), data, 1, HZ) < 0)
+ goto err;
if (ch->chnum == 0)
return 0;
data[0] = v2 >> 8;
(ch->selector << 8) | (ch->chnum + 1), ms->iface | (ch->unitid << 8), data, 1, HZ) < 0)
goto err;
return 0;
-
- default:
- return -1;
- }
- return 0;
+
+ default:
+ return -1;
+ }
+ return 0;
err:
- printk(KERN_ERR "usbaudio: mixer request device %u if %u unit %u ch %u selector %u failed\n",
- dev->devnum, ms->iface, ch->unitid, ch->chnum, ch->selector);
+ printk(KERN_ERR "usbaudio: mixer request device %u if %u unit %u ch %u selector %u failed\n",
+ dev->devnum, ms->iface, ch->unitid, ch->chnum, ch->selector);
return -1;
}
return;
}
up(&open_sem);
- wake_up(&open_wait);
+ wake_up(&open_wait);
while (!list_empty(&s->audiolist)) {
as = list_entry(s->audiolist.next, struct usb_audiodev, list);
list_del(&as->list);
extern inline int prog_dmabuf_in(struct usb_audiodev *as)
{
- usbin_stop(as);
- return dmabuf_init(&as->usbin.dma);
+ usbin_stop(as);
+ return dmabuf_init(&as->usbin.dma);
}
extern inline int prog_dmabuf_out(struct usb_audiodev *as)
{
- usbout_stop(as);
- return dmabuf_init(&as->usbout.dma);
+ usbout_stop(as);
+ return dmabuf_init(&as->usbout.dma);
}
/* --------------------------------------------------------------------- */
static loff_t usb_audio_llseek(struct file *file, loff_t offset, int origin)
{
- return -ESPIPE;
+ return -ESPIPE;
}
/* --------------------------------------------------------------------- */
static int usb_audio_open_mixdev(struct inode *inode, struct file *file)
{
- int minor = MINOR(inode->i_rdev);
+ int minor = MINOR(inode->i_rdev);
struct list_head *devs, *mdevs;
struct usb_mixerdev *ms;
- struct usb_audio_state *s;
+ struct usb_audio_state *s;
- down(&open_sem);
+ down(&open_sem);
for (devs = audiodevs.next; devs != &audiodevs; devs = devs->next) {
s = list_entry(devs, struct usb_audio_state, audiodev);
for (mdevs = s->mixerlist.next; mdevs != &s->mixerlist; mdevs = mdevs->next) {
up(&open_sem);
return -EIO;
}
- file->private_data = ms;
+ file->private_data = ms;
s->count++;
MOD_INC_USE_COUNT;
up(&open_sem);
- return 0;
+ return 0;
}
static int usb_audio_release_mixdev(struct inode *inode, struct file *file)
{
- struct usb_mixerdev *ms = (struct usb_mixerdev *)file->private_data;
+ struct usb_mixerdev *ms = (struct usb_mixerdev *)file->private_data;
struct usb_audio_state *s = ms->state;
down(&open_sem);
release(s);
- MOD_DEC_USE_COUNT;
- return 0;
+ MOD_DEC_USE_COUNT;
+ return 0;
}
static int usb_audio_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
struct usb_mixerdev *ms = (struct usb_mixerdev *)file->private_data;
- int i, j, val;
-
- if (cmd == SOUND_MIXER_INFO) {
- mixer_info info;
- strncpy(info.id, "USB_AUDIO", sizeof(info.id));
- strncpy(info.name, "USB Audio Class Driver", sizeof(info.name));
- info.modify_counter = ms->modcnt;
- if (copy_to_user((void *)arg, &info, sizeof(info)))
- return -EFAULT;
- return 0;
- }
- if (cmd == SOUND_OLD_MIXER_INFO) {
- _old_mixer_info info;
- strncpy(info.id, "USB_AUDIO", sizeof(info.id));
- strncpy(info.name, "USB Audio Class Driver", sizeof(info.name));
- if (copy_to_user((void *)arg, &info, sizeof(info)))
- return -EFAULT;
- return 0;
- }
- if (cmd == OSS_GETVERSION)
- return put_user(SOUND_VERSION, (int *)arg);
- if (_IOC_TYPE(cmd) != 'M' || _IOC_SIZE(cmd) != sizeof(int))
- return -EINVAL;
- if (_IOC_DIR(cmd) == _IOC_READ) {
- switch (_IOC_NR(cmd)) {
- case SOUND_MIXER_RECSRC: /* Arg contains a bit for each recording source */
+ int i, j, val;
+
+ if (!ms->state->usbdev)
+ return -ENODEV;
+
+ if (cmd == SOUND_MIXER_INFO) {
+ mixer_info info;
+ strncpy(info.id, "USB_AUDIO", sizeof(info.id));
+ strncpy(info.name, "USB Audio Class Driver", sizeof(info.name));
+ info.modify_counter = ms->modcnt;
+ if (copy_to_user((void *)arg, &info, sizeof(info)))
+ return -EFAULT;
+ return 0;
+ }
+ if (cmd == SOUND_OLD_MIXER_INFO) {
+ _old_mixer_info info;
+ strncpy(info.id, "USB_AUDIO", sizeof(info.id));
+ strncpy(info.name, "USB Audio Class Driver", sizeof(info.name));
+ if (copy_to_user((void *)arg, &info, sizeof(info)))
+ return -EFAULT;
+ return 0;
+ }
+ if (cmd == OSS_GETVERSION)
+ return put_user(SOUND_VERSION, (int *)arg);
+ if (_IOC_TYPE(cmd) != 'M' || _IOC_SIZE(cmd) != sizeof(int))
+ return -EINVAL;
+ if (_IOC_DIR(cmd) == _IOC_READ) {
+ switch (_IOC_NR(cmd)) {
+ case SOUND_MIXER_RECSRC: /* Arg contains a bit for each recording source */
/* don't know how to handle this yet */
- return put_user(0, (int *)arg);
-
- case SOUND_MIXER_DEVMASK: /* Arg contains a bit for each supported device */
- for (val = i = 0; i < ms->numch; i++)
+ return put_user(0, (int *)arg);
+
+ case SOUND_MIXER_DEVMASK: /* Arg contains a bit for each supported device */
+ for (val = i = 0; i < ms->numch; i++)
val |= 1 << ms->ch[i].osschannel;
- return put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
- case SOUND_MIXER_RECMASK: /* Arg contains a bit for each supported recording source */
+ case SOUND_MIXER_RECMASK: /* Arg contains a bit for each supported recording source */
/* don't know how to handle this yet */
- return put_user(0, (int *)arg);
-
- case SOUND_MIXER_STEREODEVS: /* Mixer channels supporting stereo */
- for (val = i = 0; i < ms->numch; i++)
+ return put_user(0, (int *)arg);
+
+ case SOUND_MIXER_STEREODEVS: /* Mixer channels supporting stereo */
+ for (val = i = 0; i < ms->numch; i++)
if (ms->ch[i].flags & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT))
val |= 1 << ms->ch[i].osschannel;
- return put_user(val, (int *)arg);
-
- case SOUND_MIXER_CAPS:
- return put_user(0, (int *)arg);
-
- default:
- i = _IOC_NR(cmd);
- if (i >= SOUND_MIXER_NRDEVICES)
- return -EINVAL;
+ return put_user(val, (int *)arg);
+
+ case SOUND_MIXER_CAPS:
+ return put_user(0, (int *)arg);
+
+ default:
+ i = _IOC_NR(cmd);
+ if (i >= SOUND_MIXER_NRDEVICES)
+ return -EINVAL;
for (j = 0; j < ms->numch; j++) {
if (ms->ch[j].osschannel == i) {
return put_user(ms->ch[j].value, (int *)arg);
}
}
return -EINVAL;
- }
- }
- if (_IOC_DIR(cmd) != (_IOC_READ|_IOC_WRITE))
- return -EINVAL;
- ms->modcnt++;
- switch (_IOC_NR(cmd)) {
- case SOUND_MIXER_RECSRC: /* Arg contains a bit for each recording source */
- get_user_ret(val, (int *)arg, -EFAULT);
- /* set recording source: val */
- return 0;
-
- default:
- i = _IOC_NR(cmd);
- if (i >= SOUND_MIXER_NRDEVICES)
- return -EINVAL;
+ }
+ }
+ if (_IOC_DIR(cmd) != (_IOC_READ|_IOC_WRITE))
+ return -EINVAL;
+ ms->modcnt++;
+ switch (_IOC_NR(cmd)) {
+ case SOUND_MIXER_RECSRC: /* Arg contains a bit for each recording source */
+ get_user_ret(val, (int *)arg, -EFAULT);
+ /* set recording source: val */
+ return 0;
+
+ default:
+ i = _IOC_NR(cmd);
+ if (i >= SOUND_MIXER_NRDEVICES)
+ return -EINVAL;
for (j = 0; j < ms->numch && ms->ch[j].osschannel != i; j++);
if (j >= ms->numch)
return -EINVAL;
- get_user_ret(val, (int *)arg, -EFAULT);
+ get_user_ret(val, (int *)arg, -EFAULT);
if (wrmixer(ms, j, val))
return -EIO;
- return put_user(ms->ch[j].value, (int *)arg);
- }
+ return put_user(ms->ch[j].value, (int *)arg);
+ }
}
static /*const*/ struct file_operations usb_mixer_fops = {
- &usb_audio_llseek,
- NULL, /* read */
- NULL, /* write */
- NULL, /* readdir */
- NULL, /* poll */
- &usb_audio_ioctl_mixdev,
- NULL, /* mmap */
- &usb_audio_open_mixdev,
- NULL, /* flush */
- &usb_audio_release_mixdev,
- NULL, /* fsync */
- NULL, /* fasync */
- NULL, /* check_media_change */
- NULL, /* revalidate */
- NULL, /* lock */
+ &usb_audio_llseek,
+ NULL, /* read */
+ NULL, /* write */
+ NULL, /* readdir */
+ NULL, /* poll */
+ &usb_audio_ioctl_mixdev,
+ NULL, /* mmap */
+ &usb_audio_open_mixdev,
+ NULL, /* flush */
+ &usb_audio_release_mixdev,
+ NULL, /* fsync */
+ NULL, /* fasync */
+ NULL, /* check_media_change */
+ NULL, /* revalidate */
+ NULL, /* lock */
};
/* --------------------------------------------------------------------- */
static int drain_out(struct usb_audiodev *as, int nonblock)
{
- DECLARE_WAITQUEUE(wait, current);
- unsigned long flags;
- int count, tmo;
-
- if (as->usbout.dma.mapped || !as->usbout.dma.ready)
- return 0;
- add_wait_queue(&as->usbout.dma.wait, &wait);
- for (;;) {
+ DECLARE_WAITQUEUE(wait, current);
+ unsigned long flags;
+ int count, tmo;
+
+ if (as->usbout.dma.mapped || !as->usbout.dma.ready)
+ return 0;
+ add_wait_queue(&as->usbout.dma.wait, &wait);
+ for (;;) {
__set_current_state(TASK_INTERRUPTIBLE);
spin_lock_irqsave(&as->lock, flags);
- count = as->usbout.dma.count;
- spin_unlock_irqrestore(&as->lock, flags);
- if (count <= 0)
- break;
- if (signal_pending(current))
- break;
- if (nonblock) {
- remove_wait_queue(&as->usbout.dma.wait, &wait);
- set_current_state(TASK_RUNNING);
- return -EBUSY;
- }
- tmo = 3 * HZ * count / as->usbout.dma.srate;
+ count = as->usbout.dma.count;
+ spin_unlock_irqrestore(&as->lock, flags);
+ if (count <= 0)
+ break;
+ if (signal_pending(current))
+ break;
+ if (nonblock) {
+ remove_wait_queue(&as->usbout.dma.wait, &wait);
+ set_current_state(TASK_RUNNING);
+ return -EBUSY;
+ }
+ tmo = 3 * HZ * count / as->usbout.dma.srate;
tmo >>= AFMT_BYTESSHIFT(as->usbout.dma.format);
- if (!schedule_timeout(tmo + 1)) {
- printk(KERN_DEBUG "usbaudio: dma timed out??\n");
+ if (!schedule_timeout(tmo + 1)) {
+ printk(KERN_DEBUG "usbaudio: dma timed out??\n");
break;
}
- }
- remove_wait_queue(&as->usbout.dma.wait, &wait);
- set_current_state(TASK_RUNNING);
- if (signal_pending(current))
- return -ERESTARTSYS;
- return 0;
+ }
+ remove_wait_queue(&as->usbout.dma.wait, &wait);
+ set_current_state(TASK_RUNNING);
+ if (signal_pending(current))
+ return -ERESTARTSYS;
+ return 0;
}
/* --------------------------------------------------------------------- */
static ssize_t usb_audio_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
{
- struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
+ struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
DECLARE_WAITQUEUE(wait, current);
- ssize_t ret = 0;
- unsigned long flags;
- unsigned int ptr;
- int cnt, err;
-
- if (ppos != &file->f_pos)
- return -ESPIPE;
- if (as->usbin.dma.mapped)
- return -ENXIO;
- if (!as->usbin.dma.ready && (ret = prog_dmabuf_in(as)))
- return ret;
- if (!access_ok(VERIFY_WRITE, buffer, count))
- return -EFAULT;
+ ssize_t ret = 0;
+ unsigned long flags;
+ unsigned int ptr;
+ int cnt, err;
+
+ if (ppos != &file->f_pos)
+ return -ESPIPE;
+ if (as->usbin.dma.mapped)
+ return -ENXIO;
+ if (!as->usbin.dma.ready && (ret = prog_dmabuf_in(as)))
+ return ret;
+ if (!access_ok(VERIFY_WRITE, buffer, count))
+ return -EFAULT;
add_wait_queue(&as->usbin.dma.wait, &wait);
while (count > 0) {
spin_lock_irqsave(&as->lock, flags);
spin_unlock_irqrestore(&as->lock, flags);
if (cnt > count)
cnt = count;
- if (cnt <= 0) {
+ if (cnt <= 0) {
if (usbin_start(as)) {
if (!ret)
ret = -ENODEV;
break;
}
- if (file->f_flags & O_NONBLOCK) {
+ if (file->f_flags & O_NONBLOCK) {
if (!ret)
ret = -EAGAIN;
break;
}
schedule();
- if (signal_pending(current)) {
- if (!ret)
- ret = -ERESTARTSYS;
- break;
+ if (signal_pending(current)) {
+ if (!ret)
+ ret = -ERESTARTSYS;
+ break;
}
continue;
- }
+ }
if ((err = dmabuf_copyout_user(&as->usbin.dma, ptr, buffer, cnt))) {
if (!ret)
ret = err;
buffer += cnt;
ret += cnt;
}
- __set_current_state(TASK_RUNNING);
- remove_wait_queue(&as->usbin.dma.wait, &wait);
+ __set_current_state(TASK_RUNNING);
+ remove_wait_queue(&as->usbin.dma.wait, &wait);
return ret;
}
static ssize_t usb_audio_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
{
- struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
+ struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
DECLARE_WAITQUEUE(wait, current);
- ssize_t ret = 0;
- unsigned long flags;
- unsigned int ptr;
- int cnt, err;
-
- if (ppos != &file->f_pos)
- return -ESPIPE;
- if (as->usbout.dma.mapped)
- return -ENXIO;
- if (!as->usbout.dma.ready && (ret = prog_dmabuf_out(as)))
- return ret;
- if (!access_ok(VERIFY_READ, buffer, count))
- return -EFAULT;
+ ssize_t ret = 0;
+ unsigned long flags;
+ unsigned int ptr;
+ int cnt, err;
+
+ if (ppos != &file->f_pos)
+ return -ESPIPE;
+ if (as->usbout.dma.mapped)
+ return -ENXIO;
+ if (!as->usbout.dma.ready && (ret = prog_dmabuf_out(as)))
+ return ret;
+ if (!access_ok(VERIFY_READ, buffer, count))
+ return -EFAULT;
add_wait_queue(&as->usbout.dma.wait, &wait);
- while (count > 0) {
+ while (count > 0) {
#if 0
printk(KERN_DEBUG "usb_audio_write: count %u dma: count %u rdptr %u wrptr %u dmasize %u fragsize %u flags 0x%02x taskst 0x%x\n",
count, as->usbout.dma.count, as->usbout.dma.rdptr, as->usbout.dma.wrptr, as->usbout.dma.dmasize, as->usbout.dma.fragsize,
as->usbout.flags, current->state);
#endif
- spin_lock_irqsave(&as->lock, flags);
- if (as->usbout.dma.count < 0) {
- as->usbout.dma.count = 0;
- as->usbout.dma.rdptr = as->usbout.dma.wrptr;
- }
- ptr = as->usbout.dma.wrptr;
- cnt = as->usbout.dma.dmasize - as->usbout.dma.count;
+ spin_lock_irqsave(&as->lock, flags);
+ if (as->usbout.dma.count < 0) {
+ as->usbout.dma.count = 0;
+ as->usbout.dma.rdptr = as->usbout.dma.wrptr;
+ }
+ ptr = as->usbout.dma.wrptr;
+ cnt = as->usbout.dma.dmasize - as->usbout.dma.count;
/* set task state early to avoid wakeup races */
if (cnt <= 0)
__set_current_state(TASK_INTERRUPTIBLE);
- spin_unlock_irqrestore(&as->lock, flags);
- if (cnt > count)
- cnt = count;
- if (cnt <= 0) {
+ spin_unlock_irqrestore(&as->lock, flags);
+ if (cnt > count)
+ cnt = count;
+ if (cnt <= 0) {
if (usbout_start(as)) {
if (!ret)
ret = -ENODEV;
break;
}
- if (file->f_flags & O_NONBLOCK) {
+ if (file->f_flags & O_NONBLOCK) {
if (!ret)
ret = -EAGAIN;
break;
}
schedule();
- if (signal_pending(current)) {
- if (!ret)
- ret = -ERESTARTSYS;
- break;
+ if (signal_pending(current)) {
+ if (!ret)
+ ret = -ERESTARTSYS;
+ break;
}
continue;
}
ptr += cnt;
if (ptr >= as->usbout.dma.dmasize)
ptr -= as->usbout.dma.dmasize;
- spin_lock_irqsave(&as->lock, flags);
- as->usbout.dma.wrptr = ptr;
- as->usbout.dma.count += cnt;
- spin_unlock_irqrestore(&as->lock, flags);
- count -= cnt;
- buffer += cnt;
- ret += cnt;
+ spin_lock_irqsave(&as->lock, flags);
+ as->usbout.dma.wrptr = ptr;
+ as->usbout.dma.count += cnt;
+ spin_unlock_irqrestore(&as->lock, flags);
+ count -= cnt;
+ buffer += cnt;
+ ret += cnt;
if (usbout_start(as)) {
if (!ret)
ret = -ENODEV;
break;
}
- }
- __set_current_state(TASK_RUNNING);
- remove_wait_queue(&as->usbout.dma.wait, &wait);
+ }
+ __set_current_state(TASK_RUNNING);
+ remove_wait_queue(&as->usbout.dma.wait, &wait);
return ret;
}
static unsigned int usb_audio_poll(struct file *file, struct poll_table_struct *wait)
{
- struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
- unsigned long flags;
- unsigned int mask = 0;
+ struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
+ unsigned long flags;
+ unsigned int mask = 0;
- if (file->f_mode & FMODE_WRITE) {
+ if (file->f_mode & FMODE_WRITE) {
if (!as->usbout.dma.ready)
prog_dmabuf_out(as);
- poll_wait(file, &as->usbout.dma.wait, wait);
+ poll_wait(file, &as->usbout.dma.wait, wait);
}
- if (file->f_mode & FMODE_READ) {
+ if (file->f_mode & FMODE_READ) {
if (!as->usbin.dma.ready)
prog_dmabuf_in(as);
- poll_wait(file, &as->usbin.dma.wait, wait);
- }
- spin_lock_irqsave(&as->lock, flags);
- if (file->f_mode & FMODE_READ) {
- if (as->usbin.dma.count >= (signed)as->usbin.dma.fragsize)
- mask |= POLLIN | POLLRDNORM;
- }
- if (file->f_mode & FMODE_WRITE) {
- if (as->usbout.dma.mapped) {
- if (as->usbout.dma.count >= (signed)as->usbout.dma.fragsize)
- mask |= POLLOUT | POLLWRNORM;
- } else {
- if ((signed)as->usbout.dma.dmasize >= as->usbout.dma.count + (signed)as->usbout.dma.fragsize)
- mask |= POLLOUT | POLLWRNORM;
- }
- }
- spin_unlock_irqrestore(&as->lock, flags);
- return mask;
+ poll_wait(file, &as->usbin.dma.wait, wait);
+ }
+ spin_lock_irqsave(&as->lock, flags);
+ if (file->f_mode & FMODE_READ) {
+ if (as->usbin.dma.count >= (signed)as->usbin.dma.fragsize)
+ mask |= POLLIN | POLLRDNORM;
+ }
+ if (file->f_mode & FMODE_WRITE) {
+ if (as->usbout.dma.mapped) {
+ if (as->usbout.dma.count >= (signed)as->usbout.dma.fragsize)
+ mask |= POLLOUT | POLLWRNORM;
+ } else {
+ if ((signed)as->usbout.dma.dmasize >= as->usbout.dma.count + (signed)as->usbout.dma.fragsize)
+ mask |= POLLOUT | POLLWRNORM;
+ }
+ }
+ spin_unlock_irqrestore(&as->lock, flags);
+ return mask;
}
static int usb_audio_mmap(struct file *file, struct vm_area_struct *vma)
{
- struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
- struct dmabuf *db;
- int ret;
-
- if (vma->vm_flags & VM_WRITE) {
- if ((ret = prog_dmabuf_out(as)) != 0)
- return ret;
- db = &as->usbout.dma;
- } else if (vma->vm_flags & VM_READ) {
- if ((ret = prog_dmabuf_in(as)) != 0)
- return ret;
- db = &as->usbin.dma;
- } else
- return -EINVAL;
+ struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
+ struct dmabuf *db;
+ int ret;
+
+ if (vma->vm_flags & VM_WRITE) {
+ if ((ret = prog_dmabuf_out(as)) != 0)
+ return ret;
+ db = &as->usbout.dma;
+ } else if (vma->vm_flags & VM_READ) {
+ if ((ret = prog_dmabuf_in(as)) != 0)
+ return ret;
+ db = &as->usbin.dma;
+ } else
+ return -EINVAL;
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,22)
- if (vma->vm_pgoff != 0)
- return -EINVAL;
+ if (vma->vm_pgoff != 0)
+ return -EINVAL;
#endif
return dmabuf_mmap(db, vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot);
}
static int usb_audio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
- struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
+ struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
struct usb_audio_state *s = as->state;
- unsigned long flags;
- audio_buf_info abinfo;
- count_info cinfo;
- int val, val2, mapped, ret;
+ unsigned long flags;
+ audio_buf_info abinfo;
+ count_info cinfo;
+ int val, val2, mapped, ret;
if (!s->usbdev)
return -EIO;
- mapped = ((file->f_mode & FMODE_WRITE) && as->usbout.dma.mapped) ||
- ((file->f_mode & FMODE_READ) && as->usbin.dma.mapped);
- switch (cmd) {
- case OSS_GETVERSION:
- return put_user(SOUND_VERSION, (int *)arg);
-
- case SNDCTL_DSP_SYNC:
- if (file->f_mode & FMODE_WRITE)
- return drain_out(as, 0/*file->f_flags & O_NONBLOCK*/);
- return 0;
-
- case SNDCTL_DSP_SETDUPLEX:
- return 0;
-
- case SNDCTL_DSP_GETCAPS:
- return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER |
+ mapped = ((file->f_mode & FMODE_WRITE) && as->usbout.dma.mapped) ||
+ ((file->f_mode & FMODE_READ) && as->usbin.dma.mapped);
+ switch (cmd) {
+ case OSS_GETVERSION:
+ return put_user(SOUND_VERSION, (int *)arg);
+
+ case SNDCTL_DSP_SYNC:
+ if (file->f_mode & FMODE_WRITE)
+ return drain_out(as, 0/*file->f_flags & O_NONBLOCK*/);
+ return 0;
+
+ case SNDCTL_DSP_SETDUPLEX:
+ return 0;
+
+ case SNDCTL_DSP_GETCAPS:
+ return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER |
DSP_CAP_MMAP | DSP_CAP_BATCH, (int *)arg);
- case SNDCTL_DSP_RESET:
- if (file->f_mode & FMODE_WRITE) {
- usbout_stop(as);
- as->usbout.dma.rdptr = as->usbout.dma.wrptr = as->usbout.dma.count = as->usbout.dma.total_bytes = 0;
- }
- if (file->f_mode & FMODE_READ) {
- usbin_stop(as);
- as->usbin.dma.rdptr = as->usbin.dma.wrptr = as->usbin.dma.count = as->usbin.dma.total_bytes = 0;
- }
- return 0;
-
- case SNDCTL_DSP_SPEED:
- get_user_ret(val, (int *)arg, -EFAULT);
- if (val >= 0) {
- if (val < 4000)
- val = 4000;
- if (val > 100000)
- val = 100000;
+ case SNDCTL_DSP_RESET:
+ if (file->f_mode & FMODE_WRITE) {
+ usbout_stop(as);
+ as->usbout.dma.rdptr = as->usbout.dma.wrptr = as->usbout.dma.count = as->usbout.dma.total_bytes = 0;
+ }
+ if (file->f_mode & FMODE_READ) {
+ usbin_stop(as);
+ as->usbin.dma.rdptr = as->usbin.dma.wrptr = as->usbin.dma.count = as->usbin.dma.total_bytes = 0;
+ }
+ return 0;
+
+ case SNDCTL_DSP_SPEED:
+ get_user_ret(val, (int *)arg, -EFAULT);
+ if (val >= 0) {
+ if (val < 4000)
+ val = 4000;
+ if (val > 100000)
+ val = 100000;
if (set_format(as, file->f_mode, AFMT_QUERY, val))
return -EIO;
- }
- return put_user((file->f_mode & FMODE_READ) ? as->usbin.dma.srate : as->usbout.dma.srate, (int *)arg);
+ }
+ return put_user((file->f_mode & FMODE_READ) ? as->usbin.dma.srate : as->usbout.dma.srate, (int *)arg);
- case SNDCTL_DSP_STEREO:
+ case SNDCTL_DSP_STEREO:
val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
if (set_format(as, file->f_mode, val2 | AFMT_STEREO, 0))
return -EIO;
- return 0;
+ return 0;
- case SNDCTL_DSP_CHANNELS:
- get_user_ret(val, (int *)arg, -EFAULT);
- if (val != 0) {
+ case SNDCTL_DSP_CHANNELS:
+ get_user_ret(val, (int *)arg, -EFAULT);
+ if (val != 0) {
val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
if (val == 1)
val2 &= ~AFMT_STEREO;
return -EIO;
}
val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
- return put_user(AFMT_ISSTEREO(val2) ? 2 : 1, (int *)arg);
+ return put_user(AFMT_ISSTEREO(val2) ? 2 : 1, (int *)arg);
- case SNDCTL_DSP_GETFMTS: /* Returns a mask */
- return put_user(AFMT_U8 | AFMT_U16_LE | AFMT_U16_BE |
+ case SNDCTL_DSP_GETFMTS: /* Returns a mask */
+ return put_user(AFMT_U8 | AFMT_U16_LE | AFMT_U16_BE |
AFMT_S8 | AFMT_S16_LE | AFMT_S16_BE, (int *)arg);
- case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
- get_user_ret(val, (int *)arg, -EFAULT);
+ case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
+ get_user_ret(val, (int *)arg, -EFAULT);
if (val != AFMT_QUERY) {
if (hweight32(val) != 1)
return -EINVAL;
val |= val2 & AFMT_STEREO;
if (set_format(as, file->f_mode, val, 0))
return -EIO;
- }
+ }
val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
- return put_user(val2 & ~AFMT_STEREO, (int *)arg);
-
- case SNDCTL_DSP_POST:
- return 0;
-
- case SNDCTL_DSP_GETTRIGGER:
- val = 0;
- if (file->f_mode & FMODE_READ && as->usbin.flags & FLG_RUNNING)
- val |= PCM_ENABLE_INPUT;
- if (file->f_mode & FMODE_WRITE && as->usbout.flags & FLG_RUNNING)
- val |= PCM_ENABLE_OUTPUT;
- return put_user(val, (int *)arg);
-
- case SNDCTL_DSP_SETTRIGGER:
- get_user_ret(val, (int *)arg, -EFAULT);
- if (file->f_mode & FMODE_READ) {
- if (val & PCM_ENABLE_INPUT) {
- if (!as->usbin.dma.ready && (ret = prog_dmabuf_in(as)))
- return ret;
+ return put_user(val2 & ~AFMT_STEREO, (int *)arg);
+
+ case SNDCTL_DSP_POST:
+ return 0;
+
+ case SNDCTL_DSP_GETTRIGGER:
+ val = 0;
+ if (file->f_mode & FMODE_READ && as->usbin.flags & FLG_RUNNING)
+ val |= PCM_ENABLE_INPUT;
+ if (file->f_mode & FMODE_WRITE && as->usbout.flags & FLG_RUNNING)
+ val |= PCM_ENABLE_OUTPUT;
+ return put_user(val, (int *)arg);
+
+ case SNDCTL_DSP_SETTRIGGER:
+ get_user_ret(val, (int *)arg, -EFAULT);
+ if (file->f_mode & FMODE_READ) {
+ if (val & PCM_ENABLE_INPUT) {
+ if (!as->usbin.dma.ready && (ret = prog_dmabuf_in(as)))
+ return ret;
if (usbin_start(as))
return -ENODEV;
- } else
- usbin_stop(as);
- }
- if (file->f_mode & FMODE_WRITE) {
- if (val & PCM_ENABLE_OUTPUT) {
- if (!as->usbout.dma.ready && (ret = prog_dmabuf_out(as)))
- return ret;
+ } else
+ usbin_stop(as);
+ }
+ if (file->f_mode & FMODE_WRITE) {
+ if (val & PCM_ENABLE_OUTPUT) {
+ if (!as->usbout.dma.ready && (ret = prog_dmabuf_out(as)))
+ return ret;
if (usbout_start(as))
return -ENODEV;
- } else
- usbout_stop(as);
- }
- return 0;
-
- case SNDCTL_DSP_GETOSPACE:
- if (!(file->f_mode & FMODE_WRITE))
- return -EINVAL;
- if (!(as->usbout.flags & FLG_RUNNING) && (val = prog_dmabuf_out(as)) != 0)
- return val;
- spin_lock_irqsave(&as->lock, flags);
- abinfo.fragsize = as->usbout.dma.fragsize;
- abinfo.bytes = as->usbout.dma.dmasize - as->usbout.dma.count;
- abinfo.fragstotal = as->usbout.dma.numfrag;
- abinfo.fragments = abinfo.bytes >> as->usbout.dma.fragshift;
- spin_unlock_irqrestore(&as->lock, flags);
- return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
-
- case SNDCTL_DSP_GETISPACE:
- if (!(file->f_mode & FMODE_READ))
- return -EINVAL;
- if (!(as->usbin.flags & FLG_RUNNING) && (val = prog_dmabuf_in(as)) != 0)
- return val;
- spin_lock_irqsave(&as->lock, flags);
- abinfo.fragsize = as->usbin.dma.fragsize;
- abinfo.bytes = as->usbin.dma.count;
- abinfo.fragstotal = as->usbin.dma.numfrag;
- abinfo.fragments = abinfo.bytes >> as->usbin.dma.fragshift;
- spin_unlock_irqrestore(&as->lock, flags);
- return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
-
- case SNDCTL_DSP_NONBLOCK:
- file->f_flags |= O_NONBLOCK;
- return 0;
-
- case SNDCTL_DSP_GETODELAY:
- if (!(file->f_mode & FMODE_WRITE))
- return -EINVAL;
- spin_lock_irqsave(&as->lock, flags);
- val = as->usbout.dma.count;
- spin_unlock_irqrestore(&as->lock, flags);
- return put_user(val, (int *)arg);
-
- case SNDCTL_DSP_GETIPTR:
- if (!(file->f_mode & FMODE_READ))
- return -EINVAL;
- spin_lock_irqsave(&as->lock, flags);
- cinfo.bytes = as->usbin.dma.total_bytes;
- cinfo.blocks = as->usbin.dma.count >> as->usbin.dma.fragshift;
- cinfo.ptr = as->usbin.dma.wrptr;
- if (as->usbin.dma.mapped)
- as->usbin.dma.count &= as->usbin.dma.fragsize-1;
- spin_unlock_irqrestore(&as->lock, flags);
- return copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
-
- case SNDCTL_DSP_GETOPTR:
- if (!(file->f_mode & FMODE_WRITE))
- return -EINVAL;
- spin_lock_irqsave(&as->lock, flags);
- cinfo.bytes = as->usbout.dma.total_bytes;
- cinfo.blocks = as->usbout.dma.count >> as->usbout.dma.fragshift;
- cinfo.ptr = as->usbout.dma.rdptr;
- if (as->usbout.dma.mapped)
- as->usbout.dma.count &= as->usbout.dma.fragsize-1;
- spin_unlock_irqrestore(&as->lock, flags);
- return copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
+ } else
+ usbout_stop(as);
+ }
+ return 0;
+
+ case SNDCTL_DSP_GETOSPACE:
+ if (!(file->f_mode & FMODE_WRITE))
+ return -EINVAL;
+ if (!(as->usbout.flags & FLG_RUNNING) && (val = prog_dmabuf_out(as)) != 0)
+ return val;
+ spin_lock_irqsave(&as->lock, flags);
+ abinfo.fragsize = as->usbout.dma.fragsize;
+ abinfo.bytes = as->usbout.dma.dmasize - as->usbout.dma.count;
+ abinfo.fragstotal = as->usbout.dma.numfrag;
+ abinfo.fragments = abinfo.bytes >> as->usbout.dma.fragshift;
+ spin_unlock_irqrestore(&as->lock, flags);
+ return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
+
+ case SNDCTL_DSP_GETISPACE:
+ if (!(file->f_mode & FMODE_READ))
+ return -EINVAL;
+ if (!(as->usbin.flags & FLG_RUNNING) && (val = prog_dmabuf_in(as)) != 0)
+ return val;
+ spin_lock_irqsave(&as->lock, flags);
+ abinfo.fragsize = as->usbin.dma.fragsize;
+ abinfo.bytes = as->usbin.dma.count;
+ abinfo.fragstotal = as->usbin.dma.numfrag;
+ abinfo.fragments = abinfo.bytes >> as->usbin.dma.fragshift;
+ spin_unlock_irqrestore(&as->lock, flags);
+ return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
+
+ case SNDCTL_DSP_NONBLOCK:
+ file->f_flags |= O_NONBLOCK;
+ return 0;
+
+ case SNDCTL_DSP_GETODELAY:
+ if (!(file->f_mode & FMODE_WRITE))
+ return -EINVAL;
+ spin_lock_irqsave(&as->lock, flags);
+ val = as->usbout.dma.count;
+ spin_unlock_irqrestore(&as->lock, flags);
+ return put_user(val, (int *)arg);
+
+ case SNDCTL_DSP_GETIPTR:
+ if (!(file->f_mode & FMODE_READ))
+ return -EINVAL;
+ spin_lock_irqsave(&as->lock, flags);
+ cinfo.bytes = as->usbin.dma.total_bytes;
+ cinfo.blocks = as->usbin.dma.count >> as->usbin.dma.fragshift;
+ cinfo.ptr = as->usbin.dma.wrptr;
+ if (as->usbin.dma.mapped)
+ as->usbin.dma.count &= as->usbin.dma.fragsize-1;
+ spin_unlock_irqrestore(&as->lock, flags);
+ return copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
+
+ case SNDCTL_DSP_GETOPTR:
+ if (!(file->f_mode & FMODE_WRITE))
+ return -EINVAL;
+ spin_lock_irqsave(&as->lock, flags);
+ cinfo.bytes = as->usbout.dma.total_bytes;
+ cinfo.blocks = as->usbout.dma.count >> as->usbout.dma.fragshift;
+ cinfo.ptr = as->usbout.dma.rdptr;
+ if (as->usbout.dma.mapped)
+ as->usbout.dma.count &= as->usbout.dma.fragsize-1;
+ spin_unlock_irqrestore(&as->lock, flags);
+ return copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
case SNDCTL_DSP_GETBLKSIZE:
- if (file->f_mode & FMODE_WRITE) {
- if ((val = prog_dmabuf_out(as)))
- return val;
- return put_user(as->usbout.dma.fragsize, (int *)arg);
- }
- if ((val = prog_dmabuf_in(as)))
- return val;
- return put_user(as->usbin.dma.fragsize, (int *)arg);
-
- case SNDCTL_DSP_SETFRAGMENT:
- get_user_ret(val, (int *)arg, -EFAULT);
- if (file->f_mode & FMODE_READ) {
- as->usbin.dma.ossfragshift = val & 0xffff;
- as->usbin.dma.ossmaxfrags = (val >> 16) & 0xffff;
- if (as->usbin.dma.ossfragshift < 4)
- as->usbin.dma.ossfragshift = 4;
- if (as->usbin.dma.ossfragshift > 15)
- as->usbin.dma.ossfragshift = 15;
- if (as->usbin.dma.ossmaxfrags < 4)
- as->usbin.dma.ossmaxfrags = 4;
- }
- if (file->f_mode & FMODE_WRITE) {
- as->usbout.dma.ossfragshift = val & 0xffff;
- as->usbout.dma.ossmaxfrags = (val >> 16) & 0xffff;
- if (as->usbout.dma.ossfragshift < 4)
- as->usbout.dma.ossfragshift = 4;
- if (as->usbout.dma.ossfragshift > 15)
- as->usbout.dma.ossfragshift = 15;
- if (as->usbout.dma.ossmaxfrags < 4)
- as->usbout.dma.ossmaxfrags = 4;
- }
- return 0;
-
- case SNDCTL_DSP_SUBDIVIDE:
- if ((file->f_mode & FMODE_READ && as->usbin.dma.subdivision) ||
- (file->f_mode & FMODE_WRITE && as->usbout.dma.subdivision))
- return -EINVAL;
- get_user_ret(val, (int *)arg, -EFAULT);
- if (val != 1 && val != 2 && val != 4)
- return -EINVAL;
- if (file->f_mode & FMODE_READ)
- as->usbin.dma.subdivision = val;
- if (file->f_mode & FMODE_WRITE)
- as->usbout.dma.subdivision = val;
- return 0;
-
- case SOUND_PCM_READ_RATE:
- return put_user((file->f_mode & FMODE_READ) ? as->usbin.dma.srate : as->usbout.dma.srate, (int *)arg);
-
- case SOUND_PCM_READ_CHANNELS:
+ if (file->f_mode & FMODE_WRITE) {
+ if ((val = prog_dmabuf_out(as)))
+ return val;
+ return put_user(as->usbout.dma.fragsize, (int *)arg);
+ }
+ if ((val = prog_dmabuf_in(as)))
+ return val;
+ return put_user(as->usbin.dma.fragsize, (int *)arg);
+
+ case SNDCTL_DSP_SETFRAGMENT:
+ get_user_ret(val, (int *)arg, -EFAULT);
+ if (file->f_mode & FMODE_READ) {
+ as->usbin.dma.ossfragshift = val & 0xffff;
+ as->usbin.dma.ossmaxfrags = (val >> 16) & 0xffff;
+ if (as->usbin.dma.ossfragshift < 4)
+ as->usbin.dma.ossfragshift = 4;
+ if (as->usbin.dma.ossfragshift > 15)
+ as->usbin.dma.ossfragshift = 15;
+ if (as->usbin.dma.ossmaxfrags < 4)
+ as->usbin.dma.ossmaxfrags = 4;
+ }
+ if (file->f_mode & FMODE_WRITE) {
+ as->usbout.dma.ossfragshift = val & 0xffff;
+ as->usbout.dma.ossmaxfrags = (val >> 16) & 0xffff;
+ if (as->usbout.dma.ossfragshift < 4)
+ as->usbout.dma.ossfragshift = 4;
+ if (as->usbout.dma.ossfragshift > 15)
+ as->usbout.dma.ossfragshift = 15;
+ if (as->usbout.dma.ossmaxfrags < 4)
+ as->usbout.dma.ossmaxfrags = 4;
+ }
+ return 0;
+
+ case SNDCTL_DSP_SUBDIVIDE:
+ if ((file->f_mode & FMODE_READ && as->usbin.dma.subdivision) ||
+ (file->f_mode & FMODE_WRITE && as->usbout.dma.subdivision))
+ return -EINVAL;
+ get_user_ret(val, (int *)arg, -EFAULT);
+ if (val != 1 && val != 2 && val != 4)
+ return -EINVAL;
+ if (file->f_mode & FMODE_READ)
+ as->usbin.dma.subdivision = val;
+ if (file->f_mode & FMODE_WRITE)
+ as->usbout.dma.subdivision = val;
+ return 0;
+
+ case SOUND_PCM_READ_RATE:
+ return put_user((file->f_mode & FMODE_READ) ? as->usbin.dma.srate : as->usbout.dma.srate, (int *)arg);
+
+ case SOUND_PCM_READ_CHANNELS:
val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
- return put_user(AFMT_ISSTEREO(val2) ? 2 : 1, (int *)arg);
+ return put_user(AFMT_ISSTEREO(val2) ? 2 : 1, (int *)arg);
- case SOUND_PCM_READ_BITS:
+ case SOUND_PCM_READ_BITS:
val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
return put_user(AFMT_IS16BIT(val2) ? 16 : 8, (int *)arg);
- case SOUND_PCM_WRITE_FILTER:
- case SNDCTL_DSP_SETSYNCRO:
- case SOUND_PCM_READ_FILTER:
- return -EINVAL;
- }
- return -ENOIOCTLCMD;
+ case SOUND_PCM_WRITE_FILTER:
+ case SNDCTL_DSP_SETSYNCRO:
+ case SOUND_PCM_READ_FILTER:
+ return -EINVAL;
+ }
+ return -ENOIOCTLCMD;
}
static int usb_audio_open(struct inode *inode, struct file *file)
{
- int minor = MINOR(inode->i_rdev);
+ int minor = MINOR(inode->i_rdev);
DECLARE_WAITQUEUE(wait, current);
struct list_head *devs, *adevs;
struct usb_audiodev *as;
- struct usb_audio_state *s;
+ struct usb_audio_state *s;
for (;;) {
down(&open_sem);
break;
if (file->f_flags & O_NONBLOCK) {
up(&open_sem);
- return -EBUSY;
- }
+ return -EBUSY;
+ }
__set_current_state(TASK_INTERRUPTIBLE);
add_wait_queue(&open_wait, &wait);
- up(&open_sem);
+ up(&open_sem);
schedule();
__set_current_state(TASK_RUNNING);
remove_wait_queue(&open_wait, &wait);
- if (signal_pending(current))
- return -ERESTARTSYS;
- }
+ if (signal_pending(current))
+ return -ERESTARTSYS;
+ }
if (file->f_mode & FMODE_READ)
- as->usbin.dma.ossfragshift = as->usbin.dma.ossmaxfrags = as->usbin.dma.subdivision = 0;
+ as->usbin.dma.ossfragshift = as->usbin.dma.ossmaxfrags = as->usbin.dma.subdivision = 0;
if (file->f_mode & FMODE_WRITE)
- as->usbout.dma.ossfragshift = as->usbout.dma.ossmaxfrags = as->usbout.dma.subdivision = 0;
+ as->usbout.dma.ossfragshift = as->usbout.dma.ossmaxfrags = as->usbout.dma.subdivision = 0;
if (set_format(as, file->f_mode, ((minor & 0xf) == SND_DEV_DSP16) ? AFMT_S16_LE : AFMT_U8 /* AFMT_ULAW */, 8000)) {
up(&open_sem);
return -EIO;
}
- file->private_data = as;
- as->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
+ file->private_data = as;
+ as->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
s->count++;
as->remove_pending=0;
MOD_INC_USE_COUNT;
- up(&open_sem);
- return 0;
+ up(&open_sem);
+ return 0;
}
static int usb_audio_release(struct inode *inode, struct file *file)
{
- struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
+ struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
struct usb_audio_state *s = as->state;
- struct usb_device *dev = as->state->usbdev;
- struct usb_config_descriptor *config=0;
+ struct usb_device *dev = s->usbdev;
struct usb_interface *iface;
- if (s->usbdev)
- config = dev->actconfig;
- if (file->f_mode & FMODE_WRITE)
- drain_out(as, file->f_flags & O_NONBLOCK);
- down(&open_sem);
- if (file->f_mode & FMODE_WRITE) {
- usbout_stop(as);
- if (s->usbdev) {
- iface = &config->interface[as->usbout.interface];
- usb_set_interface(s->usbdev, iface->altsetting->bInterfaceNumber, 0);
- }
- dmabuf_release(&as->usbout.dma);
+ if (file->f_mode & FMODE_WRITE)
+ drain_out(as, file->f_flags & O_NONBLOCK);
+ down(&open_sem);
+ if (file->f_mode & FMODE_WRITE) {
+ usbout_stop(as);
+ if (dev && as->usbout.interface >= 0) {
+ iface = &dev->actconfig->interface[as->usbout.interface];
+ usb_set_interface(dev, iface->altsetting->bInterfaceNumber, 0);
+ }
+ dmabuf_release(&as->usbout.dma);
usbout_release(as);
- }
- if (file->f_mode & FMODE_READ) {
- usbin_stop(as);
- if (s->usbdev) {
- iface = &config->interface[as->usbin.interface];
- usb_set_interface(s->usbdev, iface->altsetting->bInterfaceNumber, 0);
- }
- dmabuf_release(&as->usbin.dma);
+ }
+ if (file->f_mode & FMODE_READ) {
+ usbin_stop(as);
+ if (dev && as->usbin.interface >= 0) {
+ iface = &dev->actconfig->interface[as->usbin.interface];
+ usb_set_interface(dev, iface->altsetting->bInterfaceNumber, 0);
+ }
+ dmabuf_release(&as->usbin.dma);
usbin_release(as);
- }
- as->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
+ }
+ as->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
release(s);
- wake_up(&open_wait);
- MOD_DEC_USE_COUNT;
- return 0;
+ wake_up(&open_wait);
+ MOD_DEC_USE_COUNT;
+ return 0;
}
static /*const*/ struct file_operations usb_audio_fops = {
- &usb_audio_llseek,
- &usb_audio_read,
- &usb_audio_write,
- NULL, /* readdir */
- &usb_audio_poll,
- &usb_audio_ioctl,
- &usb_audio_mmap,
- &usb_audio_open,
- NULL, /* flush */
- &usb_audio_release,
- NULL, /* fsync */
- NULL, /* fasync */
- NULL, /* check_media_change */
- NULL, /* revalidate */
- NULL, /* lock */
+ &usb_audio_llseek,
+ &usb_audio_read,
+ &usb_audio_write,
+ NULL, /* readdir */
+ &usb_audio_poll,
+ &usb_audio_ioctl,
+ &usb_audio_mmap,
+ &usb_audio_open,
+ NULL, /* flush */
+ &usb_audio_release,
+ NULL, /* fsync */
+ NULL, /* fasync */
+ NULL, /* check_media_change */
+ NULL, /* revalidate */
+ NULL, /* lock */
};
/* --------------------------------------------------------------------- */
printk(KERN_DEBUG "usbaudio: unmuting feature unit %u interface %u\n", ftr[3], state->ctrlif);
data[0] = 0;
if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
- (MUTE_CONTROL << 8) | 0xff, state->ctrlif | (ftr[3] << 8), data, 1, HZ) < 0)
+ (MUTE_CONTROL << 8) | 0xff, state->ctrlif | (ftr[3] << 8), data, 1, HZ) < 0)
printk(KERN_WARNING "usbaudio: failure to unmute feature unit %u interface %u\n", ftr[3], state->ctrlif);
}
#endif
struct usb_audiodev *as;
struct usb_mixerdev *ms;
- down(&open_sem);
+ down(&open_sem);
list_del(&s->audiodev);
INIT_LIST_HEAD(&s->audiodev);
s->usbdev = NULL;
aud->irq_handle = NULL;
#endif
release(s);
- wake_up(&open_wait);
+ wake_up(&open_wait);
}
int usb_audio_init(void)
+++ /dev/null
-static unsigned char bitstream[] = {
-0x00,0x09,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,
-0x0F,0xF0,0x00,0x00,0x01,0x61,0x00,0x0D,
-0x64,0x61,0x62,0x75,0x73,0x62,0x74,0x72,
-0x2E,0x6E,0x63,0x64,0x00,0x62,0x00,0x0B,
-0x73,0x31,0x30,0x78,0x6C,0x76,0x71,0x31,
-0x30,0x30,0x00,0x63,0x00,0x0B,0x31,0x39,
-0x39,0x39,0x2F,0x30,0x39,0x2F,0x32,0x34,
-0x00,0x64,0x00,0x09,0x31,0x30,0x3A,0x34,
-0x32,0x3A,0x34,0x36,0x00,0x65,0x00,0x00,
-0x2E,0xC0,0xFF,0x20,0x17,0x5F,0x9F,0x5B,
-0xFE,0xFB,0xBB,0xB7,0xBB,0xBB,0xFB,0xBF,
-0xAF,0xEF,0xFB,0xDF,0xB7,0xFB,0xFB,0x7F,
-0xBF,0xB7,0xEF,0xF2,0xFF,0xFB,0xFE,0xFF,
-0xFF,0xEF,0xFF,0xFE,0xFF,0xBF,0xFF,0xFF,
-0xFF,0xFF,0xAF,0xFF,0xFA,0xFF,0xFF,0xFF,
-0xC9,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFB,0xFF,0xA3,0xFF,0xFB,
-0xFE,0xFF,0xBF,0xEF,0xE3,0xFE,0xFF,0xBF,
-0xE3,0xFE,0xFF,0xBF,0x6F,0xFB,0xF6,0xFF,
-0xBF,0xFF,0x47,0xFF,0xFF,0x9F,0xEE,0xF9,
-0xFE,0xCF,0x9F,0xEF,0xFB,0xCF,0x9B,0xEE,
-0xF8,0xFE,0xEF,0x8F,0xEE,0xFB,0xFE,0x0B,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xBF,0xFF,0xFF,0xFB,0xFF,0xFF,
-0xBF,0xFF,0xFF,0xFC,0x17,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,
-0xFF,0xFF,0xFB,0xFF,0xFF,0x7F,0xFF,0xFF,
-0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x5F,0xFF,
-0xFF,0xFD,0xFF,0xFF,0xDB,0xFF,0xFD,0xFF,
-0x77,0xFF,0xFD,0xFF,0xFF,0xDF,0xFE,0xFD,
-0xFF,0xFF,0xF2,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFD,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,
-0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xE3,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,
-0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0x67,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0x2F,0xFF,
-0xF3,0xFD,0xFF,0x7F,0xDE,0xF7,0xFD,0xFF,
-0x7F,0xF7,0x7D,0xFF,0x7F,0xDF,0xF7,0xBD,
-0xFF,0x7F,0xFF,0x1F,0xFF,0xEF,0xFB,0xFE,
-0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xEF,0xFB,
-0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFF,
-0x3F,0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,
-0x9F,0xE7,0xFA,0x7F,0x9F,0xE7,0xF9,0xFE,
-0x7F,0x9F,0xE7,0xFF,0xFC,0x7F,0xBF,0xBF,
-0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xB7,
-0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,
-0xFF,0xE0,0xFD,0xF9,0xFE,0x7F,0x9F,0xE7,
-0xF9,0xFE,0x7F,0x9D,0xF9,0xFE,0x7D,0x9D,
-0xE7,0xF9,0xFE,0x7F,0x9F,0xED,0xED,0xFF,
-0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F,
-0xDF,0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,
-0x7F,0xDF,0xFF,0x9B,0xFF,0xEF,0xFB,0xFE,
-0xFB,0xBF,0xEF,0xBB,0xFE,0xFF,0xAF,0xBB,
-0xBE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFF,
-0xB7,0xBF,0xDB,0xF6,0xBD,0xBF,0x6B,0xDB,
-0xF6,0xF9,0xBF,0x5B,0xD6,0xF9,0xBF,0x6F,
-0xDB,0xF6,0xFD,0xBF,0xFF,0x0E,0xFF,0xFF,
-0xFF,0xFF,0x5F,0xFF,0xF7,0xFF,0xFF,0x7F,
-0xF7,0xBD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xDF,0x9F,0xFF,0xFF,0xFF,0xFE,0xFF,
-0xFF,0xEF,0xFE,0xFE,0xFF,0xFF,0x77,0xFF,
-0xFB,0xFB,0xFF,0xFF,0xFF,0xFF,0xF8,0x3F,
-0xFF,0xFD,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xF4,0x7F,0xFF,0xFE,0xFD,
-0xBE,0xFF,0xDF,0xFE,0xFF,0xFF,0xEF,0x7F,
-0xFF,0xCF,0xFF,0xCF,0xFF,0xFF,0xFF,0xDF,
-0xE6,0xFF,0xFF,0x7F,0xDF,0xF7,0xDD,0x7F,
-0x7F,0xDF,0xF7,0xFF,0x7F,0xDF,0xD7,0xFD,
-0xFF,0x7F,0xDF,0xF7,0xFF,0xCD,0xFF,0xF2,
-0xFF,0xFF,0x4F,0x7F,0xF4,0xFF,0xFF,0xFF,
-0xE7,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xBB,0xFF,0xEF,0xFF,0xFE,0xFF,
-0xFF,0xFF,0xEF,0xFF,0xFF,0xEF,0xFF,0xFB,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x65,
-0xEF,0xFF,0xFF,0x7F,0xFF,0xFD,0xEF,0xFF,
-0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFE,0xCF,0xDF,0xFE,0xFF,
-0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFE,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xBF,0xFF,
-0xFF,0xFF,0xE3,0x7F,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xEF,0xEB,0xFF,0xFE,0xBF,0xFF,
-0xEB,0xFF,0xFC,0x7F,0xFF,0xFF,0xFF,0xEE,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDD,0xFF,
-0xD6,0xFF,0xFD,0xBF,0xFF,0xFB,0xFF,0xFE,
-0xFD,0xFF,0xFF,0xFD,0xEF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xDE,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xBF,0xFF,0xFD,0xFF,0x7F,0xBF,
-0xFF,0x5F,0xDF,0xFF,0xFF,0xBF,0x77,0xFF,
-0xFF,0xFF,0x7F,0xD7,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xDF,0xEF,
-0xFF,0xFF,0xFE,0xFB,0xFF,0xFF,0xDF,0xBF,
-0xFF,0xFF,0xFF,0xFF,0xED,0xFF,0xB7,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xAF,0x7F,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xDF,0xBF,0xDF,0xF3,0xFD,0xFB,0xFF,0x5B,
-0xFD,0xFF,0xBF,0xEF,0xF7,0xFF,0xFF,0x7D,
-0xFF,0xFF,0xFF,0xFF,0xF8,0x3B,0xFF,0xBF,
-0x6F,0xFF,0xFE,0xFF,0xBF,0xFF,0xEB,0x7D,
-0xFF,0xEF,0xFB,0xFE,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xF2,0x7F,0xFC,0xFF,0x3F,0xDF,0xED,
-0xFE,0xFF,0xFF,0xFF,0xFF,0xEF,0x5F,0xF7,
-0xB5,0xFF,0xEF,0xFF,0xFF,0xFF,0xE0,0x3F,
-0x9F,0x9E,0xFF,0xFF,0xEF,0xFF,0xDF,0xFF,
-0xBF,0x5F,0xBF,0xCF,0xF3,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0x69,0xAF,0x33,0xFD,0xFF,
-0xFB,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF,0x7F,
-0xD9,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xF5,
-0xA3,0xDF,0x6E,0xDE,0xFF,0xFF,0xBD,0xFF,
-0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xE7,0xFD,
-0xFF,0xFF,0xFF,0xF9,0xEF,0xC6,0xFE,0xB7,
-0xAD,0xE5,0xF9,0xFF,0xFF,0xFF,0xCF,0xFF,
-0xFF,0xFF,0xCD,0xFB,0x7F,0xFF,0xFF,0xFF,
-0xF9,0xF6,0x0F,0xDF,0xEC,0xCF,0x7F,0xFF,
-0xFB,0x7F,0xFF,0xFF,0xFF,0xFD,0xFF,0xFE,
-0xF9,0xFD,0x7F,0xFF,0x7F,0xFF,0xF9,0x5B,
-0xFF,0x73,0xDC,0xFD,0x7B,0xDF,0xFF,0xFF,
-0xFF,0x7B,0xFF,0xFF,0xF7,0x53,0xD6,0xFF,
-0xFF,0xFF,0xFF,0xD8,0x9F,0xFE,0xFF,0xEF,
-0x7F,0xEE,0xFF,0xFF,0xFF,0xFB,0xED,0xED,
-0xFD,0xFF,0xFE,0xFF,0xFF,0xFB,0x7F,0xFF,
-0xE2,0x7F,0xFF,0x6F,0xD8,0x57,0xF7,0xFF,
-0xFF,0xFF,0xDF,0xFF,0xE8,0xFF,0xFF,0xFD,
-0xFF,0xFF,0xFC,0x7F,0xFF,0xE4,0xFF,0xFB,
-0xEF,0xFB,0xFE,0xDF,0xB7,0xED,0xFF,0xFE,
-0xDF,0x7F,0xFF,0xFE,0x7F,0xB7,0xFF,0xFF,
-0xFF,0xFF,0x89,0xFF,0xFF,0xCF,0xF3,0xFE,
-0x7F,0xFF,0xEF,0xFF,0xFE,0x7E,0x7F,0xFB,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF1,
-0xFF,0xEB,0x7A,0xD5,0xBF,0x6F,0xDB,0xBE,
-0xFD,0xB7,0xD8,0xF6,0xE5,0xBF,0x6F,0xFB,
-0xFE,0xF5,0xBD,0x7E,0x06,0xFF,0xDF,0xF7,
-0xFB,0xF6,0xFF,0x3F,0xFF,0xDB,0xFF,0xFF,
-0x6F,0xFB,0xF7,0xFF,0xFF,0xFF,0xFB,0xFE,
-0xF7,0xAF,0xFF,0xB7,0xED,0xEF,0xF7,0xFE,
-0xFF,0xFF,0xDF,0xFF,0xFE,0xFF,0xEF,0xFF,
-0xFF,0xFF,0xFF,0xBF,0xF7,0xFC,0x1F,0xEE,
-0xFB,0xFE,0xBD,0xFF,0x7F,0x5F,0xD7,0xFD,
-0xFB,0x43,0xFF,0xFF,0xFD,0xFF,0x5F,0xFF,
-0xF7,0xFF,0xF9,0x3F,0xFF,0xCF,0xF3,0xFD,
-0xF7,0x7E,0xEF,0xA7,0xF9,0xFE,0x8F,0xA7,
-0xE9,0xF3,0x7E,0x9F,0xFB,0xF8,0xFF,0xFF,
-0x3F,0xFD,0x7F,0x5F,0xDF,0xFD,0xFF,0xFF,
-0x5F,0xFF,0xFD,0x5F,0xFF,0xFF,0x7F,0xFD,
-0x7F,0xFD,0x9F,0xFF,0xE0,0xFF,0xFA,0xF8,
-0xBE,0x6F,0x9F,0xE6,0xF8,0xBE,0x3F,0x9A,
-0xF9,0xBE,0x6F,0x9F,0xE2,0xF9,0xFE,0x6F,
-0x9F,0xF9,0xFF,0xF5,0xFD,0x7F,0xCF,0xDF,
-0xFD,0xFD,0x7F,0xFF,0xF5,0xFF,0xFF,0xFF,
-0xF7,0xF5,0xFD,0x0F,0xDB,0xFF,0xD3,0xFF,
-0xEB,0xFA,0xFF,0xFF,0xBF,0xFF,0xFA,0xFF,
-0xFF,0xCB,0xFB,0xFE,0xFF,0xFF,0xEB,0xFA,
-0xFE,0xFF,0xFF,0xB7,0xFF,0xFF,0xFF,0xFF,
-0xBF,0xFF,0xDF,0xF5,0xFF,0xFF,0xD7,0xFF,
-0xFF,0xFF,0xDF,0xD7,0xF5,0xFF,0x7F,0xFE,
-0x4F,0xFF,0xFD,0xFF,0x7F,0x7F,0xFF,0xAD,
-0xEB,0xFB,0xFF,0xAD,0xFF,0xFF,0xFF,0xFF,
-0xAF,0xEB,0xFB,0xFF,0xFC,0x0D,0xFF,0xFF,
-0xDF,0xD2,0xFD,0xFF,0xFF,0xFD,0xF6,0xFF,
-0xFF,0x7F,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,
-0xFF,0xFB,0x3F,0x7D,0xEB,0x32,0xFE,0xBF,
-0x2F,0xEB,0xFA,0xAE,0xBD,0xE0,0xFA,0x7E,
-0xBF,0xAD,0xEB,0xFA,0xFE,0xBF,0xF5,0x7F,
-0xFF,0xDE,0xFE,0xE3,0xFB,0xFF,0xFF,0xFF,
-0xDF,0xEF,0x4F,0xDF,0xFF,0x7F,0xDF,0xFF,
-0xF7,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xEF,
-0xFB,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xDF,
-0xED,0xFB,0xDF,0xFF,0xBF,0xFF,0xFF,0xFF,
-0x81,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,
-0xFF,0xFF,0xFE,0xDD,0xFE,0xEF,0xFD,0xFF,
-0xFF,0xFB,0xFE,0xF7,0xFF,0x93,0xFD,0xFB,
-0x7E,0xFF,0xFE,0x87,0xE9,0xFF,0x7F,0xB3,
-0x9F,0xFE,0xFE,0xFF,0xAF,0xFD,0xFE,0x7E,
-0x3F,0xFE,0x67,0xFF,0xFF,0xF7,0xFF,0xFF,
-0xFC,0xF7,0xDF,0xFD,0xFF,0x7F,0xFF,0xFF,
-0x7F,0x6D,0xFF,0xFF,0xFE,0xFF,0xFF,0x2F,
-0xFF,0xBF,0xFF,0xFF,0xEE,0xFF,0xBE,0xFF,
-0xFF,0xFE,0xFF,0xEF,0xFF,0xFF,0xFE,0xFF,
-0xEF,0xFF,0xFF,0xFA,0x5F,0xFF,0xFF,0xFB,
-0xFF,0xFF,0xEF,0xFF,0xFB,0xFE,0xFD,0xFF,
-0xFE,0xFF,0xFB,0xFF,0xFF,0xFF,0x7F,0xFF,
-0xFE,0xBF,0xDF,0xFF,0xFB,0xFF,0xFF,0xF7,
-0xFC,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,0x7F,0xFF,
-0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,
-0xF3,0xFF,0xFF,0xFF,0xEF,0xFB,0xFF,0xFF,
-0xFF,0xDF,0xE2,0xFF,0xFF,0xFB,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFB,0xE7,0xFF,0xFD,
-0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xED,
-0xEF,0xFD,0xFF,0xFF,0xDF,0xD7,0xF5,0xFD,
-0x7F,0x5D,0xFD,0xFF,0x7F,0xDF,0x97,0xF4,
-0xFD,0x7B,0x5F,0xFF,0xC9,0xFF,0xFB,0xFE,
-0xFF,0xBF,0xFF,0x5F,0xFF,0xFF,0xF7,0xFF,
-0xEF,0xFD,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xF7,0xFF,0xD7,0xFD,0x7D,0x7F,0xFF,
-0xFF,0xFF,0xFF,0xEF,0xDF,0xF7,0xFD,0xFF,
-0xBB,0xFF,0xFF,0x7F,0xFF,0xFE,0xE3,0xFF,
-0xF9,0xFE,0x7F,0xBF,0xEF,0xFB,0xFE,0xFF,
-0xBF,0xF9,0xFE,0xFF,0x9F,0xEF,0xF9,0xFE,
-0xFF,0xBF,0xF3,0xDA,0xFF,0x37,0xCD,0xF3,
-0x7C,0xDF,0x37,0xCD,0xF3,0x7F,0x37,0xCD,
-0xF3,0x7C,0xDF,0x37,0xCC,0xF3,0x7F,0x5A,
-0xBD,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6,0xFD,
-0xBF,0x6F,0xDE,0xFD,0xBF,0x6F,0xDB,0xF6,
-0xFD,0xBF,0x6F,0xFE,0xF1,0x6F,0xEB,0x7A,
-0xDE,0xB7,0xAD,0xEB,0x7A,0xDE,0xB7,0xAF,
-0x7A,0xDE,0xB7,0xAD,0xEB,0x7A,0xDE,0xB7,
-0xFF,0x7E,0xFF,0xFE,0xCD,0xB3,0x6C,0xDB,
-0x36,0xCD,0xB3,0x6C,0xDE,0xCD,0xB3,0x6C,
-0xDB,0x36,0xCD,0xB3,0x6C,0xDF,0xC9,0xBF,
-0xF7,0xBD,0xEF,0x7A,0x9E,0xA7,0xA9,0xEA,
-0x7A,0xB7,0xBD,0xEA,0x7B,0xDE,0xA7,0xBD,
-0xCA,0x72,0x8D,0x91,0xFF,0xEF,0xFB,0xFE,
-0xFF,0xBF,0xEF,0xFB,0xFE,0xF7,0xEF,0xFB,
-0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFE,
-0x87,0xFF,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6,
-0xFD,0xBF,0x6F,0xF6,0xFD,0xBF,0x6F,0xDB,
-0xF6,0xFD,0xBF,0x6F,0xFE,0x4F,0xFF,0xBF,
-0xEF,0xBB,0xEE,0xFB,0xBE,0xEF,0xBB,0xEF,
-0xBE,0xEF,0xBB,0xEE,0xFB,0xBE,0xEF,0xBB,
-0xEF,0xFC,0x5F,0xFF,0xFF,0xFF,0x3F,0xCF,
-0xF3,0xFC,0xFF,0x3F,0xCF,0xFC,0xFF,0x3F,
-0xCF,0xF3,0xFC,0xFF,0x3F,0xCF,0xFD,0x9F,
-0xFE,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,
-0xEB,0xFE,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,
-0xAF,0xEB,0xFF,0xE1,0x6F,0xFD,0xFF,0x7F,
-0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFD,0xFF,
-0x7F,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF,
-0x7A,0xBF,0xFB,0xFE,0xDF,0xB7,0xED,0xFB,
-0x7E,0xDF,0xB7,0xFB,0x7E,0xDF,0xB7,0xED,
-0xFB,0x7E,0xDF,0xB7,0xFF,0xC9,0xFF,0xFF,
-0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,
-0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEE,
-0xFB,0xFE,0xBB,0xFF,0xFE,0xFF,0xBF,0xEF,
-0xFB,0xFE,0xFF,0xBF,0xEF,0xFE,0xFF,0xBF,
-0xEF,0xFB,0xFE,0xFF,0x3F,0xCF,0xFF,0xE7,
-0xFE,0xFF,0xF5,0xFD,0x77,0x5D,0xD7,0x35,
-0xDD,0x77,0xD7,0xF5,0xCD,0x7B,0x5D,0xD7,
-0xF5,0xDD,0x77,0xFE,0x27,0xFF,0xFF,0x8B,
-0xE2,0xF8,0xBE,0x2F,0x8B,0xE2,0xF9,0xAF,
-0x8B,0xE2,0xF8,0xBE,0x2F,0x8B,0xE2,0xF9,
-0xFE,0x1F,0xFF,0x5F,0xD7,0xF5,0xFD,0x7F,
-0x5F,0xD7,0xF5,0xFF,0x5F,0xD7,0xF5,0xFD,
-0x7F,0x5F,0xD7,0xF5,0xFF,0xFA,0x3F,0xFE,
-0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,0xEB,
-0xEC,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,
-0xEB,0xFF,0xFE,0x7F,0xFD,0x7F,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE6,
-0xFF,0xFA,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,
-0xF7,0xFC,0xFF,0xDF,0xF7,0xFD,0xFF,0x7F,
-0xDF,0xF7,0xFD,0xFF,0xF5,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0x02,0xFF,0xFE,0xBF,0xAB,0xEB,0xFA,
-0xBE,0xBF,0x23,0xEB,0xDE,0x1F,0xAF,0xEA,
-0xFA,0xFE,0xAF,0xAF,0xEB,0xFD,0x97,0xFF,
-0xF3,0xFC,0x7B,0x1F,0xCF,0xF1,0xFC,0x7F,
-0x1F,0xF1,0xFC,0x77,0x1F,0xCD,0xF1,0xFC,
-0xFF,0x1F,0xFE,0x87,0xFF,0xAF,0xEF,0xFA,
-0xFE,0xFF,0xAF,0xEF,0xFA,0xFD,0xBF,0x2B,
-0xFB,0x7E,0xBF,0xBF,0xEB,0xFB,0xFB,0xFB,
-0xDF,0xFF,0xFB,0xF7,0xFF,0xFF,0x7F,0xF7,
-0xF7,0xFF,0xFD,0xDF,0xFE,0xFC,0xDF,0xFF,
-0xDF,0xFF,0xFD,0xFF,0xDA,0xBF,0xFF,0xBB,
-0xEF,0xFB,0xF9,0xFF,0xBE,0xEF,0xFB,0xFB,
-0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,
-0xFF,0xF7,0x7F,0xFD,0xD7,0xFF,0xFF,0x7F,
-0xFF,0xFF,0xFF,0xFE,0xF7,0xFF,0xFE,0xFF,
-0xF7,0xFF,0xFF,0x7F,0xFF,0xFF,0xEC,0xFF,
-0xFF,0xFE,0xDF,0xBF,0xFF,0xFB,0xFE,0xFF,
-0xBB,0x68,0xAE,0x1F,0xAE,0xFB,0xFB,0xFF,
-0xFF,0xBF,0xFF,0xD5,0xFF,0x7F,0xFF,0xFF,
-0xF7,0xFE,0xFE,0xFF,0xBF,0xEF,0x9F,0xFD,
-0x7F,0xFF,0xCB,0xFF,0xFF,0xDF,0xFF,0xFF,
-0xBB,0xF7,0xBF,0xFF,0xFF,0xFF,0xFF,0xDF,
-0xFF,0xBF,0xFB,0xFF,0xFF,0xFF,0xDE,0x3F,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xA7,0xFF,0xFF,
-0xFF,0xFF,0xEF,0xFF,0x7F,0xFB,0xFD,0xFB,
-0x7F,0xFF,0xFF,0xFF,0xFF,0xCF,0xF3,0x7C,
-0xFF,0x7F,0x8D,0x7F,0xFF,0xFF,0xFF,0xFF,
-0xFB,0xFF,0xF7,0xFB,0xFE,0xFD,0xFF,0xFF,
-0xFF,0xFF,0xF7,0xFD,0xFF,0x7F,0xFD,0x1F,
-0xFD,0xFF,0xFF,0xFF,0xFF,0xBF,0xDF,0xFF,
-0xFF,0xFE,0x5C,0xFF,0x6D,0xFF,0x7F,0xAB,
-0xE7,0xF1,0xFF,0xFD,0x9F,0xFF,0xFF,0xAD,
-0xEB,0x7A,0x3F,0x1F,0xFF,0xFF,0xFE,0xBF,
-0xAF,0xF3,0xDE,0xF5,0xFF,0x8F,0xFB,0xDF,
-0xE6,0x7F,0xFF,0xDF,0xF3,0xFD,0xFF,0x7E,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xF7,0xF3,
-0x7F,0xDF,0xF7,0xEF,0xFF,0xF6,0x3F,0x9F,
-0xDF,0xFF,0xFF,0xEE,0xFF,0xFF,0xEF,0xFB,
-0xFF,0xFF,0xF9,0xFB,0xFE,0x4F,0xBF,0xEF,
-0xBB,0xFF,0x69,0xAF,0xAF,0xFC,0xFF,0x3F,
-0xDD,0xFF,0xFC,0xBF,0x8F,0xFF,0xFD,0xF3,
-0xBF,0xED,0x9E,0xFC,0xBF,0x6F,0xF5,0xD3,
-0xDF,0xFF,0xDB,0xD6,0xF5,0xEF,0xFD,0xFE,
-0xFF,0xB9,0xFF,0x1F,0xD2,0xA9,0xAF,0xFF,
-0xDB,0xF7,0xBF,0xEF,0x46,0xFF,0xFF,0xAD,
-0xEB,0x7A,0xDF,0xEF,0xF7,0xFF,0x7F,0xF7,
-0x9F,0xED,0xFF,0x7F,0xFF,0xAD,0xEB,0x7F,
-0xF5,0x6F,0xFF,0xFD,0xFB,0xD6,0xF4,0xF7,
-0xFB,0xF9,0x7E,0x7F,0xFF,0x5F,0xC2,0xFE,
-0xBF,0xFD,0xFB,0x33,0xDF,0xF9,0x5B,0xFF,
-0xFF,0xDD,0x67,0x7D,0xCF,0xEF,0xDB,0xEC,
-0xFF,0x77,0xDD,0xF7,0xFD,0xFF,0xFF,0xDE,
-0xA7,0xBF,0xD4,0x9F,0xFF,0xFF,0xBF,0xEF,
-0xFE,0xFF,0xDF,0xEF,0xBB,0xFF,0xFF,0xEF,
-0xEB,0xFA,0xFF,0xEF,0xBD,0xFB,0xFF,0xE2,
-0x7F,0xFF,0xDF,0xDF,0xF7,0xFD,0xBF,0xBB,
-0x73,0xF7,0xFD,0x7F,0xDF,0xDE,0xF7,0xBF,
-0xEA,0xDB,0xF6,0xFF,0xD6,0xFF,0xFF,0x66,
-0xFF,0xBE,0xFF,0xBF,0x6B,0xD9,0xF6,0xDF,
-0xFF,0xFB,0x7E,0x7F,0xB7,0x7E,0xFF,0xFE,
-0xFF,0xCD,0xFF,0xFE,0x7F,0xFF,0xFC,0xFD,
-0x3F,0xFB,0xFB,0xF7,0xFF,0xFF,0xFB,0xF6,
-0x7D,0xFE,0x7F,0xFF,0xFC,0xFF,0xB9,0xFF,
-0xF9,0xFA,0xFE,0xBF,0xAF,0x5B,0xD6,0xED,
-0xAD,0x7B,0xF6,0xF9,0xBF,0xEF,0xF8,0xFA,
-0xFE,0xBF,0xFE,0xE6,0xFF,0xFF,0xF7,0xFD,
-0xFF,0x7F,0xBF,0xEF,0xF3,0xFF,0xFF,0x6F,
-0xF7,0xFE,0xFF,0xFF,0xF7,0xFD,0xFE,0xF7,
-0xEF,0xFF,0xFB,0xEF,0xFB,0x7E,0xDE,0xFE,
-0xFF,0xBF,0xFF,0xFE,0xFF,0xFF,0xFB,0xFF,
-0xFF,0xEF,0xFB,0x6F,0xFC,0x1F,0xFE,0xE7,
-0xFF,0xFF,0xFF,0xEF,0xFF,0xD3,0xB4,0xBB,
-0xFF,0xFF,0xFD,0xBF,0x6F,0xE3,0xFE,0xFF,
-0xBF,0xFC,0xBF,0xF7,0xCF,0xF7,0xFD,0xFF,
-0x2F,0xDF,0xAB,0xEA,0xFF,0xDF,0xE7,0xEA,
-0x9A,0xAF,0xEF,0xFB,0xFE,0xFF,0xF5,0x3F,
-0xFD,0x7E,0xFF,0xD7,0xF5,0xFB,0xFF,0xFD,
-0xF7,0xFF,0x7F,0xFE,0xF7,0xFD,0xFF,0xD7,
-0xFF,0xD7,0x7F,0xEE,0x7F,0xFA,0x79,0xFE,
-0x2F,0x8B,0xE6,0xF9,0xFE,0x3F,0x9E,0xF9,
-0xBE,0x2F,0x0B,0xE7,0xF9,0xFE,0x2F,0x9F,
-0xFD,0xFF,0xFE,0x7D,0x7F,0x5F,0xD7,0xFF,
-0xFF,0x7F,0xFF,0xFD,0xFF,0x7F,0x5F,0x97,
-0xFF,0xFD,0x7F,0x5F,0xFF,0xE3,0xFF,0xFF,
-0xFA,0xFE,0xBF,0xAF,0xFB,0xFB,0xFF,0xFF,
-0xCF,0xEB,0xFE,0xBF,0xAF,0xFF,0xFA,0xFE,
-0xBF,0xFF,0x87,0xFF,0xFF,0xF5,0xFF,0xFF,
-0xFF,0xFF,0xFD,0xFF,0x7F,0xFF,0xFF,0xFF,
-0xFB,0xFF,0xFF,0xF5,0xFF,0xFF,0xFE,0x0F,
-0xFF,0xFD,0xEB,0xFF,0xFF,0xF7,0xFF,0xEF,
-0x7B,0xDF,0xFE,0xFF,0xFF,0xDF,0xF7,0xFD,
-0xEB,0x7F,0xDF,0xFF,0x5F,0xFF,0xFF,0xFF,
-0xFF,0xFD,0xBF,0xFF,0x7E,0xFA,0xBF,0xC7,
-0xDB,0xF7,0xBD,0x3F,0xFB,0xFF,0xF6,0xFF,
-0xFA,0xAF,0xFF,0xEB,0xFA,0xFE,0x3F,0x2F,
-0xEA,0xFA,0x3E,0xAD,0xC9,0xBA,0xF6,0xAD,
-0xAF,0xEB,0xFA,0xF6,0xBF,0xFE,0x7F,0xFF,
-0xFF,0xFD,0xFF,0xF1,0x7F,0x3F,0xCF,0xF1,
-0xEF,0xFF,0x7F,0xFF,0xBC,0xDF,0xDF,0xF7,
-0xDD,0xFF,0xE0,0x7F,0xFF,0xFF,0xFE,0xFF,
-0xFA,0xEC,0xBB,0x7F,0x5F,0xFF,0xFB,0xEC,
-0xFF,0xEF,0xB7,0xFF,0xF7,0xFF,0xFF,0xB5,
-0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xEE,0xDF,
-0x5F,0xDF,0xDE,0xFF,0xAE,0xE7,0x77,0xFF,
-0xFF,0xDF,0xF7,0xFF,0xE3,0xFF,0xFA,0xBB,
-0xFE,0xFF,0xAF,0xFD,0xFB,0xFE,0xBF,0xAB,
-0xF9,0xFE,0xFF,0xBF,0x7F,0xBF,0xFE,0xBD,
-0xFE,0xD7,0xFF,0x9F,0xFD,0xFF,0xBE,0xEF,
-0xFF,0xEE,0xFD,0xBB,0x5B,0xEF,0xFF,0x7F,
-0xEF,0xFF,0xEF,0xFF,0x7F,0xFF,0x4F,0xFF,
-0xEF,0xFB,0xBC,0xFC,0xFF,0xFF,0xFF,0xFE,
-0xFE,0xFD,0xFA,0xFE,0xFB,0xFF,0xFD,0xF3,
-0xFB,0xFF,0xF8,0x5F,0xFF,0xFF,0xD7,0xF5,
-0xFD,0xDF,0xEF,0xFF,0xF3,0xDC,0x5F,0xCE,
-0xF5,0xBD,0xFF,0xFF,0xD7,0xFF,0xFF,0xF9,
-0x3F,0xFF,0xDF,0xF7,0xFF,0xFE,0xFF,0xFD,
-0xFF,0xFB,0xFF,0xF7,0xB9,0x7D,0xFE,0xDF,
-0xFF,0xFF,0xFF,0xFF,0xF9,0x7F,0xFF,0xFE,
-0xFF,0xFF,0x7F,0xFF,0xFE,0xFF,0xFF,0xF7,
-0xF6,0xFF,0xBF,0xF1,0xF8,0xFF,0xFF,0xFF,
-0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF,
-0x9B,0xFB,0x7F,0xFF,0xFF,0xFF,0xC1,0xFF,
-0xDF,0xFF,0x3F,0x5F,0xD7,0xBF,0xEF,0xBB,
-0xDE,0xEE,0xFF,0x7F,0xDF,0xFF,0xFE,0xF5,
-0x7F,0xDF,0xFF,0x99,0xFF,0xFF,0xFA,0xFF,
-0xBF,0xFD,0xEB,0x7A,0xFF,0xB7,0xFE,0xFE,
-0xFF,0xFF,0xEF,0xFF,0xFF,0xFD,0xBF,0xFF,
-0x97,0xFF,0xFD,0xF7,0xFF,0x7F,0xF7,0xFF,
-0xFF,0xFD,0x5F,0xFE,0xF3,0xF9,0xDF,0xDF,
-0xFF,0xFF,0xFC,0xFF,0xFF,0x83,0xFF,0xFF,
-0xFE,0xFF,0x9E,0xEC,0xFB,0xEE,0xFF,0x9F,
-0xBF,0xEF,0xFF,0xFE,0xED,0x7B,0xFF,0xFF,
-0xFF,0xF1,0x5A,0xFF,0xFF,0xFD,0xFF,0x7C,
-0x69,0x3B,0xDF,0xFF,0x7F,0x1F,0xDF,0xFF,
-0xFD,0xBA,0xFF,0xFF,0xFB,0xFF,0x5B,0xBD,
-0xFF,0xFF,0xFF,0xFF,0xD7,0xB6,0xED,0xE9,
-0xFF,0xD6,0xBD,0x6F,0x5F,0xFB,0xFF,0xEF,
-0xFF,0x5F,0xFE,0xF6,0x6F,0xFF,0xFF,0xFF,
-0xFF,0xF7,0xEB,0x7A,0xDF,0xFF,0x9F,0x7F,
-0x7F,0xFF,0xB7,0xFF,0xFF,0xFE,0xDF,0xFF,
-0x6C,0xFF,0xFB,0xFF,0xBB,0x6F,0xEB,0xFE,
-0xCC,0xF7,0xA5,0xFA,0x5C,0xF5,0x75,0xBB,
-0xB7,0xDF,0xFE,0x6F,0x5F,0xC5,0xBF,0xFD,
-0x7B,0xFE,0xFF,0x95,0xE7,0x29,0xCF,0x4F,
-0xF5,0x91,0xEE,0x6B,0xDF,0xEF,0xFD,0x54,
-0xF5,0xBD,0xB1,0xFF,0xEF,0xEE,0xFB,0xBE,
-0xBF,0xAF,0xFE,0xDE,0xBD,0x6F,0xDA,0xF2,
-0xFF,0xAF,0xBE,0xFF,0xFF,0xFD,0x7E,0xA7,
-0xFF,0xF7,0xFF,0xBF,0xEF,0x7B,0xF6,0xFD,
-0xBD,0x4A,0xF2,0x85,0x85,0xBF,0x5B,0xFE,
-0xB5,0xFD,0xFA,0xFF,0x4F,0xFF,0xFE,0xDF,
-0xFF,0xED,0xFF,0xBF,0xFF,0xBF,0x7F,0xFE,
-0xFF,0xB7,0x6D,0xFF,0xF7,0xBF,0xBF,0xEF,
-0xFD,0x1F,0xFF,0xFE,0x7D,0xFF,0x67,0xFF,
-0xFF,0xFF,0x3F,0x7F,0xFE,0xBF,0xFF,0xE7,
-0xDF,0xE7,0xFF,0xEF,0x6B,0xFC,0x1F,0xFF,
-0xBF,0xEF,0xFB,0xFE,0xDE,0xBF,0xAF,0xFA,
-0xFF,0xB6,0xEF,0xF9,0xFE,0xFF,0x8F,0xEF,
-0xDB,0xEF,0xAB,0x6F,0xFB,0xFE,0xFF,0xFF,
-0xEF,0xFD,0xFF,0x7F,0xFF,0xFF,0xDE,0xFF,
-0xFF,0xEF,0xFF,0xFF,0xFF,0x3F,0xFF,0x6C,
-0xFF,0xBF,0xFB,0xFF,0xFE,0xFF,0xFB,0xFE,
-0xDF,0xFF,0xFF,0xEF,0xFF,0xFF,0xBF,0xFF,
-0xFF,0xFE,0xFB,0xFF,0xD5,0x7F,0xFF,0xFF,
-0xEF,0xFB,0xFF,0xFF,0xBF,0xEF,0x43,0xB5,
-0xFD,0x6F,0xCF,0xD6,0xBE,0x3F,0x7F,0xDB,
-0xFE,0xC3,0xFF,0xFD,0xFF,0xAF,0xEB,0xFB,
-0xFC,0xFF,0x3E,0xEF,0xE8,0xFA,0xBD,0xCD,
-0xAA,0xFE,0xFE,0x7D,0xCF,0xFF,0xB7,0xFF,
-0xF7,0xFF,0xFF,0xFF,0xFD,0xFF,0x75,0xCD,
-0x52,0xD7,0xFD,0xFB,0xF7,0xDD,0xFB,0xEF,
-0xEB,0xFF,0xFF,0x4F,0xFF,0xBF,0x9F,0xE7,
-0xF9,0xFC,0x7F,0x8B,0xC3,0xF9,0xAF,0x8F,
-0xE7,0xE9,0xBE,0x7F,0x9F,0xE6,0xF9,0xFC,
-0x5F,0xFF,0xFF,0xF7,0xFD,0xFF,0x7A,0x5F,
-0xD7,0xED,0xFF,0xFF,0xD7,0xFF,0xDD,0x7F,
-0xE7,0xFF,0xFC,0xFF,0xFC,0x3F,0xFF,0xFF,
-0xFF,0xFB,0xFF,0xFE,0xBF,0xAF,0xFF,0xFD,
-0xFF,0xEF,0xFF,0xEB,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xF7,0x7F,0xFF,0x7F,0xDF,0xFF,0xFD,
-0xFD,0x7F,0xFE,0xF7,0xFD,0x7F,0xDF,0xFF,
-0xFD,0xFF,0xFF,0xDF,0xFB,0xFF,0xEE,0xFF,
-0xFB,0xFF,0xF7,0xFD,0xFF,0x7A,0xDF,0xF5,
-0xFD,0xFA,0xDF,0xF7,0xFC,0xFF,0x7F,0xDF,
-0xBF,0xED,0xFF,0xC9,0xFF,0xDF,0xFF,0xBF,
-0x2F,0xFB,0xFF,0xBC,0xAD,0xFF,0xF7,0xFF,
-0xFF,0xEF,0xD3,0xFF,0x7D,0xBF,0x6F,0xFF,
-0xFA,0xFF,0xFE,0xBF,0xAE,0xEA,0xFA,0xBE,
-0xAD,0xA5,0xEB,0xCE,0xBF,0xA7,0xEB,0x5A,
-0xDE,0xBD,0xAF,0x6B,0xFD,0x57,0xFF,0xFF,
-0xF4,0x7F,0x1F,0x7F,0xFD,0xFF,0x7F,0x36,
-0xF0,0xDF,0x79,0xFF,0xFF,0xFF,0xF7,0xFD,
-0xBF,0xFF,0x87,0xFF,0xFB,0xF3,0xFC,0xFF,
-0xFF,0xFF,0xFF,0x7E,0xFF,0xBF,0xDF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFD,0xBF,0xF8,0x9F,
-0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFD,
-0xF7,0xFC,0xBD,0xFF,0xFE,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFB,0xF9,0xBF,0xFF,0xFF,0xEB,
-0xE2,0xFE,0xFF,0xBF,0xEF,0xA9,0xBA,0x2F,
-0xEB,0xF9,0xFE,0x77,0xDF,0xF7,0xFF,0xFF,
-0xF9,0x7F,0xFF,0xFF,0x7F,0xEF,0xD7,0xFF,
-0xFD,0xFF,0xFB,0xF5,0xFF,0xBF,0x6F,0xDF,
-0xFF,0xFF,0xFD,0xFF,0xFF,0xF0,0xFF,0xFF,
-0xFF,0x3F,0xCF,0xFF,0xBA,0xEE,0x9B,0xBF,
-0xEE,0xD7,0xFE,0xCD,0xEF,0xFF,0xDF,0xBF,
-0xFF,0xFF,0xC5,0xFF,0xFF,0xFD,0x7F,0x4F,
-0xFD,0xF6,0xD9,0xFF,0x4F,0xD6,0xFD,0xBF,
-0x6E,0xFF,0xFF,0xF4,0x7F,0xFF,0x7F,0x8B,
-0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xF9,0xFE,
-0x37,0xFF,0xD9,0xFB,0xF5,0xAF,0xFD,0xFF,
-0xFF,0xFB,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,
-0xFB,0xF7,0xFF,0xFD,0xFF,0x7C,0xFA,0x7E,
-0x4F,0xFC,0xDF,0x1D,0xC7,0xFF,0xFF,0xFF,
-0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0xFD,0xFB,
-0xFF,0xFF,0xFE,0xFE,0xFC,0xFF,0x7F,0x7F,
-0xBF,0xEF,0xFE,0xFF,0xFF,0xFF,0x5F,0xFD,
-0xFF,0xFF,0xFF,0xFD,0x6F,0x5A,0xD7,0x7B,
-0xBE,0x5F,0xFE,0x39,0xFF,0xF7,0xFF,0xF7,
-0xFD,0xFE,0xAA,0x1F,0xFF,0xFF,0xFF,0xFF,
-0xFE,0xFE,0xAB,0xAF,0xFD,0xFE,0xBF,0xFF,
-0xF7,0xFF,0x7F,0xFE,0x8F,0xE3,0xFB,0xEE,
-0x7F,0xFF,0xFF,0xFF,0xFF,0xEB,0xFB,0xFF,
-0xFD,0xBF,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFB,0xE4,0x3F,0xFF,0xDF,
-0xFF,0xFF,0xFF,0xFF,0xF3,0xEF,0xBB,0xFB,
-0xBF,0xEF,0xBB,0xFF,0xD7,0xBF,0xFF,0xFF,
-0xFF,0x29,0xAF,0xF7,0xFF,0xFF,0xFB,0xFF,
-0xFB,0xE6,0xFF,0x0F,0xFB,0x3F,0xDF,0x0F,
-0xFF,0xAF,0xFF,0xFF,0xFF,0xF5,0xC3,0xDF,
-0x5F,0xFF,0xFF,0xFF,0xFE,0x6B,0xCA,0xBE,
-0xBC,0xFF,0x9F,0xF2,0xBF,0xFF,0xFE,0xFA,
-0xFF,0xFF,0xEF,0x16,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFC,0xDF,0x97,0xFD,0x79,0xFF,0x37,
-0xE7,0x7F,0xFF,0xFF,0xB5,0xFF,0xFF,0xF6,
-0x2F,0xFF,0xFD,0xFB,0xFE,0xFF,0xFF,0xFD,
-0x5F,0x57,0x5F,0xFF,0xDB,0x52,0xDF,0xFF,
-0xFD,0xBF,0xFF,0xFF,0xFC,0xDB,0xFF,0x7B,
-0xB5,0xFD,0x7F,0xFF,0x71,0x9C,0x6E,0xFF,
-0xF6,0x35,0xA5,0x9B,0xFF,0xFF,0xFD,0xFF,
-0xFF,0xDB,0x9E,0x7F,0xFE,0xEF,0xFB,0xFF,
-0xFF,0xBD,0xEF,0xFF,0xDE,0xB7,0xF9,0x4B,
-0xFF,0xF5,0xEF,0xFF,0xFF,0xFF,0xE8,0x7E,
-0xFF,0xEA,0xDF,0xF7,0xFF,0xFD,0x69,0x5B,
-0xFC,0x9F,0xEF,0x78,0xD6,0xFF,0xEB,0xEF,
-0xFF,0xFF,0xFF,0xE8,0xFF,0xFF,0xED,0xFF,
-0xFF,0xFF,0xFF,0xE3,0xF9,0xF6,0xBF,0xFF,
-0xFF,0xFE,0xDF,0xFF,0x7F,0xFF,0xFF,0xFF,
-0xD1,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFF,
-0xE7,0xF9,0xFF,0xBF,0x7F,0xD9,0xFF,0xFD,
-0xFE,0x7F,0xFF,0xFE,0xFF,0xF9,0xFF,0xFB,
-0xD6,0xDF,0xBF,0xEF,0x5B,0xD6,0xFF,0xBF,
-0xFB,0xF6,0xFF,0xBF,0xEF,0xF8,0xF6,0xDD,
-0xBE,0xFE,0x16,0xFF,0xBF,0xEF,0xFF,0xFE,
-0xFF,0xBF,0xEF,0xFF,0xFF,0xFF,0x6F,0xFB,
-0xFF,0xFF,0xFF,0x6F,0xF3,0xFF,0xF7,0xEF,
-0xFB,0xFF,0xBF,0xFF,0xEF,0xFE,0xFF,0xBF,
-0xFF,0xFF,0xFF,0xBE,0xBF,0xFF,0xEF,0xFF,
-0x7F,0xEF,0xFF,0xFD,0x17,0xFB,0x7B,0xFF,
-0xFF,0xFD,0x7F,0xDB,0xF6,0xF4,0x7F,0xFA,
-0xFE,0xF5,0xBF,0xEB,0xE3,0xF7,0xFF,0xFF,
-0xE9,0xBF,0xFF,0xAF,0xF7,0xFD,0xF3,0x7E,
-0x8F,0xA3,0xEA,0xFF,0xCB,0xF3,0xEE,0xFF,
-0xBF,0xEF,0xF7,0xF9,0xFF,0xFE,0x7F,0xFF,
-0xFF,0xFF,0xFF,0xF5,0xFB,0xF6,0xFF,0xF5,
-0x2F,0xFE,0xFB,0xD7,0xBF,0xFF,0xBE,0xDF,
-0x9F,0xFF,0xF0,0xFF,0xFF,0xF9,0xFE,0x7F,
-0x8F,0xA3,0xF8,0xFE,0x6F,0x9F,0xF9,0xF6,
-0x2F,0x9F,0xE7,0xF9,0xFE,0x2F,0x9F,0xE1,
-0xFF,0xFF,0xFF,0x7F,0xDF,0xF7,0xF5,0xFD,
-0x7F,0x7F,0xF5,0xFF,0x9F,0x5F,0xFB,0xFE,
-0xFF,0x7F,0xFF,0xFF,0xCB,0xFF,0xFF,0xFB,
-0xFE,0xFF,0xBF,0xAF,0xFB,0xFE,0xFF,0xDF,
-0xFE,0xFE,0xBF,0xF7,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xC7,0xFF,0xFF,0xFD,0xFF,0x7F,0xDD,
-0xF7,0xFD,0xFF,0xFF,0xD7,0xFF,0xFD,0x7F,
-0xFF,0xFB,0xFD,0xFF,0xFF,0xFE,0xEF,0x7F,
-0xFD,0xEF,0xFB,0xFE,0xFB,0xFD,0xFF,0x7F,
-0xDF,0xFD,0xFF,0x7A,0xDF,0xF7,0xFD,0xFF,
-0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xD3,0xF7,
-0xFF,0xFF,0x6F,0xDB,0xFF,0xFF,0xEF,0xCB,
-0xF4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
-0x29,0xFF,0xE8,0xDA,0x76,0x9F,0xAF,0x6A,
-0xDA,0xFE,0x35,0xEB,0xDA,0xD6,0xBF,0xAB,
-0xEB,0x7A,0xDE,0xBF,0xD7,0x7F,0xFF,0xFE,
-0xFF,0xBF,0xEF,0xFD,0xDF,0x77,0xBF,0xFD,
-0x37,0xEF,0xFF,0xEF,0xFF,0x3F,0xFF,0xFF,
-0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xF7,0x7E,
-0xDF,0xFF,0xFF,0xFF,0xFA,0xB7,0x7F,0xFF,
-0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0x89,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0x9F,0xFB,0xFF,0xFF,0xFF,0xE7,0xFF,
-0xFF,0xFF,0xFF,0xAA,0xFF,0xAB,0xFB,0xFA,
-0xEF,0xBF,0xFF,0xDF,0xFA,0x7B,0xB9,0xFE,
-0xFE,0xFF,0xFD,0xFF,0xF7,0xFE,0x3F,0xFF,
-0xB7,0xFF,0xF7,0xEE,0xFF,0x7F,0xEF,0xFF,
-0xFF,0x7F,0xFF,0x1F,0xFB,0xFF,0xBF,0xFB,
-0xFE,0xFF,0xBD,0xFF,0xFF,0x2F,0xFF,0xBF,
-0xFF,0x7F,0xDF,0xFA,0xFF,0xFF,0xFC,0xEE,
-0xF5,0xF3,0xBE,0xFB,0x0F,0xEF,0xF3,0xBE,
-0xEF,0xFC,0x5F,0xFF,0x5A,0xFF,0xF7,0xDF,
-0xFF,0xFF,0xFE,0xD5,0xFC,0x5F,0xFB,0xF2,
-0xFF,0xFF,0x2F,0xBB,0xF3,0xFF,0xFF,0xBF,
-0xFF,0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,
-0xBF,0xFF,0xFF,0xFD,0x7B,0xFF,0xDF,0xB9,
-0xFF,0xFB,0xFF,0xD8,0x7F,0xFF,0xFF,0xFF,
-0xFB,0xFF,0xFC,0x7F,0x1F,0xBF,0xE0,0xDF,
-0xF7,0xEF,0xFF,0xFD,0x7F,0xFE,0xDF,0xFF,
-0xE0,0xFF,0xFF,0xFD,0xEF,0xFB,0xFF,0xFE,
-0xF7,0xDF,0xFF,0xEB,0x5F,0xFF,0xF7,0xFF,
-0xFF,0xFF,0xFF,0xBF,0xFF,0xFD,0xFF,0xFD,
-0xFF,0xFF,0xFF,0xF7,0xFD,0xFF,0x3B,0xDC,
-0xFD,0x6D,0x7B,0x5F,0x57,0xF5,0xFD,0x7F,
-0x5F,0xFF,0xB1,0xFF,0xEB,0xFF,0xFF,0xFF,
-0xFB,0xFB,0xFE,0xFF,0xBF,0xFB,0xBE,0xFF,
-0xBF,0xEF,0xFB,0xFE,0xFF,0xAF,0xFE,0xF7,
-0xDF,0xDF,0xFF,0xFF,0xFF,0x7F,0xCF,0xF3,
-0xF8,0xFF,0xD7,0xFB,0xFF,0x5F,0xBF,0xF7,
-0xFB,0xFF,0x7F,0xFE,0x23,0xFF,0xFF,0xFE,
-0x7F,0xF3,0xFF,0xFB,0xFE,0xFF,0xFF,0xF3,
-0xFF,0xFF,0xF5,0xF9,0xFF,0x3F,0xFF,0xFF,
-0xF0,0x9A,0xFF,0xBE,0x7F,0xFF,0xFC,0xF9,
-0xFF,0xFD,0xAF,0xEB,0xFE,0xBF,0xFF,0xCF,
-0xF3,0xFE,0x7F,0xFF,0xFF,0x5B,0xBD,0xFF,
-0xBC,0xEB,0xFF,0xD7,0xD4,0xAF,0xAF,0xFD,
-0xFF,0xCF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7,
-0xFD,0xFE,0xFF,0x6F,0xFF,0xFB,0xFF,0xFF,
-0xFF,0xFD,0x7F,0x5E,0xFD,0xBF,0xDB,0xF6,
-0xFD,0xBF,0x6F,0xFB,0xEE,0xFD,0xFF,0x7A,
-0xFF,0xFA,0xFB,0xFF,0x3F,0xFB,0xB7,0x5F,
-0xD6,0xF7,0x1F,0x71,0xDC,0x77,0x1D,0xC7,
-0x31,0xDC,0x77,0xDF,0xF9,0xBF,0xF5,0x5B,
-0xF4,0xD7,0x9D,0xAE,0xFF,0xBF,0xFD,0xBF,
-0xDB,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6,0xFE,
-0x3D,0x81,0xFF,0xEB,0xFE,0xFE,0xFE,0xFF,
-0xEB,0x7A,0xDF,0x7D,0x77,0x7D,0xF5,0x79,
-0xDF,0x57,0xDD,0xF5,0x7D,0x7E,0xE6,0xFF,
-0xD6,0x3F,0xBF,0x7F,0xFF,0xD4,0xF5,0x3F,
-0xBF,0xFB,0xBE,0xEF,0xB3,0xEE,0xFB,0x9E,
-0xEF,0xBB,0xFE,0x8B,0xFF,0xFE,0xDF,0xB7,
-0xED,0xFF,0xF7,0xFD,0xFE,0xFF,0xEF,0xBB,
-0xEE,0xFF,0xBE,0xEF,0xBB,0xEE,0xEB,0xFC,
-0x1F,0xFF,0xFF,0xFD,0xFF,0xE7,0xFF,0xF7,
-0xFD,0xFF,0xEF,0xFE,0xFF,0xBF,0xEF,0xFB,
-0xFE,0xFF,0xBF,0xEB,0xFA,0x1F,0xFF,0xB7,
-0xEF,0x5B,0xFE,0xFF,0xAF,0xEB,0xDD,0xE7,
-0xDE,0x77,0x9D,0xE7,0x79,0xDE,0x77,0x9D,
-0xBF,0xE6,0x6F,0xFF,0xFE,0xFF,0xBF,0xEF,
-0xFB,0xFE,0xFD,0xBF,0x6F,0xF6,0xFD,0xBF,
-0x6F,0xDB,0xF6,0xFD,0xBF,0xFF,0x7E,0xFF,
-0xFF,0xFB,0xFE,0xFE,0xFF,0xEF,0xFB,0xFD,
-0xEF,0x7E,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,
-0xBD,0xEF,0xFF,0xD5,0xFF,0xBF,0xFF,0xEF,
-0xFE,0xFF,0xFC,0x3F,0x0F,0xE7,0xFE,0x7F,
-0x9F,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7,0xFE,
-0xF3,0xFF,0xFE,0xDF,0xAD,0xDF,0x67,0xEE,
-0xFB,0xBF,0xEF,0xFE,0xFF,0xBF,0xEF,0xFB,
-0xFE,0xFF,0xBF,0xEF,0xFF,0x23,0xFF,0xFF,
-0xFF,0xFF,0x7F,0xFF,0xF3,0xBC,0xDB,0xFE,
-0xFB,0xFF,0xFB,0xBE,0xF7,0xFB,0xFF,0x7F,
-0xDF,0xFF,0xCF,0xFB,0xFF,0x9F,0xE3,0xF9,
-0xBE,0x3F,0x8F,0xE7,0x79,0xFF,0x9D,0xE7,
-0xF9,0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x5F,
-0xFF,0xCF,0xF7,0xFF,0xFF,0xFF,0xDF,0xF7,
-0xFE,0x7F,0xE7,0xF9,0xFE,0x7F,0xFF,0xFF,
-0xFB,0xFE,0xFF,0xFF,0xBF,0xFF,0xBF,0xBF,
-0xFF,0xFE,0xFF,0xBF,0xEF,0xFF,0xFD,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFD,0xFF,
-0xFF,0x3F,0xFF,0xBF,0xFF,0xF7,0xFF,0xFF,
-0x7F,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xE8,0xEF,0xFF,
-0x5F,0xF7,0xBF,0xF9,0xFE,0xDF,0xB7,0xFD,
-0xFF,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7,
-0xFD,0xFF,0xDD,0xFF,0xF2,0xFF,0xBF,0xFF,
-0xFF,0xBF,0xFF,0xFF,0x2F,0xF2,0xFF,0xBF,
-0x2F,0x7B,0xD2,0xF7,0xBF,0x2F,0xFF,0xBB,
-0xFF,0xEE,0x8F,0xAF,0xEB,0xFA,0xFE,0x3F,
-0xA7,0x69,0xCE,0x8F,0xA4,0xEA,0xFA,0xEE,
-0xB7,0xAE,0xEB,0xFD,0xC7,0xFF,0xF7,0xF7,
-0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3E,0xF3,
-0x74,0xFF,0x3F,0x4F,0xFF,0xE7,0xFF,0x3F,
-0xFE,0xA7,0xFF,0xFF,0xDF,0xF7,0xB7,0xFF,
-0xF7,0xFF,0xBA,0xEF,0x37,0xEB,0xFB,0xFE,
-0xBF,0xFB,0xFE,0xF3,0xFF,0xF9,0xDF,0xFF,
-0xBF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,
-0xFD,0xDF,0xFF,0xFD,0xFF,0xFF,0xFB,0xFE,
-0xFD,0xFF,0xFB,0xBF,0xFE,0x3F,0xED,0xFF,
-0xDF,0xBE,0x3D,0xA7,0xFB,0xFA,0x3F,0xE6,
-0xE1,0xFE,0xFE,0x3F,0xEF,0xE3,0xDF,0xF5,
-0x7F,0xFE,0xFF,0x7E,0xFF,0xFF,0xFF,0xFF,
-0xEF,0x6F,0xF6,0xFF,0x7D,0xEF,0xD7,0xDE,
-0xFF,0x7D,0xEF,0xFF,0xF2,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0x7B,0xDE,0xFB,0xE6,0xEE,
-0xEF,0x37,0x6E,0xF3,0x7E,0xEB,0x37,0xEF,
-0xFF,0xC1,0xFF,0xFE,0xFF,0xF7,0xEF,0xFF,
-0xFF,0xFF,0xBF,0x3F,0xD2,0xDF,0xBF,0x2F,
-0x7B,0xE2,0xFF,0xFE,0x3B,0xBD,0xDB,0xFF,
-0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,
-0xFF,0xFB,0xFF,0xFF,0xBF,0xFF,0xFB,0xDF,
-0xFF,0xBF,0xFF,0xB7,0xFF,0xFF,0xBF,0xEF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,
-0x7F,0xFF,0x1F,0xEF,0xF1,0xFD,0xFF,0xF6,
-0xAF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,
-0xFF,0xFF,0xFE,0x9F,0xFF,0xFF,0xFF,0x77,
-0xEF,0xF7,0xFB,0xFF,0xFE,0x5F,0xFF,0xFF,
-0xBF,0xCF,0xFB,0xF7,0xDD,0xF7,0xF5,0xFF,
-0x5F,0xD5,0xF5,0xFD,0x7F,0x5F,0xD7,0xF5,
-0xFF,0xFB,0x0F,0xFF,0xFF,0xA9,0xEA,0x7A,
-0xFF,0xAF,0x8F,0xFE,0xDF,0xAF,0xEF,0xFB,
-0xFE,0xFF,0xBF,0xEF,0xFB,0xDF,0xE5,0x5F,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xBD,0x57,0xFF,
-0xFF,0x6F,0x77,0xBF,0xF7,0xFB,0xFF,0x7F,
-0xBF,0xF7,0xFF,0xFC,0xBF,0xFF,0x9F,0xFF,
-0xFF,0xEF,0xFF,0xFE,0xFF,0xFF,0xFF,0x1F,
-0xCF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xFB,
-0x65,0xAF,0xF3,0x7C,0xFF,0x3F,0xDF,0xFF,
-0xFD,0xE9,0xFE,0x7F,0xE7,0xFF,0xFE,0x7F,
-0xFF,0xFF,0xFF,0xFF,0xFD,0xE3,0xDF,0xFB,
-0xDB,0xF6,0xFD,0xEF,0x5B,0xFB,0xFF,0xDF,
-0xFC,0xFF,0x3F,0xDF,0xF3,0xFD,0xFF,0x7F,
-0xDF,0xEF,0x66,0xFF,0xDF,0xAD,0xEB,0x7A,
-0xDE,0xF7,0xF7,0xE7,0xD9,0xFD,0x9F,0x67,
-0xD9,0xF6,0x7D,0x9F,0xE7,0xDF,0xF5,0x47,
-0xFD,0x65,0x5B,0xD6,0xF4,0xFE,0xFF,0xEF,
-0xFF,0x6D,0xF6,0xDD,0xB7,0x6D,0xDB,0x76,
-0xDC,0xB7,0x7D,0xFA,0x9B,0xF6,0x6D,0x9D,
-0x67,0x59,0xDF,0xF7,0xDD,0xFF,0xEB,0xFE,
-0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,0xE3,
-0xD1,0x9F,0xFF,0xBD,0xBF,0xEF,0xFE,0xF7,
-0xBF,0xBF,0xF7,0xD7,0x7F,0xDD,0xF7,0x9D,
-0xDF,0x7F,0xDF,0xF7,0xFF,0xE0,0x7F,0xFD,
-0xC1,0xDF,0xF7,0xFD,0xC7,0x7F,0x7F,0xFB,
-0xFF,0xBB,0xEC,0xFB,0x3E,0xFF,0xBF,0xEC,
-0xFB,0xFF,0xD8,0x7F,0xBF,0x6C,0xFF,0xBE,
-0xFF,0xBF,0xED,0xFF,0xEF,0xFE,0xFB,0xBF,
-0xEF,0xFB,0xFE,0xFF,0xBF,0xEE,0xFF,0xC5,
-0xFF,0xAF,0x6F,0xFF,0xFC,0xFD,0x3F,0xE7,
-0xFF,0xFE,0xFF,0xEF,0xFB,0xFE,0xFF,0xBF,
-0xEF,0xFB,0xFE,0xBF,0x89,0xFE,0xFA,0xBA,
-0xFE,0xBF,0xAF,0xFB,0xF6,0xF5,0xD9,0x7D,
-0x97,0x65,0xD9,0x74,0x5D,0x97,0x65,0xD3,
-0xFE,0xD6,0xFF,0xBF,0xF7,0xFD,0xFF,0x7F,
-0xBF,0xCF,0xFB,0xFE,0xFF,0xEF,0xFB,0xFE,
-0xFF,0xBF,0xEF,0xFB,0xFF,0xF6,0x8F,0xFB,
-0xFF,0xEF,0xFB,0x7E,0xDB,0xFE,0xFF,0xBE,
-0xEF,0xEE,0xFB,0xBE,0xEF,0xBB,0xEE,0xFB,
-0xBE,0xFF,0xFF,0xDF,0xFF,0x43,0xFF,0xFF,
-0xFB,0xEF,0x5F,0xB7,0xFE,0x7F,0xE7,0xF9,
-0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0xF9,
-0xBF,0xFE,0xAF,0x77,0xFD,0xFF,0x2F,0xAF,
-0xA7,0xFE,0xFF,0xEF,0xFB,0xFE,0xFF,0xBF,
-0xEF,0xFB,0xFE,0xFF,0xF1,0x7F,0xEF,0xDF,
-0xFF,0x97,0xF5,0xEF,0xFF,0xDF,0xFF,0xFF,
-0xBF,0xFF,0xBF,0xFF,0xFF,0xFE,0xFF,0xFF,
-0xFF,0xE0,0xFF,0xFF,0xF9,0xFE,0x2F,0x8B,
-0xE3,0xF8,0xBE,0x77,0x9F,0xF9,0xDA,0x77,
-0x9D,0xE7,0x79,0xDE,0x77,0x9F,0xDD,0xFF,
-0xFD,0xFD,0x7F,0x5F,0xD7,0xFD,0xFF,0x7F,
-0xE7,0xFE,0x7F,0x97,0xE7,0xFB,0xFE,0xFF,
-0xBF,0xEF,0xFF,0xAB,0xFF,0xEF,0xFA,0xFE,
-0xBF,0xAF,0xFF,0xFA,0xFF,0xFF,0xDF,0xFF,
-0xFB,0xFF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF,
-0x67,0xFF,0xF7,0xF5,0xFF,0xFF,0xFF,0xDF,
-0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xBD,
-0xEB,0xFF,0xFF,0xF7,0xAD,0xEB,0xFF,0xDF,
-0xFD,0xFF,0x3F,0xDF,0xF7,0xFD,0xFF,0x7F,
-0xDF,0xFF,0x5F,0xFF,0xF7,0xFF,0xFF,0xFD,
-0xBF,0xFF,0xCB,0xF4,0xFF,0x7F,0xD3,0xF7,
-0xFD,0x3F,0x7F,0xD3,0xF7,0xFF,0xFC,0x3F,
-0xFF,0xEA,0xFA,0xBE,0xAF,0xAB,0xEB,0xBA,
-0xF4,0x95,0x6B,0x52,0xD4,0xAD,0x2F,0x4A,
-0xD2,0xF6,0xBF,0xD2,0x7F,0xF7,0x3F,0xFF,
-0xFF,0xF3,0x7F,0xFF,0xFF,0xF7,0xFF,0xBA,
-0xDF,0xFB,0xFD,0xFF,0xBF,0xFF,0xFB,0xFF,
-0xF8,0x7F,0xEA,0xFF,0xFE,0xFE,0xDF,0xFF,
-0xF7,0xFF,0x7F,0xBB,0xFF,0xFF,0xBF,0xDF,
-0xFB,0xFF,0xFF,0xBF,0xFF,0xB1,0x7F,0xFF,
-0xFB,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,
-0xCF,0xFE,0xFF,0xFF,0xEF,0xFF,0xF7,0xFF,
-0xFF,0xFF,0xF1,0xFF,0x69,0xBE,0xFA,0xBF,
-0xAF,0xE2,0xFF,0xFE,0xFD,0xAF,0xF3,0xFE,
-0xFF,0xBF,0xEF,0xFB,0xFC,0xFF,0xFF,0x07,
-0xFD,0x95,0xDB,0xDF,0x7F,0xDF,0xAF,0xFF,
-0xF7,0xAF,0x36,0xFE,0xBF,0x65,0xEB,0xF6,
-0xFE,0x9F,0x6F,0xFE,0x07,0xFF,0xCF,0xFF,
-0xF8,0xFE,0xFF,0xCF,0xFF,0xF6,0xFA,0xE7,
-0xFB,0xFE,0xFF,0xBB,0xED,0xF9,0xFF,0xFF,
-0xFF,0x5F,0xFF,0xFF,0xFF,0x75,0xFF,0xEF,
-0x7E,0xFD,0xE0,0xE8,0x5E,0xD3,0xE5,0xF9,
-0x3E,0x5F,0xD7,0xF7,0xFF,0xFA,0x2F,0xFB,
-0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0x7F,
-0x7F,0xD7,0xF5,0x7D,0x5F,0x57,0xD5,0xF5,
-0xEF,0xFF,0xF3,0x7F,0xFC,0x7F,0xFF,0xC7,
-0xF1,0xFF,0xFF,0x1F,0xCF,0xB0,0xFF,0x3F,
-0xCF,0xF3,0xFC,0xFF,0x3F,0xCE,0xFF,0xE4,
-0xFF,0xDF,0x7F,0xFE,0xF7,0xBB,0xFF,0xFF,
-0xDF,0xEF,0xEE,0xFF,0xBF,0xEF,0xFB,0xFE,
-0xBF,0xBF,0xEF,0xFF,0xD1,0xFF,0xFF,0xFF,
-0xFD,0xFB,0xFF,0xFD,0xFF,0xFB,0x9F,0xE9,
-0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0xBF,
-0xFF,0xB3,0xFF,0xFF,0xF7,0xFF,0xFF,0xAF,
-0xF7,0xFF,0xB6,0x3F,0xEB,0xFA,0xFE,0xBF,
-0xAF,0xEB,0xFA,0xFE,0xBF,0xFE,0xA7,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,
-0xFE,0x9F,0xF7,0xF9,0xFF,0x7F,0x9F,0xE7,
-0xFF,0xFF,0xFE,0xAF,0x6F,0xFF,0xFF,0xFF,
-0x9F,0xFF,0xDF,0xFF,0x7D,0x5F,0xDD,0xFF,
-0xFB,0xBF,0xE7,0xBB,0xFF,0xFB,0xDF,0x6D,
-0x5F,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xEB,0xF7,0xFF,0xE7,0xEF,0xF7,0xFF,0xFF,
-0x7F,0xFF,0xF7,0xFF,0xFC,0x8F,0xFF,0xEF,
-0xFD,0xFE,0xFF,0xBE,0xF4,0xF2,0x7D,0xD7,
-0xCF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xCF,0x6B,0xFF,0xBF,0x3F,0xFB,0xF2,
-0xFC,0x7F,0xEB,0xFF,0x9F,0xFA,0xFF,0xFF,
-0x3F,0xFF,0xF3,0xFF,0xFF,0xFD,0x70,0xF7,
-0xFF,0xFF,0xBF,0xFF,0xFB,0xD7,0xFE,0xF5,
-0x77,0xFF,0x15,0xDD,0x77,0xFD,0xFF,0x7F,
-0xDF,0xF7,0xFB,0xCD,0xBF,0xFF,0xFD,0xFF,
-0xFF,0xDF,0x37,0xCD,0xF9,0xEC,0xFE,0xEF,
-0xBB,0xF4,0xFB,0x3F,0x4F,0xB3,0xFF,0xFD,
-0xCB,0xFF,0xE9,0x7E,0x54,0x9F,0xE5,0x4B,
-0xB7,0xFF,0xDD,0x7D,0xC7,0x71,0xDD,0x77,
-0x5D,0xD7,0x75,0xCD,0x7F,0xD6,0xFF,0xD3,
-0xF6,0xF9,0x3F,0x6D,0x95,0xAF,0x7F,0xFE,
-0xFF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,
-0xFE,0xF6,0xC7,0xFF,0xAD,0x7B,0xCA,0xFF,
-0xBF,0xBF,0xEF,0xFD,0xE3,0xDF,0xB7,0xED,
-0xFB,0x7E,0xDF,0x37,0xED,0xE3,0xFB,0xDF,
-0xFF,0x52,0x5C,0x15,0xFD,0xCF,0x7F,0xDF,
-0xFE,0xEF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEC,
-0x7B,0xFE,0xFF,0xFE,0x3E,0x7F,0xDA,0xF7,
-0xFD,0xFF,0x7F,0xFF,0xFF,0xFB,0xEF,0xBB,
-0x6F,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFF,
-0xF7,0x7D,0xFF,0xD8,0xFF,0xFD,0xBF,0x7F,
-0xFB,0xFF,0xFF,0x9F,0xFB,0xFE,0x7F,0x9F,
-0xE7,0xF9,0xFE,0x7F,0x9F,0xEA,0x7F,0xF6,
-0xBF,0xBD,0x6A,0x5A,0xF6,0xE5,0xBF,0x77,
-0x5F,0x6D,0xDD,0x77,0x5D,0xD7,0x75,0xDD,
-0x77,0xFF,0xA5,0xBF,0xCF,0xFB,0xFF,0xFF,
-0xBF,0xCF,0xFB,0xFD,0xFF,0xBF,0xF3,0xFE,
-0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFD,0xAB,
-0xFF,0xBF,0xBF,0xFF,0xFB,0xFF,0x7F,0xEF,
-0xFF,0xBE,0xFB,0xEE,0xFB,0xBE,0xEF,0xBB,
-0xEE,0xFB,0xBF,0xFF,0xB5,0xFF,0xD0,0xBC,
-0xFD,0x2F,0x4B,0xF7,0xFF,0xFF,0x9F,0xF9,
-0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x9F,
-0xFA,0x8F,0xFD,0xAB,0xFA,0xDA,0xBF,0xAF,
-0xB3,0xFD,0xFF,0xBF,0xFB,0xFE,0xFF,0xBF,
-0xEF,0xFB,0xFE,0xF7,0xBF,0xFF,0x9F,0xFF,
-0x77,0xF7,0xBD,0xFD,0x77,0xDF,0xFF,0x7E,
-0xDF,0xED,0xBB,0xFE,0xFF,0xBE,0xEF,0xFB,
-0xFE,0xFF,0xFA,0x3F,0xFF,0xBE,0x6F,0x8F,
-0xE6,0xF9,0xFE,0x7F,0x9F,0xC7,0xFE,0x7F,
-0x9F,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7,0xFB,
-0x7F,0xFF,0x7F,0xCF,0xFF,0xFD,0xFF,0xFF,
-0xDF,0xFB,0xAF,0xBF,0xEF,0xFF,0xFE,0xFF,
-0x9F,0xEF,0xFB,0xFF,0xFC,0xFF,0xFB,0xFE,
-0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xF7,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xF5,0xFF,0xFF,0xFF,0x3F,0xDF,0xF7,
-0xFF,0xFF,0x7F,0xEF,0xFE,0xFF,0xBF,0xFF,
-0xFB,0xFF,0xFF,0xBF,0xEF,0xFF,0xB3,0x7F,
-0xFF,0x7B,0x5E,0xF7,0xFD,0xFF,0x7B,0x7F,
-0xF7,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F,
-0xDF,0xF7,0xFF,0x17,0xFF,0xFF,0xFF,0x7F,
-0xFF,0xFF,0xDD,0xF6,0xFC,0xBF,0xCB,0xF2,
-0xBC,0xBF,0x2F,0xCB,0xF2,0xFC,0xBF,0xFE,
-0x8F,0xFF,0xFA,0x7E,0xBF,0xA7,0xEB,0xDA,
-0xFC,0xBF,0xAF,0x7A,0xFE,0xBF,0xAF,0xEA,
-0xFA,0xFE,0xBF,0xAF,0xF4,0xDF,0xFE,0xFF,
-0xF3,0x3C,0x7F,0x3E,0xFF,0xCF,0xF8,0xBF,
-0x8F,0xE3,0xF8,0xFE,0x3F,0x8F,0xE7,0xE8,
-0xFF,0xFC,0x9F,0xFF,0xFF,0xCF,0xEB,0xB3,
-0xE7,0xFB,0x7B,0xF3,0xFE,0xFF,0xCF,0xDB,
-0xFB,0xFB,0xBF,0x6F,0x6F,0xDF,0xEC,0x7F,
-0xFF,0xFF,0xF7,0xFD,0xFD,0xFF,0xFF,0xFF,
-0xFF,0xB2,0xBF,0xFF,0xDE,0xFD,0xBD,0xEF,
-0xFB,0xF6,0xDF,0xEA,0xE7,0xDB,0xFE,0xBB,
-0xFF,0xEB,0xFB,0xBF,0x9F,0x8F,0xE8,0xFE,
-0x3F,0x8F,0xA3,0xF8,0xFE,0x3F,0x8F,0xFF,
-0xF8,0x7E,0xFD,0xFD,0x7F,0xFF,0xFB,0xCD,
-0xFF,0xFD,0xFF,0x5F,0xEF,0xFD,0xFF,0xFF,
-0xDF,0xF7,0xFD,0xFF,0xBE,0x90,0xFF,0xFF,
-0xEE,0xFF,0x3F,0xBF,0xF3,0xBB,0xFE,0xB7,
-0xAB,0xFA,0xFE,0xAF,0xAD,0xEA,0xFA,0xDE,
-0xAB,0xFF,0x63,0xFF,0xFE,0xF2,0xFF,0xB3,
-0xFF,0xDF,0xEE,0x7D,0xFF,0x03,0xF1,0xF4,
-0x3F,0x1F,0xC3,0xF1,0xEC,0x7F,0xFE,0x6F,
-0xFF,0xFB,0xFB,0xFF,0x9F,0xFF,0xBF,0xFF,
-0x7B,0x5F,0xFD,0xFF,0xDF,0xF7,0xFD,0xFD,
-0x7F,0x7F,0xDF,0xFE,0xCF,0xFB,0xFF,0xFF,
-0xAF,0xFB,0xFF,0x1F,0xEF,0xA5,0xFD,0xBF,
-0xDF,0xFB,0x7D,0xFF,0xBF,0xDF,0xFB,0xFF,
-0xFD,0x3B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,
-0xAF,0xF3,0xFF,0xFB,0x7F,0xBF,0xD7,0xFB,
-0xBF,0x7F,0xBB,0xF7,0xFF,0xF8,0x7F,0xFF,
-0xFA,0x5F,0xD7,0xFF,0xDF,0x7F,0xEF,0xFF,
-0xFF,0x7F,0xDB,0xF7,0xFD,0xFF,0x7F,0xDF,
-0xB7,0xFB,0xEC,0xFF,0xFF,0xF7,0xBF,0xEF,
-0xFD,0xFC,0xFB,0xFF,0xEF,0xF0,0xFE,0x3F,
-0x8F,0xE3,0xF8,0xFE,0x3F,0x8F,0xEF,0x8D,
-0xFF,0xFF,0xEF,0x7F,0xBF,0xFF,0xFB,0xFF,
-0xDB,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xEF,0xD8,0xFF,0x2E,0x7F,
-0xBE,0xEF,0xFE,0x6E,0xFF,0xBF,0xF9,0xFF,
-0xFF,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFC,0x66,0xBE,0x47,0xF3,0x7F,0xDF,0xFE,
-0x87,0x9F,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xD6,0x6F,0x7C,
-0xFB,0x4F,0xD2,0xFF,0xFD,0x2B,0xFE,0xFF,
-0xFF,0xFD,0x5F,0xD7,0xD5,0xF5,0x7D,0xFF,
-0xFF,0xFF,0xBF,0x9B,0xFF,0xFF,0xDF,0xB7,
-0xFF,0xFF,0xDF,0xFF,0x3F,0xCF,0xFE,0x7F,
-0xBF,0xEF,0xFB,0xFC,0xFF,0x3F,0xFF,0xD9,
-0xBF,0xFE,0x97,0xEC,0x8F,0xB7,0xFE,0x9B,
-0x7D,0xFD,0xB7,0xDD,0x77,0x1D,0xC7,0x71,
-0xDD,0x77,0x5D,0xD7,0xF3,0x6F,0xFD,0x3F,
-0x73,0xDD,0xAF,0xFD,0x7A,0xFF,0xFF,0xAF,
-0xFE,0xFD,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,
-0xEF,0x66,0x7F,0xFF,0xFF,0xBF,0xBF,0xFF,
-0xFB,0xFF,0xF7,0xDF,0xFD,0xFB,0x7D,0xDF,
-0xB7,0xCD,0xF3,0x7C,0x5F,0x3F,0x91,0x3F,
-0xFF,0x3D,0xEF,0x7B,0xFF,0xFC,0xFF,0xCA,
-0xEF,0xFE,0xFF,0xBD,0xEF,0xFB,0x1E,0xE7,
-0xBB,0xEC,0x7F,0xB3,0xFF,0xFD,0x9F,0xFF,
-0xFF,0xFE,0xFF,0xFF,0x7F,0xBF,0xFB,0xFE,
-0xFF,0xBF,0xEF,0xFB,0xEE,0xFB,0xBF,0xDF,
-0x67,0xFF,0xFF,0xBF,0xEF,0xDB,0xFF,0xBC,
-0xFE,0x7F,0xFB,0xFF,0x9F,0xEF,0xF9,0xFE,
-0x7F,0x9F,0xE7,0xF9,0xFE,0x87,0xFF,0xEE,
-0xFB,0xBE,0xE5,0xBF,0xEF,0xF9,0xD7,0x65,
-0xF7,0xDD,0xE7,0x7D,0xDF,0x77,0x5D,0xD7,
-0x7F,0xF8,0x9B,0xFE,0xFF,0xBF,0xEF,0xFB,
-0xFF,0xFF,0xBF,0xEF,0xFB,0xFF,0x7F,0xCF,
-0xF3,0xFC,0xFF,0xBF,0xEF,0xFF,0xDB,0x3F,
-0xEF,0xFB,0xFE,0xFF,0xDF,0xFF,0xFE,0xFB,
-0xBB,0xEF,0xBF,0xEF,0xBB,0xEE,0xFB,0xBE,
-0xEF,0xBB,0xFF,0xFC,0x7F,0xFD,0x3B,0x5B,
-0xD6,0xE5,0xFD,0x4F,0xC3,0xFB,0xFF,0xBF,
-0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFF,
-0xB4,0xFF,0xFA,0xBC,0x8F,0xB2,0xE9,0xD2,
-0x2E,0xCF,0xFB,0xFF,0xBF,0xEF,0xFB,0xFE,
-0xFF,0xBF,0xEF,0xFB,0xFF,0xEC,0xFF,0xFD,
-0xFD,0x7F,0xDF,0xF7,0xE4,0xDF,0x5F,0xFF,
-0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xC3,0xFF,0xEF,0xE6,0xF8,0xFE,
-0x3F,0x8B,0x83,0xF9,0xFE,0x7F,0xE7,0xF9,
-0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x17,
-0xFD,0xFF,0xFF,0xFF,0x7F,0x5F,0xF7,0x2C,
-0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xE7,0xF9,
-0xFE,0x7F,0x9F,0xFE,0x2F,0xFF,0xFF,0xEF,
-0xFF,0xFE,0xBF,0xEF,0xAD,0xFF,0xFF,0x7F,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFE,0xDF,0xFF,0xDF,0xFF,0xFD,0xFD,0x7F,
-0xDF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFA,0x3F,0xFE,
-0xF7,0xFD,0xEF,0x7A,0xFF,0xB1,0xBD,0xFF,
-0x7F,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,
-0xFF,0x7F,0xF3,0x27,0xFF,0xDF,0xFF,0xDD,
-0xFF,0xFC,0x9B,0xFF,0xCB,0xFC,0xBF,0x2F,
-0xCB,0xF2,0xFC,0xBF,0x2F,0xC9,0xFF,0xDE,
-0xFF,0xDF,0xAF,0xEB,0xDA,0xFE,0xBB,0xAF,
-0xEB,0xF8,0xF7,0xAF,0xE8,0xFA,0xFE,0xBF,
-0xAF,0xEB,0xF2,0xFF,0xFD,0xFF,0xFF,0xEF,
-0xBD,0xD7,0xBF,0xFF,0xFF,0xDE,0x8F,0xB8,
-0xDE,0x37,0x8D,0xA3,0x78,0xDA,0x3F,0x8F,
-0xFF,0xA1,0xFF,0xFF,0xFB,0xFB,0xFF,0xFF,
-0xFF,0xFF,0xA7,0xBD,0xFB,0x76,0xFD,0xBF,
-0xEF,0xDB,0xFE,0xBB,0xBF,0xFE,0x27,0x7F,
-0xFF,0xFE,0xFE,0xFD,0xF5,0xFF,0xEF,0xF5,
-0xDF,0x1F,0xE7,0xFD,0xFF,0x7F,0xDF,0xF7,
-0xFD,0xFF,0xFF,0xCD,0xFD,0xAE,0xFF,0xFA,
-0x3E,0x3F,0xAB,0xFD,0xF8,0x7E,0x8F,0xE3,
-0xF8,0xFE,0x3E,0x8F,0xE3,0xF8,0xFF,0xFE,
-0x1F,0xEF,0xDF,0xBF,0xFE,0xDE,0xDF,0xD9,
-0xFF,0xDF,0xBC,0xFF,0xFF,0x7F,0xFF,0xEF,
-0xFD,0x7F,0xDF,0xF7,0xF9,0x3F,0xFE,0xFF,
-0xFF,0x6F,0xFE,0xDE,0xBF,0xF7,0xED,0xEA,
-0xFD,0x8F,0x83,0xF8,0xEA,0x3F,0x8F,0xEF,
-0xFF,0xF4,0x7F,0xFF,0xEF,0xEF,0x7B,0xF3,
-0xF1,0x5F,0xFF,0xFF,0xF1,0x3B,0x7F,0xDF,
-0xF7,0xFD,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,
-0xFF,0xFF,0xF7,0xFF,0x6F,0xFF,0x7F,0xFF,
-0xFF,0xF7,0xDE,0xF7,0xBF,0xEF,0xFB,0xF7,
-0xFD,0xFF,0xFF,0xF5,0xFA,0xFF,0xFF,0xFB,
-0xE7,0xFF,0xF3,0xF8,0x7F,0xF3,0xDF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xEF,
-0xBB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,
-0xFF,0x7F,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xCF,0xFF,0x37,0xFF,0xFF,
-0x7F,0xDF,0x77,0x5D,0xE7,0xFC,0xFF,0xBF,
-0xF7,0xF5,0xFB,0xFF,0xFF,0xD7,0xF5,0xFB,
-0xFF,0xFF,0x45,0xFD,0x7F,0xEA,0xFD,0xBE,
-0xBF,0xDF,0xF7,0xFF,0xFF,0xDB,0xFB,0xFE,
-0xFF,0xBF,0xEF,0xFF,0xFF,0xFF,0xFB,0x5F,
-0x7F,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFE,0xFF,0xEF,0xFD,0xFF,0x7F,0xDF,
-0xFF,0xEF,0xFB,0xF8,0x0F,0xF3,0xFF,0xF9,
-0x2E,0xFB,0xFE,0xFC,0xF3,0xEF,0xFF,0xFF,
-0xBF,0xFF,0xFB,0xE7,0xFF,0xFE,0x7E,0xFF,
-0xC0,0x6B,0xCF,0xFF,0x34,0xDF,0xF1,0xFD,
-0xFF,0xEF,0xFF,0xFF,0xFF,0xDF,0xF7,0xFD,
-0xCF,0x7F,0x9C,0xFD,0xFD,0x6C,0xF7,0xFF,
-0xF6,0xFD,0xEB,0x2B,0x9F,0xFF,0xFC,0xFE,
-0x7E,0xFF,0xFF,0xFF,0xFF,0xD7,0xF3,0xF7,
-0xFF,0xFB,0xE1,0xBF,0xFF,0xEB,0x7A,0xDE,
-0xD7,0xFB,0xFF,0xF9,0xFE,0xFF,0xFF,0xF3,
-0xDE,0x7F,0xFD,0xE7,0x7F,0xFF,0xFD,0xBB,
-0xFF,0xFF,0x7E,0xCC,0xF6,0xAF,0x5F,0x7F,
-0xFE,0xF4,0x7D,0xF7,0xFD,0xBB,0x6E,0xDB,
-0xB7,0xFF,0xF7,0xDF,0x66,0xFF,0xFF,0xF7,
-0x3D,0xCF,0xDE,0xBD,0xFF,0xFF,0xDE,0xDB,
-0x8D,0xF7,0x7E,0xDF,0xB7,0xEF,0x7F,0xFF,
-0xF6,0x87,0xFF,0xFF,0xEF,0xFE,0xDE,0xBF,
-0xFF,0xFF,0xFF,0xBB,0xEF,0xFD,0xFF,0x7B,
-0xDE,0xF7,0x3F,0xFF,0xBF,0xFB,0xDB,0xFF,
-0xF2,0xB6,0xFD,0xBD,0x7F,0xE7,0xFF,0xFF,
-0xFF,0x6F,0xF7,0xFF,0xFF,0xFF,0xFE,0x77,
-0xFF,0xBF,0xF8,0xAF,0xFF,0xDF,0xBF,0xFF,
-0xBF,0x7F,0xFB,0xFF,0xFF,0xFF,0xDB,0xFE,
-0xFF,0xBF,0xFF,0xFA,0xFF,0xFD,0xFF,0xF6,
-0x7F,0xFF,0x9F,0xFF,0xFF,0x3F,0xEF,0xF8,
-0xEE,0x7E,0x9F,0xBA,0xFE,0xBF,0x8F,0xEF,
-0xFE,0xFE,0xF9,0xFF,0xFA,0x7F,0xFE,0x7E,
-0xBF,0xAF,0xFB,0x96,0xFD,0x9F,0xEF,0x5E,
-0x65,0xBE,0xEF,0x5B,0xB6,0xFF,0xBE,0xE3,
-0xFF,0xB5,0xBF,0xFF,0xFD,0xFF,0x7F,0xFF,
-0xEF,0xDF,0xFE,0xFF,0xBF,0xFB,0xFE,0xFF,
-0xBF,0xCF,0xFF,0xFF,0xFF,0xFD,0x9B,0xFF,
-0xFE,0xFB,0xFE,0xDF,0xFF,0x7F,0xFF,0xF7,
-0xFE,0xFF,0xDF,0xFB,0xFB,0xFE,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xB7,0xFE,0xFA,0xFF,0xAB,
-0xEF,0xFF,0xFD,0xB5,0x7B,0x7F,0xFB,0xF7,
-0xFD,0xFF,0xFF,0xDD,0xFF,0xEF,0x8F,0xFF,
-0x2F,0xFF,0xFB,0x7C,0xFF,0x3F,0xDF,0x73,
-0xEB,0xFE,0x3F,0xFF,0xEF,0xFB,0xFE,0xFF,
-0xEF,0xFD,0xFF,0xBF,0xFD,0x0F,0xFF,0xFF,
-0xFF,0xF5,0xF9,0xFF,0x7F,0xD7,0xFD,0xFF,
-0xDF,0xFF,0xF7,0xFB,0xFF,0x7F,0xBF,0xFF,
-0xFF,0xF0,0x9F,0xFF,0xFE,0x7F,0x8B,0xE3,
-0xF9,0xDE,0x27,0x9B,0xE6,0xBE,0x7F,0x9B,
-0xC3,0xF8,0xDE,0x7F,0x9D,0xE7,0xFE,0x7F,
-0xFF,0xFF,0x5F,0xD7,0xFF,0xFF,0xFF,0x4F,
-0xFB,0xFF,0xFF,0x7F,0xFF,0xAF,0xFF,0x9F,
-0x7F,0xFB,0xFF,0xE8,0xFF,0xFF,0xFE,0xBF,
-0xAF,0xFF,0xFF,0xFE,0xBF,0xEF,0xF7,0xFF,
-0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,
-0xFC,0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xFF,
-0xFD,0x3F,0xCF,0xFF,0xFF,0xFF,0xFF,0xF7,
-0xFF,0xFD,0x7F,0xFF,0xFF,0x93,0xFF,0xFF,
-0x7A,0xDF,0xF7,0xFF,0xFF,0x7B,0x7F,0xB7,
-0xEF,0xFF,0xFF,0xFD,0xBF,0xFD,0xFB,0xFF,
-0xF7,0xFF,0xD7,0xFF,0xFF,0xFF,0xFC,0x9F,
-0x6F,0xCB,0xFF,0xF4,0xBB,0xDF,0xD6,0xFD,
-0xBF,0x2F,0xD3,0xF7,0xFF,0xDF,0xFF,0xCF,
-0xFF,0xFA,0xBE,0xBD,0xAF,0x6A,0xDA,0xBE,
-0xBB,0xAB,0x3A,0xBE,0x2D,0xAE,0xEB,0xDA,
-0xF6,0x3F,0xAD,0xF5,0xDD,0xFF,0xCF,0xF1,
-0xFF,0xF9,0x7F,0xFF,0x73,0xFE,0xFF,0xCF,
-0xC3,0xF4,0xF7,0x2F,0xF3,0xFF,0xFC,0xFF,
-0x7C,0x1F,0xFF,0x3F,0x4F,0xFF,0x7E,0xFF,
-0xEF,0xBD,0xF6,0xFE,0xFF,0x2B,0xEF,0xDC,
-0xFB,0xFD,0xFF,0xFB,0xFF,0xEA,0x7B,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFB,0xF7,0xDF,0xFF,
-0xE3,0x7D,0xFF,0xB7,0xFF,0xBF,0xFF,0xFF,
-0xDF,0xFF,0xF8,0xFF,0xBF,0xFF,0xBF,0xEB,
-0xE7,0xFA,0xFE,0x3D,0xBF,0xE9,0xFC,0xBF,
-0xFF,0xFA,0xFB,0xFE,0xFF,0xFF,0xFF,0xD9,
-0xFF,0xFF,0xFF,0xF6,0x7F,0xFF,0xF6,0x7D,
-0xFF,0xDF,0xCF,0xFD,0xBF,0xFB,0xEF,0x7E,
-0xFF,0x7F,0xFF,0xFF,0xD3,0xFF,0xFD,0xFB,
-0xFF,0xFB,0xFF,0xFF,0xFF,0xEF,0xFF,0xBF,
-0xFE,0xFF,0xF7,0xEF,0xFF,0xFF,0xFF,0xFB,
-0xFF,0x87,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,
-0x7B,0xFE,0xFF,0xFE,0x3B,0xF7,0xF7,0xFF,
-0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,
-0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7,
-0xFF,0xFF,0xAD,0xFF,0xFE,0xF7,0xFF,0xFF,
-0x5F,0xFF,0xFF,0xDF,0xFF,0xFD,0xFF,0xF5,
-0xFF,0xDF,0xFF,0xBD,0xFF,0xE9,0xFF,0xC7,
-0xF3,0xFF,0xFF,0xF7,0xFF,0xF3,0xFF,0xF8,
-0x3B,0xFF,0xFF,0x7B,0xDF,0xBF,0xFB,0xEF,
-0xFB,0xFF,0xFB,0xF7,0xF7,0xBB,0xFF,0xFF,
-0xFF,0xFF,0xFB,0xFF,0xFE,0x7F,0xF3,0x7F,
-0x5E,0xB7,0xBF,0xFD,0x7F,0xFF,0xF9,0x7F,
-0xFB,0xFF,0xEB,0xFD,0x7F,0x7F,0xFF,0xEF,
-0xFB,0xE0,0x3F,0xFE,0xBF,0xBF,0xDF,0xFF,
-0x7E,0xFF,0xF7,0xFF,0xFF,0xFE,0xBF,0xFF,
-0xDB,0x78,0xFF,0xFF,0xFF,0xEE,0xA1,0xBF,
-0xF5,0xDE,0xFB,0xF7,0xFF,0xFB,0xFF,0xFF,
-0xFF,0xFF,0xFB,0xFF,0xFF,0xD7,0xFF,0xFF,
-0xFF,0xFF,0xEF,0xF0,0xFF,0xFF,0xFF,0xF3,
-0xF7,0xFF,0xEF,0xFF,0xE7,0xCF,0xFF,0xFB,
-0xFF,0xEF,0xFF,0xFF,0x9F,0x9F,0xEF,0xFC,
-0x16,0xBF,0xFE,0xF3,0xE4,0xFF,0xFF,0xC6,
-0xFF,0xE7,0xFF,0xFF,0xFD,0xFF,0xBF,0xFF,
-0xFF,0x3F,0xFF,0xBF,0xD6,0xAF,0x7F,0xFE,
-0x6B,0x7E,0x7F,0xFF,0xAF,0xFF,0xFF,0xBF,
-0xFF,0x5F,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,
-0xFF,0xBD,0xDB,0xFF,0xFE,0x5F,0xF2,0xFF,
-0xFF,0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xEF,0x7F,0xFF,0xFF,0xFF,0xFF,0xDE,0xBF,
-0xFF,0xFF,0xEF,0xFB,0x77,0xFE,0xBD,0x7F,
-0x5F,0xFF,0xFF,0xFF,0xDF,0x6F,0xED,0xFF,
-0xFD,0xFF,0x7F,0xFD,0x6F,0xFF,0xFF,0x77,
-0xDA,0xCF,0xFD,0x5F,0xFF,0xBF,0xFF,0xFF,
-0xDF,0x7F,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,
-0x66,0x7F,0xFF,0xFE,0xBF,0xE7,0xBF,0xFA,
-0xFF,0xFE,0xFF,0xFF,0xFF,0xDF,0xFF,0x59,
-0xEF,0xFF,0xEF,0xFB,0x7F,0x89,0xFF,0xFF,
-0xE9,0xFF,0x6F,0xFF,0xF5,0xFF,0xFF,0xFF,
-0xFF,0xFF,0x7F,0xF2,0xF7,0xFF,0xFF,0xEF,
-0xF8,0x7F,0xFB,0xFF,0xFD,0xFF,0xFF,0xD9,
-0xFF,0xEF,0xBB,0xFF,0xFF,0xFF,0xBF,0xEF,
-0xDE,0xFF,0xFF,0x9F,0x7F,0xDF,0xFF,0xF7,
-0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xAF,
-0xFF,0xFF,0xF7,0x3F,0xEB,0x9F,0xFE,0x7F,
-0x9E,0x7F,0x9F,0xFE,0x87,0xFF,0xED,0xDB,
-0x56,0xFF,0xBF,0xAF,0x0B,0xD2,0xFF,0xEF,
-0xDB,0x6E,0x7D,0xBD,0x6F,0xF8,0xFE,0x3F,
-0xFA,0x5B,0xFF,0xFD,0xBF,0xEF,0xFF,0xBF,
-0x6F,0xDB,0xE6,0xFF,0xFF,0x3F,0xFF,0xDF,
-0xFE,0xFF,0xFF,0xFF,0xFF,0xDA,0x3F,0xFF,
-0xFB,0xFE,0xFE,0xFF,0xFF,0xDF,0xF7,0xBD,
-0xFF,0xFD,0xFF,0xFE,0xFF,0xFB,0xFF,0xFF,
-0xFF,0xFF,0xF1,0x5F,0xFD,0x9F,0xDF,0xFD,
-0xFF,0xFD,0x7F,0xFF,0xFF,0xFF,0xFF,0x76,
-0xFA,0xFF,0xFF,0x7F,0xE3,0xF8,0xFF,0xAE,
-0xFF,0xFB,0x7E,0x9D,0x73,0xFF,0xFA,0x7F,
-0xDF,0xFF,0xFF,0x7F,0xFF,0xFB,0xCD,0xFF,
-0x7F,0xEF,0xFB,0xFF,0xFD,0xFF,0xF7,0x7F,
-0x7F,0xEF,0xFF,0xED,0xFF,0xFF,0xFF,0xB5,
-0xFF,0xBF,0xFF,0xBF,0xFD,0xEF,0xDB,0xF7,
-0xFF,0x93,0xFF,0xEF,0xE2,0xF9,0xBE,0x7F,
-0x8B,0xE7,0xF9,0xFE,0x6B,0xE7,0xF9,0xFE,
-0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x47,0xFF,
-0xFF,0xFD,0xFF,0x9F,0xFF,0xD7,0xFF,0xFF,
-0xFF,0xFF,0xF5,0xFF,0x9F,0xFF,0xF7,0xFE,
-0xFF,0xBF,0xFE,0x6F,0xFF,0xFF,0xFB,0xFF,
-0xFF,0xFF,0xAF,0xFF,0xFF,0xFF,0x7F,0xFB,
-0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,
-0xDF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xDF,
-0xFF,0xFF,0xFF,0x5F,0xFF,0xFF,0xFF,0xFF,
-0x5F,0xFB,0xFE,0xFF,0xF8,0x37,0xFF,0xFF,
-0xEF,0xFF,0x7F,0xFE,0xBF,0xFF,0xFF,0xFE,
-0xBF,0xFF,0xFF,0x7F,0xFF,0xBF,0xFD,0xFF,
-0x7F,0xFA,0x7F,0xFF,0xFF,0x6F,0xFF,0xFF,
-0x7D,0xFF,0xCF,0xFF,0xFF,0xFF,0x4F,0xFF,
-0xF2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFA,0xBF,
-0xFF,0xAE,0xEB,0xFA,0xFE,0xBB,0xAD,0xEB,
-0xFA,0xF7,0xAF,0x6B,0xFA,0xF6,0xBF,0x25,
-0xE9,0xF2,0x7F,0x45,0xFF,0xFF,0xFD,0xF7,
-0xF7,0xBF,0xFF,0xDF,0xFF,0xFF,0xBF,0xFB,
-0xFF,0xDF,0xF3,0xFF,0xF7,0x3F,0xCF,0xFF,
-0xA1,0xFF,0xFF,0xBF,0xE7,0xFF,0xFF,0x7F,
-0xFF,0x3D,0xFF,0xFF,0xFF,0xF7,0xFF,0x2F,
-0xFF,0xFB,0xF5,0x7F,0xFE,0x57,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,
-0x3F,0xFF,0xFE,0xFF,0xFF,0xFF,0xFD,0xFE,
-0xF7,0xEE,0xAF,0xFE,0xEE,0xE7,0xFA,0xFF,
-0xFE,0x9D,0xF9,0x5E,0xFE,0xFF,0xEB,0xFF,
-0xFF,0xDF,0xA7,0xFF,0xFF,0xFF,0xFC,0xDB,
-0xFF,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,
-0xFB,0xFD,0xFF,0xDB,0xFF,0xFF,0xFF,0xEF,
-0xFF,0xFF,0xFF,0xFD,0xBF,0xFE,0xBF,0xFF,
-0x6F,0x7F,0xFF,0xF7,0xFF,0xFF,0xF9,0xFF,
-0xF7,0xFF,0xBF,0xDE,0xF7,0xFF,0xFF,0xFF,
-0xFA,0x7F,0xFD,0xBF,0x5F,0xFF,0xFF,0xBF,
-0xFF,0xED,0xFF,0xF7,0xBF,0xFF,0xFF,0xEF,
-0xFF,0xDF,0xFF,0xFF,0xFF,0xE6,0xFF,0xFB,
-0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,
-0xFD,0xFF,0xF5,0xFF,0xF6,0x7F,0xDF,0xBD,
-0xCF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,
-0xFF,0xF9,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3,
-0xFF,0xEE,0xBF,0xFF,0x7D,0xEF,0xFE,0xFF,
-0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFE,
-0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xB5,0xAE,
-0xFF,0xFF,0xB6,0xFE,0xBF,0xFF,0xFF,0xBF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0x27,0xFF,0xEF,0xFE,0x7F,0xDF,0xFF,
-0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFD,0xFF,0xF7,0xF9,0x9F,0xFF,
-0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
-0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0x0F,0xFF,0xE7,0xBF,0xFE,
-0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFC,0xBF,
-0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xC4,
-0x6B,0xFF,0x29,0x1F,0xFB,0xAF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xEF,0x1B,0xFE,0xFF,0xFC,
-0x6F,0xFF,0xFF,0xFD,0x6A,0xF7,0xD7,0xF5,
-0xBF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFE,0xBF,0xFF,0xFF,0xFA,0xFF,0xFF,0xF7,
-0xFB,0xDD,0xBF,0xFF,0xE7,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0x7F,0xFF,
-0xFF,0xF5,0xFF,0xFF,0xF7,0xFD,0xB3,0xEF,
-0xFD,0x7E,0x5D,0xFF,0xFD,0xFF,0xFF,0xFF,
-0xFD,0x7F,0xD2,0xF5,0xFB,0x7E,0xCB,0xB7,
-0xFF,0xFF,0xFF,0xC6,0xFF,0xFD,0xEE,0x63,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xFD,0x65,
-0x5B,0xDF,0xFF,0xD5,0xFF,0xFF,0xFF,0xF6,
-0xE7,0xBF,0xF7,0xA9,0xFF,0xFF,0xED,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,0xFF,0xFF,
-0xAF,0xFF,0xFF,0xFF,0xF8,0x1B,0xFF,0xE3,
-0xD0,0xBF,0xFF,0xE1,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xD7,0xFF,0xFF,0xFF,0x5F,0xFF,0xFF,
-0xFF,0xFF,0xAF,0xFF,0xDB,0x76,0xBF,0xFF,
-0x7F,0xFF,0xBF,0xEF,0xFE,0xFF,0xBF,0xEF,
-0xFB,0xFE,0xFF,0xFF,0xFF,0xBF,0xF2,0x7F,
-0xFF,0x9F,0xFE,0xBD,0xFE,0x7F,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xF7,0x3F,0xEC,0x7F,0xF6,0x95,0xBB,
-0xEF,0xF8,0xFE,0xFC,0xBF,0x2F,0xDA,0xFC,
-0xBF,0x2F,0xCB,0xF2,0xFC,0xBF,0xEF,0xFF,
-0xA9,0xBF,0xCF,0xFB,0xFF,0xFF,0xFF,0xFE,
-0xDD,0xB7,0x6D,0xF6,0xD9,0xB6,0x6D,0x9B,
-0x76,0xD9,0xBF,0xFB,0xFD,0xA3,0xFF,0xBF,
-0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0x7F,0xDF,
-0xFD,0xEF,0x7B,0xDE,0xF7,0xFD,0xEF,0x7F,
-0xFF,0xFF,0x05,0xFF,0xFA,0xFE,0x7F,0xEF,
-0xE3,0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xFF,
-0xFF,0x5F,0xFF,0xFF,0xFD,0x7F,0xFB,0xAF,
-0xFF,0x63,0xC8,0xFF,0xBF,0xEF,0xFF,0xFF,
-0xFA,0x7F,0xFF,0xFF,0xFF,0xFE,0x9F,0xF7,
-0xFF,0xFA,0xBF,0xFE,0x9F,0xFB,0x7F,0xFF,
-0xFF,0xEF,0xD7,0xFF,0xFF,0xF5,0xFF,0xFF,
-0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xBF,0xFF,
-0xF9,0xBF,0xFF,0xBE,0x27,0x9F,0xE7,0xF9,
-0xFE,0x7F,0x8B,0xE7,0xFE,0x7F,0x9F,0xE2,
-0xF9,0xFE,0x7F,0x9F,0xE7,0xF1,0x7F,0xFF,
-0xFF,0xFF,0xFB,0xFE,0xFF,0xFF,0xFF,0xD7,
-0xFF,0xFF,0xFF,0xFF,0xF5,0xFF,0xFF,0xFF,
-0xD7,0xFF,0xFA,0xFF,0xFE,0xFF,0xFF,0xFF,
-0xFD,0xFF,0xFF,0xFF,0xAF,0xF7,0xFF,0xFF,
-0xFF,0xEB,0xFF,0xFF,0xFF,0xAF,0xFF,0xC4,
-0xFF,0xF7,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,
-0xFF,0x5F,0xFF,0xFF,0xFF,0xFF,0xD7,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,0xFB,0x7A,
-0xDF,0xF7,0xFD,0xFF,0xFF,0xFE,0xBF,0xFF,
-0xFF,0x7F,0xFF,0xAF,0xFF,0xFF,0xFF,0xF7,
-0xEF,0xE3,0xFF,0xDD,0xD2,0xFF,0xDF,0xFF,
-0xFF,0xF2,0xFC,0xBF,0xCB,0xF6,0xFD,0xBF,
-0x2F,0xCB,0xFF,0x7F,0xDF,0xDE,0xAF,0xFF,
-0xDA,0xEE,0xBF,0xAF,0xE9,0xFA,0xF4,0xBD,
-0xAF,0x5A,0xAE,0xBB,0xAB,0x6B,0xDA,0xDE,
-0xBF,0xAD,0xD7,0x5E,0xFF,0xFF,0xBF,0xFC,
-0xFF,0xDF,0xFD,0xFF,0xFF,0xFF,0xFF,0xDF,
-0xF7,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFA,
-0x1F,0xFF,0xFE,0xFB,0xEF,0xBF,0xFD,0xFF,
-0xFD,0xBD,0x77,0xFF,0xFF,0xFF,0xFF,0x9D,
-0xEF,0xFF,0xFF,0xFF,0xEF,0x7D,0xFF,0xFB,
-0xFE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,
-0xBF,0xE4,0xFB,0xFF,0xFE,0x3F,0xFE,0xFF,
-0xFF,0xFF,0xFF,0xAF,0xEA,0xFE,0xBF,0xAF,
-0xEB,0xFA,0xFE,0xFF,0xFF,0xFF,0x55,0xF6,
-0xFF,0xFE,0xF7,0xFF,0x7F,0xFF,0xEB,0xF7,
-0x5F,0xC5,0xFD,0x7F,0x5F,0xD7,0xF5,0xFF,
-0x6F,0xFB,0xFF,0x8A,0xFF,0xFF,0xFF,0xFF,
-0xEB,0xFF,0xFF,0xFF,0xFF,0xFB,0xBF,0xBF,
-0xEF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,
-0x77,0xDF,0xFB,0xFF,0xFD,0x7F,0xEF,0xFF,
-0xFF,0xFF,0xBF,0x7F,0xFF,0xDF,0xBF,0xFF,
-0xFB,0xFF,0xFF,0xFF,0xFE,0xEF,0xDF,0xFF,
-0xFE,0xFF,0x9F,0xEF,0x7D,0xFF,0xF7,0xFF,
-0x7F,0xFF,0xFF,0xDF,0xF7,0xFD,0xFF,0xEF,
-0xDF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFB,
-0xFD,0xFF,0xBF,0xDF,0xD1,0xFF,0xF8,0x3B,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0x7E,0xDB,0xFD,0xFF,0x77,0xDB,0xB7,0x7D,
-0xBF,0xFB,0xFF,0xF8,0x7F,0xED,0x7B,0x5E,
-0xFF,0xFE,0xFF,0xFF,0x4F,0xD7,0xFD,0x7F,
-0xDF,0xD7,0xF5,0xFF,0x7F,0xFF,0xFF,0xFF,
-0xF2,0x3F,0xFE,0xFF,0xBF,0xFF,0xFF,0xFF,
-0xFF,0xBF,0xEF,0xFE,0xFF,0x3B,0xEE,0xFF,
-0xFC,0xEF,0xFF,0xFF,0xFF,0x85,0xFF,0xFD,
-0xFE,0xFF,0xF5,0xFF,0xFF,0xFE,0xFF,0xDF,
-0xFB,0xFF,0x5F,0xBF,0xFF,0xFD,0xFF,0xFF,
-0xFF,0xFF,0xA8,0xFF,0xFF,0x9F,0x9E,0xFF,
-0xFF,0xFF,0x7F,0xF3,0xFF,0xFF,0xCF,0xFF,
-0xF7,0xFD,0xFF,0x7F,0xFF,0xFF,0xFC,0x16,
-0xBF,0xCF,0xA3,0xE5,0xEF,0x7F,0xFF,0xF3,
-0xE4,0xFF,0xCF,0x93,0xFC,0xFF,0x3F,0xCF,
-0xFF,0xFF,0xFF,0xD6,0x0F,0x7D,0xBF,0x6E,
-0xFB,0xF4,0xFC,0xAF,0x6D,0xDB,0x77,0xB7,
-0x6D,0xDB,0xF6,0xFD,0xBF,0xFF,0xFF,0xFF,
-0xBF,0x9B,0xFA,0xDE,0xB7,0xB7,0xED,0xF9,
-0x7E,0xB7,0xAC,0xEB,0xD6,0xB3,0xAD,0xEB,
-0x7A,0xDF,0xFF,0xFF,0xFF,0xD8,0xBF,0xFF,
-0xB7,0xED,0x9F,0x6F,0xDD,0xF7,0x68,0xDB,
-0x37,0xB3,0x6C,0xDB,0x36,0xCD,0xB3,0x7F,
-0xFF,0x7F,0xF5,0x6F,0xFD,0xEF,0x79,0x3D,
-0xF7,0x93,0xE4,0x7A,0x9E,0xAD,0xEA,0x7A,
-0x9E,0xF7,0xBD,0xEF,0xFF,0xFF,0xFF,0x76,
-0x7F,0xFB,0xC6,0xFF,0xBB,0xEF,0xDA,0xFE,
-0xFD,0xBF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,
-0xFF,0xFF,0xFB,0xFF,0xA5,0xFF,0xFD,0xAB,
-0x6F,0x78,0xDE,0x17,0x8F,0x79,0xDF,0xFD,
-0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0xFF,0xFB,
-0xFF,0xFB,0xFF,0xEF,0xFB,0xEF,0xFB,0xFE,
-0xFF,0xBB,0xDA,0xF3,0xEF,0x3B,0xCE,0xF3,
-0xBC,0xEF,0x3F,0xCF,0xDF,0xFF,0xB7,0xFF,
-0xFF,0xFF,0xCF,0x73,0xFF,0xBF,0xEF,0xFF,
-0xF3,0xFF,0x3F,0xCF,0xF3,0xFC,0xFF,0x3D,
-0xCF,0x9F,0xFE,0x07,0xFF,0xAF,0xEB,0xFE,
-0xFD,0xBF,0xEF,0xEB,0xFA,0xFF,0xAF,0xEB,
-0xFA,0xFE,0xBF,0xAF,0xFB,0xFE,0x3F,0xFB,
-0x9B,0xFF,0x7F,0xDF,0xFF,0xF3,0xFE,0xFF,
-0xDE,0xF7,0xBF,0x7B,0xDE,0xF7,0xBD,0xEF,
-0x7B,0xFE,0xFF,0xFF,0xDF,0x3F,0xFE,0xFF,
-0xB7,0xFF,0xEF,0xF7,0xFF,0xBF,0xED,0xFE,
-0xDF,0xB7,0xED,0xFB,0x7E,0xDF,0xFF,0xFF,
-0xFF,0xFD,0x5F,0xEF,0xEB,0xFA,0xFE,0xF5,
-0xBF,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFE,0xF8,0xFF,0xA8,0xFF,
-0xFF,0xBF,0xEF,0xFB,0x6A,0xFB,0xB7,0xEF,
-0xFB,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,
-0xEF,0xFB,0xFF,0xE0,0xFF,0xFF,0xFD,0x7F,
-0x5C,0xD7,0x7D,0xDF,0xF3,0x5C,0xF5,0xCD,
-0x73,0x5E,0xD7,0xB5,0xFD,0x7F,0xEF,0xFF,
-0xDB,0xFF,0xFF,0xE2,0xF8,0xBE,0x2F,0x8F,
-0xE7,0xF8,0xBE,0x6B,0xE2,0xF8,0xBE,0x2F,
-0x8B,0xE2,0xF9,0xFE,0x7F,0xE7,0xFF,0xD7,
-0xF5,0xFD,0x7F,0xFF,0xF7,0xF5,0xFD,0x7F,
-0xD7,0xF5,0xFD,0x7F,0x5F,0xD7,0xF5,0xFF,
-0xFF,0xFF,0x8F,0xFF,0xAF,0xEB,0xFA,0xFF,
-0xFF,0xBF,0xEB,0xFA,0xFF,0x2F,0xEB,0xFA,
-0xFE,0xBF,0xAF,0xEB,0xFF,0xFF,0xFE,0x5F,
-0xFF,0x5F,0xFF,0xFF,0xFD,0xFF,0xFF,0xD7,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xBF,0xFE,0xB7,0xFD,
-0xFF,0x7E,0xDF,0xF7,0xAD,0xFF,0x7F,0xF7,
-0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F,
-0xF6,0x7F,0xFF,0xFF,0xFF,0xDB,0xF6,0xFC,
-0xAF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xEC,0xBF,0xFF,
-0xAF,0xEB,0xFA,0xF6,0xAB,0x8F,0xEB,0xFA,
-0xF7,0xA5,0xEB,0xFA,0xBE,0xBF,0xAF,0xEB,
-0xFA,0xFF,0x6D,0xFF,0xFF,0x7F,0xDF,0x33,
-0xDD,0xFF,0x7F,0xFE,0xF7,0xFC,0x7F,0xFB,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA9,
-0xFF,0xFD,0xFF,0xFF,0xFE,0xFF,0xFF,0xDF,
-0xFF,0xFF,0xEF,0xEF,0xFD,0xFF,0x7F,0xFF,
-0xFF,0xFF,0xFF,0xFE,0xA7,0xFF,0xFF,0xFF,
-0x77,0xDF,0xF7,0xFD,0x9F,0x7F,0xFE,0x77,
-0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xAF,0xBF,0xAF,0xFF,0xF9,0xBE,0xBF,
-0x8F,0xFB,0xFE,0xFE,0xEF,0xFB,0xFE,0xFF,
-0xBF,0xEF,0xFB,0xFF,0xFF,0xFD,0xDF,0x6F,
-0xEF,0xFF,0x7F,0xFF,0xBF,0xBF,0xDF,0xFF,
-0xFC,0xFF,0xDF,0xF7,0xFD,0xEF,0x7F,0xDF,
-0xFF,0xFF,0xFF,0x3F,0xF6,0xFF,0xCF,0xFF,
-0xDB,0xFB,0xF7,0xFF,0xEB,0x7A,0xFF,0xFF,
-0xFF,0xBF,0xEF,0xFB,0xFF,0xFF,0xFF,0xFE,
-0x6D,0xFD,0xFF,0x5F,0xFB,0xFF,0xFF,0xF7,
-0xFF,0x5F,0xF5,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xF8,0xFF,0xFB,0xFF,
-0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xE7,0xF6,
-0xBF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,
-0xFF,0xC9,0xFF,0xFF,0xFF,0xBD,0xFF,0xBF,
-0xAF,0xEF,0xEF,0x3F,0xD1,0xFC,0x7F,0xFB,
-0xC7,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3,0xFF,
-0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0x77,0xFF,
-0xDF,0xB7,0xFD,0xF7,0xFD,0xF7,0xFF,0xFF,
-0xFF,0xFF,0xFF,0x57,0xFF,0xF7,0xA5,0xFD,
-0x3F,0xDF,0xBF,0xBF,0xFE,0x7F,0xFF,0xFF,
-0xFF,0xDF,0xFA,0xFD,0xFF,0xFF,0xFF,0xFE,
-0x87,0xFF,0xE9,0xFF,0xFE,0xEF,0xBF,0xEF,
-0xFE,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFA,0x9F,0xFF,0x3F,
-0xFF,0xFD,0xFD,0x57,0xDF,0xFD,0xF3,0xFF,
-0xDF,0xFD,0xFF,0x5F,0xDF,0xF5,0xFD,0xFF,
-0xFF,0xF9,0x8F,0xFF,0xFF,0xFF,0xEE,0x7F,
-0xFF,0xFF,0xBF,0x5E,0xFE,0xEC,0xFB,0x3F,
-0x7F,0x9F,0xEF,0xF9,0xFF,0xFF,0xCD,0x6B,
-0xFF,0xFF,0xFF,0xC5,0xF3,0xFC,0xFA,0x38,
-0xFF,0xAF,0x3F,0xEE,0x7F,0x9F,0xFF,0xD9,
-0xFF,0xFF,0xFD,0x7A,0xF7,0xFF,0xF3,0xFF,
-0xAF,0x6F,0xDB,0xF2,0xB9,0xE9,0xFB,0xFF,
-0xFF,0xFF,0xFE,0xFF,0xFF,0xEF,0xFF,0xFB,
-0xC5,0xBF,0xFF,0xEF,0xFF,0x5E,0xB7,0xAD,
-0xCD,0x79,0x7C,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFD,0x93,0xFF,0xEF,
-0xEA,0xFE,0xBF,0xEF,0x5B,0xD2,0xCD,0xF5,
-0x6D,0x77,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,
-0xFF,0xFF,0x66,0xFF,0xD5,0x65,0x7D,0x5F,
-0x75,0x9D,0x65,0x7F,0xD6,0xFB,0x4F,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xC7,
-0xFF,0xBF,0xEF,0xFA,0xFE,0xFF,0xBF,0xEB,
-0xFF,0xDF,0xFF,0x7E,0xFF,0xFF,0xEF,0xFD,
-0x7E,0xD7,0xFF,0x78,0xDF,0xFF,0x5F,0xDF,
-0xF5,0xBF,0x7F,0xDF,0xC5,0xFF,0x3F,0xF6,
-0x7E,0xFF,0x0F,0xEF,0xF2,0x3E,0xBF,0xFF,
-0xFB,0x3F,0xFF,0xFB,0x7F,0xFF,0xB3,0xFE,
-0xFB,0xF6,0xFD,0xFF,0xDA,0xF7,0xFD,0xFF,
-0x7F,0xDF,0xF7,0xBF,0xFF,0xFA,0x7F,0xFF,
-0xFF,0xFF,0xFF,0x9F,0xFF,0xF3,0xDC,0xF9,
-0xBF,0xCE,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7,
-0xFF,0xFF,0xE2,0x7F,0xFE,0xFF,0xBF,0xEF,
-0xEB,0xFA,0xFF,0x9F,0x67,0x1E,0xFF,0x8F,
-0xE7,0xF8,0xFE,0x7F,0x8F,0xEF,0xFF,0xBD,
-0xBF,0xFF,0xFB,0xFF,0xFF,0xDF,0xF7,0xFF,
-0xFC,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFD,0xB3,0xFF,0xFF,0xEF,
-0xFF,0xFF,0xBF,0xED,0xFF,0xFB,0xEE,0xFE,
-0xFF,0xFF,0xEF,0xFF,0xFE,0xFF,0xFF,0xFF,
-0xFF,0xB5,0xFF,0xB7,0xFD,0xFD,0x6E,0xFF,
-0xFF,0xFE,0xFD,0x2F,0xD8,0xFE,0xBF,0x8F,
-0xEB,0xF9,0xFE,0x3F,0xFF,0xFA,0xCF,0xFF,
-0xE7,0xD9,0xFA,0xBF,0xDF,0x77,0xFC,0xFB,
-0x3F,0xAB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,
-0xFF,0xFF,0xEE,0x1F,0xFF,0xDF,0xF7,0xFF,
-0xFF,0xFF,0x5F,0x97,0x35,0xBF,0x5E,0xFE,
-0xBF,0xEF,0xFF,0xF7,0xFD,0xFF,0xFF,0xFA,
-0xBF,0xFF,0xBE,0x6F,0x9F,0xE7,0xF8,0xBE,
-0x2F,0x8B,0x66,0x94,0x7D,0x9D,0xE7,0xF9,
-0xFE,0x7F,0x9F,0xE7,0xF1,0x7F,0xFF,0xFF,
-0xFF,0xF7,0xF5,0xFD,0x7F,0x5F,0xFB,0xFD,
-0x9E,0xFF,0xFB,0xFE,0xFF,0xFF,0xEF,0xFF,
-0xFF,0xA0,0xFF,0xFF,0xFF,0xBF,0xEF,0xEB,
-0xFA,0xFE,0xBF,0xB7,0xF7,0xF7,0xFF,0xFF,
-0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xDD,0xFF,
-0xFD,0xFF,0xFF,0xFF,0xD7,0xFF,0xFF,0xFF,
-0x7F,0xF5,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,
-0xBF,0xFF,0xFF,0xAB,0xFE,0xFB,0xFE,0xFF,
-0xF7,0xAF,0xFF,0xFF,0xDE,0xF7,0xEB,0x5F,
-0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF,0xFF,
-0xB3,0xFF,0xC9,0xFE,0xFF,0xFF,0xFF,0xFF,
-0xD6,0xFF,0xFF,0xCB,0xFF,0xFF,0xDF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFC,0x8F,0xFF,0xBA,
-0xBE,0xBF,0xAF,0xEB,0x78,0xFE,0xB7,0xAD,
-0x3A,0xFE,0xB7,0xAF,0xEB,0x7A,0xFE,0xBF,
-0xAF,0xFF,0x9F,0xFF,0xFF,0xDF,0xFC,0xFF,
-0xFF,0xFE,0xC3,0xFE,0xFF,0xFF,0x33,0xFC,
-0xFF,0xBF,0xDF,0xF3,0xFF,0xFF,0xBB,0x9F,
-0xFF,0xFF,0xFF,0xEB,0xDF,0xFF,0xFF,0xAF,
-0xF7,0x6F,0xF9,0xBF,0xEF,0xFD,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xE3,0x7F,0xFF,0xFF,0xFF,
-0xFB,0xFF,0xFF,0xBF,0xFD,0xFB,0xF7,0xFF,
-0xDF,0xF7,0xFF,0xFE,0xEF,0x5F,0xBD,0xFF,
-0xFA,0xFF,0xF8,0xFF,0xBF,0xAF,0xFB,0xFE,
-0xFE,0x3F,0xEF,0xE8,0xFF,0xDF,0xF3,0xFD,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xED,0xFF,0xFB,
-0xFD,0xFF,0xAF,0xFF,0xFF,0xFE,0xFE,0xBF,
-0xDB,0xFF,0xFF,0xFF,0xBF,0xFF,0xDF,0xFF,
-0xFD,0xFF,0xCB,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xBF,0x6F,0xFF,0x7F,0xB7,0xB3,0xFF,0xFF,
-0xDF,0xFF,0xFB,0xEF,0xFF,0xFF,0xFF,0x07,
-0xFF,0xFB,0xFF,0xFF,0xFF,0xED,0xFF,0xF5,
-0x7C,0xFF,0x7F,0xFE,0xFF,0xFF,0xEF,0xCF,
-0xFF,0xFB,0xFF,0xFF,0x2F,0xFF,0xFF,0xFF,
-0xFF,0xF3,0xFF,0xFB,0xFF,0xFE,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,
-0xFD,0x1B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFE,0x7C,0xFF,0xFF,0xFF,0xFF,
-0xEF,0xFF,0xFF,0xFF,0xFF,0xFB,0xBF,0x7F,
-0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xDB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,
-0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xDF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xBF,0xFE,
-0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xEF,0xFE,0xFF,0xBF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xEF,0xFA,0xB5,0xFF,0xFF,0xFF,
-0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xDF,0xFB,
-0xFC,0xFF,0xFF,0xFE,0xFF,0x7F,0xDF,0xBF,
-0xFF,0xCB,0xBF,0xF9,0xFE,0x7F,0x9F,0xE7,
-0xF9,0xFE,0x7F,0x97,0xE1,0xFE,0x79,0x9F,
-0xE7,0xFD,0xFE,0x7F,0xDF,0xFE,0x37,0xFF,
-0xFB,0xDE,0xDE,0xBD,0xEF,0xF3,0xFE,0xFB,
-0xAF,0xEB,0xFE,0xFF,0xFF,0xCF,0xFF,0xFE,
-0xFF,0xBF,0xFF,0x8F,0xFF,0xEF,0xFB,0xFE,
-0xFF,0xBF,0xE7,0xF9,0x5E,0x7F,0xEF,0xFB,
-0xDA,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFD,
-0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,
-0xFF,0xFF,0x7F,0xFF,0xFF,0xF7,0xFB,0x7F,
-0xFF,0xFF,0xFF,0xFF,0xFC,0x3F,0xFF,0xBF,
-0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0x7B,0x7F,
-0xBF,0xEF,0xFB,0xFE,0xFF,0xB5,0xEF,0xFB,
-0xBF,0xFA,0x7F,0xFC,0xFF,0x3F,0xCF,0xF3,
-0xFC,0xFF,0x3F,0xCF,0xBC,0xFF,0x3F,0xEF,
-0xF3,0xFC,0xFE,0x3F,0xCF,0xFF,0xEE,0xEF,
-0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0x6A,0xD7,
-0xB7,0xFB,0xF8,0xFF,0xB7,0xEF,0xBA,0xFE,
-0xFF,0xBF,0x7F,0xE9,0xFF,0xF9,0x7E,0x5F,
-0x97,0xE5,0xF9,0xFE,0x7F,0xBF,0xF9,0x7E,
-0x5F,0x9F,0xE5,0xFB,0xFE,0x5F,0xB7,0xFF,
-0xA3,0xFF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7,
-0xFD,0xFF,0x5E,0xF7,0x7D,0xFF,0x77,0xDF,
-0xF7,0xFD,0xFF,0x7F,0xFF,0xD7,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFD,0xDF,0xFB,0x7F,
-0xFF,0xFF,0xEF,0xFF,0xFE,0xFB,0xFF,0xFF,
-0xBF,0xFE,0x8F,0xFF,0xDF,0xF7,0xFD,0xFD,
-0x7F,0xDF,0xF7,0xFD,0x3E,0xDF,0xF5,0xBD,
-0xFF,0x7F,0xDF,0xF7,0xFD,0xF7,0xFF,0x9F,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFD,0xFF,0xBE,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFD,0x3F,0xFF,0xDF,0xF7,
-0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0xCF,
-0x77,0xFC,0xFF,0x5F,0xDF,0xF7,0xFD,0xFF,
-0xF4,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFD,0xFF,0xFF,0xFF,0xEE,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xED,0xFB,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xE9,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFB,0xFF,0xFF,0xFF,0xD3,0xFF,0xFF,
-0xBF,0x3F,0xFB,0xFF,0xFF,0xFF,0xFB,0xF3,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xF7,
-0xFF,0xFF,0xFF,0xFF,0x17,0xFF,0xFF,0xFF,
-0xDF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xDF,0xDF,0xFF,0xFD,0xFF,0xFF,0xDF,0xF7,
-0xFF,0x4F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFD,
-0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x9F,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,
-0xFF,0xFF,0x7A,0x3F,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,
-0x7F,0xFF,0xFB,0xFE,0xFF,0xBF,0xEF,0xF8,
-0xFE,0xFF,0xBF,0xFB,0xFE,0xFF,0x8F,0xEC,
-0xFB,0xFE,0xFF,0xBF,0xF8,0xF7,0xFE,0xFF,
-0xBF,0xEF,0xFB,0xFE,0xFD,0xBF,0xCF,0xEC,
-0xFF,0x3F,0xEF,0xDB,0xF8,0xFF,0xBF,0xCF,
-0xFF,0xF9,0xFF,0xFF,0xBF,0xFF,0xFB,0xFF,
-0xFF,0xFF,0xEF,0xFB,0xDF,0xFF,0xFF,0xFF,
-0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xBB,0xFF,
-0xEF,0xFB,0xFE,0xEF,0xBF,0xEE,0xEB,0xFB,
-0xFE,0xFF,0xEF,0xFE,0xEE,0xBF,0xFE,0xEB,
-0xFF,0xEF,0xFF,0x17,0xFF,0x7E,0xEB,0xBB,
-0xFE,0xBF,0xBE,0xFB,0xEF,0x5B,0xF7,0xBD,
-0xFB,0xCF,0xBF,0xBF,0xBB,0xFB,0x7E,0xCC,
-0xEF,0xFF
-};
--- /dev/null
+static unsigned char bitstream[] = {
+0x00,0x09,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,
+0x0F,0xF0,0x00,0x00,0x01,0x61,0x00,0x0D,
+0x64,0x61,0x62,0x75,0x73,0x62,0x74,0x72,
+0x2E,0x6E,0x63,0x64,0x00,0x62,0x00,0x0B,
+0x73,0x31,0x30,0x78,0x6C,0x76,0x71,0x31,
+0x30,0x30,0x00,0x63,0x00,0x0B,0x31,0x39,
+0x39,0x39,0x2F,0x30,0x39,0x2F,0x32,0x34,
+0x00,0x64,0x00,0x09,0x31,0x30,0x3A,0x34,
+0x32,0x3A,0x34,0x36,0x00,0x65,0x00,0x00,
+0x2E,0xC0,0xFF,0x20,0x17,0x5F,0x9F,0x5B,
+0xFE,0xFB,0xBB,0xB7,0xBB,0xBB,0xFB,0xBF,
+0xAF,0xEF,0xFB,0xDF,0xB7,0xFB,0xFB,0x7F,
+0xBF,0xB7,0xEF,0xF2,0xFF,0xFB,0xFE,0xFF,
+0xFF,0xEF,0xFF,0xFE,0xFF,0xBF,0xFF,0xFF,
+0xFF,0xFF,0xAF,0xFF,0xFA,0xFF,0xFF,0xFF,
+0xC9,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFB,0xFF,0xA3,0xFF,0xFB,
+0xFE,0xFF,0xBF,0xEF,0xE3,0xFE,0xFF,0xBF,
+0xE3,0xFE,0xFF,0xBF,0x6F,0xFB,0xF6,0xFF,
+0xBF,0xFF,0x47,0xFF,0xFF,0x9F,0xEE,0xF9,
+0xFE,0xCF,0x9F,0xEF,0xFB,0xCF,0x9B,0xEE,
+0xF8,0xFE,0xEF,0x8F,0xEE,0xFB,0xFE,0x0B,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xBF,0xFF,0xFF,0xFB,0xFF,0xFF,
+0xBF,0xFF,0xFF,0xFC,0x17,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,
+0xFF,0xFF,0xFB,0xFF,0xFF,0x7F,0xFF,0xFF,
+0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x5F,0xFF,
+0xFF,0xFD,0xFF,0xFF,0xDB,0xFF,0xFD,0xFF,
+0x77,0xFF,0xFD,0xFF,0xFF,0xDF,0xFE,0xFD,
+0xFF,0xFF,0xF2,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFD,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,
+0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xE3,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,
+0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0x67,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0x2F,0xFF,
+0xF3,0xFD,0xFF,0x7F,0xDE,0xF7,0xFD,0xFF,
+0x7F,0xF7,0x7D,0xFF,0x7F,0xDF,0xF7,0xBD,
+0xFF,0x7F,0xFF,0x1F,0xFF,0xEF,0xFB,0xFE,
+0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xEF,0xFB,
+0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFF,
+0x3F,0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,
+0x9F,0xE7,0xFA,0x7F,0x9F,0xE7,0xF9,0xFE,
+0x7F,0x9F,0xE7,0xFF,0xFC,0x7F,0xBF,0xBF,
+0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xB7,
+0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,
+0xFF,0xE0,0xFD,0xF9,0xFE,0x7F,0x9F,0xE7,
+0xF9,0xFE,0x7F,0x9D,0xF9,0xFE,0x7D,0x9D,
+0xE7,0xF9,0xFE,0x7F,0x9F,0xED,0xED,0xFF,
+0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F,
+0xDF,0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,
+0x7F,0xDF,0xFF,0x9B,0xFF,0xEF,0xFB,0xFE,
+0xFB,0xBF,0xEF,0xBB,0xFE,0xFF,0xAF,0xBB,
+0xBE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFF,
+0xB7,0xBF,0xDB,0xF6,0xBD,0xBF,0x6B,0xDB,
+0xF6,0xF9,0xBF,0x5B,0xD6,0xF9,0xBF,0x6F,
+0xDB,0xF6,0xFD,0xBF,0xFF,0x0E,0xFF,0xFF,
+0xFF,0xFF,0x5F,0xFF,0xF7,0xFF,0xFF,0x7F,
+0xF7,0xBD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xDF,0x9F,0xFF,0xFF,0xFF,0xFE,0xFF,
+0xFF,0xEF,0xFE,0xFE,0xFF,0xFF,0x77,0xFF,
+0xFB,0xFB,0xFF,0xFF,0xFF,0xFF,0xF8,0x3F,
+0xFF,0xFD,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xF4,0x7F,0xFF,0xFE,0xFD,
+0xBE,0xFF,0xDF,0xFE,0xFF,0xFF,0xEF,0x7F,
+0xFF,0xCF,0xFF,0xCF,0xFF,0xFF,0xFF,0xDF,
+0xE6,0xFF,0xFF,0x7F,0xDF,0xF7,0xDD,0x7F,
+0x7F,0xDF,0xF7,0xFF,0x7F,0xDF,0xD7,0xFD,
+0xFF,0x7F,0xDF,0xF7,0xFF,0xCD,0xFF,0xF2,
+0xFF,0xFF,0x4F,0x7F,0xF4,0xFF,0xFF,0xFF,
+0xE7,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xBB,0xFF,0xEF,0xFF,0xFE,0xFF,
+0xFF,0xFF,0xEF,0xFF,0xFF,0xEF,0xFF,0xFB,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x65,
+0xEF,0xFF,0xFF,0x7F,0xFF,0xFD,0xEF,0xFF,
+0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFE,0xCF,0xDF,0xFE,0xFF,
+0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFE,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xBF,0xFF,
+0xFF,0xFF,0xE3,0x7F,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xEF,0xEB,0xFF,0xFE,0xBF,0xFF,
+0xEB,0xFF,0xFC,0x7F,0xFF,0xFF,0xFF,0xEE,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDD,0xFF,
+0xD6,0xFF,0xFD,0xBF,0xFF,0xFB,0xFF,0xFE,
+0xFD,0xFF,0xFF,0xFD,0xEF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xDE,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xBF,0xFF,0xFD,0xFF,0x7F,0xBF,
+0xFF,0x5F,0xDF,0xFF,0xFF,0xBF,0x77,0xFF,
+0xFF,0xFF,0x7F,0xD7,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xDF,0xEF,
+0xFF,0xFF,0xFE,0xFB,0xFF,0xFF,0xDF,0xBF,
+0xFF,0xFF,0xFF,0xFF,0xED,0xFF,0xB7,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xAF,0x7F,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xDF,0xBF,0xDF,0xF3,0xFD,0xFB,0xFF,0x5B,
+0xFD,0xFF,0xBF,0xEF,0xF7,0xFF,0xFF,0x7D,
+0xFF,0xFF,0xFF,0xFF,0xF8,0x3B,0xFF,0xBF,
+0x6F,0xFF,0xFE,0xFF,0xBF,0xFF,0xEB,0x7D,
+0xFF,0xEF,0xFB,0xFE,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xF2,0x7F,0xFC,0xFF,0x3F,0xDF,0xED,
+0xFE,0xFF,0xFF,0xFF,0xFF,0xEF,0x5F,0xF7,
+0xB5,0xFF,0xEF,0xFF,0xFF,0xFF,0xE0,0x3F,
+0x9F,0x9E,0xFF,0xFF,0xEF,0xFF,0xDF,0xFF,
+0xBF,0x5F,0xBF,0xCF,0xF3,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0x69,0xAF,0x33,0xFD,0xFF,
+0xFB,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF,0x7F,
+0xD9,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xF5,
+0xA3,0xDF,0x6E,0xDE,0xFF,0xFF,0xBD,0xFF,
+0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xE7,0xFD,
+0xFF,0xFF,0xFF,0xF9,0xEF,0xC6,0xFE,0xB7,
+0xAD,0xE5,0xF9,0xFF,0xFF,0xFF,0xCF,0xFF,
+0xFF,0xFF,0xCD,0xFB,0x7F,0xFF,0xFF,0xFF,
+0xF9,0xF6,0x0F,0xDF,0xEC,0xCF,0x7F,0xFF,
+0xFB,0x7F,0xFF,0xFF,0xFF,0xFD,0xFF,0xFE,
+0xF9,0xFD,0x7F,0xFF,0x7F,0xFF,0xF9,0x5B,
+0xFF,0x73,0xDC,0xFD,0x7B,0xDF,0xFF,0xFF,
+0xFF,0x7B,0xFF,0xFF,0xF7,0x53,0xD6,0xFF,
+0xFF,0xFF,0xFF,0xD8,0x9F,0xFE,0xFF,0xEF,
+0x7F,0xEE,0xFF,0xFF,0xFF,0xFB,0xED,0xED,
+0xFD,0xFF,0xFE,0xFF,0xFF,0xFB,0x7F,0xFF,
+0xE2,0x7F,0xFF,0x6F,0xD8,0x57,0xF7,0xFF,
+0xFF,0xFF,0xDF,0xFF,0xE8,0xFF,0xFF,0xFD,
+0xFF,0xFF,0xFC,0x7F,0xFF,0xE4,0xFF,0xFB,
+0xEF,0xFB,0xFE,0xDF,0xB7,0xED,0xFF,0xFE,
+0xDF,0x7F,0xFF,0xFE,0x7F,0xB7,0xFF,0xFF,
+0xFF,0xFF,0x89,0xFF,0xFF,0xCF,0xF3,0xFE,
+0x7F,0xFF,0xEF,0xFF,0xFE,0x7E,0x7F,0xFB,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF1,
+0xFF,0xEB,0x7A,0xD5,0xBF,0x6F,0xDB,0xBE,
+0xFD,0xB7,0xD8,0xF6,0xE5,0xBF,0x6F,0xFB,
+0xFE,0xF5,0xBD,0x7E,0x06,0xFF,0xDF,0xF7,
+0xFB,0xF6,0xFF,0x3F,0xFF,0xDB,0xFF,0xFF,
+0x6F,0xFB,0xF7,0xFF,0xFF,0xFF,0xFB,0xFE,
+0xF7,0xAF,0xFF,0xB7,0xED,0xEF,0xF7,0xFE,
+0xFF,0xFF,0xDF,0xFF,0xFE,0xFF,0xEF,0xFF,
+0xFF,0xFF,0xFF,0xBF,0xF7,0xFC,0x1F,0xEE,
+0xFB,0xFE,0xBD,0xFF,0x7F,0x5F,0xD7,0xFD,
+0xFB,0x43,0xFF,0xFF,0xFD,0xFF,0x5F,0xFF,
+0xF7,0xFF,0xF9,0x3F,0xFF,0xCF,0xF3,0xFD,
+0xF7,0x7E,0xEF,0xA7,0xF9,0xFE,0x8F,0xA7,
+0xE9,0xF3,0x7E,0x9F,0xFB,0xF8,0xFF,0xFF,
+0x3F,0xFD,0x7F,0x5F,0xDF,0xFD,0xFF,0xFF,
+0x5F,0xFF,0xFD,0x5F,0xFF,0xFF,0x7F,0xFD,
+0x7F,0xFD,0x9F,0xFF,0xE0,0xFF,0xFA,0xF8,
+0xBE,0x6F,0x9F,0xE6,0xF8,0xBE,0x3F,0x9A,
+0xF9,0xBE,0x6F,0x9F,0xE2,0xF9,0xFE,0x6F,
+0x9F,0xF9,0xFF,0xF5,0xFD,0x7F,0xCF,0xDF,
+0xFD,0xFD,0x7F,0xFF,0xF5,0xFF,0xFF,0xFF,
+0xF7,0xF5,0xFD,0x0F,0xDB,0xFF,0xD3,0xFF,
+0xEB,0xFA,0xFF,0xFF,0xBF,0xFF,0xFA,0xFF,
+0xFF,0xCB,0xFB,0xFE,0xFF,0xFF,0xEB,0xFA,
+0xFE,0xFF,0xFF,0xB7,0xFF,0xFF,0xFF,0xFF,
+0xBF,0xFF,0xDF,0xF5,0xFF,0xFF,0xD7,0xFF,
+0xFF,0xFF,0xDF,0xD7,0xF5,0xFF,0x7F,0xFE,
+0x4F,0xFF,0xFD,0xFF,0x7F,0x7F,0xFF,0xAD,
+0xEB,0xFB,0xFF,0xAD,0xFF,0xFF,0xFF,0xFF,
+0xAF,0xEB,0xFB,0xFF,0xFC,0x0D,0xFF,0xFF,
+0xDF,0xD2,0xFD,0xFF,0xFF,0xFD,0xF6,0xFF,
+0xFF,0x7F,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,
+0xFF,0xFB,0x3F,0x7D,0xEB,0x32,0xFE,0xBF,
+0x2F,0xEB,0xFA,0xAE,0xBD,0xE0,0xFA,0x7E,
+0xBF,0xAD,0xEB,0xFA,0xFE,0xBF,0xF5,0x7F,
+0xFF,0xDE,0xFE,0xE3,0xFB,0xFF,0xFF,0xFF,
+0xDF,0xEF,0x4F,0xDF,0xFF,0x7F,0xDF,0xFF,
+0xF7,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xEF,
+0xFB,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xDF,
+0xED,0xFB,0xDF,0xFF,0xBF,0xFF,0xFF,0xFF,
+0x81,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,
+0xFF,0xFF,0xFE,0xDD,0xFE,0xEF,0xFD,0xFF,
+0xFF,0xFB,0xFE,0xF7,0xFF,0x93,0xFD,0xFB,
+0x7E,0xFF,0xFE,0x87,0xE9,0xFF,0x7F,0xB3,
+0x9F,0xFE,0xFE,0xFF,0xAF,0xFD,0xFE,0x7E,
+0x3F,0xFE,0x67,0xFF,0xFF,0xF7,0xFF,0xFF,
+0xFC,0xF7,0xDF,0xFD,0xFF,0x7F,0xFF,0xFF,
+0x7F,0x6D,0xFF,0xFF,0xFE,0xFF,0xFF,0x2F,
+0xFF,0xBF,0xFF,0xFF,0xEE,0xFF,0xBE,0xFF,
+0xFF,0xFE,0xFF,0xEF,0xFF,0xFF,0xFE,0xFF,
+0xEF,0xFF,0xFF,0xFA,0x5F,0xFF,0xFF,0xFB,
+0xFF,0xFF,0xEF,0xFF,0xFB,0xFE,0xFD,0xFF,
+0xFE,0xFF,0xFB,0xFF,0xFF,0xFF,0x7F,0xFF,
+0xFE,0xBF,0xDF,0xFF,0xFB,0xFF,0xFF,0xF7,
+0xFC,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,0x7F,0xFF,
+0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,
+0xF3,0xFF,0xFF,0xFF,0xEF,0xFB,0xFF,0xFF,
+0xFF,0xDF,0xE2,0xFF,0xFF,0xFB,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFB,0xE7,0xFF,0xFD,
+0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xED,
+0xEF,0xFD,0xFF,0xFF,0xDF,0xD7,0xF5,0xFD,
+0x7F,0x5D,0xFD,0xFF,0x7F,0xDF,0x97,0xF4,
+0xFD,0x7B,0x5F,0xFF,0xC9,0xFF,0xFB,0xFE,
+0xFF,0xBF,0xFF,0x5F,0xFF,0xFF,0xF7,0xFF,
+0xEF,0xFD,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xF7,0xFF,0xD7,0xFD,0x7D,0x7F,0xFF,
+0xFF,0xFF,0xFF,0xEF,0xDF,0xF7,0xFD,0xFF,
+0xBB,0xFF,0xFF,0x7F,0xFF,0xFE,0xE3,0xFF,
+0xF9,0xFE,0x7F,0xBF,0xEF,0xFB,0xFE,0xFF,
+0xBF,0xF9,0xFE,0xFF,0x9F,0xEF,0xF9,0xFE,
+0xFF,0xBF,0xF3,0xDA,0xFF,0x37,0xCD,0xF3,
+0x7C,0xDF,0x37,0xCD,0xF3,0x7F,0x37,0xCD,
+0xF3,0x7C,0xDF,0x37,0xCC,0xF3,0x7F,0x5A,
+0xBD,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6,0xFD,
+0xBF,0x6F,0xDE,0xFD,0xBF,0x6F,0xDB,0xF6,
+0xFD,0xBF,0x6F,0xFE,0xF1,0x6F,0xEB,0x7A,
+0xDE,0xB7,0xAD,0xEB,0x7A,0xDE,0xB7,0xAF,
+0x7A,0xDE,0xB7,0xAD,0xEB,0x7A,0xDE,0xB7,
+0xFF,0x7E,0xFF,0xFE,0xCD,0xB3,0x6C,0xDB,
+0x36,0xCD,0xB3,0x6C,0xDE,0xCD,0xB3,0x6C,
+0xDB,0x36,0xCD,0xB3,0x6C,0xDF,0xC9,0xBF,
+0xF7,0xBD,0xEF,0x7A,0x9E,0xA7,0xA9,0xEA,
+0x7A,0xB7,0xBD,0xEA,0x7B,0xDE,0xA7,0xBD,
+0xCA,0x72,0x8D,0x91,0xFF,0xEF,0xFB,0xFE,
+0xFF,0xBF,0xEF,0xFB,0xFE,0xF7,0xEF,0xFB,
+0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFE,
+0x87,0xFF,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6,
+0xFD,0xBF,0x6F,0xF6,0xFD,0xBF,0x6F,0xDB,
+0xF6,0xFD,0xBF,0x6F,0xFE,0x4F,0xFF,0xBF,
+0xEF,0xBB,0xEE,0xFB,0xBE,0xEF,0xBB,0xEF,
+0xBE,0xEF,0xBB,0xEE,0xFB,0xBE,0xEF,0xBB,
+0xEF,0xFC,0x5F,0xFF,0xFF,0xFF,0x3F,0xCF,
+0xF3,0xFC,0xFF,0x3F,0xCF,0xFC,0xFF,0x3F,
+0xCF,0xF3,0xFC,0xFF,0x3F,0xCF,0xFD,0x9F,
+0xFE,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,
+0xEB,0xFE,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,
+0xAF,0xEB,0xFF,0xE1,0x6F,0xFD,0xFF,0x7F,
+0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFD,0xFF,
+0x7F,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF,
+0x7A,0xBF,0xFB,0xFE,0xDF,0xB7,0xED,0xFB,
+0x7E,0xDF,0xB7,0xFB,0x7E,0xDF,0xB7,0xED,
+0xFB,0x7E,0xDF,0xB7,0xFF,0xC9,0xFF,0xFF,
+0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,
+0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEE,
+0xFB,0xFE,0xBB,0xFF,0xFE,0xFF,0xBF,0xEF,
+0xFB,0xFE,0xFF,0xBF,0xEF,0xFE,0xFF,0xBF,
+0xEF,0xFB,0xFE,0xFF,0x3F,0xCF,0xFF,0xE7,
+0xFE,0xFF,0xF5,0xFD,0x77,0x5D,0xD7,0x35,
+0xDD,0x77,0xD7,0xF5,0xCD,0x7B,0x5D,0xD7,
+0xF5,0xDD,0x77,0xFE,0x27,0xFF,0xFF,0x8B,
+0xE2,0xF8,0xBE,0x2F,0x8B,0xE2,0xF9,0xAF,
+0x8B,0xE2,0xF8,0xBE,0x2F,0x8B,0xE2,0xF9,
+0xFE,0x1F,0xFF,0x5F,0xD7,0xF5,0xFD,0x7F,
+0x5F,0xD7,0xF5,0xFF,0x5F,0xD7,0xF5,0xFD,
+0x7F,0x5F,0xD7,0xF5,0xFF,0xFA,0x3F,0xFE,
+0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,0xEB,
+0xEC,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,
+0xEB,0xFF,0xFE,0x7F,0xFD,0x7F,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE6,
+0xFF,0xFA,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,
+0xF7,0xFC,0xFF,0xDF,0xF7,0xFD,0xFF,0x7F,
+0xDF,0xF7,0xFD,0xFF,0xF5,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0x02,0xFF,0xFE,0xBF,0xAB,0xEB,0xFA,
+0xBE,0xBF,0x23,0xEB,0xDE,0x1F,0xAF,0xEA,
+0xFA,0xFE,0xAF,0xAF,0xEB,0xFD,0x97,0xFF,
+0xF3,0xFC,0x7B,0x1F,0xCF,0xF1,0xFC,0x7F,
+0x1F,0xF1,0xFC,0x77,0x1F,0xCD,0xF1,0xFC,
+0xFF,0x1F,0xFE,0x87,0xFF,0xAF,0xEF,0xFA,
+0xFE,0xFF,0xAF,0xEF,0xFA,0xFD,0xBF,0x2B,
+0xFB,0x7E,0xBF,0xBF,0xEB,0xFB,0xFB,0xFB,
+0xDF,0xFF,0xFB,0xF7,0xFF,0xFF,0x7F,0xF7,
+0xF7,0xFF,0xFD,0xDF,0xFE,0xFC,0xDF,0xFF,
+0xDF,0xFF,0xFD,0xFF,0xDA,0xBF,0xFF,0xBB,
+0xEF,0xFB,0xF9,0xFF,0xBE,0xEF,0xFB,0xFB,
+0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,
+0xFF,0xF7,0x7F,0xFD,0xD7,0xFF,0xFF,0x7F,
+0xFF,0xFF,0xFF,0xFE,0xF7,0xFF,0xFE,0xFF,
+0xF7,0xFF,0xFF,0x7F,0xFF,0xFF,0xEC,0xFF,
+0xFF,0xFE,0xDF,0xBF,0xFF,0xFB,0xFE,0xFF,
+0xBB,0x68,0xAE,0x1F,0xAE,0xFB,0xFB,0xFF,
+0xFF,0xBF,0xFF,0xD5,0xFF,0x7F,0xFF,0xFF,
+0xF7,0xFE,0xFE,0xFF,0xBF,0xEF,0x9F,0xFD,
+0x7F,0xFF,0xCB,0xFF,0xFF,0xDF,0xFF,0xFF,
+0xBB,0xF7,0xBF,0xFF,0xFF,0xFF,0xFF,0xDF,
+0xFF,0xBF,0xFB,0xFF,0xFF,0xFF,0xDE,0x3F,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xA7,0xFF,0xFF,
+0xFF,0xFF,0xEF,0xFF,0x7F,0xFB,0xFD,0xFB,
+0x7F,0xFF,0xFF,0xFF,0xFF,0xCF,0xF3,0x7C,
+0xFF,0x7F,0x8D,0x7F,0xFF,0xFF,0xFF,0xFF,
+0xFB,0xFF,0xF7,0xFB,0xFE,0xFD,0xFF,0xFF,
+0xFF,0xFF,0xF7,0xFD,0xFF,0x7F,0xFD,0x1F,
+0xFD,0xFF,0xFF,0xFF,0xFF,0xBF,0xDF,0xFF,
+0xFF,0xFE,0x5C,0xFF,0x6D,0xFF,0x7F,0xAB,
+0xE7,0xF1,0xFF,0xFD,0x9F,0xFF,0xFF,0xAD,
+0xEB,0x7A,0x3F,0x1F,0xFF,0xFF,0xFE,0xBF,
+0xAF,0xF3,0xDE,0xF5,0xFF,0x8F,0xFB,0xDF,
+0xE6,0x7F,0xFF,0xDF,0xF3,0xFD,0xFF,0x7E,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xF7,0xF3,
+0x7F,0xDF,0xF7,0xEF,0xFF,0xF6,0x3F,0x9F,
+0xDF,0xFF,0xFF,0xEE,0xFF,0xFF,0xEF,0xFB,
+0xFF,0xFF,0xF9,0xFB,0xFE,0x4F,0xBF,0xEF,
+0xBB,0xFF,0x69,0xAF,0xAF,0xFC,0xFF,0x3F,
+0xDD,0xFF,0xFC,0xBF,0x8F,0xFF,0xFD,0xF3,
+0xBF,0xED,0x9E,0xFC,0xBF,0x6F,0xF5,0xD3,
+0xDF,0xFF,0xDB,0xD6,0xF5,0xEF,0xFD,0xFE,
+0xFF,0xB9,0xFF,0x1F,0xD2,0xA9,0xAF,0xFF,
+0xDB,0xF7,0xBF,0xEF,0x46,0xFF,0xFF,0xAD,
+0xEB,0x7A,0xDF,0xEF,0xF7,0xFF,0x7F,0xF7,
+0x9F,0xED,0xFF,0x7F,0xFF,0xAD,0xEB,0x7F,
+0xF5,0x6F,0xFF,0xFD,0xFB,0xD6,0xF4,0xF7,
+0xFB,0xF9,0x7E,0x7F,0xFF,0x5F,0xC2,0xFE,
+0xBF,0xFD,0xFB,0x33,0xDF,0xF9,0x5B,0xFF,
+0xFF,0xDD,0x67,0x7D,0xCF,0xEF,0xDB,0xEC,
+0xFF,0x77,0xDD,0xF7,0xFD,0xFF,0xFF,0xDE,
+0xA7,0xBF,0xD4,0x9F,0xFF,0xFF,0xBF,0xEF,
+0xFE,0xFF,0xDF,0xEF,0xBB,0xFF,0xFF,0xEF,
+0xEB,0xFA,0xFF,0xEF,0xBD,0xFB,0xFF,0xE2,
+0x7F,0xFF,0xDF,0xDF,0xF7,0xFD,0xBF,0xBB,
+0x73,0xF7,0xFD,0x7F,0xDF,0xDE,0xF7,0xBF,
+0xEA,0xDB,0xF6,0xFF,0xD6,0xFF,0xFF,0x66,
+0xFF,0xBE,0xFF,0xBF,0x6B,0xD9,0xF6,0xDF,
+0xFF,0xFB,0x7E,0x7F,0xB7,0x7E,0xFF,0xFE,
+0xFF,0xCD,0xFF,0xFE,0x7F,0xFF,0xFC,0xFD,
+0x3F,0xFB,0xFB,0xF7,0xFF,0xFF,0xFB,0xF6,
+0x7D,0xFE,0x7F,0xFF,0xFC,0xFF,0xB9,0xFF,
+0xF9,0xFA,0xFE,0xBF,0xAF,0x5B,0xD6,0xED,
+0xAD,0x7B,0xF6,0xF9,0xBF,0xEF,0xF8,0xFA,
+0xFE,0xBF,0xFE,0xE6,0xFF,0xFF,0xF7,0xFD,
+0xFF,0x7F,0xBF,0xEF,0xF3,0xFF,0xFF,0x6F,
+0xF7,0xFE,0xFF,0xFF,0xF7,0xFD,0xFE,0xF7,
+0xEF,0xFF,0xFB,0xEF,0xFB,0x7E,0xDE,0xFE,
+0xFF,0xBF,0xFF,0xFE,0xFF,0xFF,0xFB,0xFF,
+0xFF,0xEF,0xFB,0x6F,0xFC,0x1F,0xFE,0xE7,
+0xFF,0xFF,0xFF,0xEF,0xFF,0xD3,0xB4,0xBB,
+0xFF,0xFF,0xFD,0xBF,0x6F,0xE3,0xFE,0xFF,
+0xBF,0xFC,0xBF,0xF7,0xCF,0xF7,0xFD,0xFF,
+0x2F,0xDF,0xAB,0xEA,0xFF,0xDF,0xE7,0xEA,
+0x9A,0xAF,0xEF,0xFB,0xFE,0xFF,0xF5,0x3F,
+0xFD,0x7E,0xFF,0xD7,0xF5,0xFB,0xFF,0xFD,
+0xF7,0xFF,0x7F,0xFE,0xF7,0xFD,0xFF,0xD7,
+0xFF,0xD7,0x7F,0xEE,0x7F,0xFA,0x79,0xFE,
+0x2F,0x8B,0xE6,0xF9,0xFE,0x3F,0x9E,0xF9,
+0xBE,0x2F,0x0B,0xE7,0xF9,0xFE,0x2F,0x9F,
+0xFD,0xFF,0xFE,0x7D,0x7F,0x5F,0xD7,0xFF,
+0xFF,0x7F,0xFF,0xFD,0xFF,0x7F,0x5F,0x97,
+0xFF,0xFD,0x7F,0x5F,0xFF,0xE3,0xFF,0xFF,
+0xFA,0xFE,0xBF,0xAF,0xFB,0xFB,0xFF,0xFF,
+0xCF,0xEB,0xFE,0xBF,0xAF,0xFF,0xFA,0xFE,
+0xBF,0xFF,0x87,0xFF,0xFF,0xF5,0xFF,0xFF,
+0xFF,0xFF,0xFD,0xFF,0x7F,0xFF,0xFF,0xFF,
+0xFB,0xFF,0xFF,0xF5,0xFF,0xFF,0xFE,0x0F,
+0xFF,0xFD,0xEB,0xFF,0xFF,0xF7,0xFF,0xEF,
+0x7B,0xDF,0xFE,0xFF,0xFF,0xDF,0xF7,0xFD,
+0xEB,0x7F,0xDF,0xFF,0x5F,0xFF,0xFF,0xFF,
+0xFF,0xFD,0xBF,0xFF,0x7E,0xFA,0xBF,0xC7,
+0xDB,0xF7,0xBD,0x3F,0xFB,0xFF,0xF6,0xFF,
+0xFA,0xAF,0xFF,0xEB,0xFA,0xFE,0x3F,0x2F,
+0xEA,0xFA,0x3E,0xAD,0xC9,0xBA,0xF6,0xAD,
+0xAF,0xEB,0xFA,0xF6,0xBF,0xFE,0x7F,0xFF,
+0xFF,0xFD,0xFF,0xF1,0x7F,0x3F,0xCF,0xF1,
+0xEF,0xFF,0x7F,0xFF,0xBC,0xDF,0xDF,0xF7,
+0xDD,0xFF,0xE0,0x7F,0xFF,0xFF,0xFE,0xFF,
+0xFA,0xEC,0xBB,0x7F,0x5F,0xFF,0xFB,0xEC,
+0xFF,0xEF,0xB7,0xFF,0xF7,0xFF,0xFF,0xB5,
+0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xEE,0xDF,
+0x5F,0xDF,0xDE,0xFF,0xAE,0xE7,0x77,0xFF,
+0xFF,0xDF,0xF7,0xFF,0xE3,0xFF,0xFA,0xBB,
+0xFE,0xFF,0xAF,0xFD,0xFB,0xFE,0xBF,0xAB,
+0xF9,0xFE,0xFF,0xBF,0x7F,0xBF,0xFE,0xBD,
+0xFE,0xD7,0xFF,0x9F,0xFD,0xFF,0xBE,0xEF,
+0xFF,0xEE,0xFD,0xBB,0x5B,0xEF,0xFF,0x7F,
+0xEF,0xFF,0xEF,0xFF,0x7F,0xFF,0x4F,0xFF,
+0xEF,0xFB,0xBC,0xFC,0xFF,0xFF,0xFF,0xFE,
+0xFE,0xFD,0xFA,0xFE,0xFB,0xFF,0xFD,0xF3,
+0xFB,0xFF,0xF8,0x5F,0xFF,0xFF,0xD7,0xF5,
+0xFD,0xDF,0xEF,0xFF,0xF3,0xDC,0x5F,0xCE,
+0xF5,0xBD,0xFF,0xFF,0xD7,0xFF,0xFF,0xF9,
+0x3F,0xFF,0xDF,0xF7,0xFF,0xFE,0xFF,0xFD,
+0xFF,0xFB,0xFF,0xF7,0xB9,0x7D,0xFE,0xDF,
+0xFF,0xFF,0xFF,0xFF,0xF9,0x7F,0xFF,0xFE,
+0xFF,0xFF,0x7F,0xFF,0xFE,0xFF,0xFF,0xF7,
+0xF6,0xFF,0xBF,0xF1,0xF8,0xFF,0xFF,0xFF,
+0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF,
+0x9B,0xFB,0x7F,0xFF,0xFF,0xFF,0xC1,0xFF,
+0xDF,0xFF,0x3F,0x5F,0xD7,0xBF,0xEF,0xBB,
+0xDE,0xEE,0xFF,0x7F,0xDF,0xFF,0xFE,0xF5,
+0x7F,0xDF,0xFF,0x99,0xFF,0xFF,0xFA,0xFF,
+0xBF,0xFD,0xEB,0x7A,0xFF,0xB7,0xFE,0xFE,
+0xFF,0xFF,0xEF,0xFF,0xFF,0xFD,0xBF,0xFF,
+0x97,0xFF,0xFD,0xF7,0xFF,0x7F,0xF7,0xFF,
+0xFF,0xFD,0x5F,0xFE,0xF3,0xF9,0xDF,0xDF,
+0xFF,0xFF,0xFC,0xFF,0xFF,0x83,0xFF,0xFF,
+0xFE,0xFF,0x9E,0xEC,0xFB,0xEE,0xFF,0x9F,
+0xBF,0xEF,0xFF,0xFE,0xED,0x7B,0xFF,0xFF,
+0xFF,0xF1,0x5A,0xFF,0xFF,0xFD,0xFF,0x7C,
+0x69,0x3B,0xDF,0xFF,0x7F,0x1F,0xDF,0xFF,
+0xFD,0xBA,0xFF,0xFF,0xFB,0xFF,0x5B,0xBD,
+0xFF,0xFF,0xFF,0xFF,0xD7,0xB6,0xED,0xE9,
+0xFF,0xD6,0xBD,0x6F,0x5F,0xFB,0xFF,0xEF,
+0xFF,0x5F,0xFE,0xF6,0x6F,0xFF,0xFF,0xFF,
+0xFF,0xF7,0xEB,0x7A,0xDF,0xFF,0x9F,0x7F,
+0x7F,0xFF,0xB7,0xFF,0xFF,0xFE,0xDF,0xFF,
+0x6C,0xFF,0xFB,0xFF,0xBB,0x6F,0xEB,0xFE,
+0xCC,0xF7,0xA5,0xFA,0x5C,0xF5,0x75,0xBB,
+0xB7,0xDF,0xFE,0x6F,0x5F,0xC5,0xBF,0xFD,
+0x7B,0xFE,0xFF,0x95,0xE7,0x29,0xCF,0x4F,
+0xF5,0x91,0xEE,0x6B,0xDF,0xEF,0xFD,0x54,
+0xF5,0xBD,0xB1,0xFF,0xEF,0xEE,0xFB,0xBE,
+0xBF,0xAF,0xFE,0xDE,0xBD,0x6F,0xDA,0xF2,
+0xFF,0xAF,0xBE,0xFF,0xFF,0xFD,0x7E,0xA7,
+0xFF,0xF7,0xFF,0xBF,0xEF,0x7B,0xF6,0xFD,
+0xBD,0x4A,0xF2,0x85,0x85,0xBF,0x5B,0xFE,
+0xB5,0xFD,0xFA,0xFF,0x4F,0xFF,0xFE,0xDF,
+0xFF,0xED,0xFF,0xBF,0xFF,0xBF,0x7F,0xFE,
+0xFF,0xB7,0x6D,0xFF,0xF7,0xBF,0xBF,0xEF,
+0xFD,0x1F,0xFF,0xFE,0x7D,0xFF,0x67,0xFF,
+0xFF,0xFF,0x3F,0x7F,0xFE,0xBF,0xFF,0xE7,
+0xDF,0xE7,0xFF,0xEF,0x6B,0xFC,0x1F,0xFF,
+0xBF,0xEF,0xFB,0xFE,0xDE,0xBF,0xAF,0xFA,
+0xFF,0xB6,0xEF,0xF9,0xFE,0xFF,0x8F,0xEF,
+0xDB,0xEF,0xAB,0x6F,0xFB,0xFE,0xFF,0xFF,
+0xEF,0xFD,0xFF,0x7F,0xFF,0xFF,0xDE,0xFF,
+0xFF,0xEF,0xFF,0xFF,0xFF,0x3F,0xFF,0x6C,
+0xFF,0xBF,0xFB,0xFF,0xFE,0xFF,0xFB,0xFE,
+0xDF,0xFF,0xFF,0xEF,0xFF,0xFF,0xBF,0xFF,
+0xFF,0xFE,0xFB,0xFF,0xD5,0x7F,0xFF,0xFF,
+0xEF,0xFB,0xFF,0xFF,0xBF,0xEF,0x43,0xB5,
+0xFD,0x6F,0xCF,0xD6,0xBE,0x3F,0x7F,0xDB,
+0xFE,0xC3,0xFF,0xFD,0xFF,0xAF,0xEB,0xFB,
+0xFC,0xFF,0x3E,0xEF,0xE8,0xFA,0xBD,0xCD,
+0xAA,0xFE,0xFE,0x7D,0xCF,0xFF,0xB7,0xFF,
+0xF7,0xFF,0xFF,0xFF,0xFD,0xFF,0x75,0xCD,
+0x52,0xD7,0xFD,0xFB,0xF7,0xDD,0xFB,0xEF,
+0xEB,0xFF,0xFF,0x4F,0xFF,0xBF,0x9F,0xE7,
+0xF9,0xFC,0x7F,0x8B,0xC3,0xF9,0xAF,0x8F,
+0xE7,0xE9,0xBE,0x7F,0x9F,0xE6,0xF9,0xFC,
+0x5F,0xFF,0xFF,0xF7,0xFD,0xFF,0x7A,0x5F,
+0xD7,0xED,0xFF,0xFF,0xD7,0xFF,0xDD,0x7F,
+0xE7,0xFF,0xFC,0xFF,0xFC,0x3F,0xFF,0xFF,
+0xFF,0xFB,0xFF,0xFE,0xBF,0xAF,0xFF,0xFD,
+0xFF,0xEF,0xFF,0xEB,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xF7,0x7F,0xFF,0x7F,0xDF,0xFF,0xFD,
+0xFD,0x7F,0xFE,0xF7,0xFD,0x7F,0xDF,0xFF,
+0xFD,0xFF,0xFF,0xDF,0xFB,0xFF,0xEE,0xFF,
+0xFB,0xFF,0xF7,0xFD,0xFF,0x7A,0xDF,0xF5,
+0xFD,0xFA,0xDF,0xF7,0xFC,0xFF,0x7F,0xDF,
+0xBF,0xED,0xFF,0xC9,0xFF,0xDF,0xFF,0xBF,
+0x2F,0xFB,0xFF,0xBC,0xAD,0xFF,0xF7,0xFF,
+0xFF,0xEF,0xD3,0xFF,0x7D,0xBF,0x6F,0xFF,
+0xFA,0xFF,0xFE,0xBF,0xAE,0xEA,0xFA,0xBE,
+0xAD,0xA5,0xEB,0xCE,0xBF,0xA7,0xEB,0x5A,
+0xDE,0xBD,0xAF,0x6B,0xFD,0x57,0xFF,0xFF,
+0xF4,0x7F,0x1F,0x7F,0xFD,0xFF,0x7F,0x36,
+0xF0,0xDF,0x79,0xFF,0xFF,0xFF,0xF7,0xFD,
+0xBF,0xFF,0x87,0xFF,0xFB,0xF3,0xFC,0xFF,
+0xFF,0xFF,0xFF,0x7E,0xFF,0xBF,0xDF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFD,0xBF,0xF8,0x9F,
+0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFD,
+0xF7,0xFC,0xBD,0xFF,0xFE,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFB,0xF9,0xBF,0xFF,0xFF,0xEB,
+0xE2,0xFE,0xFF,0xBF,0xEF,0xA9,0xBA,0x2F,
+0xEB,0xF9,0xFE,0x77,0xDF,0xF7,0xFF,0xFF,
+0xF9,0x7F,0xFF,0xFF,0x7F,0xEF,0xD7,0xFF,
+0xFD,0xFF,0xFB,0xF5,0xFF,0xBF,0x6F,0xDF,
+0xFF,0xFF,0xFD,0xFF,0xFF,0xF0,0xFF,0xFF,
+0xFF,0x3F,0xCF,0xFF,0xBA,0xEE,0x9B,0xBF,
+0xEE,0xD7,0xFE,0xCD,0xEF,0xFF,0xDF,0xBF,
+0xFF,0xFF,0xC5,0xFF,0xFF,0xFD,0x7F,0x4F,
+0xFD,0xF6,0xD9,0xFF,0x4F,0xD6,0xFD,0xBF,
+0x6E,0xFF,0xFF,0xF4,0x7F,0xFF,0x7F,0x8B,
+0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xF9,0xFE,
+0x37,0xFF,0xD9,0xFB,0xF5,0xAF,0xFD,0xFF,
+0xFF,0xFB,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,
+0xFB,0xF7,0xFF,0xFD,0xFF,0x7C,0xFA,0x7E,
+0x4F,0xFC,0xDF,0x1D,0xC7,0xFF,0xFF,0xFF,
+0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0xFD,0xFB,
+0xFF,0xFF,0xFE,0xFE,0xFC,0xFF,0x7F,0x7F,
+0xBF,0xEF,0xFE,0xFF,0xFF,0xFF,0x5F,0xFD,
+0xFF,0xFF,0xFF,0xFD,0x6F,0x5A,0xD7,0x7B,
+0xBE,0x5F,0xFE,0x39,0xFF,0xF7,0xFF,0xF7,
+0xFD,0xFE,0xAA,0x1F,0xFF,0xFF,0xFF,0xFF,
+0xFE,0xFE,0xAB,0xAF,0xFD,0xFE,0xBF,0xFF,
+0xF7,0xFF,0x7F,0xFE,0x8F,0xE3,0xFB,0xEE,
+0x7F,0xFF,0xFF,0xFF,0xFF,0xEB,0xFB,0xFF,
+0xFD,0xBF,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFB,0xE4,0x3F,0xFF,0xDF,
+0xFF,0xFF,0xFF,0xFF,0xF3,0xEF,0xBB,0xFB,
+0xBF,0xEF,0xBB,0xFF,0xD7,0xBF,0xFF,0xFF,
+0xFF,0x29,0xAF,0xF7,0xFF,0xFF,0xFB,0xFF,
+0xFB,0xE6,0xFF,0x0F,0xFB,0x3F,0xDF,0x0F,
+0xFF,0xAF,0xFF,0xFF,0xFF,0xF5,0xC3,0xDF,
+0x5F,0xFF,0xFF,0xFF,0xFE,0x6B,0xCA,0xBE,
+0xBC,0xFF,0x9F,0xF2,0xBF,0xFF,0xFE,0xFA,
+0xFF,0xFF,0xEF,0x16,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFC,0xDF,0x97,0xFD,0x79,0xFF,0x37,
+0xE7,0x7F,0xFF,0xFF,0xB5,0xFF,0xFF,0xF6,
+0x2F,0xFF,0xFD,0xFB,0xFE,0xFF,0xFF,0xFD,
+0x5F,0x57,0x5F,0xFF,0xDB,0x52,0xDF,0xFF,
+0xFD,0xBF,0xFF,0xFF,0xFC,0xDB,0xFF,0x7B,
+0xB5,0xFD,0x7F,0xFF,0x71,0x9C,0x6E,0xFF,
+0xF6,0x35,0xA5,0x9B,0xFF,0xFF,0xFD,0xFF,
+0xFF,0xDB,0x9E,0x7F,0xFE,0xEF,0xFB,0xFF,
+0xFF,0xBD,0xEF,0xFF,0xDE,0xB7,0xF9,0x4B,
+0xFF,0xF5,0xEF,0xFF,0xFF,0xFF,0xE8,0x7E,
+0xFF,0xEA,0xDF,0xF7,0xFF,0xFD,0x69,0x5B,
+0xFC,0x9F,0xEF,0x78,0xD6,0xFF,0xEB,0xEF,
+0xFF,0xFF,0xFF,0xE8,0xFF,0xFF,0xED,0xFF,
+0xFF,0xFF,0xFF,0xE3,0xF9,0xF6,0xBF,0xFF,
+0xFF,0xFE,0xDF,0xFF,0x7F,0xFF,0xFF,0xFF,
+0xD1,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFF,
+0xE7,0xF9,0xFF,0xBF,0x7F,0xD9,0xFF,0xFD,
+0xFE,0x7F,0xFF,0xFE,0xFF,0xF9,0xFF,0xFB,
+0xD6,0xDF,0xBF,0xEF,0x5B,0xD6,0xFF,0xBF,
+0xFB,0xF6,0xFF,0xBF,0xEF,0xF8,0xF6,0xDD,
+0xBE,0xFE,0x16,0xFF,0xBF,0xEF,0xFF,0xFE,
+0xFF,0xBF,0xEF,0xFF,0xFF,0xFF,0x6F,0xFB,
+0xFF,0xFF,0xFF,0x6F,0xF3,0xFF,0xF7,0xEF,
+0xFB,0xFF,0xBF,0xFF,0xEF,0xFE,0xFF,0xBF,
+0xFF,0xFF,0xFF,0xBE,0xBF,0xFF,0xEF,0xFF,
+0x7F,0xEF,0xFF,0xFD,0x17,0xFB,0x7B,0xFF,
+0xFF,0xFD,0x7F,0xDB,0xF6,0xF4,0x7F,0xFA,
+0xFE,0xF5,0xBF,0xEB,0xE3,0xF7,0xFF,0xFF,
+0xE9,0xBF,0xFF,0xAF,0xF7,0xFD,0xF3,0x7E,
+0x8F,0xA3,0xEA,0xFF,0xCB,0xF3,0xEE,0xFF,
+0xBF,0xEF,0xF7,0xF9,0xFF,0xFE,0x7F,0xFF,
+0xFF,0xFF,0xFF,0xF5,0xFB,0xF6,0xFF,0xF5,
+0x2F,0xFE,0xFB,0xD7,0xBF,0xFF,0xBE,0xDF,
+0x9F,0xFF,0xF0,0xFF,0xFF,0xF9,0xFE,0x7F,
+0x8F,0xA3,0xF8,0xFE,0x6F,0x9F,0xF9,0xF6,
+0x2F,0x9F,0xE7,0xF9,0xFE,0x2F,0x9F,0xE1,
+0xFF,0xFF,0xFF,0x7F,0xDF,0xF7,0xF5,0xFD,
+0x7F,0x7F,0xF5,0xFF,0x9F,0x5F,0xFB,0xFE,
+0xFF,0x7F,0xFF,0xFF,0xCB,0xFF,0xFF,0xFB,
+0xFE,0xFF,0xBF,0xAF,0xFB,0xFE,0xFF,0xDF,
+0xFE,0xFE,0xBF,0xF7,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xC7,0xFF,0xFF,0xFD,0xFF,0x7F,0xDD,
+0xF7,0xFD,0xFF,0xFF,0xD7,0xFF,0xFD,0x7F,
+0xFF,0xFB,0xFD,0xFF,0xFF,0xFE,0xEF,0x7F,
+0xFD,0xEF,0xFB,0xFE,0xFB,0xFD,0xFF,0x7F,
+0xDF,0xFD,0xFF,0x7A,0xDF,0xF7,0xFD,0xFF,
+0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xD3,0xF7,
+0xFF,0xFF,0x6F,0xDB,0xFF,0xFF,0xEF,0xCB,
+0xF4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
+0x29,0xFF,0xE8,0xDA,0x76,0x9F,0xAF,0x6A,
+0xDA,0xFE,0x35,0xEB,0xDA,0xD6,0xBF,0xAB,
+0xEB,0x7A,0xDE,0xBF,0xD7,0x7F,0xFF,0xFE,
+0xFF,0xBF,0xEF,0xFD,0xDF,0x77,0xBF,0xFD,
+0x37,0xEF,0xFF,0xEF,0xFF,0x3F,0xFF,0xFF,
+0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xF7,0x7E,
+0xDF,0xFF,0xFF,0xFF,0xFA,0xB7,0x7F,0xFF,
+0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0x89,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0x9F,0xFB,0xFF,0xFF,0xFF,0xE7,0xFF,
+0xFF,0xFF,0xFF,0xAA,0xFF,0xAB,0xFB,0xFA,
+0xEF,0xBF,0xFF,0xDF,0xFA,0x7B,0xB9,0xFE,
+0xFE,0xFF,0xFD,0xFF,0xF7,0xFE,0x3F,0xFF,
+0xB7,0xFF,0xF7,0xEE,0xFF,0x7F,0xEF,0xFF,
+0xFF,0x7F,0xFF,0x1F,0xFB,0xFF,0xBF,0xFB,
+0xFE,0xFF,0xBD,0xFF,0xFF,0x2F,0xFF,0xBF,
+0xFF,0x7F,0xDF,0xFA,0xFF,0xFF,0xFC,0xEE,
+0xF5,0xF3,0xBE,0xFB,0x0F,0xEF,0xF3,0xBE,
+0xEF,0xFC,0x5F,0xFF,0x5A,0xFF,0xF7,0xDF,
+0xFF,0xFF,0xFE,0xD5,0xFC,0x5F,0xFB,0xF2,
+0xFF,0xFF,0x2F,0xBB,0xF3,0xFF,0xFF,0xBF,
+0xFF,0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,
+0xBF,0xFF,0xFF,0xFD,0x7B,0xFF,0xDF,0xB9,
+0xFF,0xFB,0xFF,0xD8,0x7F,0xFF,0xFF,0xFF,
+0xFB,0xFF,0xFC,0x7F,0x1F,0xBF,0xE0,0xDF,
+0xF7,0xEF,0xFF,0xFD,0x7F,0xFE,0xDF,0xFF,
+0xE0,0xFF,0xFF,0xFD,0xEF,0xFB,0xFF,0xFE,
+0xF7,0xDF,0xFF,0xEB,0x5F,0xFF,0xF7,0xFF,
+0xFF,0xFF,0xFF,0xBF,0xFF,0xFD,0xFF,0xFD,
+0xFF,0xFF,0xFF,0xF7,0xFD,0xFF,0x3B,0xDC,
+0xFD,0x6D,0x7B,0x5F,0x57,0xF5,0xFD,0x7F,
+0x5F,0xFF,0xB1,0xFF,0xEB,0xFF,0xFF,0xFF,
+0xFB,0xFB,0xFE,0xFF,0xBF,0xFB,0xBE,0xFF,
+0xBF,0xEF,0xFB,0xFE,0xFF,0xAF,0xFE,0xF7,
+0xDF,0xDF,0xFF,0xFF,0xFF,0x7F,0xCF,0xF3,
+0xF8,0xFF,0xD7,0xFB,0xFF,0x5F,0xBF,0xF7,
+0xFB,0xFF,0x7F,0xFE,0x23,0xFF,0xFF,0xFE,
+0x7F,0xF3,0xFF,0xFB,0xFE,0xFF,0xFF,0xF3,
+0xFF,0xFF,0xF5,0xF9,0xFF,0x3F,0xFF,0xFF,
+0xF0,0x9A,0xFF,0xBE,0x7F,0xFF,0xFC,0xF9,
+0xFF,0xFD,0xAF,0xEB,0xFE,0xBF,0xFF,0xCF,
+0xF3,0xFE,0x7F,0xFF,0xFF,0x5B,0xBD,0xFF,
+0xBC,0xEB,0xFF,0xD7,0xD4,0xAF,0xAF,0xFD,
+0xFF,0xCF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7,
+0xFD,0xFE,0xFF,0x6F,0xFF,0xFB,0xFF,0xFF,
+0xFF,0xFD,0x7F,0x5E,0xFD,0xBF,0xDB,0xF6,
+0xFD,0xBF,0x6F,0xFB,0xEE,0xFD,0xFF,0x7A,
+0xFF,0xFA,0xFB,0xFF,0x3F,0xFB,0xB7,0x5F,
+0xD6,0xF7,0x1F,0x71,0xDC,0x77,0x1D,0xC7,
+0x31,0xDC,0x77,0xDF,0xF9,0xBF,0xF5,0x5B,
+0xF4,0xD7,0x9D,0xAE,0xFF,0xBF,0xFD,0xBF,
+0xDB,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6,0xFE,
+0x3D,0x81,0xFF,0xEB,0xFE,0xFE,0xFE,0xFF,
+0xEB,0x7A,0xDF,0x7D,0x77,0x7D,0xF5,0x79,
+0xDF,0x57,0xDD,0xF5,0x7D,0x7E,0xE6,0xFF,
+0xD6,0x3F,0xBF,0x7F,0xFF,0xD4,0xF5,0x3F,
+0xBF,0xFB,0xBE,0xEF,0xB3,0xEE,0xFB,0x9E,
+0xEF,0xBB,0xFE,0x8B,0xFF,0xFE,0xDF,0xB7,
+0xED,0xFF,0xF7,0xFD,0xFE,0xFF,0xEF,0xBB,
+0xEE,0xFF,0xBE,0xEF,0xBB,0xEE,0xEB,0xFC,
+0x1F,0xFF,0xFF,0xFD,0xFF,0xE7,0xFF,0xF7,
+0xFD,0xFF,0xEF,0xFE,0xFF,0xBF,0xEF,0xFB,
+0xFE,0xFF,0xBF,0xEB,0xFA,0x1F,0xFF,0xB7,
+0xEF,0x5B,0xFE,0xFF,0xAF,0xEB,0xDD,0xE7,
+0xDE,0x77,0x9D,0xE7,0x79,0xDE,0x77,0x9D,
+0xBF,0xE6,0x6F,0xFF,0xFE,0xFF,0xBF,0xEF,
+0xFB,0xFE,0xFD,0xBF,0x6F,0xF6,0xFD,0xBF,
+0x6F,0xDB,0xF6,0xFD,0xBF,0xFF,0x7E,0xFF,
+0xFF,0xFB,0xFE,0xFE,0xFF,0xEF,0xFB,0xFD,
+0xEF,0x7E,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,
+0xBD,0xEF,0xFF,0xD5,0xFF,0xBF,0xFF,0xEF,
+0xFE,0xFF,0xFC,0x3F,0x0F,0xE7,0xFE,0x7F,
+0x9F,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7,0xFE,
+0xF3,0xFF,0xFE,0xDF,0xAD,0xDF,0x67,0xEE,
+0xFB,0xBF,0xEF,0xFE,0xFF,0xBF,0xEF,0xFB,
+0xFE,0xFF,0xBF,0xEF,0xFF,0x23,0xFF,0xFF,
+0xFF,0xFF,0x7F,0xFF,0xF3,0xBC,0xDB,0xFE,
+0xFB,0xFF,0xFB,0xBE,0xF7,0xFB,0xFF,0x7F,
+0xDF,0xFF,0xCF,0xFB,0xFF,0x9F,0xE3,0xF9,
+0xBE,0x3F,0x8F,0xE7,0x79,0xFF,0x9D,0xE7,
+0xF9,0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x5F,
+0xFF,0xCF,0xF7,0xFF,0xFF,0xFF,0xDF,0xF7,
+0xFE,0x7F,0xE7,0xF9,0xFE,0x7F,0xFF,0xFF,
+0xFB,0xFE,0xFF,0xFF,0xBF,0xFF,0xBF,0xBF,
+0xFF,0xFE,0xFF,0xBF,0xEF,0xFF,0xFD,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFD,0xFF,
+0xFF,0x3F,0xFF,0xBF,0xFF,0xF7,0xFF,0xFF,
+0x7F,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xE8,0xEF,0xFF,
+0x5F,0xF7,0xBF,0xF9,0xFE,0xDF,0xB7,0xFD,
+0xFF,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7,
+0xFD,0xFF,0xDD,0xFF,0xF2,0xFF,0xBF,0xFF,
+0xFF,0xBF,0xFF,0xFF,0x2F,0xF2,0xFF,0xBF,
+0x2F,0x7B,0xD2,0xF7,0xBF,0x2F,0xFF,0xBB,
+0xFF,0xEE,0x8F,0xAF,0xEB,0xFA,0xFE,0x3F,
+0xA7,0x69,0xCE,0x8F,0xA4,0xEA,0xFA,0xEE,
+0xB7,0xAE,0xEB,0xFD,0xC7,0xFF,0xF7,0xF7,
+0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3E,0xF3,
+0x74,0xFF,0x3F,0x4F,0xFF,0xE7,0xFF,0x3F,
+0xFE,0xA7,0xFF,0xFF,0xDF,0xF7,0xB7,0xFF,
+0xF7,0xFF,0xBA,0xEF,0x37,0xEB,0xFB,0xFE,
+0xBF,0xFB,0xFE,0xF3,0xFF,0xF9,0xDF,0xFF,
+0xBF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,
+0xFD,0xDF,0xFF,0xFD,0xFF,0xFF,0xFB,0xFE,
+0xFD,0xFF,0xFB,0xBF,0xFE,0x3F,0xED,0xFF,
+0xDF,0xBE,0x3D,0xA7,0xFB,0xFA,0x3F,0xE6,
+0xE1,0xFE,0xFE,0x3F,0xEF,0xE3,0xDF,0xF5,
+0x7F,0xFE,0xFF,0x7E,0xFF,0xFF,0xFF,0xFF,
+0xEF,0x6F,0xF6,0xFF,0x7D,0xEF,0xD7,0xDE,
+0xFF,0x7D,0xEF,0xFF,0xF2,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0x7B,0xDE,0xFB,0xE6,0xEE,
+0xEF,0x37,0x6E,0xF3,0x7E,0xEB,0x37,0xEF,
+0xFF,0xC1,0xFF,0xFE,0xFF,0xF7,0xEF,0xFF,
+0xFF,0xFF,0xBF,0x3F,0xD2,0xDF,0xBF,0x2F,
+0x7B,0xE2,0xFF,0xFE,0x3B,0xBD,0xDB,0xFF,
+0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,
+0xFF,0xFB,0xFF,0xFF,0xBF,0xFF,0xFB,0xDF,
+0xFF,0xBF,0xFF,0xB7,0xFF,0xFF,0xBF,0xEF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,
+0x7F,0xFF,0x1F,0xEF,0xF1,0xFD,0xFF,0xF6,
+0xAF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,
+0xFF,0xFF,0xFE,0x9F,0xFF,0xFF,0xFF,0x77,
+0xEF,0xF7,0xFB,0xFF,0xFE,0x5F,0xFF,0xFF,
+0xBF,0xCF,0xFB,0xF7,0xDD,0xF7,0xF5,0xFF,
+0x5F,0xD5,0xF5,0xFD,0x7F,0x5F,0xD7,0xF5,
+0xFF,0xFB,0x0F,0xFF,0xFF,0xA9,0xEA,0x7A,
+0xFF,0xAF,0x8F,0xFE,0xDF,0xAF,0xEF,0xFB,
+0xFE,0xFF,0xBF,0xEF,0xFB,0xDF,0xE5,0x5F,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xBD,0x57,0xFF,
+0xFF,0x6F,0x77,0xBF,0xF7,0xFB,0xFF,0x7F,
+0xBF,0xF7,0xFF,0xFC,0xBF,0xFF,0x9F,0xFF,
+0xFF,0xEF,0xFF,0xFE,0xFF,0xFF,0xFF,0x1F,
+0xCF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xFB,
+0x65,0xAF,0xF3,0x7C,0xFF,0x3F,0xDF,0xFF,
+0xFD,0xE9,0xFE,0x7F,0xE7,0xFF,0xFE,0x7F,
+0xFF,0xFF,0xFF,0xFF,0xFD,0xE3,0xDF,0xFB,
+0xDB,0xF6,0xFD,0xEF,0x5B,0xFB,0xFF,0xDF,
+0xFC,0xFF,0x3F,0xDF,0xF3,0xFD,0xFF,0x7F,
+0xDF,0xEF,0x66,0xFF,0xDF,0xAD,0xEB,0x7A,
+0xDE,0xF7,0xF7,0xE7,0xD9,0xFD,0x9F,0x67,
+0xD9,0xF6,0x7D,0x9F,0xE7,0xDF,0xF5,0x47,
+0xFD,0x65,0x5B,0xD6,0xF4,0xFE,0xFF,0xEF,
+0xFF,0x6D,0xF6,0xDD,0xB7,0x6D,0xDB,0x76,
+0xDC,0xB7,0x7D,0xFA,0x9B,0xF6,0x6D,0x9D,
+0x67,0x59,0xDF,0xF7,0xDD,0xFF,0xEB,0xFE,
+0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,0xE3,
+0xD1,0x9F,0xFF,0xBD,0xBF,0xEF,0xFE,0xF7,
+0xBF,0xBF,0xF7,0xD7,0x7F,0xDD,0xF7,0x9D,
+0xDF,0x7F,0xDF,0xF7,0xFF,0xE0,0x7F,0xFD,
+0xC1,0xDF,0xF7,0xFD,0xC7,0x7F,0x7F,0xFB,
+0xFF,0xBB,0xEC,0xFB,0x3E,0xFF,0xBF,0xEC,
+0xFB,0xFF,0xD8,0x7F,0xBF,0x6C,0xFF,0xBE,
+0xFF,0xBF,0xED,0xFF,0xEF,0xFE,0xFB,0xBF,
+0xEF,0xFB,0xFE,0xFF,0xBF,0xEE,0xFF,0xC5,
+0xFF,0xAF,0x6F,0xFF,0xFC,0xFD,0x3F,0xE7,
+0xFF,0xFE,0xFF,0xEF,0xFB,0xFE,0xFF,0xBF,
+0xEF,0xFB,0xFE,0xBF,0x89,0xFE,0xFA,0xBA,
+0xFE,0xBF,0xAF,0xFB,0xF6,0xF5,0xD9,0x7D,
+0x97,0x65,0xD9,0x74,0x5D,0x97,0x65,0xD3,
+0xFE,0xD6,0xFF,0xBF,0xF7,0xFD,0xFF,0x7F,
+0xBF,0xCF,0xFB,0xFE,0xFF,0xEF,0xFB,0xFE,
+0xFF,0xBF,0xEF,0xFB,0xFF,0xF6,0x8F,0xFB,
+0xFF,0xEF,0xFB,0x7E,0xDB,0xFE,0xFF,0xBE,
+0xEF,0xEE,0xFB,0xBE,0xEF,0xBB,0xEE,0xFB,
+0xBE,0xFF,0xFF,0xDF,0xFF,0x43,0xFF,0xFF,
+0xFB,0xEF,0x5F,0xB7,0xFE,0x7F,0xE7,0xF9,
+0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0xF9,
+0xBF,0xFE,0xAF,0x77,0xFD,0xFF,0x2F,0xAF,
+0xA7,0xFE,0xFF,0xEF,0xFB,0xFE,0xFF,0xBF,
+0xEF,0xFB,0xFE,0xFF,0xF1,0x7F,0xEF,0xDF,
+0xFF,0x97,0xF5,0xEF,0xFF,0xDF,0xFF,0xFF,
+0xBF,0xFF,0xBF,0xFF,0xFF,0xFE,0xFF,0xFF,
+0xFF,0xE0,0xFF,0xFF,0xF9,0xFE,0x2F,0x8B,
+0xE3,0xF8,0xBE,0x77,0x9F,0xF9,0xDA,0x77,
+0x9D,0xE7,0x79,0xDE,0x77,0x9F,0xDD,0xFF,
+0xFD,0xFD,0x7F,0x5F,0xD7,0xFD,0xFF,0x7F,
+0xE7,0xFE,0x7F,0x97,0xE7,0xFB,0xFE,0xFF,
+0xBF,0xEF,0xFF,0xAB,0xFF,0xEF,0xFA,0xFE,
+0xBF,0xAF,0xFF,0xFA,0xFF,0xFF,0xDF,0xFF,
+0xFB,0xFF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF,
+0x67,0xFF,0xF7,0xF5,0xFF,0xFF,0xFF,0xDF,
+0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xBD,
+0xEB,0xFF,0xFF,0xF7,0xAD,0xEB,0xFF,0xDF,
+0xFD,0xFF,0x3F,0xDF,0xF7,0xFD,0xFF,0x7F,
+0xDF,0xFF,0x5F,0xFF,0xF7,0xFF,0xFF,0xFD,
+0xBF,0xFF,0xCB,0xF4,0xFF,0x7F,0xD3,0xF7,
+0xFD,0x3F,0x7F,0xD3,0xF7,0xFF,0xFC,0x3F,
+0xFF,0xEA,0xFA,0xBE,0xAF,0xAB,0xEB,0xBA,
+0xF4,0x95,0x6B,0x52,0xD4,0xAD,0x2F,0x4A,
+0xD2,0xF6,0xBF,0xD2,0x7F,0xF7,0x3F,0xFF,
+0xFF,0xF3,0x7F,0xFF,0xFF,0xF7,0xFF,0xBA,
+0xDF,0xFB,0xFD,0xFF,0xBF,0xFF,0xFB,0xFF,
+0xF8,0x7F,0xEA,0xFF,0xFE,0xFE,0xDF,0xFF,
+0xF7,0xFF,0x7F,0xBB,0xFF,0xFF,0xBF,0xDF,
+0xFB,0xFF,0xFF,0xBF,0xFF,0xB1,0x7F,0xFF,
+0xFB,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,
+0xCF,0xFE,0xFF,0xFF,0xEF,0xFF,0xF7,0xFF,
+0xFF,0xFF,0xF1,0xFF,0x69,0xBE,0xFA,0xBF,
+0xAF,0xE2,0xFF,0xFE,0xFD,0xAF,0xF3,0xFE,
+0xFF,0xBF,0xEF,0xFB,0xFC,0xFF,0xFF,0x07,
+0xFD,0x95,0xDB,0xDF,0x7F,0xDF,0xAF,0xFF,
+0xF7,0xAF,0x36,0xFE,0xBF,0x65,0xEB,0xF6,
+0xFE,0x9F,0x6F,0xFE,0x07,0xFF,0xCF,0xFF,
+0xF8,0xFE,0xFF,0xCF,0xFF,0xF6,0xFA,0xE7,
+0xFB,0xFE,0xFF,0xBB,0xED,0xF9,0xFF,0xFF,
+0xFF,0x5F,0xFF,0xFF,0xFF,0x75,0xFF,0xEF,
+0x7E,0xFD,0xE0,0xE8,0x5E,0xD3,0xE5,0xF9,
+0x3E,0x5F,0xD7,0xF7,0xFF,0xFA,0x2F,0xFB,
+0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0x7F,
+0x7F,0xD7,0xF5,0x7D,0x5F,0x57,0xD5,0xF5,
+0xEF,0xFF,0xF3,0x7F,0xFC,0x7F,0xFF,0xC7,
+0xF1,0xFF,0xFF,0x1F,0xCF,0xB0,0xFF,0x3F,
+0xCF,0xF3,0xFC,0xFF,0x3F,0xCE,0xFF,0xE4,
+0xFF,0xDF,0x7F,0xFE,0xF7,0xBB,0xFF,0xFF,
+0xDF,0xEF,0xEE,0xFF,0xBF,0xEF,0xFB,0xFE,
+0xBF,0xBF,0xEF,0xFF,0xD1,0xFF,0xFF,0xFF,
+0xFD,0xFB,0xFF,0xFD,0xFF,0xFB,0x9F,0xE9,
+0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0xBF,
+0xFF,0xB3,0xFF,0xFF,0xF7,0xFF,0xFF,0xAF,
+0xF7,0xFF,0xB6,0x3F,0xEB,0xFA,0xFE,0xBF,
+0xAF,0xEB,0xFA,0xFE,0xBF,0xFE,0xA7,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,
+0xFE,0x9F,0xF7,0xF9,0xFF,0x7F,0x9F,0xE7,
+0xFF,0xFF,0xFE,0xAF,0x6F,0xFF,0xFF,0xFF,
+0x9F,0xFF,0xDF,0xFF,0x7D,0x5F,0xDD,0xFF,
+0xFB,0xBF,0xE7,0xBB,0xFF,0xFB,0xDF,0x6D,
+0x5F,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xEB,0xF7,0xFF,0xE7,0xEF,0xF7,0xFF,0xFF,
+0x7F,0xFF,0xF7,0xFF,0xFC,0x8F,0xFF,0xEF,
+0xFD,0xFE,0xFF,0xBE,0xF4,0xF2,0x7D,0xD7,
+0xCF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xCF,0x6B,0xFF,0xBF,0x3F,0xFB,0xF2,
+0xFC,0x7F,0xEB,0xFF,0x9F,0xFA,0xFF,0xFF,
+0x3F,0xFF,0xF3,0xFF,0xFF,0xFD,0x70,0xF7,
+0xFF,0xFF,0xBF,0xFF,0xFB,0xD7,0xFE,0xF5,
+0x77,0xFF,0x15,0xDD,0x77,0xFD,0xFF,0x7F,
+0xDF,0xF7,0xFB,0xCD,0xBF,0xFF,0xFD,0xFF,
+0xFF,0xDF,0x37,0xCD,0xF9,0xEC,0xFE,0xEF,
+0xBB,0xF4,0xFB,0x3F,0x4F,0xB3,0xFF,0xFD,
+0xCB,0xFF,0xE9,0x7E,0x54,0x9F,0xE5,0x4B,
+0xB7,0xFF,0xDD,0x7D,0xC7,0x71,0xDD,0x77,
+0x5D,0xD7,0x75,0xCD,0x7F,0xD6,0xFF,0xD3,
+0xF6,0xF9,0x3F,0x6D,0x95,0xAF,0x7F,0xFE,
+0xFF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,
+0xFE,0xF6,0xC7,0xFF,0xAD,0x7B,0xCA,0xFF,
+0xBF,0xBF,0xEF,0xFD,0xE3,0xDF,0xB7,0xED,
+0xFB,0x7E,0xDF,0x37,0xED,0xE3,0xFB,0xDF,
+0xFF,0x52,0x5C,0x15,0xFD,0xCF,0x7F,0xDF,
+0xFE,0xEF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEC,
+0x7B,0xFE,0xFF,0xFE,0x3E,0x7F,0xDA,0xF7,
+0xFD,0xFF,0x7F,0xFF,0xFF,0xFB,0xEF,0xBB,
+0x6F,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFF,
+0xF7,0x7D,0xFF,0xD8,0xFF,0xFD,0xBF,0x7F,
+0xFB,0xFF,0xFF,0x9F,0xFB,0xFE,0x7F,0x9F,
+0xE7,0xF9,0xFE,0x7F,0x9F,0xEA,0x7F,0xF6,
+0xBF,0xBD,0x6A,0x5A,0xF6,0xE5,0xBF,0x77,
+0x5F,0x6D,0xDD,0x77,0x5D,0xD7,0x75,0xDD,
+0x77,0xFF,0xA5,0xBF,0xCF,0xFB,0xFF,0xFF,
+0xBF,0xCF,0xFB,0xFD,0xFF,0xBF,0xF3,0xFE,
+0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFD,0xAB,
+0xFF,0xBF,0xBF,0xFF,0xFB,0xFF,0x7F,0xEF,
+0xFF,0xBE,0xFB,0xEE,0xFB,0xBE,0xEF,0xBB,
+0xEE,0xFB,0xBF,0xFF,0xB5,0xFF,0xD0,0xBC,
+0xFD,0x2F,0x4B,0xF7,0xFF,0xFF,0x9F,0xF9,
+0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x9F,
+0xFA,0x8F,0xFD,0xAB,0xFA,0xDA,0xBF,0xAF,
+0xB3,0xFD,0xFF,0xBF,0xFB,0xFE,0xFF,0xBF,
+0xEF,0xFB,0xFE,0xF7,0xBF,0xFF,0x9F,0xFF,
+0x77,0xF7,0xBD,0xFD,0x77,0xDF,0xFF,0x7E,
+0xDF,0xED,0xBB,0xFE,0xFF,0xBE,0xEF,0xFB,
+0xFE,0xFF,0xFA,0x3F,0xFF,0xBE,0x6F,0x8F,
+0xE6,0xF9,0xFE,0x7F,0x9F,0xC7,0xFE,0x7F,
+0x9F,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7,0xFB,
+0x7F,0xFF,0x7F,0xCF,0xFF,0xFD,0xFF,0xFF,
+0xDF,0xFB,0xAF,0xBF,0xEF,0xFF,0xFE,0xFF,
+0x9F,0xEF,0xFB,0xFF,0xFC,0xFF,0xFB,0xFE,
+0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xF7,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xF5,0xFF,0xFF,0xFF,0x3F,0xDF,0xF7,
+0xFF,0xFF,0x7F,0xEF,0xFE,0xFF,0xBF,0xFF,
+0xFB,0xFF,0xFF,0xBF,0xEF,0xFF,0xB3,0x7F,
+0xFF,0x7B,0x5E,0xF7,0xFD,0xFF,0x7B,0x7F,
+0xF7,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F,
+0xDF,0xF7,0xFF,0x17,0xFF,0xFF,0xFF,0x7F,
+0xFF,0xFF,0xDD,0xF6,0xFC,0xBF,0xCB,0xF2,
+0xBC,0xBF,0x2F,0xCB,0xF2,0xFC,0xBF,0xFE,
+0x8F,0xFF,0xFA,0x7E,0xBF,0xA7,0xEB,0xDA,
+0xFC,0xBF,0xAF,0x7A,0xFE,0xBF,0xAF,0xEA,
+0xFA,0xFE,0xBF,0xAF,0xF4,0xDF,0xFE,0xFF,
+0xF3,0x3C,0x7F,0x3E,0xFF,0xCF,0xF8,0xBF,
+0x8F,0xE3,0xF8,0xFE,0x3F,0x8F,0xE7,0xE8,
+0xFF,0xFC,0x9F,0xFF,0xFF,0xCF,0xEB,0xB3,
+0xE7,0xFB,0x7B,0xF3,0xFE,0xFF,0xCF,0xDB,
+0xFB,0xFB,0xBF,0x6F,0x6F,0xDF,0xEC,0x7F,
+0xFF,0xFF,0xF7,0xFD,0xFD,0xFF,0xFF,0xFF,
+0xFF,0xB2,0xBF,0xFF,0xDE,0xFD,0xBD,0xEF,
+0xFB,0xF6,0xDF,0xEA,0xE7,0xDB,0xFE,0xBB,
+0xFF,0xEB,0xFB,0xBF,0x9F,0x8F,0xE8,0xFE,
+0x3F,0x8F,0xA3,0xF8,0xFE,0x3F,0x8F,0xFF,
+0xF8,0x7E,0xFD,0xFD,0x7F,0xFF,0xFB,0xCD,
+0xFF,0xFD,0xFF,0x5F,0xEF,0xFD,0xFF,0xFF,
+0xDF,0xF7,0xFD,0xFF,0xBE,0x90,0xFF,0xFF,
+0xEE,0xFF,0x3F,0xBF,0xF3,0xBB,0xFE,0xB7,
+0xAB,0xFA,0xFE,0xAF,0xAD,0xEA,0xFA,0xDE,
+0xAB,0xFF,0x63,0xFF,0xFE,0xF2,0xFF,0xB3,
+0xFF,0xDF,0xEE,0x7D,0xFF,0x03,0xF1,0xF4,
+0x3F,0x1F,0xC3,0xF1,0xEC,0x7F,0xFE,0x6F,
+0xFF,0xFB,0xFB,0xFF,0x9F,0xFF,0xBF,0xFF,
+0x7B,0x5F,0xFD,0xFF,0xDF,0xF7,0xFD,0xFD,
+0x7F,0x7F,0xDF,0xFE,0xCF,0xFB,0xFF,0xFF,
+0xAF,0xFB,0xFF,0x1F,0xEF,0xA5,0xFD,0xBF,
+0xDF,0xFB,0x7D,0xFF,0xBF,0xDF,0xFB,0xFF,
+0xFD,0x3B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,
+0xAF,0xF3,0xFF,0xFB,0x7F,0xBF,0xD7,0xFB,
+0xBF,0x7F,0xBB,0xF7,0xFF,0xF8,0x7F,0xFF,
+0xFA,0x5F,0xD7,0xFF,0xDF,0x7F,0xEF,0xFF,
+0xFF,0x7F,0xDB,0xF7,0xFD,0xFF,0x7F,0xDF,
+0xB7,0xFB,0xEC,0xFF,0xFF,0xF7,0xBF,0xEF,
+0xFD,0xFC,0xFB,0xFF,0xEF,0xF0,0xFE,0x3F,
+0x8F,0xE3,0xF8,0xFE,0x3F,0x8F,0xEF,0x8D,
+0xFF,0xFF,0xEF,0x7F,0xBF,0xFF,0xFB,0xFF,
+0xDB,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xEF,0xD8,0xFF,0x2E,0x7F,
+0xBE,0xEF,0xFE,0x6E,0xFF,0xBF,0xF9,0xFF,
+0xFF,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFC,0x66,0xBE,0x47,0xF3,0x7F,0xDF,0xFE,
+0x87,0x9F,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xD6,0x6F,0x7C,
+0xFB,0x4F,0xD2,0xFF,0xFD,0x2B,0xFE,0xFF,
+0xFF,0xFD,0x5F,0xD7,0xD5,0xF5,0x7D,0xFF,
+0xFF,0xFF,0xBF,0x9B,0xFF,0xFF,0xDF,0xB7,
+0xFF,0xFF,0xDF,0xFF,0x3F,0xCF,0xFE,0x7F,
+0xBF,0xEF,0xFB,0xFC,0xFF,0x3F,0xFF,0xD9,
+0xBF,0xFE,0x97,0xEC,0x8F,0xB7,0xFE,0x9B,
+0x7D,0xFD,0xB7,0xDD,0x77,0x1D,0xC7,0x71,
+0xDD,0x77,0x5D,0xD7,0xF3,0x6F,0xFD,0x3F,
+0x73,0xDD,0xAF,0xFD,0x7A,0xFF,0xFF,0xAF,
+0xFE,0xFD,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,
+0xEF,0x66,0x7F,0xFF,0xFF,0xBF,0xBF,0xFF,
+0xFB,0xFF,0xF7,0xDF,0xFD,0xFB,0x7D,0xDF,
+0xB7,0xCD,0xF3,0x7C,0x5F,0x3F,0x91,0x3F,
+0xFF,0x3D,0xEF,0x7B,0xFF,0xFC,0xFF,0xCA,
+0xEF,0xFE,0xFF,0xBD,0xEF,0xFB,0x1E,0xE7,
+0xBB,0xEC,0x7F,0xB3,0xFF,0xFD,0x9F,0xFF,
+0xFF,0xFE,0xFF,0xFF,0x7F,0xBF,0xFB,0xFE,
+0xFF,0xBF,0xEF,0xFB,0xEE,0xFB,0xBF,0xDF,
+0x67,0xFF,0xFF,0xBF,0xEF,0xDB,0xFF,0xBC,
+0xFE,0x7F,0xFB,0xFF,0x9F,0xEF,0xF9,0xFE,
+0x7F,0x9F,0xE7,0xF9,0xFE,0x87,0xFF,0xEE,
+0xFB,0xBE,0xE5,0xBF,0xEF,0xF9,0xD7,0x65,
+0xF7,0xDD,0xE7,0x7D,0xDF,0x77,0x5D,0xD7,
+0x7F,0xF8,0x9B,0xFE,0xFF,0xBF,0xEF,0xFB,
+0xFF,0xFF,0xBF,0xEF,0xFB,0xFF,0x7F,0xCF,
+0xF3,0xFC,0xFF,0xBF,0xEF,0xFF,0xDB,0x3F,
+0xEF,0xFB,0xFE,0xFF,0xDF,0xFF,0xFE,0xFB,
+0xBB,0xEF,0xBF,0xEF,0xBB,0xEE,0xFB,0xBE,
+0xEF,0xBB,0xFF,0xFC,0x7F,0xFD,0x3B,0x5B,
+0xD6,0xE5,0xFD,0x4F,0xC3,0xFB,0xFF,0xBF,
+0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFF,
+0xB4,0xFF,0xFA,0xBC,0x8F,0xB2,0xE9,0xD2,
+0x2E,0xCF,0xFB,0xFF,0xBF,0xEF,0xFB,0xFE,
+0xFF,0xBF,0xEF,0xFB,0xFF,0xEC,0xFF,0xFD,
+0xFD,0x7F,0xDF,0xF7,0xE4,0xDF,0x5F,0xFF,
+0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xC3,0xFF,0xEF,0xE6,0xF8,0xFE,
+0x3F,0x8B,0x83,0xF9,0xFE,0x7F,0xE7,0xF9,
+0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x17,
+0xFD,0xFF,0xFF,0xFF,0x7F,0x5F,0xF7,0x2C,
+0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xE7,0xF9,
+0xFE,0x7F,0x9F,0xFE,0x2F,0xFF,0xFF,0xEF,
+0xFF,0xFE,0xBF,0xEF,0xAD,0xFF,0xFF,0x7F,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFE,0xDF,0xFF,0xDF,0xFF,0xFD,0xFD,0x7F,
+0xDF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFA,0x3F,0xFE,
+0xF7,0xFD,0xEF,0x7A,0xFF,0xB1,0xBD,0xFF,
+0x7F,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,
+0xFF,0x7F,0xF3,0x27,0xFF,0xDF,0xFF,0xDD,
+0xFF,0xFC,0x9B,0xFF,0xCB,0xFC,0xBF,0x2F,
+0xCB,0xF2,0xFC,0xBF,0x2F,0xC9,0xFF,0xDE,
+0xFF,0xDF,0xAF,0xEB,0xDA,0xFE,0xBB,0xAF,
+0xEB,0xF8,0xF7,0xAF,0xE8,0xFA,0xFE,0xBF,
+0xAF,0xEB,0xF2,0xFF,0xFD,0xFF,0xFF,0xEF,
+0xBD,0xD7,0xBF,0xFF,0xFF,0xDE,0x8F,0xB8,
+0xDE,0x37,0x8D,0xA3,0x78,0xDA,0x3F,0x8F,
+0xFF,0xA1,0xFF,0xFF,0xFB,0xFB,0xFF,0xFF,
+0xFF,0xFF,0xA7,0xBD,0xFB,0x76,0xFD,0xBF,
+0xEF,0xDB,0xFE,0xBB,0xBF,0xFE,0x27,0x7F,
+0xFF,0xFE,0xFE,0xFD,0xF5,0xFF,0xEF,0xF5,
+0xDF,0x1F,0xE7,0xFD,0xFF,0x7F,0xDF,0xF7,
+0xFD,0xFF,0xFF,0xCD,0xFD,0xAE,0xFF,0xFA,
+0x3E,0x3F,0xAB,0xFD,0xF8,0x7E,0x8F,0xE3,
+0xF8,0xFE,0x3E,0x8F,0xE3,0xF8,0xFF,0xFE,
+0x1F,0xEF,0xDF,0xBF,0xFE,0xDE,0xDF,0xD9,
+0xFF,0xDF,0xBC,0xFF,0xFF,0x7F,0xFF,0xEF,
+0xFD,0x7F,0xDF,0xF7,0xF9,0x3F,0xFE,0xFF,
+0xFF,0x6F,0xFE,0xDE,0xBF,0xF7,0xED,0xEA,
+0xFD,0x8F,0x83,0xF8,0xEA,0x3F,0x8F,0xEF,
+0xFF,0xF4,0x7F,0xFF,0xEF,0xEF,0x7B,0xF3,
+0xF1,0x5F,0xFF,0xFF,0xF1,0x3B,0x7F,0xDF,
+0xF7,0xFD,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,
+0xFF,0xFF,0xF7,0xFF,0x6F,0xFF,0x7F,0xFF,
+0xFF,0xF7,0xDE,0xF7,0xBF,0xEF,0xFB,0xF7,
+0xFD,0xFF,0xFF,0xF5,0xFA,0xFF,0xFF,0xFB,
+0xE7,0xFF,0xF3,0xF8,0x7F,0xF3,0xDF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xEF,
+0xBB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,
+0xFF,0x7F,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xCF,0xFF,0x37,0xFF,0xFF,
+0x7F,0xDF,0x77,0x5D,0xE7,0xFC,0xFF,0xBF,
+0xF7,0xF5,0xFB,0xFF,0xFF,0xD7,0xF5,0xFB,
+0xFF,0xFF,0x45,0xFD,0x7F,0xEA,0xFD,0xBE,
+0xBF,0xDF,0xF7,0xFF,0xFF,0xDB,0xFB,0xFE,
+0xFF,0xBF,0xEF,0xFF,0xFF,0xFF,0xFB,0x5F,
+0x7F,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFE,0xFF,0xEF,0xFD,0xFF,0x7F,0xDF,
+0xFF,0xEF,0xFB,0xF8,0x0F,0xF3,0xFF,0xF9,
+0x2E,0xFB,0xFE,0xFC,0xF3,0xEF,0xFF,0xFF,
+0xBF,0xFF,0xFB,0xE7,0xFF,0xFE,0x7E,0xFF,
+0xC0,0x6B,0xCF,0xFF,0x34,0xDF,0xF1,0xFD,
+0xFF,0xEF,0xFF,0xFF,0xFF,0xDF,0xF7,0xFD,
+0xCF,0x7F,0x9C,0xFD,0xFD,0x6C,0xF7,0xFF,
+0xF6,0xFD,0xEB,0x2B,0x9F,0xFF,0xFC,0xFE,
+0x7E,0xFF,0xFF,0xFF,0xFF,0xD7,0xF3,0xF7,
+0xFF,0xFB,0xE1,0xBF,0xFF,0xEB,0x7A,0xDE,
+0xD7,0xFB,0xFF,0xF9,0xFE,0xFF,0xFF,0xF3,
+0xDE,0x7F,0xFD,0xE7,0x7F,0xFF,0xFD,0xBB,
+0xFF,0xFF,0x7E,0xCC,0xF6,0xAF,0x5F,0x7F,
+0xFE,0xF4,0x7D,0xF7,0xFD,0xBB,0x6E,0xDB,
+0xB7,0xFF,0xF7,0xDF,0x66,0xFF,0xFF,0xF7,
+0x3D,0xCF,0xDE,0xBD,0xFF,0xFF,0xDE,0xDB,
+0x8D,0xF7,0x7E,0xDF,0xB7,0xEF,0x7F,0xFF,
+0xF6,0x87,0xFF,0xFF,0xEF,0xFE,0xDE,0xBF,
+0xFF,0xFF,0xFF,0xBB,0xEF,0xFD,0xFF,0x7B,
+0xDE,0xF7,0x3F,0xFF,0xBF,0xFB,0xDB,0xFF,
+0xF2,0xB6,0xFD,0xBD,0x7F,0xE7,0xFF,0xFF,
+0xFF,0x6F,0xF7,0xFF,0xFF,0xFF,0xFE,0x77,
+0xFF,0xBF,0xF8,0xAF,0xFF,0xDF,0xBF,0xFF,
+0xBF,0x7F,0xFB,0xFF,0xFF,0xFF,0xDB,0xFE,
+0xFF,0xBF,0xFF,0xFA,0xFF,0xFD,0xFF,0xF6,
+0x7F,0xFF,0x9F,0xFF,0xFF,0x3F,0xEF,0xF8,
+0xEE,0x7E,0x9F,0xBA,0xFE,0xBF,0x8F,0xEF,
+0xFE,0xFE,0xF9,0xFF,0xFA,0x7F,0xFE,0x7E,
+0xBF,0xAF,0xFB,0x96,0xFD,0x9F,0xEF,0x5E,
+0x65,0xBE,0xEF,0x5B,0xB6,0xFF,0xBE,0xE3,
+0xFF,0xB5,0xBF,0xFF,0xFD,0xFF,0x7F,0xFF,
+0xEF,0xDF,0xFE,0xFF,0xBF,0xFB,0xFE,0xFF,
+0xBF,0xCF,0xFF,0xFF,0xFF,0xFD,0x9B,0xFF,
+0xFE,0xFB,0xFE,0xDF,0xFF,0x7F,0xFF,0xF7,
+0xFE,0xFF,0xDF,0xFB,0xFB,0xFE,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xB7,0xFE,0xFA,0xFF,0xAB,
+0xEF,0xFF,0xFD,0xB5,0x7B,0x7F,0xFB,0xF7,
+0xFD,0xFF,0xFF,0xDD,0xFF,0xEF,0x8F,0xFF,
+0x2F,0xFF,0xFB,0x7C,0xFF,0x3F,0xDF,0x73,
+0xEB,0xFE,0x3F,0xFF,0xEF,0xFB,0xFE,0xFF,
+0xEF,0xFD,0xFF,0xBF,0xFD,0x0F,0xFF,0xFF,
+0xFF,0xF5,0xF9,0xFF,0x7F,0xD7,0xFD,0xFF,
+0xDF,0xFF,0xF7,0xFB,0xFF,0x7F,0xBF,0xFF,
+0xFF,0xF0,0x9F,0xFF,0xFE,0x7F,0x8B,0xE3,
+0xF9,0xDE,0x27,0x9B,0xE6,0xBE,0x7F,0x9B,
+0xC3,0xF8,0xDE,0x7F,0x9D,0xE7,0xFE,0x7F,
+0xFF,0xFF,0x5F,0xD7,0xFF,0xFF,0xFF,0x4F,
+0xFB,0xFF,0xFF,0x7F,0xFF,0xAF,0xFF,0x9F,
+0x7F,0xFB,0xFF,0xE8,0xFF,0xFF,0xFE,0xBF,
+0xAF,0xFF,0xFF,0xFE,0xBF,0xEF,0xF7,0xFF,
+0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,
+0xFC,0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xFF,
+0xFD,0x3F,0xCF,0xFF,0xFF,0xFF,0xFF,0xF7,
+0xFF,0xFD,0x7F,0xFF,0xFF,0x93,0xFF,0xFF,
+0x7A,0xDF,0xF7,0xFF,0xFF,0x7B,0x7F,0xB7,
+0xEF,0xFF,0xFF,0xFD,0xBF,0xFD,0xFB,0xFF,
+0xF7,0xFF,0xD7,0xFF,0xFF,0xFF,0xFC,0x9F,
+0x6F,0xCB,0xFF,0xF4,0xBB,0xDF,0xD6,0xFD,
+0xBF,0x2F,0xD3,0xF7,0xFF,0xDF,0xFF,0xCF,
+0xFF,0xFA,0xBE,0xBD,0xAF,0x6A,0xDA,0xBE,
+0xBB,0xAB,0x3A,0xBE,0x2D,0xAE,0xEB,0xDA,
+0xF6,0x3F,0xAD,0xF5,0xDD,0xFF,0xCF,0xF1,
+0xFF,0xF9,0x7F,0xFF,0x73,0xFE,0xFF,0xCF,
+0xC3,0xF4,0xF7,0x2F,0xF3,0xFF,0xFC,0xFF,
+0x7C,0x1F,0xFF,0x3F,0x4F,0xFF,0x7E,0xFF,
+0xEF,0xBD,0xF6,0xFE,0xFF,0x2B,0xEF,0xDC,
+0xFB,0xFD,0xFF,0xFB,0xFF,0xEA,0x7B,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFB,0xF7,0xDF,0xFF,
+0xE3,0x7D,0xFF,0xB7,0xFF,0xBF,0xFF,0xFF,
+0xDF,0xFF,0xF8,0xFF,0xBF,0xFF,0xBF,0xEB,
+0xE7,0xFA,0xFE,0x3D,0xBF,0xE9,0xFC,0xBF,
+0xFF,0xFA,0xFB,0xFE,0xFF,0xFF,0xFF,0xD9,
+0xFF,0xFF,0xFF,0xF6,0x7F,0xFF,0xF6,0x7D,
+0xFF,0xDF,0xCF,0xFD,0xBF,0xFB,0xEF,0x7E,
+0xFF,0x7F,0xFF,0xFF,0xD3,0xFF,0xFD,0xFB,
+0xFF,0xFB,0xFF,0xFF,0xFF,0xEF,0xFF,0xBF,
+0xFE,0xFF,0xF7,0xEF,0xFF,0xFF,0xFF,0xFB,
+0xFF,0x87,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,
+0x7B,0xFE,0xFF,0xFE,0x3B,0xF7,0xF7,0xFF,
+0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,
+0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7,
+0xFF,0xFF,0xAD,0xFF,0xFE,0xF7,0xFF,0xFF,
+0x5F,0xFF,0xFF,0xDF,0xFF,0xFD,0xFF,0xF5,
+0xFF,0xDF,0xFF,0xBD,0xFF,0xE9,0xFF,0xC7,
+0xF3,0xFF,0xFF,0xF7,0xFF,0xF3,0xFF,0xF8,
+0x3B,0xFF,0xFF,0x7B,0xDF,0xBF,0xFB,0xEF,
+0xFB,0xFF,0xFB,0xF7,0xF7,0xBB,0xFF,0xFF,
+0xFF,0xFF,0xFB,0xFF,0xFE,0x7F,0xF3,0x7F,
+0x5E,0xB7,0xBF,0xFD,0x7F,0xFF,0xF9,0x7F,
+0xFB,0xFF,0xEB,0xFD,0x7F,0x7F,0xFF,0xEF,
+0xFB,0xE0,0x3F,0xFE,0xBF,0xBF,0xDF,0xFF,
+0x7E,0xFF,0xF7,0xFF,0xFF,0xFE,0xBF,0xFF,
+0xDB,0x78,0xFF,0xFF,0xFF,0xEE,0xA1,0xBF,
+0xF5,0xDE,0xFB,0xF7,0xFF,0xFB,0xFF,0xFF,
+0xFF,0xFF,0xFB,0xFF,0xFF,0xD7,0xFF,0xFF,
+0xFF,0xFF,0xEF,0xF0,0xFF,0xFF,0xFF,0xF3,
+0xF7,0xFF,0xEF,0xFF,0xE7,0xCF,0xFF,0xFB,
+0xFF,0xEF,0xFF,0xFF,0x9F,0x9F,0xEF,0xFC,
+0x16,0xBF,0xFE,0xF3,0xE4,0xFF,0xFF,0xC6,
+0xFF,0xE7,0xFF,0xFF,0xFD,0xFF,0xBF,0xFF,
+0xFF,0x3F,0xFF,0xBF,0xD6,0xAF,0x7F,0xFE,
+0x6B,0x7E,0x7F,0xFF,0xAF,0xFF,0xFF,0xBF,
+0xFF,0x5F,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,
+0xFF,0xBD,0xDB,0xFF,0xFE,0x5F,0xF2,0xFF,
+0xFF,0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xEF,0x7F,0xFF,0xFF,0xFF,0xFF,0xDE,0xBF,
+0xFF,0xFF,0xEF,0xFB,0x77,0xFE,0xBD,0x7F,
+0x5F,0xFF,0xFF,0xFF,0xDF,0x6F,0xED,0xFF,
+0xFD,0xFF,0x7F,0xFD,0x6F,0xFF,0xFF,0x77,
+0xDA,0xCF,0xFD,0x5F,0xFF,0xBF,0xFF,0xFF,
+0xDF,0x7F,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,
+0x66,0x7F,0xFF,0xFE,0xBF,0xE7,0xBF,0xFA,
+0xFF,0xFE,0xFF,0xFF,0xFF,0xDF,0xFF,0x59,
+0xEF,0xFF,0xEF,0xFB,0x7F,0x89,0xFF,0xFF,
+0xE9,0xFF,0x6F,0xFF,0xF5,0xFF,0xFF,0xFF,
+0xFF,0xFF,0x7F,0xF2,0xF7,0xFF,0xFF,0xEF,
+0xF8,0x7F,0xFB,0xFF,0xFD,0xFF,0xFF,0xD9,
+0xFF,0xEF,0xBB,0xFF,0xFF,0xFF,0xBF,0xEF,
+0xDE,0xFF,0xFF,0x9F,0x7F,0xDF,0xFF,0xF7,
+0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xAF,
+0xFF,0xFF,0xF7,0x3F,0xEB,0x9F,0xFE,0x7F,
+0x9E,0x7F,0x9F,0xFE,0x87,0xFF,0xED,0xDB,
+0x56,0xFF,0xBF,0xAF,0x0B,0xD2,0xFF,0xEF,
+0xDB,0x6E,0x7D,0xBD,0x6F,0xF8,0xFE,0x3F,
+0xFA,0x5B,0xFF,0xFD,0xBF,0xEF,0xFF,0xBF,
+0x6F,0xDB,0xE6,0xFF,0xFF,0x3F,0xFF,0xDF,
+0xFE,0xFF,0xFF,0xFF,0xFF,0xDA,0x3F,0xFF,
+0xFB,0xFE,0xFE,0xFF,0xFF,0xDF,0xF7,0xBD,
+0xFF,0xFD,0xFF,0xFE,0xFF,0xFB,0xFF,0xFF,
+0xFF,0xFF,0xF1,0x5F,0xFD,0x9F,0xDF,0xFD,
+0xFF,0xFD,0x7F,0xFF,0xFF,0xFF,0xFF,0x76,
+0xFA,0xFF,0xFF,0x7F,0xE3,0xF8,0xFF,0xAE,
+0xFF,0xFB,0x7E,0x9D,0x73,0xFF,0xFA,0x7F,
+0xDF,0xFF,0xFF,0x7F,0xFF,0xFB,0xCD,0xFF,
+0x7F,0xEF,0xFB,0xFF,0xFD,0xFF,0xF7,0x7F,
+0x7F,0xEF,0xFF,0xED,0xFF,0xFF,0xFF,0xB5,
+0xFF,0xBF,0xFF,0xBF,0xFD,0xEF,0xDB,0xF7,
+0xFF,0x93,0xFF,0xEF,0xE2,0xF9,0xBE,0x7F,
+0x8B,0xE7,0xF9,0xFE,0x6B,0xE7,0xF9,0xFE,
+0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x47,0xFF,
+0xFF,0xFD,0xFF,0x9F,0xFF,0xD7,0xFF,0xFF,
+0xFF,0xFF,0xF5,0xFF,0x9F,0xFF,0xF7,0xFE,
+0xFF,0xBF,0xFE,0x6F,0xFF,0xFF,0xFB,0xFF,
+0xFF,0xFF,0xAF,0xFF,0xFF,0xFF,0x7F,0xFB,
+0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,
+0xDF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xDF,
+0xFF,0xFF,0xFF,0x5F,0xFF,0xFF,0xFF,0xFF,
+0x5F,0xFB,0xFE,0xFF,0xF8,0x37,0xFF,0xFF,
+0xEF,0xFF,0x7F,0xFE,0xBF,0xFF,0xFF,0xFE,
+0xBF,0xFF,0xFF,0x7F,0xFF,0xBF,0xFD,0xFF,
+0x7F,0xFA,0x7F,0xFF,0xFF,0x6F,0xFF,0xFF,
+0x7D,0xFF,0xCF,0xFF,0xFF,0xFF,0x4F,0xFF,
+0xF2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFA,0xBF,
+0xFF,0xAE,0xEB,0xFA,0xFE,0xBB,0xAD,0xEB,
+0xFA,0xF7,0xAF,0x6B,0xFA,0xF6,0xBF,0x25,
+0xE9,0xF2,0x7F,0x45,0xFF,0xFF,0xFD,0xF7,
+0xF7,0xBF,0xFF,0xDF,0xFF,0xFF,0xBF,0xFB,
+0xFF,0xDF,0xF3,0xFF,0xF7,0x3F,0xCF,0xFF,
+0xA1,0xFF,0xFF,0xBF,0xE7,0xFF,0xFF,0x7F,
+0xFF,0x3D,0xFF,0xFF,0xFF,0xF7,0xFF,0x2F,
+0xFF,0xFB,0xF5,0x7F,0xFE,0x57,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,
+0x3F,0xFF,0xFE,0xFF,0xFF,0xFF,0xFD,0xFE,
+0xF7,0xEE,0xAF,0xFE,0xEE,0xE7,0xFA,0xFF,
+0xFE,0x9D,0xF9,0x5E,0xFE,0xFF,0xEB,0xFF,
+0xFF,0xDF,0xA7,0xFF,0xFF,0xFF,0xFC,0xDB,
+0xFF,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF,
+0xFB,0xFD,0xFF,0xDB,0xFF,0xFF,0xFF,0xEF,
+0xFF,0xFF,0xFF,0xFD,0xBF,0xFE,0xBF,0xFF,
+0x6F,0x7F,0xFF,0xF7,0xFF,0xFF,0xF9,0xFF,
+0xF7,0xFF,0xBF,0xDE,0xF7,0xFF,0xFF,0xFF,
+0xFA,0x7F,0xFD,0xBF,0x5F,0xFF,0xFF,0xBF,
+0xFF,0xED,0xFF,0xF7,0xBF,0xFF,0xFF,0xEF,
+0xFF,0xDF,0xFF,0xFF,0xFF,0xE6,0xFF,0xFB,
+0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,
+0xFD,0xFF,0xF5,0xFF,0xF6,0x7F,0xDF,0xBD,
+0xCF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,
+0xFF,0xF9,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3,
+0xFF,0xEE,0xBF,0xFF,0x7D,0xEF,0xFE,0xFF,
+0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFE,
+0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xB5,0xAE,
+0xFF,0xFF,0xB6,0xFE,0xBF,0xFF,0xFF,0xBF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0x27,0xFF,0xEF,0xFE,0x7F,0xDF,0xFF,
+0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFD,0xFF,0xF7,0xF9,0x9F,0xFF,
+0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
+0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0x0F,0xFF,0xE7,0xBF,0xFE,
+0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFC,0xBF,
+0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xC4,
+0x6B,0xFF,0x29,0x1F,0xFB,0xAF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xEF,0x1B,0xFE,0xFF,0xFC,
+0x6F,0xFF,0xFF,0xFD,0x6A,0xF7,0xD7,0xF5,
+0xBF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFE,0xBF,0xFF,0xFF,0xFA,0xFF,0xFF,0xF7,
+0xFB,0xDD,0xBF,0xFF,0xE7,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0x7F,0xFF,
+0xFF,0xF5,0xFF,0xFF,0xF7,0xFD,0xB3,0xEF,
+0xFD,0x7E,0x5D,0xFF,0xFD,0xFF,0xFF,0xFF,
+0xFD,0x7F,0xD2,0xF5,0xFB,0x7E,0xCB,0xB7,
+0xFF,0xFF,0xFF,0xC6,0xFF,0xFD,0xEE,0x63,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xFD,0x65,
+0x5B,0xDF,0xFF,0xD5,0xFF,0xFF,0xFF,0xF6,
+0xE7,0xBF,0xF7,0xA9,0xFF,0xFF,0xED,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,0xFF,0xFF,
+0xAF,0xFF,0xFF,0xFF,0xF8,0x1B,0xFF,0xE3,
+0xD0,0xBF,0xFF,0xE1,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xD7,0xFF,0xFF,0xFF,0x5F,0xFF,0xFF,
+0xFF,0xFF,0xAF,0xFF,0xDB,0x76,0xBF,0xFF,
+0x7F,0xFF,0xBF,0xEF,0xFE,0xFF,0xBF,0xEF,
+0xFB,0xFE,0xFF,0xFF,0xFF,0xBF,0xF2,0x7F,
+0xFF,0x9F,0xFE,0xBD,0xFE,0x7F,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xF7,0x3F,0xEC,0x7F,0xF6,0x95,0xBB,
+0xEF,0xF8,0xFE,0xFC,0xBF,0x2F,0xDA,0xFC,
+0xBF,0x2F,0xCB,0xF2,0xFC,0xBF,0xEF,0xFF,
+0xA9,0xBF,0xCF,0xFB,0xFF,0xFF,0xFF,0xFE,
+0xDD,0xB7,0x6D,0xF6,0xD9,0xB6,0x6D,0x9B,
+0x76,0xD9,0xBF,0xFB,0xFD,0xA3,0xFF,0xBF,
+0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0x7F,0xDF,
+0xFD,0xEF,0x7B,0xDE,0xF7,0xFD,0xEF,0x7F,
+0xFF,0xFF,0x05,0xFF,0xFA,0xFE,0x7F,0xEF,
+0xE3,0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xFF,
+0xFF,0x5F,0xFF,0xFF,0xFD,0x7F,0xFB,0xAF,
+0xFF,0x63,0xC8,0xFF,0xBF,0xEF,0xFF,0xFF,
+0xFA,0x7F,0xFF,0xFF,0xFF,0xFE,0x9F,0xF7,
+0xFF,0xFA,0xBF,0xFE,0x9F,0xFB,0x7F,0xFF,
+0xFF,0xEF,0xD7,0xFF,0xFF,0xF5,0xFF,0xFF,
+0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xBF,0xFF,
+0xF9,0xBF,0xFF,0xBE,0x27,0x9F,0xE7,0xF9,
+0xFE,0x7F,0x8B,0xE7,0xFE,0x7F,0x9F,0xE2,
+0xF9,0xFE,0x7F,0x9F,0xE7,0xF1,0x7F,0xFF,
+0xFF,0xFF,0xFB,0xFE,0xFF,0xFF,0xFF,0xD7,
+0xFF,0xFF,0xFF,0xFF,0xF5,0xFF,0xFF,0xFF,
+0xD7,0xFF,0xFA,0xFF,0xFE,0xFF,0xFF,0xFF,
+0xFD,0xFF,0xFF,0xFF,0xAF,0xF7,0xFF,0xFF,
+0xFF,0xEB,0xFF,0xFF,0xFF,0xAF,0xFF,0xC4,
+0xFF,0xF7,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,
+0xFF,0x5F,0xFF,0xFF,0xFF,0xFF,0xD7,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,0xFB,0x7A,
+0xDF,0xF7,0xFD,0xFF,0xFF,0xFE,0xBF,0xFF,
+0xFF,0x7F,0xFF,0xAF,0xFF,0xFF,0xFF,0xF7,
+0xEF,0xE3,0xFF,0xDD,0xD2,0xFF,0xDF,0xFF,
+0xFF,0xF2,0xFC,0xBF,0xCB,0xF6,0xFD,0xBF,
+0x2F,0xCB,0xFF,0x7F,0xDF,0xDE,0xAF,0xFF,
+0xDA,0xEE,0xBF,0xAF,0xE9,0xFA,0xF4,0xBD,
+0xAF,0x5A,0xAE,0xBB,0xAB,0x6B,0xDA,0xDE,
+0xBF,0xAD,0xD7,0x5E,0xFF,0xFF,0xBF,0xFC,
+0xFF,0xDF,0xFD,0xFF,0xFF,0xFF,0xFF,0xDF,
+0xF7,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFA,
+0x1F,0xFF,0xFE,0xFB,0xEF,0xBF,0xFD,0xFF,
+0xFD,0xBD,0x77,0xFF,0xFF,0xFF,0xFF,0x9D,
+0xEF,0xFF,0xFF,0xFF,0xEF,0x7D,0xFF,0xFB,
+0xFE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,
+0xBF,0xE4,0xFB,0xFF,0xFE,0x3F,0xFE,0xFF,
+0xFF,0xFF,0xFF,0xAF,0xEA,0xFE,0xBF,0xAF,
+0xEB,0xFA,0xFE,0xFF,0xFF,0xFF,0x55,0xF6,
+0xFF,0xFE,0xF7,0xFF,0x7F,0xFF,0xEB,0xF7,
+0x5F,0xC5,0xFD,0x7F,0x5F,0xD7,0xF5,0xFF,
+0x6F,0xFB,0xFF,0x8A,0xFF,0xFF,0xFF,0xFF,
+0xEB,0xFF,0xFF,0xFF,0xFF,0xFB,0xBF,0xBF,
+0xEF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,
+0x77,0xDF,0xFB,0xFF,0xFD,0x7F,0xEF,0xFF,
+0xFF,0xFF,0xBF,0x7F,0xFF,0xDF,0xBF,0xFF,
+0xFB,0xFF,0xFF,0xFF,0xFE,0xEF,0xDF,0xFF,
+0xFE,0xFF,0x9F,0xEF,0x7D,0xFF,0xF7,0xFF,
+0x7F,0xFF,0xFF,0xDF,0xF7,0xFD,0xFF,0xEF,
+0xDF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFB,
+0xFD,0xFF,0xBF,0xDF,0xD1,0xFF,0xF8,0x3B,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0x7E,0xDB,0xFD,0xFF,0x77,0xDB,0xB7,0x7D,
+0xBF,0xFB,0xFF,0xF8,0x7F,0xED,0x7B,0x5E,
+0xFF,0xFE,0xFF,0xFF,0x4F,0xD7,0xFD,0x7F,
+0xDF,0xD7,0xF5,0xFF,0x7F,0xFF,0xFF,0xFF,
+0xF2,0x3F,0xFE,0xFF,0xBF,0xFF,0xFF,0xFF,
+0xFF,0xBF,0xEF,0xFE,0xFF,0x3B,0xEE,0xFF,
+0xFC,0xEF,0xFF,0xFF,0xFF,0x85,0xFF,0xFD,
+0xFE,0xFF,0xF5,0xFF,0xFF,0xFE,0xFF,0xDF,
+0xFB,0xFF,0x5F,0xBF,0xFF,0xFD,0xFF,0xFF,
+0xFF,0xFF,0xA8,0xFF,0xFF,0x9F,0x9E,0xFF,
+0xFF,0xFF,0x7F,0xF3,0xFF,0xFF,0xCF,0xFF,
+0xF7,0xFD,0xFF,0x7F,0xFF,0xFF,0xFC,0x16,
+0xBF,0xCF,0xA3,0xE5,0xEF,0x7F,0xFF,0xF3,
+0xE4,0xFF,0xCF,0x93,0xFC,0xFF,0x3F,0xCF,
+0xFF,0xFF,0xFF,0xD6,0x0F,0x7D,0xBF,0x6E,
+0xFB,0xF4,0xFC,0xAF,0x6D,0xDB,0x77,0xB7,
+0x6D,0xDB,0xF6,0xFD,0xBF,0xFF,0xFF,0xFF,
+0xBF,0x9B,0xFA,0xDE,0xB7,0xB7,0xED,0xF9,
+0x7E,0xB7,0xAC,0xEB,0xD6,0xB3,0xAD,0xEB,
+0x7A,0xDF,0xFF,0xFF,0xFF,0xD8,0xBF,0xFF,
+0xB7,0xED,0x9F,0x6F,0xDD,0xF7,0x68,0xDB,
+0x37,0xB3,0x6C,0xDB,0x36,0xCD,0xB3,0x7F,
+0xFF,0x7F,0xF5,0x6F,0xFD,0xEF,0x79,0x3D,
+0xF7,0x93,0xE4,0x7A,0x9E,0xAD,0xEA,0x7A,
+0x9E,0xF7,0xBD,0xEF,0xFF,0xFF,0xFF,0x76,
+0x7F,0xFB,0xC6,0xFF,0xBB,0xEF,0xDA,0xFE,
+0xFD,0xBF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,
+0xFF,0xFF,0xFB,0xFF,0xA5,0xFF,0xFD,0xAB,
+0x6F,0x78,0xDE,0x17,0x8F,0x79,0xDF,0xFD,
+0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0xFF,0xFB,
+0xFF,0xFB,0xFF,0xEF,0xFB,0xEF,0xFB,0xFE,
+0xFF,0xBB,0xDA,0xF3,0xEF,0x3B,0xCE,0xF3,
+0xBC,0xEF,0x3F,0xCF,0xDF,0xFF,0xB7,0xFF,
+0xFF,0xFF,0xCF,0x73,0xFF,0xBF,0xEF,0xFF,
+0xF3,0xFF,0x3F,0xCF,0xF3,0xFC,0xFF,0x3D,
+0xCF,0x9F,0xFE,0x07,0xFF,0xAF,0xEB,0xFE,
+0xFD,0xBF,0xEF,0xEB,0xFA,0xFF,0xAF,0xEB,
+0xFA,0xFE,0xBF,0xAF,0xFB,0xFE,0x3F,0xFB,
+0x9B,0xFF,0x7F,0xDF,0xFF,0xF3,0xFE,0xFF,
+0xDE,0xF7,0xBF,0x7B,0xDE,0xF7,0xBD,0xEF,
+0x7B,0xFE,0xFF,0xFF,0xDF,0x3F,0xFE,0xFF,
+0xB7,0xFF,0xEF,0xF7,0xFF,0xBF,0xED,0xFE,
+0xDF,0xB7,0xED,0xFB,0x7E,0xDF,0xFF,0xFF,
+0xFF,0xFD,0x5F,0xEF,0xEB,0xFA,0xFE,0xF5,
+0xBF,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFE,0xF8,0xFF,0xA8,0xFF,
+0xFF,0xBF,0xEF,0xFB,0x6A,0xFB,0xB7,0xEF,
+0xFB,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,
+0xEF,0xFB,0xFF,0xE0,0xFF,0xFF,0xFD,0x7F,
+0x5C,0xD7,0x7D,0xDF,0xF3,0x5C,0xF5,0xCD,
+0x73,0x5E,0xD7,0xB5,0xFD,0x7F,0xEF,0xFF,
+0xDB,0xFF,0xFF,0xE2,0xF8,0xBE,0x2F,0x8F,
+0xE7,0xF8,0xBE,0x6B,0xE2,0xF8,0xBE,0x2F,
+0x8B,0xE2,0xF9,0xFE,0x7F,0xE7,0xFF,0xD7,
+0xF5,0xFD,0x7F,0xFF,0xF7,0xF5,0xFD,0x7F,
+0xD7,0xF5,0xFD,0x7F,0x5F,0xD7,0xF5,0xFF,
+0xFF,0xFF,0x8F,0xFF,0xAF,0xEB,0xFA,0xFF,
+0xFF,0xBF,0xEB,0xFA,0xFF,0x2F,0xEB,0xFA,
+0xFE,0xBF,0xAF,0xEB,0xFF,0xFF,0xFE,0x5F,
+0xFF,0x5F,0xFF,0xFF,0xFD,0xFF,0xFF,0xD7,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xBF,0xFE,0xB7,0xFD,
+0xFF,0x7E,0xDF,0xF7,0xAD,0xFF,0x7F,0xF7,
+0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F,
+0xF6,0x7F,0xFF,0xFF,0xFF,0xDB,0xF6,0xFC,
+0xAF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xEC,0xBF,0xFF,
+0xAF,0xEB,0xFA,0xF6,0xAB,0x8F,0xEB,0xFA,
+0xF7,0xA5,0xEB,0xFA,0xBE,0xBF,0xAF,0xEB,
+0xFA,0xFF,0x6D,0xFF,0xFF,0x7F,0xDF,0x33,
+0xDD,0xFF,0x7F,0xFE,0xF7,0xFC,0x7F,0xFB,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA9,
+0xFF,0xFD,0xFF,0xFF,0xFE,0xFF,0xFF,0xDF,
+0xFF,0xFF,0xEF,0xEF,0xFD,0xFF,0x7F,0xFF,
+0xFF,0xFF,0xFF,0xFE,0xA7,0xFF,0xFF,0xFF,
+0x77,0xDF,0xF7,0xFD,0x9F,0x7F,0xFE,0x77,
+0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xAF,0xBF,0xAF,0xFF,0xF9,0xBE,0xBF,
+0x8F,0xFB,0xFE,0xFE,0xEF,0xFB,0xFE,0xFF,
+0xBF,0xEF,0xFB,0xFF,0xFF,0xFD,0xDF,0x6F,
+0xEF,0xFF,0x7F,0xFF,0xBF,0xBF,0xDF,0xFF,
+0xFC,0xFF,0xDF,0xF7,0xFD,0xEF,0x7F,0xDF,
+0xFF,0xFF,0xFF,0x3F,0xF6,0xFF,0xCF,0xFF,
+0xDB,0xFB,0xF7,0xFF,0xEB,0x7A,0xFF,0xFF,
+0xFF,0xBF,0xEF,0xFB,0xFF,0xFF,0xFF,0xFE,
+0x6D,0xFD,0xFF,0x5F,0xFB,0xFF,0xFF,0xF7,
+0xFF,0x5F,0xF5,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xF8,0xFF,0xFB,0xFF,
+0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xE7,0xF6,
+0xBF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,
+0xFF,0xC9,0xFF,0xFF,0xFF,0xBD,0xFF,0xBF,
+0xAF,0xEF,0xEF,0x3F,0xD1,0xFC,0x7F,0xFB,
+0xC7,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3,0xFF,
+0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0x77,0xFF,
+0xDF,0xB7,0xFD,0xF7,0xFD,0xF7,0xFF,0xFF,
+0xFF,0xFF,0xFF,0x57,0xFF,0xF7,0xA5,0xFD,
+0x3F,0xDF,0xBF,0xBF,0xFE,0x7F,0xFF,0xFF,
+0xFF,0xDF,0xFA,0xFD,0xFF,0xFF,0xFF,0xFE,
+0x87,0xFF,0xE9,0xFF,0xFE,0xEF,0xBF,0xEF,
+0xFE,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFA,0x9F,0xFF,0x3F,
+0xFF,0xFD,0xFD,0x57,0xDF,0xFD,0xF3,0xFF,
+0xDF,0xFD,0xFF,0x5F,0xDF,0xF5,0xFD,0xFF,
+0xFF,0xF9,0x8F,0xFF,0xFF,0xFF,0xEE,0x7F,
+0xFF,0xFF,0xBF,0x5E,0xFE,0xEC,0xFB,0x3F,
+0x7F,0x9F,0xEF,0xF9,0xFF,0xFF,0xCD,0x6B,
+0xFF,0xFF,0xFF,0xC5,0xF3,0xFC,0xFA,0x38,
+0xFF,0xAF,0x3F,0xEE,0x7F,0x9F,0xFF,0xD9,
+0xFF,0xFF,0xFD,0x7A,0xF7,0xFF,0xF3,0xFF,
+0xAF,0x6F,0xDB,0xF2,0xB9,0xE9,0xFB,0xFF,
+0xFF,0xFF,0xFE,0xFF,0xFF,0xEF,0xFF,0xFB,
+0xC5,0xBF,0xFF,0xEF,0xFF,0x5E,0xB7,0xAD,
+0xCD,0x79,0x7C,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFD,0x93,0xFF,0xEF,
+0xEA,0xFE,0xBF,0xEF,0x5B,0xD2,0xCD,0xF5,
+0x6D,0x77,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,
+0xFF,0xFF,0x66,0xFF,0xD5,0x65,0x7D,0x5F,
+0x75,0x9D,0x65,0x7F,0xD6,0xFB,0x4F,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xC7,
+0xFF,0xBF,0xEF,0xFA,0xFE,0xFF,0xBF,0xEB,
+0xFF,0xDF,0xFF,0x7E,0xFF,0xFF,0xEF,0xFD,
+0x7E,0xD7,0xFF,0x78,0xDF,0xFF,0x5F,0xDF,
+0xF5,0xBF,0x7F,0xDF,0xC5,0xFF,0x3F,0xF6,
+0x7E,0xFF,0x0F,0xEF,0xF2,0x3E,0xBF,0xFF,
+0xFB,0x3F,0xFF,0xFB,0x7F,0xFF,0xB3,0xFE,
+0xFB,0xF6,0xFD,0xFF,0xDA,0xF7,0xFD,0xFF,
+0x7F,0xDF,0xF7,0xBF,0xFF,0xFA,0x7F,0xFF,
+0xFF,0xFF,0xFF,0x9F,0xFF,0xF3,0xDC,0xF9,
+0xBF,0xCE,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7,
+0xFF,0xFF,0xE2,0x7F,0xFE,0xFF,0xBF,0xEF,
+0xEB,0xFA,0xFF,0x9F,0x67,0x1E,0xFF,0x8F,
+0xE7,0xF8,0xFE,0x7F,0x8F,0xEF,0xFF,0xBD,
+0xBF,0xFF,0xFB,0xFF,0xFF,0xDF,0xF7,0xFF,
+0xFC,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFD,0xB3,0xFF,0xFF,0xEF,
+0xFF,0xFF,0xBF,0xED,0xFF,0xFB,0xEE,0xFE,
+0xFF,0xFF,0xEF,0xFF,0xFE,0xFF,0xFF,0xFF,
+0xFF,0xB5,0xFF,0xB7,0xFD,0xFD,0x6E,0xFF,
+0xFF,0xFE,0xFD,0x2F,0xD8,0xFE,0xBF,0x8F,
+0xEB,0xF9,0xFE,0x3F,0xFF,0xFA,0xCF,0xFF,
+0xE7,0xD9,0xFA,0xBF,0xDF,0x77,0xFC,0xFB,
+0x3F,0xAB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,
+0xFF,0xFF,0xEE,0x1F,0xFF,0xDF,0xF7,0xFF,
+0xFF,0xFF,0x5F,0x97,0x35,0xBF,0x5E,0xFE,
+0xBF,0xEF,0xFF,0xF7,0xFD,0xFF,0xFF,0xFA,
+0xBF,0xFF,0xBE,0x6F,0x9F,0xE7,0xF8,0xBE,
+0x2F,0x8B,0x66,0x94,0x7D,0x9D,0xE7,0xF9,
+0xFE,0x7F,0x9F,0xE7,0xF1,0x7F,0xFF,0xFF,
+0xFF,0xF7,0xF5,0xFD,0x7F,0x5F,0xFB,0xFD,
+0x9E,0xFF,0xFB,0xFE,0xFF,0xFF,0xEF,0xFF,
+0xFF,0xA0,0xFF,0xFF,0xFF,0xBF,0xEF,0xEB,
+0xFA,0xFE,0xBF,0xB7,0xF7,0xF7,0xFF,0xFF,
+0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xDD,0xFF,
+0xFD,0xFF,0xFF,0xFF,0xD7,0xFF,0xFF,0xFF,
+0x7F,0xF5,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,
+0xBF,0xFF,0xFF,0xAB,0xFE,0xFB,0xFE,0xFF,
+0xF7,0xAF,0xFF,0xFF,0xDE,0xF7,0xEB,0x5F,
+0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF,0xFF,
+0xB3,0xFF,0xC9,0xFE,0xFF,0xFF,0xFF,0xFF,
+0xD6,0xFF,0xFF,0xCB,0xFF,0xFF,0xDF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFC,0x8F,0xFF,0xBA,
+0xBE,0xBF,0xAF,0xEB,0x78,0xFE,0xB7,0xAD,
+0x3A,0xFE,0xB7,0xAF,0xEB,0x7A,0xFE,0xBF,
+0xAF,0xFF,0x9F,0xFF,0xFF,0xDF,0xFC,0xFF,
+0xFF,0xFE,0xC3,0xFE,0xFF,0xFF,0x33,0xFC,
+0xFF,0xBF,0xDF,0xF3,0xFF,0xFF,0xBB,0x9F,
+0xFF,0xFF,0xFF,0xEB,0xDF,0xFF,0xFF,0xAF,
+0xF7,0x6F,0xF9,0xBF,0xEF,0xFD,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xE3,0x7F,0xFF,0xFF,0xFF,
+0xFB,0xFF,0xFF,0xBF,0xFD,0xFB,0xF7,0xFF,
+0xDF,0xF7,0xFF,0xFE,0xEF,0x5F,0xBD,0xFF,
+0xFA,0xFF,0xF8,0xFF,0xBF,0xAF,0xFB,0xFE,
+0xFE,0x3F,0xEF,0xE8,0xFF,0xDF,0xF3,0xFD,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xED,0xFF,0xFB,
+0xFD,0xFF,0xAF,0xFF,0xFF,0xFE,0xFE,0xBF,
+0xDB,0xFF,0xFF,0xFF,0xBF,0xFF,0xDF,0xFF,
+0xFD,0xFF,0xCB,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xBF,0x6F,0xFF,0x7F,0xB7,0xB3,0xFF,0xFF,
+0xDF,0xFF,0xFB,0xEF,0xFF,0xFF,0xFF,0x07,
+0xFF,0xFB,0xFF,0xFF,0xFF,0xED,0xFF,0xF5,
+0x7C,0xFF,0x7F,0xFE,0xFF,0xFF,0xEF,0xCF,
+0xFF,0xFB,0xFF,0xFF,0x2F,0xFF,0xFF,0xFF,
+0xFF,0xF3,0xFF,0xFB,0xFF,0xFE,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,
+0xFD,0x1B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFE,0x7C,0xFF,0xFF,0xFF,0xFF,
+0xEF,0xFF,0xFF,0xFF,0xFF,0xFB,0xBF,0x7F,
+0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xDB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,
+0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xDF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xBF,0xFE,
+0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xEF,0xFE,0xFF,0xBF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xEF,0xFA,0xB5,0xFF,0xFF,0xFF,
+0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xDF,0xFB,
+0xFC,0xFF,0xFF,0xFE,0xFF,0x7F,0xDF,0xBF,
+0xFF,0xCB,0xBF,0xF9,0xFE,0x7F,0x9F,0xE7,
+0xF9,0xFE,0x7F,0x97,0xE1,0xFE,0x79,0x9F,
+0xE7,0xFD,0xFE,0x7F,0xDF,0xFE,0x37,0xFF,
+0xFB,0xDE,0xDE,0xBD,0xEF,0xF3,0xFE,0xFB,
+0xAF,0xEB,0xFE,0xFF,0xFF,0xCF,0xFF,0xFE,
+0xFF,0xBF,0xFF,0x8F,0xFF,0xEF,0xFB,0xFE,
+0xFF,0xBF,0xE7,0xF9,0x5E,0x7F,0xEF,0xFB,
+0xDA,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFD,
+0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,
+0xFF,0xFF,0x7F,0xFF,0xFF,0xF7,0xFB,0x7F,
+0xFF,0xFF,0xFF,0xFF,0xFC,0x3F,0xFF,0xBF,
+0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0x7B,0x7F,
+0xBF,0xEF,0xFB,0xFE,0xFF,0xB5,0xEF,0xFB,
+0xBF,0xFA,0x7F,0xFC,0xFF,0x3F,0xCF,0xF3,
+0xFC,0xFF,0x3F,0xCF,0xBC,0xFF,0x3F,0xEF,
+0xF3,0xFC,0xFE,0x3F,0xCF,0xFF,0xEE,0xEF,
+0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0x6A,0xD7,
+0xB7,0xFB,0xF8,0xFF,0xB7,0xEF,0xBA,0xFE,
+0xFF,0xBF,0x7F,0xE9,0xFF,0xF9,0x7E,0x5F,
+0x97,0xE5,0xF9,0xFE,0x7F,0xBF,0xF9,0x7E,
+0x5F,0x9F,0xE5,0xFB,0xFE,0x5F,0xB7,0xFF,
+0xA3,0xFF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7,
+0xFD,0xFF,0x5E,0xF7,0x7D,0xFF,0x77,0xDF,
+0xF7,0xFD,0xFF,0x7F,0xFF,0xD7,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFD,0xDF,0xFB,0x7F,
+0xFF,0xFF,0xEF,0xFF,0xFE,0xFB,0xFF,0xFF,
+0xBF,0xFE,0x8F,0xFF,0xDF,0xF7,0xFD,0xFD,
+0x7F,0xDF,0xF7,0xFD,0x3E,0xDF,0xF5,0xBD,
+0xFF,0x7F,0xDF,0xF7,0xFD,0xF7,0xFF,0x9F,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFD,0xFF,0xBE,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFD,0x3F,0xFF,0xDF,0xF7,
+0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0xCF,
+0x77,0xFC,0xFF,0x5F,0xDF,0xF7,0xFD,0xFF,
+0xF4,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFD,0xFF,0xFF,0xFF,0xEE,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xED,0xFB,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xE9,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFB,0xFF,0xFF,0xFF,0xD3,0xFF,0xFF,
+0xBF,0x3F,0xFB,0xFF,0xFF,0xFF,0xFB,0xF3,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xF7,
+0xFF,0xFF,0xFF,0xFF,0x17,0xFF,0xFF,0xFF,
+0xDF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xDF,0xDF,0xFF,0xFD,0xFF,0xFF,0xDF,0xF7,
+0xFF,0x4F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFD,
+0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x9F,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,
+0xFF,0xFF,0x7A,0x3F,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,
+0x7F,0xFF,0xFB,0xFE,0xFF,0xBF,0xEF,0xF8,
+0xFE,0xFF,0xBF,0xFB,0xFE,0xFF,0x8F,0xEC,
+0xFB,0xFE,0xFF,0xBF,0xF8,0xF7,0xFE,0xFF,
+0xBF,0xEF,0xFB,0xFE,0xFD,0xBF,0xCF,0xEC,
+0xFF,0x3F,0xEF,0xDB,0xF8,0xFF,0xBF,0xCF,
+0xFF,0xF9,0xFF,0xFF,0xBF,0xFF,0xFB,0xFF,
+0xFF,0xFF,0xEF,0xFB,0xDF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xBB,0xFF,
+0xEF,0xFB,0xFE,0xEF,0xBF,0xEE,0xEB,0xFB,
+0xFE,0xFF,0xEF,0xFE,0xEE,0xBF,0xFE,0xEB,
+0xFF,0xEF,0xFF,0x17,0xFF,0x7E,0xEB,0xBB,
+0xFE,0xBF,0xBE,0xFB,0xEF,0x5B,0xF7,0xBD,
+0xFB,0xCF,0xBF,0xBF,0xBB,0xFB,0x7E,0xCC,
+0xEF,0xFF
+};
(sensorbaserate << 8) + sensorclkdivisor, 0, NULL, 0, HZ);
}
+#ifdef NOTUSED
static int usb_cpia_grab_frame(struct usb_device *dev, int streamstartline)
{
return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
USB_REQ_CPIA_GRAB_FRAME, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
streamstartline << 8, 0, NULL, 0, HZ);
}
+#endif
static int usb_cpia_upload_frame(struct usb_device *dev, int forceupload)
{
/*
* Make all of the blocks of data contiguous
*/
-static int cpia_compress_isochronous(struct usb_cpia *cpia, struct usb_isoc_desc *isodesc)
+static int cpia_compress_isochronous(struct usb_cpia *cpia, urb_t *urb)
{
unsigned char *cdata, *data;
int i, totlen = 0;
- cdata = isodesc->data;
data = cpia->scratch + cpia->scratchlen;
- for (i = 0; i < isodesc->frame_count; i++) {
- int n = isodesc->frames[i].frame_length;
- int st = isodesc->frames[i].frame_status;
+ for (i = 0; i < urb->number_of_packets; i++) {
+ int n = urb->iso_frame_desc[i].actual_length;
+ int st = urb->iso_frame_desc[i].status;
+
+ cdata = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
if (st && debug >= 1)
printk(KERN_DEBUG "cpia data error: [%d] len=%d, status=%X\n",
i, n, st);
if ((cpia->scratchlen + n) > SCRATCH_BUF_SIZE) {
- printk(KERN_DEBUG "cpia: scratch buf overflow!\n");
+ printk(KERN_DEBUG "cpia: scratch buf overflow!scr_len: %d, n: %d\n",cpia->scratchlen, n );
return totlen;
}
totlen += n;
cpia->scratchlen += n;
}
- cdata += isodesc->frame_size;
}
return totlen;
}
-static int cpia_isoc_irq(int status, void *__buffer, int len, void *isocdesc)
+static void cpia_isoc_irq(struct urb *urb)
{
- void *dev_id = ((struct usb_isoc_desc *)isocdesc)->context;
- struct usb_cpia *cpia = (struct usb_cpia *)dev_id;
+ int len;
+ struct usb_cpia *cpia = urb->context;
struct cpia_sbuf *sbuf;
int i;
+#if 0
+printk("cpia_isoc_irq: %p status %d, errcount = %d, length = %d\n", urb, urb->status, urb->error_count, urb->actual_length);
+#endif
+
if (!cpia->streaming) {
if (debug >= 1)
printk(KERN_DEBUG "cpia: oops, not streaming, but interrupt\n");
- return 0;
+ return;
}
sbuf = &cpia->sbuf[cpia->cursbuf];
- usb_kill_isoc(sbuf->isodesc);
+ // usb_kill_isoc(sbuf->isodesc);
/* Copy the data received into our scratch buffer */
- len = cpia_compress_isochronous(cpia, sbuf->isodesc);
+ len = cpia_compress_isochronous(cpia, urb);
/* If we don't have a frame we're current working on, complain */
if (cpia->scratchlen) {
cpia_parse_data(cpia);
}
- for (i = 0; i < FRAMES_PER_DESC; i++)
- sbuf->isodesc->frames[i].frame_length = FRAME_SIZE_PER_DESC;
-
+ for (i = 0; i < FRAMES_PER_DESC; i++) {
+ sbuf->urb->iso_frame_desc[i].status = 0;
+ sbuf->urb->iso_frame_desc[i].actual_length = 0;
+ }
/* Move to the next sbuf */
cpia->cursbuf = (cpia->cursbuf + 1) % CPIA_NUMSBUF;
/* Reschedule this block of Isochronous desc */
- usb_run_isoc(sbuf->isodesc, cpia->sbuf[cpia->cursbuf].isodesc);
+ // usb_run_isoc(sbuf->isodesc, cpia->sbuf[cpia->cursbuf].isodesc);
- return -1;
+ return;
}
static int cpia_init_isoc(struct usb_cpia *cpia)
{
struct usb_device *dev = cpia->dev;
- struct usb_isoc_desc *id;
+ urb_t *urb;
int fx, err;
cpia->compress = 0;
cpia->scratchlen = 0;
/* Alternate interface 3 is is the biggest frame size */
- if (usb_set_interface(cpia->dev, 1, 3) < 0) {
+ if (usb_set_interface(cpia->dev, cpia->iface, 3) < 0) {
printk(KERN_ERR "usb_set_interface error\n");
return -EBUSY;
}
/* We double buffer the Iso lists */
- err = usb_init_isoc(dev, usb_rcvisocpipe(dev, 1), FRAMES_PER_DESC,
- cpia, &cpia->sbuf[0].isodesc);
- if (err) {
+// err = usb_init_isoc(dev, usb_rcvisocpipe(dev, 1), FRAMES_PER_DESC, cpia, &cpia->sbuf[0].isodesc);
+ urb = usb_alloc_urb(FRAMES_PER_DESC);
+
+ if (!urb) {
printk(KERN_ERR "cpia_init_isoc: usb_init_isoc ret %d\n",
- err);
+ 0);
return -ENOMEM;
}
-
- err = usb_init_isoc(dev, usb_rcvisocpipe(dev, 1), FRAMES_PER_DESC,
- cpia, &cpia->sbuf[1].isodesc);
- if (err) {
+ cpia->sbuf[0].urb = urb;
+ urb->dev = dev;
+ urb->context = cpia;
+ urb->pipe = usb_rcvisocpipe(dev, 1);
+ urb->transfer_flags = USB_ISO_ASAP;
+ urb->transfer_buffer = cpia->sbuf[0].data;
+ urb->complete = cpia_isoc_irq;
+ urb->number_of_packets = FRAMES_PER_DESC;
+ urb->transfer_buffer_length = FRAME_SIZE_PER_DESC * FRAMES_PER_DESC;
+ for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
+ urb->iso_frame_desc[fx].offset = FRAME_SIZE_PER_DESC * fx;
+ urb->iso_frame_desc[fx].length = FRAME_SIZE_PER_DESC;
+ }
+ urb = usb_alloc_urb(FRAMES_PER_DESC);
+ if (!urb) {
printk(KERN_ERR "cpia_init_isoc: usb_init_isoc ret %d\n",
- err);
- usb_free_isoc (cpia->sbuf[0].isodesc);
+ 0);
return -ENOMEM;
}
+ cpia->sbuf[1].urb = urb;
+ urb->dev = dev;
+ urb->context = cpia;
+ urb->pipe = usb_rcvisocpipe(dev, 1);
+ urb->transfer_flags = USB_ISO_ASAP;
+ urb->transfer_buffer = cpia->sbuf[1].data;
+ urb->complete = cpia_isoc_irq;
+ urb->number_of_packets = FRAMES_PER_DESC;
+ urb->transfer_buffer_length = FRAME_SIZE_PER_DESC * FRAMES_PER_DESC;
+ for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
+ urb->iso_frame_desc[fx].offset = FRAME_SIZE_PER_DESC * fx;
+ urb->iso_frame_desc[fx].length = FRAME_SIZE_PER_DESC;
+ }
- /* Set the Isoc. desc. parameters. */
- /* First for desc. [0] */
- id = cpia->sbuf[0].isodesc;
- id->start_type = START_ASAP;
- id->callback_frames = 10; /* on every 10th frame */
- id->callback_fn = cpia_isoc_irq;
- id->data = cpia->sbuf[0].data;
- id->buf_size = FRAME_SIZE_PER_DESC * FRAMES_PER_DESC;
- for (fx = 0; fx < FRAMES_PER_DESC; fx++)
- id->frames[fx].frame_length = FRAME_SIZE_PER_DESC;
-
- /* and for desc. [1] */
- id = cpia->sbuf[1].isodesc;
- id->start_type = 0; /* will follow the first desc. */
- id->callback_frames = 10; /* on every 10th frame */
- id->callback_fn = cpia_isoc_irq;
- id->data = cpia->sbuf[1].data;
- id->buf_size = FRAME_SIZE_PER_DESC * FRAMES_PER_DESC;
- for (fx = 0; fx < FRAMES_PER_DESC; fx++)
- id->frames[fx].frame_length = FRAME_SIZE_PER_DESC;
-
- err = usb_run_isoc(cpia->sbuf[0].isodesc, NULL);
+ cpia->sbuf[1].urb->next = cpia->sbuf[0].urb;
+ cpia->sbuf[0].urb->next = cpia->sbuf[1].urb;
+
+ err = usb_submit_urb(cpia->sbuf[0].urb);
if (err)
- printk(KERN_ERR "cpia_init_isoc: usb_run_isoc ret %d\n",
+ printk(KERN_ERR "cpia_init_isoc: usb_run_isoc(0) ret %d\n",
err);
- err = usb_run_isoc(cpia->sbuf[1].isodesc, cpia->sbuf[0].isodesc);
+ err = usb_submit_urb(cpia->sbuf[1].urb);
if (err)
- printk(KERN_ERR "cpia_init_isoc: usb_run_isoc ret %d\n",
+ printk(KERN_ERR "cpia_init_isoc: usb_run_isoc(1) ret %d\n",
err);
cpia->streaming = 1;
}
/* Set packet size to 0 */
- if (usb_set_interface(cpia->dev, 1, 0) < 0) {
+ if (usb_set_interface(cpia->dev, cpia->iface, 0) < 0) {
printk(KERN_ERR "usb_set_interface error\n");
return /* -EINVAL */;
}
/* Unschedule all of the iso td's */
- usb_kill_isoc(cpia->sbuf[1].isodesc);
- usb_kill_isoc(cpia->sbuf[0].isodesc);
+ usb_unlink_urb(cpia->sbuf[1].urb);
+ usb_unlink_urb(cpia->sbuf[0].urb);
cpia->streaming = 0;
/* Delete them all */
- usb_free_isoc(cpia->sbuf[1].isodesc);
- usb_free_isoc(cpia->sbuf[0].isodesc);
+ usb_free_urb(cpia->sbuf[1].urb);
+ usb_free_urb(cpia->sbuf[0].urb);
}
static int cpia_new_frame(struct usb_cpia *cpia, int framenum)
struct usb_device *dev = cpia->dev;
unsigned char version[4];
- /* claim interface 1 */
- usb_driver_claim_interface(&cpia_driver,
- &dev->actconfig->interface[1], cpia);
-
- /* Set altsetting 0 on interface 1 */
- if (usb_set_interface(dev, 1, 0) < 0) {
+ /* Set altsetting 0 */
+ if (usb_set_interface(dev, cpia->iface, 0) < 0) {
printk(KERN_ERR "usb_set_interface error\n");
return -EBUSY;
}
error:
video_unregister_device(&cpia->vdev);
usb_driver_release_interface(&cpia_driver,
- &dev->actconfig->interface[1]);
+ &dev->actconfig->interface[0]);
kfree(cpia);
memset(cpia, 0, sizeof(*cpia));
cpia->dev = dev;
+ cpia->iface = interface->bInterfaceNumber;
if (!usb_cpia_configure(cpia)) {
cpia->user=0;
video_unregister_device(&cpia->vdev);
usb_driver_release_interface(&cpia_driver,
- &cpia->dev->actconfig->interface[1]);
+ &cpia->dev->actconfig->interface[0]);
/* Free the memory */
kfree(cpia);
struct cpia_sbuf {
char *data;
- struct usb_isoc_desc *isodesc;
+ urb_t *urb;
};
enum {
/* Device structure */
struct usb_device *dev;
+ unsigned char iface;
+
struct semaphore lock;
int user; /* user count for exclusive use */
*
*
*
- * $Id: dabusb.c,v 1.26 1999/12/13 08:40:23 fliegl Exp $
+ * $Id: dabusb.c,v 1.30 1999/12/17 17:50:58 fliegl Exp $
*
*/
/*****************************************************************************/
-#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>
+#include <linux/init.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
-//#include <linux/spinlock.h>
#include <linux/delay.h>
#include "usb.h"
#include "dabusb.h"
-#include "bitstream.c"
-#include "firmware.c"
+#include "bitstream.h"
+#include "firmware.h"
/* --------------------------------------------------------------------- */
#define NRDABUSB 4
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
+#define __init
+#define __exit
+#endif
+
/*-------------------------------------------------------------------*/
static dabusb_t dabusb[NRDABUSB];
static int buffers = 256;
spin_lock_irqsave (&s->lock, flags);
-// printk(KERN_DEBUG MODSTR"dabusb_add_buf_tail %p %p\n",src->next, dst->next);
if (list_empty (src)) {
// no elements in source buffer
- // printk(KERN_DEBUG MODSTR"source list empty\n");
ret = -1;
goto err;
}
return ret;
}
/*-------------------------------------------------------------------*/
+#ifdef DEBUG
static void dump_urb (purb_t purb)
{
printk ("urb :%p\n", purb);
printk ("context :%p\n", purb->context);
printk ("complete :%p\n", purb->complete);
}
-
+#endif
/*-------------------------------------------------------------------*/
static int dabusb_cancel_queue (pdabusb_t s, struct list_head *q)
{
unsigned long flags;
struct list_head *p;
pbuff_t b;
+
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_cancel_queue\n");
+#endif
spin_lock_irqsave (&s->lock, flags);
+
for (p = q->next; p != q; p = p->next) {
-// printk("p:%p\n",p);
b = list_entry (p, buff_t, buff_list);
-// printk("buff:%p\n",b);
- // dump_urb(b->purb);
+#ifdef DEBUG
+ dump_urb(b->purb);
+#endif
usb_unlink_urb (b->purb);
}
spin_unlock_irqrestore (&s->lock, flags);
struct list_head *tmp;
struct list_head *p;
pbuff_t b;
+
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_free_queue\n");
+#endif
for (p = q->next; p != q;) {
-// printk("%p\n",p);
b = list_entry (p, buff_t, buff_list);
-// dump_urb(b->purb);
+#ifdef DEBUG
+ dump_urb(b->purb);
+#endif
if (b->purb->transfer_buffer)
kfree (b->purb->transfer_buffer);
if (b->purb)
/*-------------------------------------------------------------------*/
static int dabusb_free_buffers (pdabusb_t s)
{
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_free_buffers\n");
+#endif
dabusb_free_queue (&s->free_buff_list);
dabusb_free_queue (&s->rec_buff_list);
s->got_mem = 0;
int len;
int dst = 0;
void *buf = purb->transfer_buffer;
-// printk(KERN_DEBUG MODSTR"dabusb_iso_complete\n");
+
+#ifdef DEBUG_ALL
+ printk(KERN_DEBUG MODSTR"dabusb_iso_complete\n");
+#endif
if (purb->status != USB_ST_URB_KILLED) {
unsigned int pipe = usb_rcvisocpipe (purb->dev, _DABUSB_ISOPIPE);
int pipesize = usb_maxpacket (purb->dev, pipe, usb_pipeout (pipe));
int transfer_buffer_length = packets * pipesize;
int i;
int len = sizeof (urb_t) + packets * sizeof (iso_packet_descriptor_t);
+
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_alloc_buffers len:%d pipesize:%d packets:%d transfer_buffer_len:%d\n",
len, pipesize, packets, transfer_buffer_length);
+#endif
+
while (buffers < (s->total_buffer_size << 10)) {
b = (pbuff_t) kmalloc (sizeof (buff_t), GFP_KERNEL);
if (!b) {
b->purb->iso_frame_desc[i].offset = i * pipesize;
b->purb->iso_frame_desc[i].length = pipesize;
}
-// dump_urb(b->purb);
+
buffers += transfer_buffer_length;
list_add_tail (&b->buff_list, &s->free_buff_list);
}
s->got_mem = buffers;
return 0;
+
err:
dabusb_free_buffers (s);
return -ENOMEM;
/*-------------------------------------------------------------------*/
static int dabusb_reset_pipe (struct usb_device *usbdev, unsigned int ep)
{
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_reset_pipe\n");
+#endif
if ((ep & ~0x80) >= 16)
return -EINVAL;
+
usb_settoggle (usbdev, ep & 0xf, !(ep & 0x80), 0);
+
return 0;
}
/* --------------------------------------------------------------------- */
{
int ret;
bulk_completion_context_t context;
+
init_waitqueue_head (&context.wait);
purb->context = &context;
-// dump_urb(purb);
+
+#ifdef DEBUG_ALL
+ dump_urb(purb);
+#endif
+
ret = usb_submit_urb (purb);
if (ret < 0) {
printk (KERN_DEBUG MODSTR "dabusb_bulk: usb_submit_urb returned %d\n", ret);
if (purb->status == USB_ST_URB_PENDING) {
printk (KERN_ERR MODSTR "dabusb_usb_submit_urb: %p timed out\n", purb);
usb_unlink_urb (purb);
+ dabusb_reset_pipe(purb->dev, purb->pipe);
return -ETIMEDOUT;
}
return purb->status;
static void dabusb_bulk_complete (purb_t purb)
{
pbulk_completion_context_t context = purb->context;
-// printk(KERN_DEBUG MODSTR"dabusb_bulk_complete\n");
- // dump_urb(purb);
+
+#ifdef DEBUG_ALL
+ printk(KERN_DEBUG MODSTR"dabusb_bulk_complete\n");
+ dump_urb(purb);
+#endif
wake_up (&context->wait);
}
urb_t urb;
unsigned int pipe;
-// printk(KERN_DEBUG MODSTR"dabusb_bulk\n");
+#ifdef DEBUG_ALL
+ printk(KERN_DEBUG MODSTR"dabusb_bulk\n");
+#endif
if (!pb->pipe)
pipe = usb_rcvbulkpipe (s->usbdev, 2);
setup[5] = 0;
setup[6] = len & 0xff;
setup[7] = len >> 8;
-// printk(KERN_DEBUG MODSTR"dabusb_control\n");
memcpy (transfer_buffer, data, len);
/* --------------------------------------------------------------------- */
static int dabusb_8051_reset (pdabusb_t s, unsigned char reset_bit)
{
- //printk("dabusb_8051_reset: %d\n",reset_bit);
+#ifdef DEBUG
+ printk("dabusb_8051_reset: %d\n",reset_bit);
+#endif
return dabusb_writemem (s, CPUCS_REG, &reset_bit, 1);
}
/* --------------------------------------------------------------------- */
{
int ret;
PINTEL_HEX_RECORD ptr = firmware;
- printk (KERN_DEBUG MODSTR "Enter dabusb_loadmem (internal)\n");
+#ifdef DEBUG
+ printk (KERN_DEBUG MODSTR "Enter dabusb_loadmem (internal)\n");
+#endif
ret = dabusb_8051_reset (s, 1);
while (ptr->Type == 0) {
- //printk(KERN_ERR MODSTR"dabusb_writemem: %04X %p %d)\n", ptr->Address, ptr->Data, ptr->Length);
+#ifdef DEBUG_ALL
+ printk(KERN_ERR MODSTR"dabusb_writemem: %04X %p %d)\n", ptr->Address, ptr->Data, ptr->Length);
+#endif
ret = dabusb_writemem (s, ptr->Address, ptr->Data, ptr->Length);
if (ret < 0) {
printk (KERN_ERR MODSTR "dabusb_writemem failed (%04X %p %d)\n", ptr->Address, ptr->Data, ptr->Length);
ptr++;
}
ret = dabusb_8051_reset (s, 0);
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_loadmem: exit\n");
+#endif
return ret;
}
/* --------------------------------------------------------------------- */
b->data[1] = 0;
b->data[2] = 0;
b->data[3] = 0;
+
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_fpga_clear\n");
+#endif
return dabusb_bulk (s, b);
}
/* --------------------------------------------------------------------- */
b->data[1] = 0;
b->data[2] = 0;
b->data[3] = 0;
+
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_fpga_init\n");
+#endif
return dabusb_bulk (s, b);
}
/* --------------------------------------------------------------------- */
int ret;
unsigned char *buf = bitstream;
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "Enter dabusb_fpga_download (internal)\n");
+#endif
if (!b) {
printk (KERN_ERR MODSTR "kmalloc(sizeof(bulk_transfer_t))==NULL\n");
return -ENOMEM;
ret = dabusb_fpga_clear (s, b);
mdelay (10);
blen = buf[73] + (buf[72] << 8);
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "Bitstream len: %i\n", blen);
-
+#endif
b->data[0] = 0x2b;
b->data[1] = 0;
b->data[2] = 0;
ret = dabusb_fpga_init (s, b);
kfree (b);
+
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "exit dabusb_fpga_download\n");
+#endif
return ret;
}
static int dabusb_stop (pdabusb_t s)
{
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_stop\n");
+#endif
+
s->state = _stopped;
dabusb_cancel_queue (s, &s->rec_buff_list);
+
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "pending_io: %d\n", s->pending_io.counter);
+#endif
+
s->pending_io.counter = 0;
return 0;
}
static int dabusb_startrek (pdabusb_t s)
{
if (!s->got_mem && s->state != _started) {
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_startrek\n");
+#endif
+
if (dabusb_alloc_buffers (s) < 0)
return -ENOMEM;
dabusb_stop (s);
int ret;
while (!dabusb_add_buf_tail (s, &s->rec_buff_list, &s->free_buff_list)) {
- //printk("submitting: end:%p s->rec_buff_list:%p\n", s->rec_buff_list.prev, &s->rec_buff_list);
-
+#ifdef DEBUG_ALL
+ printk("submitting: end:%p s->rec_buff_list:%p\n", s->rec_buff_list.prev, &s->rec_buff_list);
+#endif
end = list_entry (s->rec_buff_list.prev, buff_t, buff_list);
- //printk("pipesize:%d number_of_packets:%d\n",pipesize, end->purb->number_of_packets);
ret = usb_submit_urb (end->purb);
if (ret) {
else
atomic_inc (&s->pending_io);
}
- //printk(KERN_DEBUG MODSTR"pending_io: %d\n",s->pending_io.counter);
+#ifdef DEBUG_ALL
+ printk(KERN_DEBUG MODSTR"pending_io: %d\n",s->pending_io.counter);
+#endif
}
return 0;
}
pbuff_t b;
purb_t purb = NULL;
- //printk(KERN_DEBUG MODSTR"dabusb_read\n");
+#ifdef DEBUG_ALL
+ printk(KERN_DEBUG MODSTR"dabusb_read\n");
+#endif
if (*ppos)
return -ESPIPE;
if (s->remove_pending)
return -EIO;
-// down(&s->mutex);
- if (!s->usbdev) {
-// up(&s->mutex);
+
+ if (!s->usbdev)
return -EIO;
- }
while (count > 0) {
dabusb_startrek (s);
if (list_empty (&s->rec_buff_list)) {
- printk (KERN_ERR MODSTR "shit... rec_buf_list is empty\n");
+ printk (KERN_ERR MODSTR "error: rec_buf_list is empty\n");
goto err;
}
b = list_entry (s->rec_buff_list.next, buff_t, buff_list);
purb = b->purb;
if (purb->status == USB_ST_URB_PENDING) {
- //printk("after comp\n");
if (file->f_flags & O_NONBLOCK) // return nonblocking
{
if (!ret)
ret = -EAGAIN;
goto err;
}
- //printk("before sleep\n");
+
interruptible_sleep_on (&s->wait);
- //printk("after sleep\n");
+
if (signal_pending (current)) {
if (!ret)
ret = -ERESTARTSYS;
goto err;
}
if (list_empty (&s->rec_buff_list)) {
- printk (KERN_ERR MODSTR "shit... still no buffer available.\n");
+ printk (KERN_ERR MODSTR "error: still no buffer available.\n");
goto err;
}
s->readptr = 0;
ret = -EIO;
goto err;
}
- //printk("get pointers %d %d %d\n", purb->actual_length, s->readptr, count);
rem = purb->actual_length - s->readptr; // set remaining bytes to copy
else
cnt = count;
- //printk("copy_to_user:%p %p %d\n",buf, purb->transfer_buffer + s->readptr, cnt);
+#ifdef DEBUG_ALL
+ printk("copy_to_user:%p %p %d\n",buf, purb->transfer_buffer + s->readptr, cnt);
+#endif
if (copy_to_user (buf, purb->transfer_buffer + s->readptr, cnt)) {
printk (KERN_ERR MODSTR "read: copy_to_user failed\n");
if (s->readptr == purb->actual_length) {
// finished, take next buffer
- //printk("next buffer...\n");
if (dabusb_add_buf_tail (s, &s->free_buff_list, &s->rec_buff_list))
printk (KERN_ERR MODSTR "read: dabusb_add_buf_tail failed");
s->readptr = 0;
if (devnum < DABUSB_MINOR || devnum > (DABUSB_MINOR + NRDABUSB))
return -EIO;
+ MOD_INC_USE_COUNT;
s = &dabusb[devnum - DABUSB_MINOR];
+
printk (KERN_DEBUG MODSTR "dabusb_open\n");
down (&s->mutex);
+
while (!s->usbdev || s->opened) {
up (&s->mutex);
+
if (file->f_flags & O_NONBLOCK) {
+ MOD_DEC_USE_COUNT;
return -EBUSY;
}
schedule_timeout (HZ / 2);
- if (signal_pending (current))
+
+ if (signal_pending (current)) {
+ MOD_DEC_USE_COUNT;
return -EAGAIN;
+ }
down (&s->mutex);
}
s->opened = 1;
up (&s->mutex);
+
if (usb_set_interface (s->usbdev, _DABUSB_IF, 1) < 0) {
printk (KERN_ERR "dabusb: set_interface failed\n");
+ MOD_DEC_USE_COUNT;
return -EINVAL;
}
file->f_pos = 0;
file->private_data = s;
- MOD_INC_USE_COUNT;
+
return 0;
}
dabusb_stop (s);
dabusb_free_buffers (s);
up (&s->mutex);
+
if (!s->remove_pending) {
if (usb_set_interface (s->usbdev, _DABUSB_IF, 0) < 0)
printk (KERN_ERR "dabusb: set_interface failed\n");
}
else
wake_up (&s->remove_ok);
+
MOD_DEC_USE_COUNT;
s->opened = 0;
return 0;
return -EIO;
down (&s->mutex);
+
if (!s->usbdev) {
up (&s->mutex);
return -EIO;
case IOCTL_DAB_BULK:
pbulk = (pbulk_transfer_t) kmalloc (sizeof (bulk_transfer_t), GFP_KERNEL);
+
if (!pbulk) {
ret = -ENOMEM;
break;
}
+
if (copy_from_user (pbulk, (void *) arg, sizeof (bulk_transfer_t))) {
ret = -EFAULT;
kfree (pbulk);
break;
}
+
dabusb_bulk (s, pbulk);
ret = copy_to_user ((void *) arg, pbulk, sizeof (bulk_transfer_t));
kfree (pbulk);
static int dabusb_find_struct (void)
{
int u;
+
for (u = 0; u < NRDABUSB; u++) {
pdabusb_t s = &dabusb[u];
if (!s->usbdev)
int devnum;
pdabusb_t s;
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb: probe: vendor id 0x%x, device id 0x%x ifnum:%d\n",
usbdev->descriptor.idVendor, usbdev->descriptor.idProduct, ifnum);
+#endif
/* the 1234:5678 is just a self assigned test ID */
if ((usbdev->descriptor.idVendor != 0x0547 || usbdev->descriptor.idProduct != 0x2131) &&
static void dabusb_disconnect (struct usb_device *usbdev, void *ptr)
{
pdabusb_t s = (pdabusb_t) ptr;
+
printk (KERN_DEBUG MODSTR "dabusb_disconnect\n");
+
s->remove_pending = 1;
wake_up (&s->wait);
if (s->state == _started)
/* --------------------------------------------------------------------- */
-int dabusb_init (void)
+int __init dabusb_init (void)
{
unsigned u;
spin_lock_init (&s->lock);
INIT_LIST_HEAD (&s->free_buff_list);
INIT_LIST_HEAD (&s->rec_buff_list);
-// printk("s->free_buff_list:%p\n",&s->free_buff_list);
- // printk("s->rec_buff_list:%p\n",&s->rec_buff_list);
}
+
/* register misc device */
usb_register (&dabusb_driver);
+
+#ifdef DEBUG
printk (KERN_INFO "dabusb_init: driver registered\n");
+#endif
return 0;
}
-void dabusb_cleanup (void)
+void __exit dabusb_cleanup (void)
{
+#ifdef DEBUG
printk (KERN_DEBUG MODSTR "dabusb_cleanup\n");
+#endif
usb_deregister (&dabusb_driver);
}
MODULE_AUTHOR ("Deti Fliegl, deti@fliegl.de");
MODULE_DESCRIPTION ("DAB-USB Interface Driver for Linux (c)1999");
MODULE_PARM (buffers, "i");
-int init_module (void)
+
+int __init init_module (void)
{
return dabusb_init ();
}
-void cleanup_module (void)
+void __exit cleanup_module (void)
{
dabusb_cleanup ();
}
/*****************************************************************************/
#include <linux/version.h>
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/socket.h>
#include <linux/miscdevice.h>
extern inline unsigned int ld2(unsigned int x)
{
- unsigned int r = 0;
-
- if (x >= 0x10000) {
- x >>= 16;
- r += 16;
- }
- if (x >= 0x100) {
- x >>= 8;
- r += 8;
- }
- if (x >= 0x10) {
- x >>= 4;
- r += 4;
- }
- if (x >= 4) {
- x >>= 2;
- r += 2;
- }
- if (x >= 2)
- r++;
- return r;
+ unsigned int r = 0;
+
+ if (x >= 0x10000) {
+ x >>= 16;
+ r += 16;
+ }
+ if (x >= 0x100) {
+ x >>= 8;
+ r += 8;
+ }
+ if (x >= 0x10) {
+ x >>= 4;
+ r += 4;
+ }
+ if (x >= 4) {
+ x >>= 2;
+ r += 2;
+ }
+ if (x >= 2)
+ r++;
+ return r;
}
#if 0
/* why doesn't this work properly on i386? */
extern inline unsigned int ld2(unsigned int x)
{
- unsigned int r;
+ unsigned int r;
__asm__("bsrl %1,%0" : "=r" (r) : "g" (x));
return r;
static int ezusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
struct ezusb *ez = (struct ezusb *)file->private_data;
- DECLARE_WAITQUEUE(wait, current);
+ DECLARE_WAITQUEUE(wait, current);
struct usb_proc_ctrltransfer pctrl;
struct usb_proc_bulktransfer pbulk;
struct usb_proc_old_ctrltransfer opctrl;
static void * ezusb_probe(struct usb_device *usbdev, unsigned int ifnum)
{
struct ezusb *ez = &ezusb[0];
- struct usb_interface_descriptor *interface;
- struct usb_endpoint_descriptor *endpoint;
+ struct usb_interface_descriptor *interface;
+ struct usb_endpoint_descriptor *endpoint;
#undef KERN_DEBUG
#define KERN_DEBUG ""
- printk(KERN_DEBUG "ezusb: probe: vendor id 0x%x, device id 0x%x\n",
- usbdev->descriptor.idVendor, usbdev->descriptor.idProduct);
+ printk(KERN_DEBUG "ezusb: probe: vendor id 0x%x, device id 0x%x\n",
+ usbdev->descriptor.idVendor, usbdev->descriptor.idProduct);
/* the 1234:5678 is just a self assigned test ID */
if ((usbdev->descriptor.idVendor != 0x0547 || usbdev->descriptor.idProduct != 0x2131)
(usbdev->descriptor.idVendor != 0x1234 || usbdev->descriptor.idProduct != 0x5678)
#endif
)
- return NULL;
+ return NULL;
- /* We don't handle multiple configurations */
- if (usbdev->descriptor.bNumConfigurations != 1)
- return NULL;
+ /* We don't handle multiple configurations */
+ if (usbdev->descriptor.bNumConfigurations != 1)
+ return NULL;
#if 0
- /* We don't handle multiple interfaces */
+ /* We don't handle multiple interfaces */
if (usbdev->config[0].bNumInterfaces != 1)
- return NULL;
+ return NULL;
#endif
down(&ez->mutex);
}
up(&ez->mutex);
MOD_INC_USE_COUNT;
- return ez;
+ return ez;
err:
up(&ez->mutex);
}
static struct usb_driver ezusb_driver = {
- "ezusb",
- ezusb_probe,
- ezusb_disconnect,
- { NULL, NULL },
+ "ezusb",
+ ezusb_probe,
+ ezusb_disconnect,
+ { NULL, NULL },
&ezusb_fops,
192
};
}
/* register misc device */
usb_register(&ezusb_driver);
- printk(KERN_INFO "ezusb: Anchorchip firmware download driver registered\n");
+ printk(KERN_INFO "ezusb: Anchorchip firmware download driver registered\n");
return 0;
}
+++ /dev/null
-//$Id: firmware.c,v 1.4 1999/12/13 14:15:28 fliegl Exp $
-static INTEL_HEX_RECORD firmware[] = {
-{ 2,
- 0x0,
- 0,
- {0x21,0x57}
-},
-{ 3,
- 0x3,
- 0,
- {0x02,0x01,0x66}
-},
-{ 3,
- 0xb,
- 0,
- {0x02,0x01,0x66}
-},
-{ 3,
- 0x13,
- 0,
- {0x02,0x01,0x66}
-},
-{ 3,
- 0x1b,
- 0,
- {0x02,0x01,0x66}
-},
-{ 3,
- 0x23,
- 0,
- {0x02,0x01,0x66}
-},
-{ 3,
- 0x2b,
- 0,
- {0x02,0x01,0x66}
-},
-{ 3,
- 0x33,
- 0,
- {0x02,0x03,0x0f}
-},
-{ 3,
- 0x3b,
- 0,
- {0x02,0x01,0x66}
-},
-{ 3,
- 0x43,
- 0,
- {0x02,0x01,0x00}
-},
-{ 3,
- 0x4b,
- 0,
- {0x02,0x01,0x66}
-},
-{ 3,
- 0x53,
- 0,
- {0x02,0x01,0x66}
-},
-{ 3,
- 0x5b,
- 0,
- {0x02,0x04,0xbd}
-},
-{ 3,
- 0x63,
- 0,
- {0x02,0x01,0x67}
-},
-{ 3,
- 0x100,
- 0,
- {0x02,0x0c,0x5a}
-},
-{ 3,
- 0x104,
- 0,
- {0x02,0x01,0xed}
-},
-{ 3,
- 0x108,
- 0,
- {0x02,0x02,0x51}
-},
-{ 3,
- 0x10c,
- 0,
- {0x02,0x02,0x7c}
-},
-{ 3,
- 0x110,
- 0,
- {0x02,0x02,0xe4}
-},
-{ 1,
- 0x114,
- 0,
- {0x32}
-},
-{ 1,
- 0x118,
- 0,
- {0x32}
-},
-{ 3,
- 0x11c,
- 0,
- {0x02,0x05,0xfd}
-},
-{ 3,
- 0x120,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x124,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x128,
- 0,
- {0x02,0x04,0x3c}
-},
-{ 3,
- 0x12c,
- 0,
- {0x02,0x04,0x6a}
-},
-{ 3,
- 0x130,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x134,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x138,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x13c,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x140,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x144,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x148,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x14c,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x150,
- 0,
- {0x02,0x00,0x00}
-},
-{ 3,
- 0x154,
- 0,
- {0x02,0x00,0x00}
-},
-{ 10,
- 0x157,
- 0,
- {0x75,0x81,0x7f,0xe5,0x82,0x60,0x03,0x02,0x01,0x61}
-},
-{ 5,
- 0x161,
- 0,
- {0x12,0x07,0x6f,0x21,0x64}
-},
-{ 1,
- 0x166,
- 0,
- {0x32}
-},
-{ 14,
- 0x167,
- 0,
- {0xc0,0xd0,0xc0,0x86,0xc0,0x82,0xc0,0x83,0xc0,0xe0,0x90,0x7f,0x97,0xe0}
-},
-{ 14,
- 0x175,
- 0,
- {0x44,0x80,0xf0,0x90,0x7f,0x69,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0}
-},
-{ 14,
- 0x183,
- 0,
- {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0}
-},
-{ 14,
- 0x191,
- 0,
- {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x90,0x7f,0x97,0xe0}
-},
-{ 3,
- 0x19f,
- 0,
- {0x55,0x7f,0xf0}
-},
-{ 14,
- 0x1a2,
- 0,
- {0x90,0x7f,0x9a,0xe0,0x30,0xe4,0x23,0x90,0x7f,0x68,0xf0,0xf0,0xf0,0xf0}
-},
-{ 14,
- 0x1b0,
- 0,
- {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0}
-},
-{ 14,
- 0x1be,
- 0,
- {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0}
-},
-{ 14,
- 0x1cc,
- 0,
- {0xe5,0xd8,0xc2,0xe3,0xf5,0xd8,0xd0,0xe0,0xd0,0x83,0xd0,0x82,0xd0,0x86}
-},
-{ 3,
- 0x1da,
- 0,
- {0xd0,0xd0,0x32}
-},
-{ 8,
- 0x1dd,
- 0,
- {0x75,0x86,0x00,0x90,0xff,0xc3,0x7c,0x05}
-},
-{ 7,
- 0x1e5,
- 0,
- {0xa3,0xe5,0x82,0x45,0x83,0x70,0xf9}
-},
-{ 1,
- 0x1ec,
- 0,
- {0x22}
-},
-{ 14,
- 0x1ed,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0xd0}
-},
-{ 14,
- 0x1fb,
- 0,
- {0x75,0xd0,0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91}
-},
-{ 13,
- 0x209,
- 0,
- {0x90,0x88,0x00,0xe0,0xf5,0x41,0x90,0x7f,0xab,0x74,0x02,0xf0,0x90}
-},
-{ 9,
- 0x216,
- 0,
- {0x7f,0xab,0x74,0x02,0xf0,0xe5,0x32,0x60,0x21}
-},
-{ 4,
- 0x21f,
- 0,
- {0x7a,0x00,0x7b,0x00}
-},
-{ 11,
- 0x223,
- 0,
- {0xc3,0xea,0x94,0x18,0xeb,0x64,0x80,0x94,0x80,0x50,0x12}
-},
-{ 14,
- 0x22e,
- 0,
- {0x90,0x7f,0x69,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x0a,0xba,0x00}
-},
-{ 2,
- 0x23c,
- 0,
- {0x01,0x0b}
-},
-{ 2,
- 0x23e,
- 0,
- {0x80,0xe3}
-},
-{ 2,
- 0x240,
- 0,
- {0xd0,0x86}
-},
-{ 14,
- 0x242,
- 0,
- {0xd0,0xd0,0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0}
-},
-{ 1,
- 0x250,
- 0,
- {0x32}
-},
-{ 14,
- 0x251,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
-},
-{ 14,
- 0x25f,
- 0,
- {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xab,0x74}
-},
-{ 4,
- 0x26d,
- 0,
- {0x04,0xf0,0xd0,0x86}
-},
-{ 11,
- 0x271,
- 0,
- {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 14,
- 0x27c,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04}
-},
-{ 14,
- 0x28a,
- 0,
- {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0}
-},
-{ 13,
- 0x298,
- 0,
- {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90}
-},
-{ 12,
- 0x2a5,
- 0,
- {0x7f,0xab,0x74,0x08,0xf0,0x75,0x6e,0x00,0x75,0x6f,0x02,0x12}
-},
-{ 6,
- 0x2b1,
- 0,
- {0x11,0x44,0x75,0x70,0x39,0x75}
-},
-{ 6,
- 0x2b7,
- 0,
- {0x71,0x0c,0x75,0x72,0x02,0x12}
-},
-{ 12,
- 0x2bd,
- 0,
- {0x11,0x75,0x90,0x7f,0xd6,0xe4,0xf0,0x75,0xd8,0x20,0xd0,0x86}
-},
-{ 14,
- 0x2c9,
- 0,
- {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04}
-},
-{ 13,
- 0x2d7,
- 0,
- {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 14,
- 0x2e4,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
-},
-{ 14,
- 0x2f2,
- 0,
- {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xab,0x74}
-},
-{ 4,
- 0x300,
- 0,
- {0x10,0xf0,0xd0,0x86}
-},
-{ 11,
- 0x304,
- 0,
- {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 14,
- 0x30f,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04}
-},
-{ 14,
- 0x31d,
- 0,
- {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0}
-},
-{ 12,
- 0x32b,
- 0,
- {0x00,0xc0,0x86,0x75,0x86,0x00,0x75,0x6e,0x00,0x75,0x6f,0x02}
-},
-{ 7,
- 0x337,
- 0,
- {0x12,0x11,0x44,0x75,0x70,0x40,0x75}
-},
-{ 6,
- 0x33e,
- 0,
- {0x71,0x0c,0x75,0x72,0x02,0x12}
-},
-{ 14,
- 0x344,
- 0,
- {0x11,0x75,0x90,0x7f,0xd6,0x74,0x02,0xf0,0x90,0x7f,0xd6,0x74,0x06,0xf0}
-},
-{ 5,
- 0x352,
- 0,
- {0x75,0xd8,0x10,0xd0,0x86}
-},
-{ 14,
- 0x357,
- 0,
- {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04}
-},
-{ 13,
- 0x365,
- 0,
- {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 13,
- 0x372,
- 0,
- {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x90,0x7f,0xa6,0x74,0x9a,0xf0,0x12}
-},
-{ 12,
- 0x37f,
- 0,
- {0x10,0x1b,0x90,0x7f,0xa6,0xe5,0x42,0xf0,0x12,0x10,0x1b,0x90}
-},
-{ 13,
- 0x38b,
- 0,
- {0x7f,0xa6,0xe5,0x43,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa5,0x74,0x40}
-},
-{ 1,
- 0x398,
- 0,
- {0xf0}
-},
-{ 1,
- 0x399,
- 0,
- {0x22}
-},
-{ 13,
- 0x39a,
- 0,
- {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x90,0x7f,0xa6,0x74,0x9a,0xf0,0x12}
-},
-{ 12,
- 0x3a7,
- 0,
- {0x10,0x1b,0x90,0x7f,0xa6,0xe5,0x44,0xf0,0x12,0x10,0x1b,0x90}
-},
-{ 12,
- 0x3b3,
- 0,
- {0x7f,0xa6,0xe5,0x45,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa6,0xe5}
-},
-{ 11,
- 0x3bf,
- 0,
- {0x46,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa5,0x74,0x40,0xf0}
-},
-{ 1,
- 0x3ca,
- 0,
- {0x22}
-},
-{ 10,
- 0x3cb,
- 0,
- {0x75,0x44,0x02,0x75,0x45,0x00,0x75,0x46,0x00,0x12}
-},
-{ 9,
- 0x3d5,
- 0,
- {0x03,0x9a,0x75,0x42,0x03,0x75,0x43,0x00,0x12}
-},
-{ 2,
- 0x3de,
- 0,
- {0x03,0x72}
-},
-{ 1,
- 0x3e0,
- 0,
- {0x22}
-},
-{ 12,
- 0x3e1,
- 0,
- {0x90,0x88,0x00,0xe5,0x36,0xf0,0x90,0x88,0x00,0x74,0x10,0x25}
-},
-{ 9,
- 0x3ed,
- 0,
- {0x36,0xf0,0x12,0x01,0xdd,0x75,0x42,0x01,0x75}
-},
-{ 9,
- 0x3f6,
- 0,
- {0x43,0x18,0x12,0x03,0x72,0x75,0x44,0x02,0x75}
-},
-{ 9,
- 0x3ff,
- 0,
- {0x45,0x00,0x75,0x46,0x00,0x12,0x03,0x9a,0x75}
-},
-{ 8,
- 0x408,
- 0,
- {0x42,0x03,0x75,0x43,0x44,0x12,0x03,0x72}
-},
-{ 1,
- 0x410,
- 0,
- {0x22}
-},
-{ 14,
- 0x411,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
-},
-{ 14,
- 0x41f,
- 0,
- {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xaa,0x74}
-},
-{ 4,
- 0x42d,
- 0,
- {0x02,0xf0,0xd0,0x86}
-},
-{ 11,
- 0x431,
- 0,
- {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 14,
- 0x43c,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
-},
-{ 14,
- 0x44a,
- 0,
- {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xa9,0x74}
-},
-{ 7,
- 0x458,
- 0,
- {0x04,0xf0,0x75,0x30,0x01,0xd0,0x86}
-},
-{ 11,
- 0x45f,
- 0,
- {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 14,
- 0x46a,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
-},
-{ 14,
- 0x478,
- 0,
- {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xaa,0x74}
-},
-{ 7,
- 0x486,
- 0,
- {0x04,0xf0,0x75,0x31,0x01,0xd0,0x86}
-},
-{ 11,
- 0x48d,
- 0,
- {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 14,
- 0x498,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
-},
-{ 12,
- 0x4a6,
- 0,
- {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe5,0xf5,0x91,0xd0,0x86}
-},
-{ 11,
- 0x4b2,
- 0,
- {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 14,
- 0x4bd,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
-},
-{ 12,
- 0x4cb,
- 0,
- {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe7,0xf5,0x91,0xd0,0x86}
-},
-{ 11,
- 0x4d7,
- 0,
- {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 12,
- 0x4e2,
- 0,
- {0x90,0x7f,0xea,0xe0,0xfa,0x8a,0x20,0x90,0x7f,0x96,0xe4,0xf0}
-},
-{ 1,
- 0x4ee,
- 0,
- {0x22}
-},
-{ 7,
- 0x4ef,
- 0,
- {0x90,0x7f,0xea,0xe0,0xfa,0x8a,0x21}
-},
-{ 1,
- 0x4f6,
- 0,
- {0x22}
-},
-{ 14,
- 0x4f7,
- 0,
- {0x90,0x17,0x13,0xe0,0xfa,0x90,0x17,0x15,0xe0,0xfb,0x74,0x80,0x2a,0xfa}
-},
-{ 14,
- 0x505,
- 0,
- {0x74,0x80,0x2b,0xfb,0xea,0x03,0x03,0x54,0x3f,0xfc,0xea,0xc4,0x23,0x54}
-},
-{ 14,
- 0x513,
- 0,
- {0x1f,0xfa,0x2c,0xfa,0xeb,0x03,0x03,0x54,0x3f,0xfc,0xeb,0xc4,0x23,0x54}
-},
-{ 11,
- 0x521,
- 0,
- {0x1f,0xfb,0x2c,0xfb,0x90,0x17,0x0a,0xe0,0xfc,0x60,0x02}
-},
-{ 2,
- 0x52c,
- 0,
- {0x7a,0x00}
-},
-{ 7,
- 0x52e,
- 0,
- {0x90,0x17,0x0c,0xe0,0xfc,0x60,0x02}
-},
-{ 2,
- 0x535,
- 0,
- {0x7b,0x00}
-},
-{ 11,
- 0x537,
- 0,
- {0xea,0x2b,0xfc,0xc3,0x13,0xf5,0x3a,0x75,0x44,0x02,0x8b}
-},
-{ 7,
- 0x542,
- 0,
- {0x45,0x8a,0x46,0x12,0x03,0x9a,0x75}
-},
-{ 9,
- 0x549,
- 0,
- {0x6e,0x08,0x75,0x6f,0x00,0x12,0x11,0x44,0x75}
-},
-{ 4,
- 0x552,
- 0,
- {0x70,0x47,0x75,0x71}
-},
-{ 8,
- 0x556,
- 0,
- {0x0c,0x75,0x72,0x02,0x12,0x11,0x75,0x85}
-},
-{ 5,
- 0x55e,
- 0,
- {0x3a,0x73,0x12,0x11,0xa0}
-},
-{ 1,
- 0x563,
- 0,
- {0x22}
-},
-{ 14,
- 0x564,
- 0,
- {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x65,0x02,0xf0,0x90}
-},
-{ 14,
- 0x572,
- 0,
- {0x7f,0xeb,0xe0,0xfa,0x90,0x7f,0xea,0xe0,0xfb,0x90,0x7f,0xef,0xe0,0xfc}
-},
-{ 14,
- 0x580,
- 0,
- {0x33,0x95,0xe0,0xfd,0x8c,0x05,0x7c,0x00,0x90,0x7f,0xee,0xe0,0xfe,0x33}
-},
-{ 14,
- 0x58e,
- 0,
- {0x95,0xe0,0xff,0xec,0x2e,0xfc,0xed,0x3f,0xfd,0x90,0x7f,0xe9,0xe0,0xfe}
-},
-{ 5,
- 0x59c,
- 0,
- {0xbe,0x01,0x02,0x80,0x03}
-},
-{ 3,
- 0x5a1,
- 0,
- {0x02,0x05,0xf9}
-},
-{ 6,
- 0x5a4,
- 0,
- {0xbc,0x01,0x21,0xbd,0x00,0x1e}
-},
-{ 14,
- 0x5aa,
- 0,
- {0xea,0xc4,0x03,0x54,0xf8,0xfc,0xeb,0x25,0xe0,0xfd,0x2c,0x24,0x00,0xfc}
-},
-{ 14,
- 0x5b8,
- 0,
- {0xe4,0x34,0x17,0xfd,0x90,0x7e,0xc0,0xe0,0xfe,0x8c,0x82,0x8d,0x83,0xf0}
-},
-{ 2,
- 0x5c6,
- 0,
- {0x80,0x31}
-},
-{ 14,
- 0x5c8,
- 0,
- {0xea,0xc4,0x03,0x54,0xf8,0xfa,0xeb,0x25,0xe0,0xfb,0x2a,0xfa,0x24,0x00}
-},
-{ 14,
- 0x5d6,
- 0,
- {0xfb,0xe4,0x34,0x17,0xfc,0x90,0x7e,0xc0,0xe0,0xfd,0x8b,0x82,0x8c,0x83}
-},
-{ 14,
- 0x5e4,
- 0,
- {0xf0,0x74,0x01,0x2a,0x24,0x00,0xfa,0xe4,0x34,0x17,0xfb,0x90,0x7e,0xc1}
-},
-{ 7,
- 0x5f2,
- 0,
- {0xe0,0xfc,0x8a,0x82,0x8b,0x83,0xf0}
-},
-{ 3,
- 0x5f9,
- 0,
- {0x75,0x38,0x01}
-},
-{ 1,
- 0x5fc,
- 0,
- {0x22}
-},
-{ 14,
- 0x5fd,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04}
-},
-{ 14,
- 0x60b,
- 0,
- {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0}
-},
-{ 13,
- 0x619,
- 0,
- {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90}
-},
-{ 13,
- 0x626,
- 0,
- {0x7f,0xaa,0x74,0x01,0xf0,0x12,0x05,0x64,0x75,0x37,0x00,0xd0,0x86}
-},
-{ 14,
- 0x633,
- 0,
- {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04}
-},
-{ 13,
- 0x641,
- 0,
- {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 14,
- 0x64e,
- 0,
- {0x90,0x7f,0xeb,0xe0,0xfa,0x90,0x7f,0xea,0xe0,0xfb,0x90,0x7f,0xee,0xe0}
-},
-{ 14,
- 0x65c,
- 0,
- {0xfc,0x33,0x95,0xe0,0xfd,0x90,0x7f,0x96,0xe0,0xfe,0x90,0x7f,0x96,0x74}
-},
-{ 14,
- 0x66a,
- 0,
- {0x80,0x65,0x06,0xf0,0x90,0x7f,0x00,0x74,0x01,0xf0,0xea,0xc4,0x03,0x54}
-},
-{ 14,
- 0x678,
- 0,
- {0xf8,0xfe,0xeb,0x25,0xe0,0xfb,0x2e,0xfe,0x24,0x00,0xfb,0xe4,0x34,0x17}
-},
-{ 14,
- 0x686,
- 0,
- {0xff,0x8b,0x82,0x8f,0x83,0xe0,0xfb,0x74,0x01,0x2e,0x24,0x00,0xfe,0xe4}
-},
-{ 14,
- 0x694,
- 0,
- {0x34,0x17,0xff,0x8e,0x82,0x8f,0x83,0xe0,0xfe,0x90,0x7f,0xe9,0xe0,0xff}
-},
-{ 3,
- 0x6a2,
- 0,
- {0xbf,0x81,0x0a}
-},
-{ 10,
- 0x6a5,
- 0,
- {0x90,0x7f,0x00,0xeb,0xf0,0x90,0x7f,0x01,0xee,0xf0}
-},
-{ 8,
- 0x6af,
- 0,
- {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x82,0x1a}
-},
-{ 3,
- 0x6b7,
- 0,
- {0xba,0x01,0x0c}
-},
-{ 12,
- 0x6ba,
- 0,
- {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0b}
-},
-{ 11,
- 0x6c6,
- 0,
- {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0x74,0xb5,0xf0}
-},
-{ 8,
- 0x6d1,
- 0,
- {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x83,0x1b}
-},
-{ 3,
- 0x6d9,
- 0,
- {0xba,0x01,0x0d}
-},
-{ 13,
- 0x6dc,
- 0,
- {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0b}
-},
-{ 11,
- 0x6e9,
- 0,
- {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0x74,0x12,0xf0}
-},
-{ 8,
- 0x6f4,
- 0,
- {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x84,0x1c}
-},
-{ 3,
- 0x6fc,
- 0,
- {0xba,0x01,0x0d}
-},
-{ 13,
- 0x6ff,
- 0,
- {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0c}
-},
-{ 12,
- 0x70c,
- 0,
- {0x90,0x7f,0x00,0x74,0x80,0xf0,0x90,0x7f,0x01,0x74,0x01,0xf0}
-},
-{ 5,
- 0x718,
- 0,
- {0x90,0x7f,0xb5,0xec,0xf0}
-},
-{ 1,
- 0x71d,
- 0,
- {0x22}
-},
-{ 12,
- 0x71e,
- 0,
- {0x75,0x36,0x0d,0x90,0x88,0x00,0x74,0x1d,0xf0,0x75,0x6b,0x80}
-},
-{ 10,
- 0x72a,
- 0,
- {0x75,0x6c,0x3c,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75}
-},
-{ 9,
- 0x734,
- 0,
- {0x6c,0x0f,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75}
-},
-{ 9,
- 0x73d,
- 0,
- {0x6c,0x06,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75}
-},
-{ 7,
- 0x746,
- 0,
- {0x6c,0x01,0x12,0x10,0xe2,0x7a,0x00}
-},
-{ 3,
- 0x74d,
- 0,
- {0xba,0xff,0x00}
-},
-{ 2,
- 0x750,
- 0,
- {0x50,0x0a}
-},
-{ 10,
- 0x752,
- 0,
- {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xf1}
-},
-{ 10,
- 0x75c,
- 0,
- {0x75,0x6b,0x80,0x75,0x6c,0x3c,0x12,0x10,0xe2,0x75}
-},
-{ 8,
- 0x766,
- 0,
- {0x6b,0x80,0x75,0x6c,0x0f,0x12,0x10,0xe2}
-},
-{ 1,
- 0x76e,
- 0,
- {0x22}
-},
-{ 14,
- 0x76f,
- 0,
- {0x90,0x7f,0xa1,0xe4,0xf0,0x90,0x7f,0xaf,0x74,0x01,0xf0,0x90,0x7f,0x92}
-},
-{ 14,
- 0x77d,
- 0,
- {0x74,0x02,0xf0,0x75,0x8e,0x31,0x75,0x89,0x21,0x75,0x88,0x00,0x75,0xc8}
-},
-{ 14,
- 0x78b,
- 0,
- {0x00,0x75,0x8d,0x40,0x75,0x98,0x40,0x75,0xc0,0x40,0x75,0x87,0x00,0x75}
-},
-{ 9,
- 0x799,
- 0,
- {0x20,0x00,0x75,0x21,0x00,0x75,0x22,0x00,0x75}
-},
-{ 5,
- 0x7a2,
- 0,
- {0x23,0x00,0x75,0x47,0x00}
-},
-{ 7,
- 0x7a7,
- 0,
- {0xc3,0xe5,0x47,0x94,0x20,0x50,0x11}
-},
-{ 13,
- 0x7ae,
- 0,
- {0xe5,0x47,0x24,0x00,0xf5,0x82,0xe4,0x34,0x17,0xf5,0x83,0xe4,0xf0}
-},
-{ 4,
- 0x7bb,
- 0,
- {0x05,0x47,0x80,0xe8}
-},
-{ 9,
- 0x7bf,
- 0,
- {0xe4,0xf5,0x40,0xf5,0x3f,0xe4,0xf5,0x3c,0xf5}
-},
-{ 7,
- 0x7c8,
- 0,
- {0x3b,0xe4,0xf5,0x3e,0xf5,0x3d,0x75}
-},
-{ 11,
- 0x7cf,
- 0,
- {0x32,0x00,0x75,0x37,0x00,0x75,0x39,0x00,0x90,0x7f,0x93}
-},
-{ 14,
- 0x7da,
- 0,
- {0x74,0x3c,0xf0,0x90,0x7f,0x9c,0x74,0xff,0xf0,0x90,0x7f,0x96,0x74,0x80}
-},
-{ 14,
- 0x7e8,
- 0,
- {0xf0,0x90,0x7f,0x94,0x74,0x70,0xf0,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90}
-},
-{ 14,
- 0x7f6,
- 0,
- {0x7f,0x97,0xe4,0xf0,0x90,0x7f,0x95,0x74,0xc2,0xf0,0x90,0x7f,0x98,0x74}
-},
-{ 14,
- 0x804,
- 0,
- {0x28,0xf0,0x90,0x7f,0x9e,0x74,0x28,0xf0,0x90,0x7f,0xf0,0xe4,0xf0,0x90}
-},
-{ 14,
- 0x812,
- 0,
- {0x7f,0xf1,0xe4,0xf0,0x90,0x7f,0xf2,0xe4,0xf0,0x90,0x7f,0xf3,0xe4,0xf0}
-},
-{ 14,
- 0x820,
- 0,
- {0x90,0x7f,0xf4,0xe4,0xf0,0x90,0x7f,0xf5,0xe4,0xf0,0x90,0x7f,0xf6,0xe4}
-},
-{ 14,
- 0x82e,
- 0,
- {0xf0,0x90,0x7f,0xf7,0xe4,0xf0,0x90,0x7f,0xf8,0xe4,0xf0,0x90,0x7f,0xf9}
-},
-{ 14,
- 0x83c,
- 0,
- {0x74,0x38,0xf0,0x90,0x7f,0xfa,0x74,0xa0,0xf0,0x90,0x7f,0xfb,0x74,0xa0}
-},
-{ 14,
- 0x84a,
- 0,
- {0xf0,0x90,0x7f,0xfc,0x74,0xa0,0xf0,0x90,0x7f,0xfd,0x74,0xa0,0xf0,0x90}
-},
-{ 14,
- 0x858,
- 0,
- {0x7f,0xfe,0x74,0xa0,0xf0,0x90,0x7f,0xff,0x74,0xa0,0xf0,0x90,0x7f,0xe0}
-},
-{ 14,
- 0x866,
- 0,
- {0x74,0x03,0xf0,0x90,0x7f,0xe1,0x74,0x01,0xf0,0x90,0x7f,0xdd,0x74,0x80}
-},
-{ 11,
- 0x874,
- 0,
- {0xf0,0x12,0x12,0x43,0x12,0x07,0x1e,0x7a,0x00,0x7b,0x00}
-},
-{ 9,
- 0x87f,
- 0,
- {0xc3,0xea,0x94,0x1e,0xeb,0x94,0x00,0x50,0x17}
-},
-{ 12,
- 0x888,
- 0,
- {0x90,0x88,0x00,0xe0,0xf5,0x47,0x90,0x88,0x0b,0xe0,0xf5,0x47}
-},
-{ 9,
- 0x894,
- 0,
- {0x90,0x7f,0x68,0xf0,0x0a,0xba,0x00,0x01,0x0b}
-},
-{ 2,
- 0x89d,
- 0,
- {0x80,0xe0}
-},
-{ 12,
- 0x89f,
- 0,
- {0x12,0x03,0xe1,0x90,0x7f,0xd6,0xe4,0xf0,0x7a,0x00,0x7b,0x00}
-},
-{ 13,
- 0x8ab,
- 0,
- {0x8a,0x04,0x8b,0x05,0xc3,0xea,0x94,0xe0,0xeb,0x94,0x2e,0x50,0x1a}
-},
-{ 14,
- 0x8b8,
- 0,
- {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0}
-},
-{ 10,
- 0x8c6,
- 0,
- {0x04,0xd0,0x03,0xd0,0x02,0x0a,0xba,0x00,0x01,0x0b}
-},
-{ 2,
- 0x8d0,
- 0,
- {0x80,0xd9}
-},
-{ 13,
- 0x8d2,
- 0,
- {0x90,0x7f,0xd6,0x74,0x02,0xf0,0x90,0x7f,0xd6,0x74,0x06,0xf0,0x90}
-},
-{ 14,
- 0x8df,
- 0,
- {0x7f,0xde,0x74,0x05,0xf0,0x90,0x7f,0xdf,0x74,0x05,0xf0,0x90,0x7f,0xac}
-},
-{ 14,
- 0x8ed,
- 0,
- {0xe4,0xf0,0x90,0x7f,0xad,0x74,0x05,0xf0,0x75,0xa8,0x80,0x75,0xf8,0x10}
-},
-{ 13,
- 0x8fb,
- 0,
- {0x90,0x7f,0xae,0x74,0x0b,0xf0,0x90,0x7f,0xe2,0x74,0x88,0xf0,0x90}
-},
-{ 12,
- 0x908,
- 0,
- {0x7f,0xab,0x74,0x08,0xf0,0x75,0xe8,0x11,0x75,0x32,0x01,0x75}
-},
-{ 12,
- 0x914,
- 0,
- {0x31,0x00,0x75,0x30,0x00,0xc0,0x04,0xc0,0x05,0x12,0x04,0xf7}
-},
-{ 10,
- 0x920,
- 0,
- {0xd0,0x05,0xd0,0x04,0x75,0x34,0x00,0x75,0x35,0x01}
-},
-{ 13,
- 0x92a,
- 0,
- {0x90,0x7f,0xae,0x74,0x03,0xf0,0x8c,0x02,0xba,0x00,0x02,0x80,0x03}
-},
-{ 3,
- 0x937,
- 0,
- {0x02,0x0a,0x3f}
-},
-{ 12,
- 0x93a,
- 0,
- {0x85,0x33,0x34,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90,0x7f,0x97}
-},
-{ 14,
- 0x946,
- 0,
- {0x74,0x08,0xf0,0x90,0x7f,0x9d,0x74,0x88,0xf0,0x90,0x7f,0x9a,0xe0,0xfa}
-},
-{ 12,
- 0x954,
- 0,
- {0x74,0x05,0x5a,0xf5,0x33,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90}
-},
-{ 13,
- 0x960,
- 0,
- {0x7f,0x97,0x74,0x02,0xf0,0x90,0x7f,0x9d,0x74,0x82,0xf0,0xe5,0x33}
-},
-{ 13,
- 0x96d,
- 0,
- {0x25,0xe0,0xfa,0x90,0x7f,0x9a,0xe0,0x54,0x05,0xfb,0x4a,0xf5,0x33}
-},
-{ 2,
- 0x97a,
- 0,
- {0x60,0x0c}
-},
-{ 12,
- 0x97c,
- 0,
- {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x4a,0xf0}
-},
-{ 11,
- 0x988,
- 0,
- {0x75,0x6e,0x00,0x75,0x6f,0x00,0xc0,0x04,0xc0,0x05,0x12}
-},
-{ 14,
- 0x993,
- 0,
- {0x11,0x44,0xd0,0x05,0xd0,0x04,0x90,0x17,0x13,0xe0,0xfa,0x74,0x80,0x2a}
-},
-{ 6,
- 0x9a1,
- 0,
- {0xfa,0xe5,0x33,0xb4,0x04,0x29}
-},
-{ 3,
- 0x9a7,
- 0,
- {0xba,0xa0,0x00}
-},
-{ 2,
- 0x9aa,
- 0,
- {0x50,0x24}
-},
-{ 13,
- 0x9ac,
- 0,
- {0x90,0x17,0x13,0xe0,0x04,0xfb,0x0b,0x90,0x17,0x13,0xeb,0xf0,0x90}
-},
-{ 14,
- 0x9b9,
- 0,
- {0x17,0x13,0xe0,0xfb,0x90,0x17,0x15,0xf0,0xc0,0x02,0xc0,0x04,0xc0,0x05}
-},
-{ 9,
- 0x9c7,
- 0,
- {0x12,0x04,0xf7,0xd0,0x05,0xd0,0x04,0xd0,0x02}
-},
-{ 5,
- 0x9d0,
- 0,
- {0xe5,0x33,0xb4,0x02,0x26}
-},
-{ 6,
- 0x9d5,
- 0,
- {0xc3,0x74,0x04,0x9a,0x50,0x20}
-},
-{ 13,
- 0x9db,
- 0,
- {0x90,0x17,0x13,0xe0,0xfa,0x1a,0x1a,0x90,0x17,0x13,0xea,0xf0,0x90}
-},
-{ 13,
- 0x9e8,
- 0,
- {0x17,0x13,0xe0,0xfa,0x90,0x17,0x15,0xf0,0xc0,0x04,0xc0,0x05,0x12}
-},
-{ 6,
- 0x9f5,
- 0,
- {0x04,0xf7,0xd0,0x05,0xd0,0x04}
-},
-{ 5,
- 0x9fb,
- 0,
- {0xe5,0x33,0xb4,0x08,0x1d}
-},
-{ 4,
- 0xa00,
- 0,
- {0xe5,0x34,0x70,0x19}
-},
-{ 10,
- 0xa04,
- 0,
- {0x74,0x01,0x25,0x35,0x54,0x0f,0xf5,0x35,0x85,0x35}
-},
-{ 12,
- 0xa0e,
- 0,
- {0x75,0x75,0x76,0x00,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0}
-},
-{ 3,
- 0xa1a,
- 0,
- {0x05,0xd0,0x04}
-},
-{ 5,
- 0xa1d,
- 0,
- {0xe5,0x33,0xb4,0x01,0x1d}
-},
-{ 4,
- 0xa22,
- 0,
- {0xe5,0x34,0x70,0x19}
-},
-{ 10,
- 0xa26,
- 0,
- {0xe5,0x35,0x24,0xff,0x54,0x0f,0xf5,0x35,0x85,0x35}
-},
-{ 12,
- 0xa30,
- 0,
- {0x75,0x75,0x76,0x00,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0}
-},
-{ 3,
- 0xa3c,
- 0,
- {0x05,0xd0,0x04}
-},
-{ 14,
- 0xa3f,
- 0,
- {0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0,0x04,0x90,0x7f,0x96}
-},
-{ 14,
- 0xa4d,
- 0,
- {0xe0,0xfa,0x90,0x7f,0x96,0x74,0x7f,0x5a,0xf0,0x90,0x7f,0x97,0x74,0x08}
-},
-{ 10,
- 0xa5b,
- 0,
- {0xf0,0xc3,0xec,0x94,0x00,0xed,0x94,0x02,0x40,0x08}
-},
-{ 8,
- 0xa65,
- 0,
- {0x90,0x7f,0x96,0xe0,0xfa,0x20,0xe6,0x08}
-},
-{ 8,
- 0xa6d,
- 0,
- {0xc3,0xe4,0x9c,0x74,0x08,0x9d,0x50,0x13}
-},
-{ 14,
- 0xa75,
- 0,
- {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x40,0x65,0x02,0xf0,0x7c}
-},
-{ 5,
- 0xa83,
- 0,
- {0x00,0x7d,0x00,0x80,0x05}
-},
-{ 5,
- 0xa88,
- 0,
- {0x0c,0xbc,0x00,0x01,0x0d}
-},
-{ 5,
- 0xa8d,
- 0,
- {0xe5,0x38,0xb4,0x01,0x0e}
-},
-{ 13,
- 0xa92,
- 0,
- {0xc0,0x04,0xc0,0x05,0x12,0x04,0xf7,0xd0,0x05,0xd0,0x04,0x75,0x38}
-},
-{ 1,
- 0xa9f,
- 0,
- {0x00}
-},
-{ 7,
- 0xaa0,
- 0,
- {0xe5,0x31,0x70,0x03,0x02,0x09,0x2a}
-},
-{ 10,
- 0xaa7,
- 0,
- {0x90,0x7f,0xc9,0xe0,0xfa,0x70,0x03,0x02,0x0c,0x2d}
-},
-{ 14,
- 0xab1,
- 0,
- {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x65,0x02,0xf0,0x90}
-},
-{ 9,
- 0xabf,
- 0,
- {0x7d,0xc0,0xe0,0xfa,0xba,0x2c,0x02,0x80,0x03}
-},
-{ 3,
- 0xac8,
- 0,
- {0x02,0x0b,0x36}
-},
-{ 5,
- 0xacb,
- 0,
- {0x75,0x32,0x00,0x7b,0x00}
-},
-{ 3,
- 0xad0,
- 0,
- {0xbb,0x64,0x00}
-},
-{ 2,
- 0xad3,
- 0,
- {0x50,0x1c}
-},
-{ 14,
- 0xad5,
- 0,
- {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0}
-},
-{ 13,
- 0xae3,
- 0,
- {0x04,0xd0,0x03,0xd0,0x02,0x90,0x88,0x0f,0xe0,0xf5,0x47,0x0b,0x80}
-},
-{ 1,
- 0xaf0,
- 0,
- {0xdf}
-},
-{ 13,
- 0xaf1,
- 0,
- {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x07,0x1e,0x12,0x03,0xe1,0x12}
-},
-{ 12,
- 0xafe,
- 0,
- {0x04,0xf7,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x75,0x6e,0x00,0x75}
-},
-{ 13,
- 0xb0a,
- 0,
- {0x6f,0x01,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x11,0x44,0xd0,0x05}
-},
-{ 9,
- 0xb17,
- 0,
- {0xd0,0x04,0xd0,0x02,0x75,0x70,0x4d,0x75,0x71}
-},
-{ 11,
- 0xb20,
- 0,
- {0x0c,0x75,0x72,0x02,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12}
-},
-{ 11,
- 0xb2b,
- 0,
- {0x11,0x75,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x02,0x0c,0x2d}
-},
-{ 3,
- 0xb36,
- 0,
- {0xba,0x2a,0x3b}
-},
-{ 13,
- 0xb39,
- 0,
- {0x90,0x7f,0x98,0x74,0x20,0xf0,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12}
-},
-{ 14,
- 0xb46,
- 0,
- {0x01,0xdd,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x90,0x7f,0x98,0x74,0x28,0xf0}
-},
-{ 2,
- 0xb54,
- 0,
- {0x7b,0x00}
-},
-{ 3,
- 0xb56,
- 0,
- {0xbb,0x0a,0x00}
-},
-{ 5,
- 0xb59,
- 0,
- {0x40,0x03,0x02,0x0c,0x2d}
-},
-{ 14,
- 0xb5e,
- 0,
- {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0}
-},
-{ 8,
- 0xb6c,
- 0,
- {0x04,0xd0,0x03,0xd0,0x02,0x0b,0x80,0xe2}
-},
-{ 3,
- 0xb74,
- 0,
- {0xba,0x2b,0x1a}
-},
-{ 8,
- 0xb77,
- 0,
- {0x90,0x7f,0xc9,0xe0,0xfb,0xbb,0x40,0x12}
-},
-{ 14,
- 0xb7f,
- 0,
- {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x12,0x05,0xd0,0x05,0xd0,0x04,0xd0}
-},
-{ 4,
- 0xb8d,
- 0,
- {0x02,0x02,0x0c,0x2d}
-},
-{ 3,
- 0xb91,
- 0,
- {0xba,0x10,0x1f}
-},
-{ 14,
- 0xb94,
- 0,
- {0x90,0x7f,0x96,0xe0,0xfb,0x90,0x7f,0x96,0x74,0x80,0x65,0x03,0xf0,0xc0}
-},
-{ 14,
- 0xba2,
- 0,
- {0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x3d,0xd0,0x05,0xd0,0x04,0xd0,0x02}
-},
-{ 3,
- 0xbb0,
- 0,
- {0x02,0x0c,0x2d}
-},
-{ 3,
- 0xbb3,
- 0,
- {0xba,0x11,0x12}
-},
-{ 14,
- 0xbb6,
- 0,
- {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x6a,0xd0,0x05,0xd0,0x04,0xd0}
-},
-{ 4,
- 0xbc4,
- 0,
- {0x02,0x02,0x0c,0x2d}
-},
-{ 3,
- 0xbc8,
- 0,
- {0xba,0x12,0x12}
-},
-{ 14,
- 0xbcb,
- 0,
- {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x8f,0xd0,0x05,0xd0,0x04,0xd0}
-},
-{ 4,
- 0xbd9,
- 0,
- {0x02,0x02,0x0c,0x2d}
-},
-{ 3,
- 0xbdd,
- 0,
- {0xba,0x13,0x0b}
-},
-{ 11,
- 0xbe0,
- 0,
- {0x90,0x7d,0xc1,0xe0,0xfb,0x90,0x88,0x00,0xf0,0x80,0x42}
-},
-{ 3,
- 0xbeb,
- 0,
- {0xba,0x14,0x11}
-},
-{ 14,
- 0xbee,
- 0,
- {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x11,0xdd,0xd0,0x05,0xd0,0x04,0xd0}
-},
-{ 3,
- 0xbfc,
- 0,
- {0x02,0x80,0x2e}
-},
-{ 3,
- 0xbff,
- 0,
- {0xba,0x15,0x1d}
-},
-{ 12,
- 0xc02,
- 0,
- {0x90,0x7d,0xc1,0xe0,0xf5,0x75,0x90,0x7d,0xc2,0xe0,0xf5,0x76}
-},
-{ 14,
- 0xc0e,
- 0,
- {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0,0x05,0xd0,0x04,0xd0}
-},
-{ 3,
- 0xc1c,
- 0,
- {0x02,0x80,0x0e}
-},
-{ 3,
- 0xc1f,
- 0,
- {0xba,0x16,0x0b}
-},
-{ 11,
- 0xc22,
- 0,
- {0xc0,0x04,0xc0,0x05,0x12,0x13,0xa3,0xd0,0x05,0xd0,0x04}
-},
-{ 11,
- 0xc2d,
- 0,
- {0x90,0x7f,0xc9,0xe4,0xf0,0x75,0x31,0x00,0x02,0x09,0x2a}
-},
-{ 1,
- 0xc38,
- 0,
- {0x22}
-},
-{ 7,
- 0xc39,
- 0,
- {0x53,0x55,0x50,0x45,0x4e,0x44,0x00}
-},
-{ 7,
- 0xc40,
- 0,
- {0x52,0x45,0x53,0x55,0x4d,0x45,0x00}
-},
-{ 6,
- 0xc47,
- 0,
- {0x20,0x56,0x6f,0x6c,0x20,0x00}
-},
-{ 13,
- 0xc4d,
- 0,
- {0x44,0x41,0x42,0x55,0x53,0x42,0x20,0x76,0x31,0x2e,0x30,0x30,0x00}
-},
-{ 14,
- 0xc5a,
- 0,
- {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04}
-},
-{ 14,
- 0xc68,
- 0,
- {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0}
-},
-{ 13,
- 0xc76,
- 0,
- {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90}
-},
-{ 14,
- 0xc83,
- 0,
- {0x7f,0xab,0x74,0x01,0xf0,0x90,0x7f,0xe8,0xe0,0xfa,0x90,0x7f,0xe9,0xe0}
-},
-{ 6,
- 0xc91,
- 0,
- {0xfb,0xbb,0x00,0x02,0x80,0x03}
-},
-{ 3,
- 0xc97,
- 0,
- {0x02,0x0d,0x38}
-},
-{ 3,
- 0xc9a,
- 0,
- {0xba,0x80,0x14}
-},
-{ 14,
- 0xc9d,
- 0,
- {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5}
-},
-{ 6,
- 0xcab,
- 0,
- {0x74,0x02,0xf0,0x02,0x0e,0xcd}
-},
-{ 5,
- 0xcb1,
- 0,
- {0xba,0x82,0x02,0x80,0x03}
-},
-{ 3,
- 0xcb6,
- 0,
- {0x02,0x0d,0x1d}
-},
-{ 8,
- 0xcb9,
- 0,
- {0x90,0x7f,0xec,0xe0,0xfc,0xbc,0x01,0x00}
-},
-{ 2,
- 0xcc1,
- 0,
- {0x40,0x21}
-},
-{ 6,
- 0xcc3,
- 0,
- {0xc3,0x74,0x07,0x9c,0x40,0x1b}
-},
-{ 14,
- 0xcc9,
- 0,
- {0xec,0x24,0xff,0x25,0xe0,0xfd,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x7f,0xf5}
-},
-{ 13,
- 0xcd7,
- 0,
- {0x83,0xe0,0xfd,0x53,0x05,0x01,0x90,0x7f,0x00,0xed,0xf0,0x80,0x2b}
-},
-{ 3,
- 0xce4,
- 0,
- {0xbc,0x81,0x00}
-},
-{ 2,
- 0xce7,
- 0,
- {0x40,0x21}
-},
-{ 6,
- 0xce9,
- 0,
- {0xc3,0x74,0x87,0x9c,0x40,0x1b}
-},
-{ 14,
- 0xcef,
- 0,
- {0xec,0x24,0x7f,0x25,0xe0,0xfc,0x24,0xb6,0xf5,0x82,0xe4,0x34,0x7f,0xf5}
-},
-{ 13,
- 0xcfd,
- 0,
- {0x83,0xe0,0xfc,0x53,0x04,0x01,0x90,0x7f,0x00,0xec,0xf0,0x80,0x05}
-},
-{ 5,
- 0xd0a,
- 0,
- {0x90,0x7f,0x00,0xe4,0xf0}
-},
-{ 14,
- 0xd0f,
- 0,
- {0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5,0x74,0x02,0xf0,0x02,0x0e,0xcd}
-},
-{ 5,
- 0xd1d,
- 0,
- {0xba,0x81,0x02,0x80,0x03}
-},
-{ 3,
- 0xd22,
- 0,
- {0x02,0x0e,0xc5}
-},
-{ 14,
- 0xd25,
- 0,
- {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5,0x74}
-},
-{ 5,
- 0xd33,
- 0,
- {0x02,0xf0,0x02,0x0e,0xcd}
-},
-{ 3,
- 0xd38,
- 0,
- {0xbb,0x01,0x2d}
-},
-{ 6,
- 0xd3b,
- 0,
- {0xba,0x00,0x03,0x02,0x0e,0xcd}
-},
-{ 3,
- 0xd41,
- 0,
- {0xba,0x02,0x11}
-},
-{ 13,
- 0xd44,
- 0,
- {0x75,0x59,0x00,0xc0,0x02,0xc0,0x03,0x12,0x0e,0xf0,0xd0,0x03,0xd0}
-},
-{ 4,
- 0xd51,
- 0,
- {0x02,0x02,0x0e,0xcd}
-},
-{ 5,
- 0xd55,
- 0,
- {0xba,0x21,0x02,0x80,0x03}
-},
-{ 3,
- 0xd5a,
- 0,
- {0x02,0x0e,0xcd}
-},
-{ 11,
- 0xd5d,
- 0,
- {0x75,0x37,0x01,0x90,0x7f,0xc5,0xe4,0xf0,0x02,0x0e,0xcd}
-},
-{ 3,
- 0xd68,
- 0,
- {0xbb,0x03,0x1f}
-},
-{ 6,
- 0xd6b,
- 0,
- {0xba,0x00,0x03,0x02,0x0e,0xcd}
-},
-{ 5,
- 0xd71,
- 0,
- {0xba,0x02,0x02,0x80,0x03}
-},
-{ 3,
- 0xd76,
- 0,
- {0x02,0x0e,0xcd}
-},
-{ 13,
- 0xd79,
- 0,
- {0x75,0x59,0x01,0xc0,0x02,0xc0,0x03,0x12,0x0e,0xf0,0xd0,0x03,0xd0}
-},
-{ 4,
- 0xd86,
- 0,
- {0x02,0x02,0x0e,0xcd}
-},
-{ 3,
- 0xd8a,
- 0,
- {0xbb,0x06,0x54}
-},
-{ 5,
- 0xd8d,
- 0,
- {0xba,0x80,0x02,0x80,0x03}
-},
-{ 3,
- 0xd92,
- 0,
- {0x02,0x0e,0xc5}
-},
-{ 8,
- 0xd95,
- 0,
- {0x90,0x7f,0xeb,0xe0,0xfc,0xbc,0x01,0x15}
-},
-{ 12,
- 0xd9d,
- 0,
- {0x7c,0xfb,0x7d,0x0f,0x8d,0x06,0x7f,0x00,0x90,0x7f,0xd4,0xee}
-},
-{ 9,
- 0xda9,
- 0,
- {0xf0,0x90,0x7f,0xd5,0xec,0xf0,0x02,0x0e,0xcd}
-},
-{ 10,
- 0xdb2,
- 0,
- {0x90,0x7f,0xeb,0xe0,0xfc,0xbc,0x02,0x02,0x80,0x03}
-},
-{ 3,
- 0xdbc,
- 0,
- {0x02,0x0e,0xc5}
-},
-{ 10,
- 0xdbf,
- 0,
- {0x90,0x7f,0xea,0xe0,0xfc,0xbc,0x00,0x02,0x80,0x03}
-},
-{ 3,
- 0xdc9,
- 0,
- {0x02,0x0e,0xc5}
-},
-{ 12,
- 0xdcc,
- 0,
- {0x7c,0x3b,0x7d,0x0f,0x8d,0x06,0x7f,0x00,0x90,0x7f,0xd4,0xee}
-},
-{ 9,
- 0xdd8,
- 0,
- {0xf0,0x90,0x7f,0xd5,0xec,0xf0,0x02,0x0e,0xcd}
-},
-{ 6,
- 0xde1,
- 0,
- {0xbb,0x07,0x03,0x02,0x0e,0xc5}
-},
-{ 3,
- 0xde7,
- 0,
- {0xbb,0x08,0x10}
-},
-{ 13,
- 0xdea,
- 0,
- {0xac,0x48,0x90,0x7f,0x00,0xec,0xf0,0x90,0x7f,0xb5,0x74,0x01,0xf0}
-},
-{ 3,
- 0xdf7,
- 0,
- {0x02,0x0e,0xcd}
-},
-{ 3,
- 0xdfa,
- 0,
- {0xbb,0x09,0x31}
-},
-{ 5,
- 0xdfd,
- 0,
- {0xba,0x00,0x02,0x80,0x03}
-},
-{ 3,
- 0xe02,
- 0,
- {0x02,0x0e,0xc5}
-},
-{ 14,
- 0xe05,
- 0,
- {0x90,0x7f,0xea,0xe0,0xfc,0xc3,0x74,0x01,0x9c,0x50,0x03,0x02,0x0e,0xc5}
-},
-{ 8,
- 0xe13,
- 0,
- {0x90,0x7f,0xea,0xe0,0xfc,0xbc,0x00,0x0a}
-},
-{ 10,
- 0xe1b,
- 0,
- {0x90,0x17,0x21,0xe4,0xf0,0x90,0x17,0x22,0xe4,0xf0}
-},
-{ 9,
- 0xe25,
- 0,
- {0x90,0x7f,0xea,0xe0,0xf5,0x48,0x02,0x0e,0xcd}
-},
-{ 3,
- 0xe2e,
- 0,
- {0xbb,0x0a,0x27}
-},
-{ 5,
- 0xe31,
- 0,
- {0xba,0x81,0x02,0x80,0x03}
-},
-{ 3,
- 0xe36,
- 0,
- {0x02,0x0e,0xc5}
-},
-{ 14,
- 0xe39,
- 0,
- {0x90,0x7f,0xec,0xe0,0xfa,0x24,0x20,0xfa,0xe4,0x34,0x17,0xfc,0x8a,0x82}
-},
-{ 14,
- 0xe47,
- 0,
- {0x8c,0x83,0xe0,0xfa,0x90,0x7f,0x00,0xf0,0x90,0x7f,0xb5,0x74,0x01,0xf0}
-},
-{ 3,
- 0xe55,
- 0,
- {0x02,0x0e,0xcd}
-},
-{ 5,
- 0xe58,
- 0,
- {0xbb,0x0b,0x02,0x80,0x03}
-},
-{ 3,
- 0xe5d,
- 0,
- {0x02,0x0e,0xa9}
-},
-{ 13,
- 0xe60,
- 0,
- {0x90,0x17,0x20,0xe4,0xf0,0x90,0x7f,0xec,0xe0,0xfa,0xba,0x01,0x1a}
-},
-{ 8,
- 0xe6d,
- 0,
- {0x90,0x7f,0xed,0xe0,0xfa,0xba,0x00,0x12}
-},
-{ 14,
- 0xe75,
- 0,
- {0x90,0x7f,0xea,0xe0,0xfa,0x90,0x17,0x21,0xf0,0xc0,0x03,0x12,0x04,0xe2}
-},
-{ 4,
- 0xe83,
- 0,
- {0xd0,0x03,0x80,0x46}
-},
-{ 8,
- 0xe87,
- 0,
- {0x90,0x7f,0xec,0xe0,0xfa,0xba,0x02,0x3e}
-},
-{ 8,
- 0xe8f,
- 0,
- {0x90,0x7f,0xed,0xe0,0xfa,0xba,0x00,0x36}
-},
-{ 13,
- 0xe97,
- 0,
- {0xc0,0x03,0x12,0x04,0xef,0xd0,0x03,0x90,0x7f,0xea,0xe0,0xfa,0x90}
-},
-{ 5,
- 0xea4,
- 0,
- {0x17,0x22,0xf0,0x80,0x24}
-},
-{ 5,
- 0xea9,
- 0,
- {0xbb,0x12,0x02,0x80,0x17}
-},
-{ 5,
- 0xeae,
- 0,
- {0xbb,0x81,0x02,0x80,0x0d}
-},
-{ 5,
- 0xeb3,
- 0,
- {0xbb,0x83,0x02,0x80,0x08}
-},
-{ 5,
- 0xeb8,
- 0,
- {0xbb,0x82,0x02,0x80,0x03}
-},
-{ 3,
- 0xebd,
- 0,
- {0xbb,0x84,0x05}
-},
-{ 5,
- 0xec0,
- 0,
- {0x12,0x06,0x4e,0x80,0x08}
-},
-{ 8,
- 0xec5,
- 0,
- {0x90,0x7f,0xb4,0x74,0x03,0xf0,0x80,0x06}
-},
-{ 6,
- 0xecd,
- 0,
- {0x90,0x7f,0xb4,0x74,0x02,0xf0}
-},
-{ 2,
- 0xed3,
- 0,
- {0xd0,0x86}
-},
-{ 14,
- 0xed5,
- 0,
- {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04}
-},
-{ 13,
- 0xee3,
- 0,
- {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
-},
-{ 11,
- 0xef0,
- 0,
- {0x90,0x7f,0xec,0xe0,0xf5,0x5a,0xc3,0x94,0x01,0x40,0x1d}
-},
-{ 7,
- 0xefb,
- 0,
- {0xc3,0x74,0x07,0x95,0x5a,0x40,0x16}
-},
-{ 13,
- 0xf02,
- 0,
- {0xe5,0x5a,0x24,0xff,0x25,0xe0,0xfa,0x24,0xc6,0xf5,0x82,0xe4,0x34}
-},
-{ 9,
- 0xf0f,
- 0,
- {0x7f,0xf5,0x83,0xaa,0x59,0xea,0xf0,0x80,0x22}
-},
-{ 7,
- 0xf18,
- 0,
- {0xc3,0xe5,0x5a,0x94,0x81,0x40,0x1b}
-},
-{ 7,
- 0xf1f,
- 0,
- {0xc3,0x74,0x87,0x95,0x5a,0x40,0x14}
-},
-{ 13,
- 0xf26,
- 0,
- {0xe5,0x5a,0x24,0xff,0x25,0xe0,0xfa,0x24,0xb6,0xf5,0x82,0xe4,0x34}
-},
-{ 7,
- 0xf33,
- 0,
- {0x7f,0xf5,0x83,0xaa,0x59,0xea,0xf0}
-},
-{ 1,
- 0xf3a,
- 0,
- {0x22}
-},
-{ 14,
- 0xf3b,
- 0,
- {0x09,0x02,0xba,0x00,0x03,0x01,0x00,0x40,0x00,0x09,0x04,0x00,0x00,0x00}
-},
-{ 14,
- 0xf49,
- 0,
- {0x01,0x01,0x00,0x00,0x09,0x24,0x01,0x00,0x01,0x3d,0x00,0x01,0x01,0x0c}
-},
-{ 14,
- 0xf57,
- 0,
- {0x24,0x02,0x01,0x10,0x07,0x00,0x02,0x03,0x00,0x00,0x00,0x0d,0x24,0x06}
-},
-{ 14,
- 0xf65,
- 0,
- {0x03,0x01,0x02,0x15,0x00,0x03,0x00,0x03,0x00,0x00,0x09,0x24,0x03,0x02}
-},
-{ 14,
- 0xf73,
- 0,
- {0x01,0x01,0x00,0x01,0x00,0x09,0x24,0x03,0x04,0x02,0x03,0x00,0x03,0x00}
-},
-{ 14,
- 0xf81,
- 0,
- {0x09,0x24,0x03,0x05,0x03,0x06,0x00,0x01,0x00,0x09,0x04,0x01,0x00,0x00}
-},
-{ 14,
- 0xf8f,
- 0,
- {0x01,0x02,0x00,0x00,0x09,0x04,0x01,0x01,0x01,0x01,0x02,0x00,0x00,0x07}
-},
-{ 14,
- 0xf9d,
- 0,
- {0x24,0x01,0x02,0x01,0x01,0x00,0x0b,0x24,0x02,0x01,0x02,0x02,0x10,0x01}
-},
-{ 14,
- 0xfab,
- 0,
- {0x80,0xbb,0x00,0x09,0x05,0x88,0x05,0x00,0x01,0x01,0x00,0x00,0x07,0x25}
-},
-{ 14,
- 0xfb9,
- 0,
- {0x01,0x00,0x00,0x00,0x00,0x09,0x04,0x02,0x00,0x02,0x00,0x00,0x00,0x00}
-},
-{ 14,
- 0xfc7,
- 0,
- {0x07,0x05,0x82,0x02,0x40,0x00,0x00,0x07,0x05,0x02,0x02,0x40,0x00,0x00}
-},
-{ 14,
- 0xfd5,
- 0,
- {0x09,0x04,0x02,0x01,0x03,0x00,0x00,0x00,0x00,0x07,0x05,0x82,0x02,0x40}
-},
-{ 14,
- 0xfe3,
- 0,
- {0x00,0x00,0x07,0x05,0x02,0x02,0x40,0x00,0x00,0x09,0x05,0x89,0x05,0xa0}
-},
-{ 10,
- 0xff1,
- 0,
- {0x01,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00}
-},
-{ 14,
- 0xffb,
- 0,
- {0x12,0x01,0x00,0x01,0x00,0x00,0x00,0x40,0x47,0x05,0x99,0x99,0x00,0x01}
-},
-{ 14,
- 0x1009,
- 0,
- {0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0xba}
-},
-{ 4,
- 0x1017,
- 0,
- {0x00,0x03,0x01,0x00}
-},
-{ 2,
- 0x101b,
- 0,
- {0x7a,0x00}
-},
-{ 3,
- 0x101d,
- 0,
- {0xba,0x05,0x00}
-},
-{ 2,
- 0x1020,
- 0,
- {0x50,0x17}
-},
-{ 8,
- 0x1022,
- 0,
- {0x90,0x7f,0xa5,0xe0,0xfb,0x30,0xe0,0x05}
-},
-{ 5,
- 0x102a,
- 0,
- {0x90,0x00,0x01,0x80,0x0d}
-},
-{ 10,
- 0x102f,
- 0,
- {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xe4}
-},
-{ 3,
- 0x1039,
- 0,
- {0x90,0x00,0x01}
-},
-{ 1,
- 0x103c,
- 0,
- {0x22}
-},
-{ 14,
- 0x103d,
- 0,
- {0x90,0x7d,0xc1,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0x7c,0x00,0x7d}
-},
-{ 4,
- 0x104b,
- 0,
- {0x7e,0xeb,0x60,0x12}
-},
-{ 14,
- 0x104f,
- 0,
- {0x89,0x82,0x8a,0x83,0xe0,0xa3,0xa9,0x82,0xaa,0x83,0x8c,0x82,0x8d,0x83}
-},
-{ 4,
- 0x105d,
- 0,
- {0xf0,0x0c,0xdb,0xee}
-},
-{ 8,
- 0x1061,
- 0,
- {0x90,0x7d,0xc3,0xe0,0x90,0x7f,0xb9,0xf0}
-},
-{ 1,
- 0x1069,
- 0,
- {0x22}
-},
-{ 14,
- 0x106a,
- 0,
- {0x90,0x7d,0xc1,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0x7c,0xc4,0x7d}
-},
-{ 4,
- 0x1078,
- 0,
- {0x7d,0xeb,0x60,0xe5}
-},
-{ 14,
- 0x107c,
- 0,
- {0x8c,0x82,0x8d,0x83,0xe0,0x0c,0x89,0x82,0x8a,0x83,0xf0,0xa3,0xa9,0x82}
-},
-{ 4,
- 0x108a,
- 0,
- {0xaa,0x83,0xdb,0xee}
-},
-{ 1,
- 0x108e,
- 0,
- {0x22}
-},
-{ 14,
- 0x108f,
- 0,
- {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x05,0x86,0x90,0x7d,0xc1,0xe0,0x05,0x86}
-},
-{ 14,
- 0x109d,
- 0,
- {0xa3,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa6,0x05,0x86,0xa3,0xa3,0xe0,0xf9}
-},
-{ 5,
- 0x10ab,
- 0,
- {0x60,0x16,0xa3,0x05,0x86}
-},
-{ 13,
- 0x10b0,
- 0,
- {0x90,0x7f,0xa6,0x05,0x86,0xe0,0xa3,0x05,0x86,0xf0,0xc0,0x01,0x12}
-},
-{ 6,
- 0x10bd,
- 0,
- {0x10,0x1b,0xd0,0x01,0xd9,0xed}
-},
-{ 6,
- 0x10c3,
- 0,
- {0x90,0x7f,0xa5,0x74,0x40,0xf0}
-},
-{ 1,
- 0x10c9,
- 0,
- {0x22}
-},
-{ 8,
- 0x10ca,
- 0,
- {0x90,0x88,0x02,0x74,0x01,0xf0,0x7a,0x00}
-},
-{ 3,
- 0x10d2,
- 0,
- {0xba,0xff,0x00}
-},
-{ 2,
- 0x10d5,
- 0,
- {0x50,0x0a}
-},
-{ 10,
- 0x10d7,
- 0,
- {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xf1}
-},
-{ 1,
- 0x10e1,
- 0,
- {0x22}
-},
-{ 5,
- 0x10e2,
- 0,
- {0xe5,0x6b,0xb4,0xc0,0x08}
-},
-{ 8,
- 0x10e7,
- 0,
- {0x90,0x88,0x03,0xe5,0x6c,0xf0,0x80,0x06}
-},
-{ 6,
- 0x10ef,
- 0,
- {0x90,0x88,0x02,0xe5,0x6c,0xf0}
-},
-{ 4,
- 0x10f5,
- 0,
- {0x7a,0x00,0x7b,0x00}
-},
-{ 11,
- 0x10f9,
- 0,
- {0xc3,0xea,0x94,0x32,0xeb,0x64,0x80,0x94,0x80,0x50,0x07}
-},
-{ 5,
- 0x1104,
- 0,
- {0x0a,0xba,0x00,0x01,0x0b}
-},
-{ 2,
- 0x1109,
- 0,
- {0x80,0xee}
-},
-{ 1,
- 0x110b,
- 0,
- {0x22}
-},
-{ 10,
- 0x110c,
- 0,
- {0x90,0x88,0x03,0xe5,0x6d,0xf0,0x05,0x39,0x7a,0x00}
-},
-{ 3,
- 0x1116,
- 0,
- {0xba,0x28,0x00}
-},
-{ 2,
- 0x1119,
- 0,
- {0x50,0x03}
-},
-{ 3,
- 0x111b,
- 0,
- {0x0a,0x80,0xf8}
-},
-{ 5,
- 0x111e,
- 0,
- {0xe5,0x39,0xb4,0x10,0x08}
-},
-{ 8,
- 0x1123,
- 0,
- {0x90,0x88,0x02,0x74,0xc0,0xf0,0x80,0x0e}
-},
-{ 5,
- 0x112b,
- 0,
- {0xe5,0x39,0xb4,0x20,0x09}
-},
-{ 9,
- 0x1130,
- 0,
- {0x90,0x88,0x02,0x74,0x80,0xf0,0x75,0x39,0x00}
-},
-{ 2,
- 0x1139,
- 0,
- {0x7a,0x00}
-},
-{ 3,
- 0x113b,
- 0,
- {0xba,0x28,0x00}
-},
-{ 2,
- 0x113e,
- 0,
- {0x50,0x03}
-},
-{ 3,
- 0x1140,
- 0,
- {0x0a,0x80,0xf8}
-},
-{ 1,
- 0x1143,
- 0,
- {0x22}
-},
-{ 4,
- 0x1144,
- 0,
- {0xe5,0x6f,0x60,0x02}
-},
-{ 2,
- 0x1148,
- 0,
- {0x80,0x07}
-},
-{ 7,
- 0x114a,
- 0,
- {0x7a,0x00,0x75,0x39,0x00,0x80,0x05}
-},
-{ 5,
- 0x1151,
- 0,
- {0x7a,0x40,0x75,0x39,0x10}
-},
-{ 9,
- 0x1156,
- 0,
- {0xe5,0x6e,0x2a,0xfa,0xe5,0x6e,0x25,0x39,0xf5}
-},
-{ 10,
- 0x115f,
- 0,
- {0x39,0x90,0x88,0x02,0x74,0x80,0x2a,0xf0,0x7a,0x00}
-},
-{ 8,
- 0x1169,
- 0,
- {0xc3,0xea,0x64,0x80,0x94,0xa8,0x50,0x03}
-},
-{ 3,
- 0x1171,
- 0,
- {0x0a,0x80,0xf5}
-},
-{ 1,
- 0x1174,
- 0,
- {0x22}
-},
-{ 6,
- 0x1175,
- 0,
- {0xaa,0x70,0xab,0x71,0xac,0x72}
-},
-{ 12,
- 0x117b,
- 0,
- {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x12,0x14,0xee,0xfd,0x60,0x18}
-},
-{ 13,
- 0x1187,
- 0,
- {0x8d,0x6d,0xc0,0x02,0xc0,0x03,0xc0,0x04,0x12,0x11,0x0c,0xd0,0x04}
-},
-{ 9,
- 0x1194,
- 0,
- {0xd0,0x03,0xd0,0x02,0x0a,0xba,0x00,0x01,0x0b}
-},
-{ 2,
- 0x119d,
- 0,
- {0x80,0xdc}
-},
-{ 1,
- 0x119f,
- 0,
- {0x22}
-},
-{ 13,
- 0x11a0,
- 0,
- {0xe5,0x73,0xc4,0x54,0x0f,0xfa,0x53,0x02,0x0f,0xc3,0x74,0x09,0x9a}
-},
-{ 2,
- 0x11ad,
- 0,
- {0x50,0x06}
-},
-{ 6,
- 0x11af,
- 0,
- {0x74,0x37,0x2a,0xfb,0x80,0x04}
-},
-{ 4,
- 0x11b5,
- 0,
- {0x74,0x30,0x2a,0xfb}
-},
-{ 12,
- 0x11b9,
- 0,
- {0x8b,0x6d,0xc0,0x03,0x12,0x11,0x0c,0xd0,0x03,0xaa,0x73,0x53}
-},
-{ 8,
- 0x11c5,
- 0,
- {0x02,0x0f,0xc3,0x74,0x09,0x9a,0x50,0x06}
-},
-{ 6,
- 0x11cd,
- 0,
- {0x74,0x37,0x2a,0xfb,0x80,0x04}
-},
-{ 4,
- 0x11d3,
- 0,
- {0x74,0x30,0x2a,0xfb}
-},
-{ 5,
- 0x11d7,
- 0,
- {0x8b,0x6d,0x12,0x11,0x0c}
-},
-{ 1,
- 0x11dc,
- 0,
- {0x22}
-},
-{ 7,
- 0x11dd,
- 0,
- {0x90,0x7d,0xc3,0xe0,0xfa,0x60,0x0f}
-},
-{ 12,
- 0x11e4,
- 0,
- {0x90,0x7d,0xc1,0xe0,0xf5,0x6e,0x90,0x7d,0xc2,0xe0,0xf5,0x6f}
-},
-{ 3,
- 0x11f0,
- 0,
- {0x12,0x11,0x44}
-},
-{ 12,
- 0x11f3,
- 0,
- {0x90,0x7d,0xff,0xe4,0xf0,0x75,0x70,0xc4,0x75,0x71,0x7d,0x75}
-},
-{ 5,
- 0x11ff,
- 0,
- {0x72,0x01,0x12,0x11,0x75}
-},
-{ 1,
- 0x1204,
- 0,
- {0x22}
-},
-{ 2,
- 0x1205,
- 0,
- {0x7a,0x04}
-},
-{ 3,
- 0x1207,
- 0,
- {0xba,0x40,0x00}
-},
-{ 2,
- 0x120a,
- 0,
- {0x50,0x36}
-},
-{ 14,
- 0x120c,
- 0,
- {0xea,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x7d,0xf5,0x83,0xe0,0xfb,0x7c,0x00}
-},
-{ 3,
- 0x121a,
- 0,
- {0xbc,0x08,0x00}
-},
-{ 2,
- 0x121d,
- 0,
- {0x50,0x20}
-},
-{ 6,
- 0x121f,
- 0,
- {0x8b,0x05,0xed,0x30,0xe7,0x0b}
-},
-{ 11,
- 0x1225,
- 0,
- {0x90,0x7f,0x96,0x74,0x42,0xf0,0x74,0xc3,0xf0,0x80,0x08}
-},
-{ 8,
- 0x1230,
- 0,
- {0x90,0x7f,0x96,0xe4,0xf0,0x74,0x81,0xf0}
-},
-{ 7,
- 0x1238,
- 0,
- {0xeb,0x25,0xe0,0xfb,0x0c,0x80,0xdb}
-},
-{ 3,
- 0x123f,
- 0,
- {0x0a,0x80,0xc5}
-},
-{ 1,
- 0x1242,
- 0,
- {0x22}
-},
-{ 4,
- 0x1243,
- 0,
- {0x7a,0x00,0x7b,0xef}
-},
-{ 3,
- 0x1247,
- 0,
- {0xba,0x10,0x00}
-},
-{ 2,
- 0x124a,
- 0,
- {0x50,0x20}
-},
-{ 14,
- 0x124c,
- 0,
- {0x74,0x11,0x2b,0xfb,0x24,0x00,0xfc,0xe4,0x34,0x18,0xfd,0x8c,0x82,0x8d}
-},
-{ 14,
- 0x125a,
- 0,
- {0x83,0xe4,0xf0,0xea,0x24,0x00,0xf5,0x82,0xe4,0x34,0x19,0xf5,0x83,0xe4}
-},
-{ 4,
- 0x1268,
- 0,
- {0xf0,0x0a,0x80,0xdb}
-},
-{ 1,
- 0x126c,
- 0,
- {0x22}
-},
-{ 14,
- 0x126d,
- 0,
- {0x74,0xf8,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0}
-},
-{ 14,
- 0x127b,
- 0,
- {0x74,0xf9,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0}
-},
-{ 14,
- 0x1289,
- 0,
- {0x74,0xfa,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0}
-},
-{ 14,
- 0x1297,
- 0,
- {0x74,0xfb,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0}
-},
-{ 14,
- 0x12a5,
- 0,
- {0x74,0xff,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0}
-},
-{ 1,
- 0x12b3,
- 0,
- {0x22}
-},
-{ 14,
- 0x12b4,
- 0,
- {0x12,0x03,0xcb,0x12,0x12,0x6d,0x7a,0xc0,0x7b,0x87,0x7c,0x01,0x74,0x01}
-},
-{ 14,
- 0x12c2,
- 0,
- {0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x74}
-},
-{ 14,
- 0x12d0,
- 0,
- {0x01,0x12,0x14,0xbf,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e}
-},
-{ 14,
- 0x12de,
- 0,
- {0x83,0x8f,0xf0,0x74,0x06,0x12,0x14,0xbf,0x74,0x01,0x2a,0xfd,0xe4,0x3b}
-},
-{ 14,
- 0x12ec,
- 0,
- {0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83,0x8c,0xf0,0xe4,0x12,0x14,0xbf,0x74}
-},
-{ 14,
- 0x12fa,
- 0,
- {0x01,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0}
-},
-{ 14,
- 0x1308,
- 0,
- {0x74,0x0b,0x12,0x14,0xbf,0x74,0x01,0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07}
-},
-{ 14,
- 0x1316,
- 0,
- {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x74,0x08,0x12,0x14,0xbf,0x74,0x01,0x2d}
-},
-{ 14,
- 0x1324,
- 0,
- {0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0,0x74,0x01}
-},
-{ 14,
- 0x1332,
- 0,
- {0x12,0x14,0xbf,0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83}
-},
-{ 14,
- 0x1340,
- 0,
- {0x8c,0xf0,0xe4,0x12,0x14,0xbf,0x74,0x01,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f}
-},
-{ 14,
- 0x134e,
- 0,
- {0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0,0x74,0x03,0x12,0x14,0xbf,0x7d,0x00}
-},
-{ 3,
- 0x135c,
- 0,
- {0xbd,0x06,0x00}
-},
-{ 2,
- 0x135f,
- 0,
- {0x50,0x12}
-},
-{ 11,
- 0x1361,
- 0,
- {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x0a,0xba,0x00,0x01,0x0b}
-},
-{ 7,
- 0x136c,
- 0,
- {0xe4,0x12,0x14,0xbf,0x0d,0x80,0xe9}
-},
-{ 13,
- 0x1373,
- 0,
- {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0xe5,0x74,0x12,0x14,0xbf,0x74,0xf9}
-},
-{ 14,
- 0x1380,
- 0,
- {0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0x74,0x0f,0xf0,0x74}
-},
-{ 14,
- 0x138e,
- 0,
- {0xfe,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0x74,0x01,0xf0}
-},
-{ 6,
- 0x139c,
- 0,
- {0x12,0x03,0xe1,0x12,0x04,0xf7}
-},
-{ 1,
- 0x13a2,
- 0,
- {0x22}
-},
-{ 13,
- 0x13a3,
- 0,
- {0x90,0x7d,0xc1,0xe0,0xfa,0x24,0x00,0xfb,0xe4,0x34,0x19,0xfc,0x90}
-},
-{ 14,
- 0x13b0,
- 0,
- {0x7d,0xc2,0xe0,0xfd,0x8b,0x82,0x8c,0x83,0xf0,0x75,0xf0,0x11,0xea,0xa4}
-},
-{ 3,
- 0x13be,
- 0,
- {0xfa,0x7b,0x00}
-},
-{ 3,
- 0x13c1,
- 0,
- {0xbb,0x10,0x00}
-},
-{ 2,
- 0x13c4,
- 0,
- {0x50,0x24}
-},
-{ 14,
- 0x13c6,
- 0,
- {0xea,0x24,0x00,0xfc,0xe4,0x34,0x18,0xfd,0xeb,0x2c,0xfc,0xe4,0x3d,0xfd}
-},
-{ 14,
- 0x13d4,
- 0,
- {0x74,0x04,0x2b,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x7d,0xf5,0x83,0xe0,0xfe}
-},
-{ 8,
- 0x13e2,
- 0,
- {0x8c,0x82,0x8d,0x83,0xf0,0x0b,0x80,0xd7}
-},
-{ 14,
- 0x13ea,
- 0,
- {0xea,0x24,0x00,0xfa,0xe4,0x34,0x18,0xfb,0x74,0x10,0x2a,0xf5,0x82,0xe4}
-},
-{ 5,
- 0x13f8,
- 0,
- {0x3b,0xf5,0x83,0xe4,0xf0}
-},
-{ 1,
- 0x13fd,
- 0,
- {0x22}
-},
-{ 4,
- 0x13fe,
- 0,
- {0xe5,0x76,0x60,0x02}
-},
-{ 2,
- 0x1402,
- 0,
- {0x80,0x16}
-},
-{ 12,
- 0x1404,
- 0,
- {0x74,0x0f,0x55,0x75,0xfa,0x8a,0x75,0x24,0x00,0xf5,0x82,0xe4}
-},
-{ 10,
- 0x1410,
- 0,
- {0x34,0x19,0xf5,0x83,0xe0,0xf5,0x74,0x12,0x12,0xb4}
-},
-{ 10,
- 0x141a,
- 0,
- {0x12,0x10,0xca,0x75,0x6e,0x00,0x75,0x6f,0x00,0x12}
-},
-{ 6,
- 0x1424,
- 0,
- {0x11,0x44,0x75,0x70,0xb9,0x75}
-},
-{ 6,
- 0x142a,
- 0,
- {0x71,0x14,0x75,0x72,0x02,0x12}
-},
-{ 11,
- 0x1430,
- 0,
- {0x11,0x75,0xe5,0x76,0xb4,0x02,0x04,0x74,0x01,0x80,0x01}
-},
-{ 1,
- 0x143b,
- 0,
- {0xe4}
-},
-{ 3,
- 0x143c,
- 0,
- {0xfa,0x70,0x0f}
-},
-{ 12,
- 0x143f,
- 0,
- {0x74,0x01,0x25,0x75,0xf5,0x73,0xc0,0x02,0x12,0x11,0xa0,0xd0}
-},
-{ 3,
- 0x144b,
- 0,
- {0x02,0x80,0x0a}
-},
-{ 10,
- 0x144e,
- 0,
- {0x85,0x75,0x73,0xc0,0x02,0x12,0x11,0xa0,0xd0,0x02}
-},
-{ 12,
- 0x1458,
- 0,
- {0x75,0x6e,0x00,0x75,0x6f,0x01,0xc0,0x02,0x12,0x11,0x44,0xd0}
-},
-{ 4,
- 0x1464,
- 0,
- {0x02,0xea,0x70,0x1a}
-},
-{ 13,
- 0x1468,
- 0,
- {0x75,0xf0,0x11,0xe5,0x75,0xa4,0xfa,0x24,0x00,0xfa,0xe4,0x34,0x18}
-},
-{ 9,
- 0x1475,
- 0,
- {0xfb,0x8a,0x70,0x8b,0x71,0x75,0x72,0x01,0x12}
-},
-{ 4,
- 0x147e,
- 0,
- {0x11,0x75,0x80,0x36}
-},
-{ 2,
- 0x1482,
- 0,
- {0x7a,0x00}
-},
-{ 3,
- 0x1484,
- 0,
- {0xba,0x10,0x00}
-},
-{ 2,
- 0x1487,
- 0,
- {0x50,0x2f}
-},
-{ 13,
- 0x1489,
- 0,
- {0xea,0x24,0x00,0xf5,0x82,0xe4,0x34,0x19,0xf5,0x83,0xe0,0xfb,0xe5}
-},
-{ 4,
- 0x1496,
- 0,
- {0x75,0xb5,0x03,0x1b}
-},
-{ 14,
- 0x149a,
- 0,
- {0x75,0xf0,0x11,0xea,0xa4,0xfb,0x24,0x00,0xfb,0xe4,0x34,0x18,0xfc,0x8b}
-},
-{ 9,
- 0x14a8,
- 0,
- {0x70,0x8c,0x71,0x75,0x72,0x01,0xc0,0x02,0x12}
-},
-{ 4,
- 0x14b1,
- 0,
- {0x11,0x75,0xd0,0x02}
-},
-{ 3,
- 0x14b5,
- 0,
- {0x0a,0x80,0xcc}
-},
-{ 1,
- 0x14b8,
- 0,
- {0x22}
-},
-{ 6,
- 0x14b9,
- 0,
- {0x50,0x72,0x6f,0x67,0x20,0x00}
-},
-{ 14,
- 0x14bf,
- 0,
- {0xc8,0xc0,0xe0,0xc8,0xc0,0xe0,0xe5,0xf0,0x60,0x0b,0x14,0x60,0x0f,0x14}
-},
-{ 7,
- 0x14cd,
- 0,
- {0x60,0x11,0x14,0x60,0x12,0x80,0x15}
-},
-{ 7,
- 0x14d4,
- 0,
- {0xd0,0xe0,0xa8,0x82,0xf6,0x80,0x0e}
-},
-{ 5,
- 0x14db,
- 0,
- {0xd0,0xe0,0xf0,0x80,0x09}
-},
-{ 4,
- 0x14e0,
- 0,
- {0xd0,0xe0,0x80,0x05}
-},
-{ 5,
- 0x14e4,
- 0,
- {0xd0,0xe0,0xa8,0x82,0xf2}
-},
-{ 4,
- 0x14e9,
- 0,
- {0xc8,0xd0,0xe0,0xc8}
-},
-{ 1,
- 0x14ed,
- 0,
- {0x22}
-},
-{ 14,
- 0x14ee,
- 0,
- {0xc8,0xc0,0xe0,0xe5,0xf0,0x60,0x0d,0x14,0x60,0x0f,0x14,0x60,0x0f,0x14}
-},
-{ 6,
- 0x14fc,
- 0,
- {0x60,0x10,0x74,0xff,0x80,0x0f}
-},
-{ 5,
- 0x1502,
- 0,
- {0xa8,0x82,0xe6,0x80,0x0a}
-},
-{ 3,
- 0x1507,
- 0,
- {0xe0,0x80,0x07}
-},
-{ 4,
- 0x150a,
- 0,
- {0xe4,0x93,0x80,0x03}
-},
-{ 3,
- 0x150e,
- 0,
- {0xa8,0x82,0xe2}
-},
-{ 4,
- 0x1511,
- 0,
- {0xf8,0xd0,0xe0,0xc8}
-},
-{ 1,
- 0x1515,
- 0,
- {0x22}
-},
-{ 0,
- 0x0,
- 1,
- {0}
-}
-};
--- /dev/null
+//$Id: firmware.h,v 1.1 1999/12/17 08:55:05 fliegl Exp $
+static INTEL_HEX_RECORD firmware[] = {
+{ 2,
+ 0x0,
+ 0,
+ {0x21,0x57}
+},
+{ 3,
+ 0x3,
+ 0,
+ {0x02,0x01,0x66}
+},
+{ 3,
+ 0xb,
+ 0,
+ {0x02,0x01,0x66}
+},
+{ 3,
+ 0x13,
+ 0,
+ {0x02,0x01,0x66}
+},
+{ 3,
+ 0x1b,
+ 0,
+ {0x02,0x01,0x66}
+},
+{ 3,
+ 0x23,
+ 0,
+ {0x02,0x01,0x66}
+},
+{ 3,
+ 0x2b,
+ 0,
+ {0x02,0x01,0x66}
+},
+{ 3,
+ 0x33,
+ 0,
+ {0x02,0x03,0x0f}
+},
+{ 3,
+ 0x3b,
+ 0,
+ {0x02,0x01,0x66}
+},
+{ 3,
+ 0x43,
+ 0,
+ {0x02,0x01,0x00}
+},
+{ 3,
+ 0x4b,
+ 0,
+ {0x02,0x01,0x66}
+},
+{ 3,
+ 0x53,
+ 0,
+ {0x02,0x01,0x66}
+},
+{ 3,
+ 0x5b,
+ 0,
+ {0x02,0x04,0xbd}
+},
+{ 3,
+ 0x63,
+ 0,
+ {0x02,0x01,0x67}
+},
+{ 3,
+ 0x100,
+ 0,
+ {0x02,0x0c,0x5a}
+},
+{ 3,
+ 0x104,
+ 0,
+ {0x02,0x01,0xed}
+},
+{ 3,
+ 0x108,
+ 0,
+ {0x02,0x02,0x51}
+},
+{ 3,
+ 0x10c,
+ 0,
+ {0x02,0x02,0x7c}
+},
+{ 3,
+ 0x110,
+ 0,
+ {0x02,0x02,0xe4}
+},
+{ 1,
+ 0x114,
+ 0,
+ {0x32}
+},
+{ 1,
+ 0x118,
+ 0,
+ {0x32}
+},
+{ 3,
+ 0x11c,
+ 0,
+ {0x02,0x05,0xfd}
+},
+{ 3,
+ 0x120,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x124,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x128,
+ 0,
+ {0x02,0x04,0x3c}
+},
+{ 3,
+ 0x12c,
+ 0,
+ {0x02,0x04,0x6a}
+},
+{ 3,
+ 0x130,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x134,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x138,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x13c,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x140,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x144,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x148,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x14c,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x150,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 3,
+ 0x154,
+ 0,
+ {0x02,0x00,0x00}
+},
+{ 10,
+ 0x157,
+ 0,
+ {0x75,0x81,0x7f,0xe5,0x82,0x60,0x03,0x02,0x01,0x61}
+},
+{ 5,
+ 0x161,
+ 0,
+ {0x12,0x07,0x6f,0x21,0x64}
+},
+{ 1,
+ 0x166,
+ 0,
+ {0x32}
+},
+{ 14,
+ 0x167,
+ 0,
+ {0xc0,0xd0,0xc0,0x86,0xc0,0x82,0xc0,0x83,0xc0,0xe0,0x90,0x7f,0x97,0xe0}
+},
+{ 14,
+ 0x175,
+ 0,
+ {0x44,0x80,0xf0,0x90,0x7f,0x69,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0}
+},
+{ 14,
+ 0x183,
+ 0,
+ {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0}
+},
+{ 14,
+ 0x191,
+ 0,
+ {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x90,0x7f,0x97,0xe0}
+},
+{ 3,
+ 0x19f,
+ 0,
+ {0x55,0x7f,0xf0}
+},
+{ 14,
+ 0x1a2,
+ 0,
+ {0x90,0x7f,0x9a,0xe0,0x30,0xe4,0x23,0x90,0x7f,0x68,0xf0,0xf0,0xf0,0xf0}
+},
+{ 14,
+ 0x1b0,
+ 0,
+ {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0}
+},
+{ 14,
+ 0x1be,
+ 0,
+ {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0}
+},
+{ 14,
+ 0x1cc,
+ 0,
+ {0xe5,0xd8,0xc2,0xe3,0xf5,0xd8,0xd0,0xe0,0xd0,0x83,0xd0,0x82,0xd0,0x86}
+},
+{ 3,
+ 0x1da,
+ 0,
+ {0xd0,0xd0,0x32}
+},
+{ 8,
+ 0x1dd,
+ 0,
+ {0x75,0x86,0x00,0x90,0xff,0xc3,0x7c,0x05}
+},
+{ 7,
+ 0x1e5,
+ 0,
+ {0xa3,0xe5,0x82,0x45,0x83,0x70,0xf9}
+},
+{ 1,
+ 0x1ec,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x1ed,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0xd0}
+},
+{ 14,
+ 0x1fb,
+ 0,
+ {0x75,0xd0,0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91}
+},
+{ 13,
+ 0x209,
+ 0,
+ {0x90,0x88,0x00,0xe0,0xf5,0x41,0x90,0x7f,0xab,0x74,0x02,0xf0,0x90}
+},
+{ 9,
+ 0x216,
+ 0,
+ {0x7f,0xab,0x74,0x02,0xf0,0xe5,0x32,0x60,0x21}
+},
+{ 4,
+ 0x21f,
+ 0,
+ {0x7a,0x00,0x7b,0x00}
+},
+{ 11,
+ 0x223,
+ 0,
+ {0xc3,0xea,0x94,0x18,0xeb,0x64,0x80,0x94,0x80,0x50,0x12}
+},
+{ 14,
+ 0x22e,
+ 0,
+ {0x90,0x7f,0x69,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x0a,0xba,0x00}
+},
+{ 2,
+ 0x23c,
+ 0,
+ {0x01,0x0b}
+},
+{ 2,
+ 0x23e,
+ 0,
+ {0x80,0xe3}
+},
+{ 2,
+ 0x240,
+ 0,
+ {0xd0,0x86}
+},
+{ 14,
+ 0x242,
+ 0,
+ {0xd0,0xd0,0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0}
+},
+{ 1,
+ 0x250,
+ 0,
+ {0x32}
+},
+{ 14,
+ 0x251,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
+},
+{ 14,
+ 0x25f,
+ 0,
+ {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xab,0x74}
+},
+{ 4,
+ 0x26d,
+ 0,
+ {0x04,0xf0,0xd0,0x86}
+},
+{ 11,
+ 0x271,
+ 0,
+ {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 14,
+ 0x27c,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04}
+},
+{ 14,
+ 0x28a,
+ 0,
+ {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0}
+},
+{ 13,
+ 0x298,
+ 0,
+ {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90}
+},
+{ 12,
+ 0x2a5,
+ 0,
+ {0x7f,0xab,0x74,0x08,0xf0,0x75,0x6e,0x00,0x75,0x6f,0x02,0x12}
+},
+{ 6,
+ 0x2b1,
+ 0,
+ {0x11,0x44,0x75,0x70,0x39,0x75}
+},
+{ 6,
+ 0x2b7,
+ 0,
+ {0x71,0x0c,0x75,0x72,0x02,0x12}
+},
+{ 12,
+ 0x2bd,
+ 0,
+ {0x11,0x75,0x90,0x7f,0xd6,0xe4,0xf0,0x75,0xd8,0x20,0xd0,0x86}
+},
+{ 14,
+ 0x2c9,
+ 0,
+ {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04}
+},
+{ 13,
+ 0x2d7,
+ 0,
+ {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 14,
+ 0x2e4,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
+},
+{ 14,
+ 0x2f2,
+ 0,
+ {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xab,0x74}
+},
+{ 4,
+ 0x300,
+ 0,
+ {0x10,0xf0,0xd0,0x86}
+},
+{ 11,
+ 0x304,
+ 0,
+ {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 14,
+ 0x30f,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04}
+},
+{ 14,
+ 0x31d,
+ 0,
+ {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0}
+},
+{ 12,
+ 0x32b,
+ 0,
+ {0x00,0xc0,0x86,0x75,0x86,0x00,0x75,0x6e,0x00,0x75,0x6f,0x02}
+},
+{ 7,
+ 0x337,
+ 0,
+ {0x12,0x11,0x44,0x75,0x70,0x40,0x75}
+},
+{ 6,
+ 0x33e,
+ 0,
+ {0x71,0x0c,0x75,0x72,0x02,0x12}
+},
+{ 14,
+ 0x344,
+ 0,
+ {0x11,0x75,0x90,0x7f,0xd6,0x74,0x02,0xf0,0x90,0x7f,0xd6,0x74,0x06,0xf0}
+},
+{ 5,
+ 0x352,
+ 0,
+ {0x75,0xd8,0x10,0xd0,0x86}
+},
+{ 14,
+ 0x357,
+ 0,
+ {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04}
+},
+{ 13,
+ 0x365,
+ 0,
+ {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 13,
+ 0x372,
+ 0,
+ {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x90,0x7f,0xa6,0x74,0x9a,0xf0,0x12}
+},
+{ 12,
+ 0x37f,
+ 0,
+ {0x10,0x1b,0x90,0x7f,0xa6,0xe5,0x42,0xf0,0x12,0x10,0x1b,0x90}
+},
+{ 13,
+ 0x38b,
+ 0,
+ {0x7f,0xa6,0xe5,0x43,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa5,0x74,0x40}
+},
+{ 1,
+ 0x398,
+ 0,
+ {0xf0}
+},
+{ 1,
+ 0x399,
+ 0,
+ {0x22}
+},
+{ 13,
+ 0x39a,
+ 0,
+ {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x90,0x7f,0xa6,0x74,0x9a,0xf0,0x12}
+},
+{ 12,
+ 0x3a7,
+ 0,
+ {0x10,0x1b,0x90,0x7f,0xa6,0xe5,0x44,0xf0,0x12,0x10,0x1b,0x90}
+},
+{ 12,
+ 0x3b3,
+ 0,
+ {0x7f,0xa6,0xe5,0x45,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa6,0xe5}
+},
+{ 11,
+ 0x3bf,
+ 0,
+ {0x46,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa5,0x74,0x40,0xf0}
+},
+{ 1,
+ 0x3ca,
+ 0,
+ {0x22}
+},
+{ 10,
+ 0x3cb,
+ 0,
+ {0x75,0x44,0x02,0x75,0x45,0x00,0x75,0x46,0x00,0x12}
+},
+{ 9,
+ 0x3d5,
+ 0,
+ {0x03,0x9a,0x75,0x42,0x03,0x75,0x43,0x00,0x12}
+},
+{ 2,
+ 0x3de,
+ 0,
+ {0x03,0x72}
+},
+{ 1,
+ 0x3e0,
+ 0,
+ {0x22}
+},
+{ 12,
+ 0x3e1,
+ 0,
+ {0x90,0x88,0x00,0xe5,0x36,0xf0,0x90,0x88,0x00,0x74,0x10,0x25}
+},
+{ 9,
+ 0x3ed,
+ 0,
+ {0x36,0xf0,0x12,0x01,0xdd,0x75,0x42,0x01,0x75}
+},
+{ 9,
+ 0x3f6,
+ 0,
+ {0x43,0x18,0x12,0x03,0x72,0x75,0x44,0x02,0x75}
+},
+{ 9,
+ 0x3ff,
+ 0,
+ {0x45,0x00,0x75,0x46,0x00,0x12,0x03,0x9a,0x75}
+},
+{ 8,
+ 0x408,
+ 0,
+ {0x42,0x03,0x75,0x43,0x44,0x12,0x03,0x72}
+},
+{ 1,
+ 0x410,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x411,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
+},
+{ 14,
+ 0x41f,
+ 0,
+ {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xaa,0x74}
+},
+{ 4,
+ 0x42d,
+ 0,
+ {0x02,0xf0,0xd0,0x86}
+},
+{ 11,
+ 0x431,
+ 0,
+ {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 14,
+ 0x43c,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
+},
+{ 14,
+ 0x44a,
+ 0,
+ {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xa9,0x74}
+},
+{ 7,
+ 0x458,
+ 0,
+ {0x04,0xf0,0x75,0x30,0x01,0xd0,0x86}
+},
+{ 11,
+ 0x45f,
+ 0,
+ {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 14,
+ 0x46a,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
+},
+{ 14,
+ 0x478,
+ 0,
+ {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xaa,0x74}
+},
+{ 7,
+ 0x486,
+ 0,
+ {0x04,0xf0,0x75,0x31,0x01,0xd0,0x86}
+},
+{ 11,
+ 0x48d,
+ 0,
+ {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 14,
+ 0x498,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
+},
+{ 12,
+ 0x4a6,
+ 0,
+ {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe5,0xf5,0x91,0xd0,0x86}
+},
+{ 11,
+ 0x4b2,
+ 0,
+ {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 14,
+ 0x4bd,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0}
+},
+{ 12,
+ 0x4cb,
+ 0,
+ {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe7,0xf5,0x91,0xd0,0x86}
+},
+{ 11,
+ 0x4d7,
+ 0,
+ {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 12,
+ 0x4e2,
+ 0,
+ {0x90,0x7f,0xea,0xe0,0xfa,0x8a,0x20,0x90,0x7f,0x96,0xe4,0xf0}
+},
+{ 1,
+ 0x4ee,
+ 0,
+ {0x22}
+},
+{ 7,
+ 0x4ef,
+ 0,
+ {0x90,0x7f,0xea,0xe0,0xfa,0x8a,0x21}
+},
+{ 1,
+ 0x4f6,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x4f7,
+ 0,
+ {0x90,0x17,0x13,0xe0,0xfa,0x90,0x17,0x15,0xe0,0xfb,0x74,0x80,0x2a,0xfa}
+},
+{ 14,
+ 0x505,
+ 0,
+ {0x74,0x80,0x2b,0xfb,0xea,0x03,0x03,0x54,0x3f,0xfc,0xea,0xc4,0x23,0x54}
+},
+{ 14,
+ 0x513,
+ 0,
+ {0x1f,0xfa,0x2c,0xfa,0xeb,0x03,0x03,0x54,0x3f,0xfc,0xeb,0xc4,0x23,0x54}
+},
+{ 11,
+ 0x521,
+ 0,
+ {0x1f,0xfb,0x2c,0xfb,0x90,0x17,0x0a,0xe0,0xfc,0x60,0x02}
+},
+{ 2,
+ 0x52c,
+ 0,
+ {0x7a,0x00}
+},
+{ 7,
+ 0x52e,
+ 0,
+ {0x90,0x17,0x0c,0xe0,0xfc,0x60,0x02}
+},
+{ 2,
+ 0x535,
+ 0,
+ {0x7b,0x00}
+},
+{ 11,
+ 0x537,
+ 0,
+ {0xea,0x2b,0xfc,0xc3,0x13,0xf5,0x3a,0x75,0x44,0x02,0x8b}
+},
+{ 7,
+ 0x542,
+ 0,
+ {0x45,0x8a,0x46,0x12,0x03,0x9a,0x75}
+},
+{ 9,
+ 0x549,
+ 0,
+ {0x6e,0x08,0x75,0x6f,0x00,0x12,0x11,0x44,0x75}
+},
+{ 4,
+ 0x552,
+ 0,
+ {0x70,0x47,0x75,0x71}
+},
+{ 8,
+ 0x556,
+ 0,
+ {0x0c,0x75,0x72,0x02,0x12,0x11,0x75,0x85}
+},
+{ 5,
+ 0x55e,
+ 0,
+ {0x3a,0x73,0x12,0x11,0xa0}
+},
+{ 1,
+ 0x563,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x564,
+ 0,
+ {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x65,0x02,0xf0,0x90}
+},
+{ 14,
+ 0x572,
+ 0,
+ {0x7f,0xeb,0xe0,0xfa,0x90,0x7f,0xea,0xe0,0xfb,0x90,0x7f,0xef,0xe0,0xfc}
+},
+{ 14,
+ 0x580,
+ 0,
+ {0x33,0x95,0xe0,0xfd,0x8c,0x05,0x7c,0x00,0x90,0x7f,0xee,0xe0,0xfe,0x33}
+},
+{ 14,
+ 0x58e,
+ 0,
+ {0x95,0xe0,0xff,0xec,0x2e,0xfc,0xed,0x3f,0xfd,0x90,0x7f,0xe9,0xe0,0xfe}
+},
+{ 5,
+ 0x59c,
+ 0,
+ {0xbe,0x01,0x02,0x80,0x03}
+},
+{ 3,
+ 0x5a1,
+ 0,
+ {0x02,0x05,0xf9}
+},
+{ 6,
+ 0x5a4,
+ 0,
+ {0xbc,0x01,0x21,0xbd,0x00,0x1e}
+},
+{ 14,
+ 0x5aa,
+ 0,
+ {0xea,0xc4,0x03,0x54,0xf8,0xfc,0xeb,0x25,0xe0,0xfd,0x2c,0x24,0x00,0xfc}
+},
+{ 14,
+ 0x5b8,
+ 0,
+ {0xe4,0x34,0x17,0xfd,0x90,0x7e,0xc0,0xe0,0xfe,0x8c,0x82,0x8d,0x83,0xf0}
+},
+{ 2,
+ 0x5c6,
+ 0,
+ {0x80,0x31}
+},
+{ 14,
+ 0x5c8,
+ 0,
+ {0xea,0xc4,0x03,0x54,0xf8,0xfa,0xeb,0x25,0xe0,0xfb,0x2a,0xfa,0x24,0x00}
+},
+{ 14,
+ 0x5d6,
+ 0,
+ {0xfb,0xe4,0x34,0x17,0xfc,0x90,0x7e,0xc0,0xe0,0xfd,0x8b,0x82,0x8c,0x83}
+},
+{ 14,
+ 0x5e4,
+ 0,
+ {0xf0,0x74,0x01,0x2a,0x24,0x00,0xfa,0xe4,0x34,0x17,0xfb,0x90,0x7e,0xc1}
+},
+{ 7,
+ 0x5f2,
+ 0,
+ {0xe0,0xfc,0x8a,0x82,0x8b,0x83,0xf0}
+},
+{ 3,
+ 0x5f9,
+ 0,
+ {0x75,0x38,0x01}
+},
+{ 1,
+ 0x5fc,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x5fd,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04}
+},
+{ 14,
+ 0x60b,
+ 0,
+ {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0}
+},
+{ 13,
+ 0x619,
+ 0,
+ {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90}
+},
+{ 13,
+ 0x626,
+ 0,
+ {0x7f,0xaa,0x74,0x01,0xf0,0x12,0x05,0x64,0x75,0x37,0x00,0xd0,0x86}
+},
+{ 14,
+ 0x633,
+ 0,
+ {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04}
+},
+{ 13,
+ 0x641,
+ 0,
+ {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 14,
+ 0x64e,
+ 0,
+ {0x90,0x7f,0xeb,0xe0,0xfa,0x90,0x7f,0xea,0xe0,0xfb,0x90,0x7f,0xee,0xe0}
+},
+{ 14,
+ 0x65c,
+ 0,
+ {0xfc,0x33,0x95,0xe0,0xfd,0x90,0x7f,0x96,0xe0,0xfe,0x90,0x7f,0x96,0x74}
+},
+{ 14,
+ 0x66a,
+ 0,
+ {0x80,0x65,0x06,0xf0,0x90,0x7f,0x00,0x74,0x01,0xf0,0xea,0xc4,0x03,0x54}
+},
+{ 14,
+ 0x678,
+ 0,
+ {0xf8,0xfe,0xeb,0x25,0xe0,0xfb,0x2e,0xfe,0x24,0x00,0xfb,0xe4,0x34,0x17}
+},
+{ 14,
+ 0x686,
+ 0,
+ {0xff,0x8b,0x82,0x8f,0x83,0xe0,0xfb,0x74,0x01,0x2e,0x24,0x00,0xfe,0xe4}
+},
+{ 14,
+ 0x694,
+ 0,
+ {0x34,0x17,0xff,0x8e,0x82,0x8f,0x83,0xe0,0xfe,0x90,0x7f,0xe9,0xe0,0xff}
+},
+{ 3,
+ 0x6a2,
+ 0,
+ {0xbf,0x81,0x0a}
+},
+{ 10,
+ 0x6a5,
+ 0,
+ {0x90,0x7f,0x00,0xeb,0xf0,0x90,0x7f,0x01,0xee,0xf0}
+},
+{ 8,
+ 0x6af,
+ 0,
+ {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x82,0x1a}
+},
+{ 3,
+ 0x6b7,
+ 0,
+ {0xba,0x01,0x0c}
+},
+{ 12,
+ 0x6ba,
+ 0,
+ {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0b}
+},
+{ 11,
+ 0x6c6,
+ 0,
+ {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0x74,0xb5,0xf0}
+},
+{ 8,
+ 0x6d1,
+ 0,
+ {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x83,0x1b}
+},
+{ 3,
+ 0x6d9,
+ 0,
+ {0xba,0x01,0x0d}
+},
+{ 13,
+ 0x6dc,
+ 0,
+ {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0b}
+},
+{ 11,
+ 0x6e9,
+ 0,
+ {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0x74,0x12,0xf0}
+},
+{ 8,
+ 0x6f4,
+ 0,
+ {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x84,0x1c}
+},
+{ 3,
+ 0x6fc,
+ 0,
+ {0xba,0x01,0x0d}
+},
+{ 13,
+ 0x6ff,
+ 0,
+ {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0c}
+},
+{ 12,
+ 0x70c,
+ 0,
+ {0x90,0x7f,0x00,0x74,0x80,0xf0,0x90,0x7f,0x01,0x74,0x01,0xf0}
+},
+{ 5,
+ 0x718,
+ 0,
+ {0x90,0x7f,0xb5,0xec,0xf0}
+},
+{ 1,
+ 0x71d,
+ 0,
+ {0x22}
+},
+{ 12,
+ 0x71e,
+ 0,
+ {0x75,0x36,0x0d,0x90,0x88,0x00,0x74,0x1d,0xf0,0x75,0x6b,0x80}
+},
+{ 10,
+ 0x72a,
+ 0,
+ {0x75,0x6c,0x3c,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75}
+},
+{ 9,
+ 0x734,
+ 0,
+ {0x6c,0x0f,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75}
+},
+{ 9,
+ 0x73d,
+ 0,
+ {0x6c,0x06,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75}
+},
+{ 7,
+ 0x746,
+ 0,
+ {0x6c,0x01,0x12,0x10,0xe2,0x7a,0x00}
+},
+{ 3,
+ 0x74d,
+ 0,
+ {0xba,0xff,0x00}
+},
+{ 2,
+ 0x750,
+ 0,
+ {0x50,0x0a}
+},
+{ 10,
+ 0x752,
+ 0,
+ {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xf1}
+},
+{ 10,
+ 0x75c,
+ 0,
+ {0x75,0x6b,0x80,0x75,0x6c,0x3c,0x12,0x10,0xe2,0x75}
+},
+{ 8,
+ 0x766,
+ 0,
+ {0x6b,0x80,0x75,0x6c,0x0f,0x12,0x10,0xe2}
+},
+{ 1,
+ 0x76e,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x76f,
+ 0,
+ {0x90,0x7f,0xa1,0xe4,0xf0,0x90,0x7f,0xaf,0x74,0x01,0xf0,0x90,0x7f,0x92}
+},
+{ 14,
+ 0x77d,
+ 0,
+ {0x74,0x02,0xf0,0x75,0x8e,0x31,0x75,0x89,0x21,0x75,0x88,0x00,0x75,0xc8}
+},
+{ 14,
+ 0x78b,
+ 0,
+ {0x00,0x75,0x8d,0x40,0x75,0x98,0x40,0x75,0xc0,0x40,0x75,0x87,0x00,0x75}
+},
+{ 9,
+ 0x799,
+ 0,
+ {0x20,0x00,0x75,0x21,0x00,0x75,0x22,0x00,0x75}
+},
+{ 5,
+ 0x7a2,
+ 0,
+ {0x23,0x00,0x75,0x47,0x00}
+},
+{ 7,
+ 0x7a7,
+ 0,
+ {0xc3,0xe5,0x47,0x94,0x20,0x50,0x11}
+},
+{ 13,
+ 0x7ae,
+ 0,
+ {0xe5,0x47,0x24,0x00,0xf5,0x82,0xe4,0x34,0x17,0xf5,0x83,0xe4,0xf0}
+},
+{ 4,
+ 0x7bb,
+ 0,
+ {0x05,0x47,0x80,0xe8}
+},
+{ 9,
+ 0x7bf,
+ 0,
+ {0xe4,0xf5,0x40,0xf5,0x3f,0xe4,0xf5,0x3c,0xf5}
+},
+{ 7,
+ 0x7c8,
+ 0,
+ {0x3b,0xe4,0xf5,0x3e,0xf5,0x3d,0x75}
+},
+{ 11,
+ 0x7cf,
+ 0,
+ {0x32,0x00,0x75,0x37,0x00,0x75,0x39,0x00,0x90,0x7f,0x93}
+},
+{ 14,
+ 0x7da,
+ 0,
+ {0x74,0x3c,0xf0,0x90,0x7f,0x9c,0x74,0xff,0xf0,0x90,0x7f,0x96,0x74,0x80}
+},
+{ 14,
+ 0x7e8,
+ 0,
+ {0xf0,0x90,0x7f,0x94,0x74,0x70,0xf0,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90}
+},
+{ 14,
+ 0x7f6,
+ 0,
+ {0x7f,0x97,0xe4,0xf0,0x90,0x7f,0x95,0x74,0xc2,0xf0,0x90,0x7f,0x98,0x74}
+},
+{ 14,
+ 0x804,
+ 0,
+ {0x28,0xf0,0x90,0x7f,0x9e,0x74,0x28,0xf0,0x90,0x7f,0xf0,0xe4,0xf0,0x90}
+},
+{ 14,
+ 0x812,
+ 0,
+ {0x7f,0xf1,0xe4,0xf0,0x90,0x7f,0xf2,0xe4,0xf0,0x90,0x7f,0xf3,0xe4,0xf0}
+},
+{ 14,
+ 0x820,
+ 0,
+ {0x90,0x7f,0xf4,0xe4,0xf0,0x90,0x7f,0xf5,0xe4,0xf0,0x90,0x7f,0xf6,0xe4}
+},
+{ 14,
+ 0x82e,
+ 0,
+ {0xf0,0x90,0x7f,0xf7,0xe4,0xf0,0x90,0x7f,0xf8,0xe4,0xf0,0x90,0x7f,0xf9}
+},
+{ 14,
+ 0x83c,
+ 0,
+ {0x74,0x38,0xf0,0x90,0x7f,0xfa,0x74,0xa0,0xf0,0x90,0x7f,0xfb,0x74,0xa0}
+},
+{ 14,
+ 0x84a,
+ 0,
+ {0xf0,0x90,0x7f,0xfc,0x74,0xa0,0xf0,0x90,0x7f,0xfd,0x74,0xa0,0xf0,0x90}
+},
+{ 14,
+ 0x858,
+ 0,
+ {0x7f,0xfe,0x74,0xa0,0xf0,0x90,0x7f,0xff,0x74,0xa0,0xf0,0x90,0x7f,0xe0}
+},
+{ 14,
+ 0x866,
+ 0,
+ {0x74,0x03,0xf0,0x90,0x7f,0xe1,0x74,0x01,0xf0,0x90,0x7f,0xdd,0x74,0x80}
+},
+{ 11,
+ 0x874,
+ 0,
+ {0xf0,0x12,0x12,0x43,0x12,0x07,0x1e,0x7a,0x00,0x7b,0x00}
+},
+{ 9,
+ 0x87f,
+ 0,
+ {0xc3,0xea,0x94,0x1e,0xeb,0x94,0x00,0x50,0x17}
+},
+{ 12,
+ 0x888,
+ 0,
+ {0x90,0x88,0x00,0xe0,0xf5,0x47,0x90,0x88,0x0b,0xe0,0xf5,0x47}
+},
+{ 9,
+ 0x894,
+ 0,
+ {0x90,0x7f,0x68,0xf0,0x0a,0xba,0x00,0x01,0x0b}
+},
+{ 2,
+ 0x89d,
+ 0,
+ {0x80,0xe0}
+},
+{ 12,
+ 0x89f,
+ 0,
+ {0x12,0x03,0xe1,0x90,0x7f,0xd6,0xe4,0xf0,0x7a,0x00,0x7b,0x00}
+},
+{ 13,
+ 0x8ab,
+ 0,
+ {0x8a,0x04,0x8b,0x05,0xc3,0xea,0x94,0xe0,0xeb,0x94,0x2e,0x50,0x1a}
+},
+{ 14,
+ 0x8b8,
+ 0,
+ {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0}
+},
+{ 10,
+ 0x8c6,
+ 0,
+ {0x04,0xd0,0x03,0xd0,0x02,0x0a,0xba,0x00,0x01,0x0b}
+},
+{ 2,
+ 0x8d0,
+ 0,
+ {0x80,0xd9}
+},
+{ 13,
+ 0x8d2,
+ 0,
+ {0x90,0x7f,0xd6,0x74,0x02,0xf0,0x90,0x7f,0xd6,0x74,0x06,0xf0,0x90}
+},
+{ 14,
+ 0x8df,
+ 0,
+ {0x7f,0xde,0x74,0x05,0xf0,0x90,0x7f,0xdf,0x74,0x05,0xf0,0x90,0x7f,0xac}
+},
+{ 14,
+ 0x8ed,
+ 0,
+ {0xe4,0xf0,0x90,0x7f,0xad,0x74,0x05,0xf0,0x75,0xa8,0x80,0x75,0xf8,0x10}
+},
+{ 13,
+ 0x8fb,
+ 0,
+ {0x90,0x7f,0xae,0x74,0x0b,0xf0,0x90,0x7f,0xe2,0x74,0x88,0xf0,0x90}
+},
+{ 12,
+ 0x908,
+ 0,
+ {0x7f,0xab,0x74,0x08,0xf0,0x75,0xe8,0x11,0x75,0x32,0x01,0x75}
+},
+{ 12,
+ 0x914,
+ 0,
+ {0x31,0x00,0x75,0x30,0x00,0xc0,0x04,0xc0,0x05,0x12,0x04,0xf7}
+},
+{ 10,
+ 0x920,
+ 0,
+ {0xd0,0x05,0xd0,0x04,0x75,0x34,0x00,0x75,0x35,0x01}
+},
+{ 13,
+ 0x92a,
+ 0,
+ {0x90,0x7f,0xae,0x74,0x03,0xf0,0x8c,0x02,0xba,0x00,0x02,0x80,0x03}
+},
+{ 3,
+ 0x937,
+ 0,
+ {0x02,0x0a,0x3f}
+},
+{ 12,
+ 0x93a,
+ 0,
+ {0x85,0x33,0x34,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90,0x7f,0x97}
+},
+{ 14,
+ 0x946,
+ 0,
+ {0x74,0x08,0xf0,0x90,0x7f,0x9d,0x74,0x88,0xf0,0x90,0x7f,0x9a,0xe0,0xfa}
+},
+{ 12,
+ 0x954,
+ 0,
+ {0x74,0x05,0x5a,0xf5,0x33,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90}
+},
+{ 13,
+ 0x960,
+ 0,
+ {0x7f,0x97,0x74,0x02,0xf0,0x90,0x7f,0x9d,0x74,0x82,0xf0,0xe5,0x33}
+},
+{ 13,
+ 0x96d,
+ 0,
+ {0x25,0xe0,0xfa,0x90,0x7f,0x9a,0xe0,0x54,0x05,0xfb,0x4a,0xf5,0x33}
+},
+{ 2,
+ 0x97a,
+ 0,
+ {0x60,0x0c}
+},
+{ 12,
+ 0x97c,
+ 0,
+ {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x4a,0xf0}
+},
+{ 11,
+ 0x988,
+ 0,
+ {0x75,0x6e,0x00,0x75,0x6f,0x00,0xc0,0x04,0xc0,0x05,0x12}
+},
+{ 14,
+ 0x993,
+ 0,
+ {0x11,0x44,0xd0,0x05,0xd0,0x04,0x90,0x17,0x13,0xe0,0xfa,0x74,0x80,0x2a}
+},
+{ 6,
+ 0x9a1,
+ 0,
+ {0xfa,0xe5,0x33,0xb4,0x04,0x29}
+},
+{ 3,
+ 0x9a7,
+ 0,
+ {0xba,0xa0,0x00}
+},
+{ 2,
+ 0x9aa,
+ 0,
+ {0x50,0x24}
+},
+{ 13,
+ 0x9ac,
+ 0,
+ {0x90,0x17,0x13,0xe0,0x04,0xfb,0x0b,0x90,0x17,0x13,0xeb,0xf0,0x90}
+},
+{ 14,
+ 0x9b9,
+ 0,
+ {0x17,0x13,0xe0,0xfb,0x90,0x17,0x15,0xf0,0xc0,0x02,0xc0,0x04,0xc0,0x05}
+},
+{ 9,
+ 0x9c7,
+ 0,
+ {0x12,0x04,0xf7,0xd0,0x05,0xd0,0x04,0xd0,0x02}
+},
+{ 5,
+ 0x9d0,
+ 0,
+ {0xe5,0x33,0xb4,0x02,0x26}
+},
+{ 6,
+ 0x9d5,
+ 0,
+ {0xc3,0x74,0x04,0x9a,0x50,0x20}
+},
+{ 13,
+ 0x9db,
+ 0,
+ {0x90,0x17,0x13,0xe0,0xfa,0x1a,0x1a,0x90,0x17,0x13,0xea,0xf0,0x90}
+},
+{ 13,
+ 0x9e8,
+ 0,
+ {0x17,0x13,0xe0,0xfa,0x90,0x17,0x15,0xf0,0xc0,0x04,0xc0,0x05,0x12}
+},
+{ 6,
+ 0x9f5,
+ 0,
+ {0x04,0xf7,0xd0,0x05,0xd0,0x04}
+},
+{ 5,
+ 0x9fb,
+ 0,
+ {0xe5,0x33,0xb4,0x08,0x1d}
+},
+{ 4,
+ 0xa00,
+ 0,
+ {0xe5,0x34,0x70,0x19}
+},
+{ 10,
+ 0xa04,
+ 0,
+ {0x74,0x01,0x25,0x35,0x54,0x0f,0xf5,0x35,0x85,0x35}
+},
+{ 12,
+ 0xa0e,
+ 0,
+ {0x75,0x75,0x76,0x00,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0}
+},
+{ 3,
+ 0xa1a,
+ 0,
+ {0x05,0xd0,0x04}
+},
+{ 5,
+ 0xa1d,
+ 0,
+ {0xe5,0x33,0xb4,0x01,0x1d}
+},
+{ 4,
+ 0xa22,
+ 0,
+ {0xe5,0x34,0x70,0x19}
+},
+{ 10,
+ 0xa26,
+ 0,
+ {0xe5,0x35,0x24,0xff,0x54,0x0f,0xf5,0x35,0x85,0x35}
+},
+{ 12,
+ 0xa30,
+ 0,
+ {0x75,0x75,0x76,0x00,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0}
+},
+{ 3,
+ 0xa3c,
+ 0,
+ {0x05,0xd0,0x04}
+},
+{ 14,
+ 0xa3f,
+ 0,
+ {0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0,0x04,0x90,0x7f,0x96}
+},
+{ 14,
+ 0xa4d,
+ 0,
+ {0xe0,0xfa,0x90,0x7f,0x96,0x74,0x7f,0x5a,0xf0,0x90,0x7f,0x97,0x74,0x08}
+},
+{ 10,
+ 0xa5b,
+ 0,
+ {0xf0,0xc3,0xec,0x94,0x00,0xed,0x94,0x02,0x40,0x08}
+},
+{ 8,
+ 0xa65,
+ 0,
+ {0x90,0x7f,0x96,0xe0,0xfa,0x20,0xe6,0x08}
+},
+{ 8,
+ 0xa6d,
+ 0,
+ {0xc3,0xe4,0x9c,0x74,0x08,0x9d,0x50,0x13}
+},
+{ 14,
+ 0xa75,
+ 0,
+ {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x40,0x65,0x02,0xf0,0x7c}
+},
+{ 5,
+ 0xa83,
+ 0,
+ {0x00,0x7d,0x00,0x80,0x05}
+},
+{ 5,
+ 0xa88,
+ 0,
+ {0x0c,0xbc,0x00,0x01,0x0d}
+},
+{ 5,
+ 0xa8d,
+ 0,
+ {0xe5,0x38,0xb4,0x01,0x0e}
+},
+{ 13,
+ 0xa92,
+ 0,
+ {0xc0,0x04,0xc0,0x05,0x12,0x04,0xf7,0xd0,0x05,0xd0,0x04,0x75,0x38}
+},
+{ 1,
+ 0xa9f,
+ 0,
+ {0x00}
+},
+{ 7,
+ 0xaa0,
+ 0,
+ {0xe5,0x31,0x70,0x03,0x02,0x09,0x2a}
+},
+{ 10,
+ 0xaa7,
+ 0,
+ {0x90,0x7f,0xc9,0xe0,0xfa,0x70,0x03,0x02,0x0c,0x2d}
+},
+{ 14,
+ 0xab1,
+ 0,
+ {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x65,0x02,0xf0,0x90}
+},
+{ 9,
+ 0xabf,
+ 0,
+ {0x7d,0xc0,0xe0,0xfa,0xba,0x2c,0x02,0x80,0x03}
+},
+{ 3,
+ 0xac8,
+ 0,
+ {0x02,0x0b,0x36}
+},
+{ 5,
+ 0xacb,
+ 0,
+ {0x75,0x32,0x00,0x7b,0x00}
+},
+{ 3,
+ 0xad0,
+ 0,
+ {0xbb,0x64,0x00}
+},
+{ 2,
+ 0xad3,
+ 0,
+ {0x50,0x1c}
+},
+{ 14,
+ 0xad5,
+ 0,
+ {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0}
+},
+{ 13,
+ 0xae3,
+ 0,
+ {0x04,0xd0,0x03,0xd0,0x02,0x90,0x88,0x0f,0xe0,0xf5,0x47,0x0b,0x80}
+},
+{ 1,
+ 0xaf0,
+ 0,
+ {0xdf}
+},
+{ 13,
+ 0xaf1,
+ 0,
+ {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x07,0x1e,0x12,0x03,0xe1,0x12}
+},
+{ 12,
+ 0xafe,
+ 0,
+ {0x04,0xf7,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x75,0x6e,0x00,0x75}
+},
+{ 13,
+ 0xb0a,
+ 0,
+ {0x6f,0x01,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x11,0x44,0xd0,0x05}
+},
+{ 9,
+ 0xb17,
+ 0,
+ {0xd0,0x04,0xd0,0x02,0x75,0x70,0x4d,0x75,0x71}
+},
+{ 11,
+ 0xb20,
+ 0,
+ {0x0c,0x75,0x72,0x02,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12}
+},
+{ 11,
+ 0xb2b,
+ 0,
+ {0x11,0x75,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x02,0x0c,0x2d}
+},
+{ 3,
+ 0xb36,
+ 0,
+ {0xba,0x2a,0x3b}
+},
+{ 13,
+ 0xb39,
+ 0,
+ {0x90,0x7f,0x98,0x74,0x20,0xf0,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12}
+},
+{ 14,
+ 0xb46,
+ 0,
+ {0x01,0xdd,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x90,0x7f,0x98,0x74,0x28,0xf0}
+},
+{ 2,
+ 0xb54,
+ 0,
+ {0x7b,0x00}
+},
+{ 3,
+ 0xb56,
+ 0,
+ {0xbb,0x0a,0x00}
+},
+{ 5,
+ 0xb59,
+ 0,
+ {0x40,0x03,0x02,0x0c,0x2d}
+},
+{ 14,
+ 0xb5e,
+ 0,
+ {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0}
+},
+{ 8,
+ 0xb6c,
+ 0,
+ {0x04,0xd0,0x03,0xd0,0x02,0x0b,0x80,0xe2}
+},
+{ 3,
+ 0xb74,
+ 0,
+ {0xba,0x2b,0x1a}
+},
+{ 8,
+ 0xb77,
+ 0,
+ {0x90,0x7f,0xc9,0xe0,0xfb,0xbb,0x40,0x12}
+},
+{ 14,
+ 0xb7f,
+ 0,
+ {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x12,0x05,0xd0,0x05,0xd0,0x04,0xd0}
+},
+{ 4,
+ 0xb8d,
+ 0,
+ {0x02,0x02,0x0c,0x2d}
+},
+{ 3,
+ 0xb91,
+ 0,
+ {0xba,0x10,0x1f}
+},
+{ 14,
+ 0xb94,
+ 0,
+ {0x90,0x7f,0x96,0xe0,0xfb,0x90,0x7f,0x96,0x74,0x80,0x65,0x03,0xf0,0xc0}
+},
+{ 14,
+ 0xba2,
+ 0,
+ {0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x3d,0xd0,0x05,0xd0,0x04,0xd0,0x02}
+},
+{ 3,
+ 0xbb0,
+ 0,
+ {0x02,0x0c,0x2d}
+},
+{ 3,
+ 0xbb3,
+ 0,
+ {0xba,0x11,0x12}
+},
+{ 14,
+ 0xbb6,
+ 0,
+ {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x6a,0xd0,0x05,0xd0,0x04,0xd0}
+},
+{ 4,
+ 0xbc4,
+ 0,
+ {0x02,0x02,0x0c,0x2d}
+},
+{ 3,
+ 0xbc8,
+ 0,
+ {0xba,0x12,0x12}
+},
+{ 14,
+ 0xbcb,
+ 0,
+ {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x8f,0xd0,0x05,0xd0,0x04,0xd0}
+},
+{ 4,
+ 0xbd9,
+ 0,
+ {0x02,0x02,0x0c,0x2d}
+},
+{ 3,
+ 0xbdd,
+ 0,
+ {0xba,0x13,0x0b}
+},
+{ 11,
+ 0xbe0,
+ 0,
+ {0x90,0x7d,0xc1,0xe0,0xfb,0x90,0x88,0x00,0xf0,0x80,0x42}
+},
+{ 3,
+ 0xbeb,
+ 0,
+ {0xba,0x14,0x11}
+},
+{ 14,
+ 0xbee,
+ 0,
+ {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x11,0xdd,0xd0,0x05,0xd0,0x04,0xd0}
+},
+{ 3,
+ 0xbfc,
+ 0,
+ {0x02,0x80,0x2e}
+},
+{ 3,
+ 0xbff,
+ 0,
+ {0xba,0x15,0x1d}
+},
+{ 12,
+ 0xc02,
+ 0,
+ {0x90,0x7d,0xc1,0xe0,0xf5,0x75,0x90,0x7d,0xc2,0xe0,0xf5,0x76}
+},
+{ 14,
+ 0xc0e,
+ 0,
+ {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0,0x05,0xd0,0x04,0xd0}
+},
+{ 3,
+ 0xc1c,
+ 0,
+ {0x02,0x80,0x0e}
+},
+{ 3,
+ 0xc1f,
+ 0,
+ {0xba,0x16,0x0b}
+},
+{ 11,
+ 0xc22,
+ 0,
+ {0xc0,0x04,0xc0,0x05,0x12,0x13,0xa3,0xd0,0x05,0xd0,0x04}
+},
+{ 11,
+ 0xc2d,
+ 0,
+ {0x90,0x7f,0xc9,0xe4,0xf0,0x75,0x31,0x00,0x02,0x09,0x2a}
+},
+{ 1,
+ 0xc38,
+ 0,
+ {0x22}
+},
+{ 7,
+ 0xc39,
+ 0,
+ {0x53,0x55,0x50,0x45,0x4e,0x44,0x00}
+},
+{ 7,
+ 0xc40,
+ 0,
+ {0x52,0x45,0x53,0x55,0x4d,0x45,0x00}
+},
+{ 6,
+ 0xc47,
+ 0,
+ {0x20,0x56,0x6f,0x6c,0x20,0x00}
+},
+{ 13,
+ 0xc4d,
+ 0,
+ {0x44,0x41,0x42,0x55,0x53,0x42,0x20,0x76,0x31,0x2e,0x30,0x30,0x00}
+},
+{ 14,
+ 0xc5a,
+ 0,
+ {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04}
+},
+{ 14,
+ 0xc68,
+ 0,
+ {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0}
+},
+{ 13,
+ 0xc76,
+ 0,
+ {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90}
+},
+{ 14,
+ 0xc83,
+ 0,
+ {0x7f,0xab,0x74,0x01,0xf0,0x90,0x7f,0xe8,0xe0,0xfa,0x90,0x7f,0xe9,0xe0}
+},
+{ 6,
+ 0xc91,
+ 0,
+ {0xfb,0xbb,0x00,0x02,0x80,0x03}
+},
+{ 3,
+ 0xc97,
+ 0,
+ {0x02,0x0d,0x38}
+},
+{ 3,
+ 0xc9a,
+ 0,
+ {0xba,0x80,0x14}
+},
+{ 14,
+ 0xc9d,
+ 0,
+ {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5}
+},
+{ 6,
+ 0xcab,
+ 0,
+ {0x74,0x02,0xf0,0x02,0x0e,0xcd}
+},
+{ 5,
+ 0xcb1,
+ 0,
+ {0xba,0x82,0x02,0x80,0x03}
+},
+{ 3,
+ 0xcb6,
+ 0,
+ {0x02,0x0d,0x1d}
+},
+{ 8,
+ 0xcb9,
+ 0,
+ {0x90,0x7f,0xec,0xe0,0xfc,0xbc,0x01,0x00}
+},
+{ 2,
+ 0xcc1,
+ 0,
+ {0x40,0x21}
+},
+{ 6,
+ 0xcc3,
+ 0,
+ {0xc3,0x74,0x07,0x9c,0x40,0x1b}
+},
+{ 14,
+ 0xcc9,
+ 0,
+ {0xec,0x24,0xff,0x25,0xe0,0xfd,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x7f,0xf5}
+},
+{ 13,
+ 0xcd7,
+ 0,
+ {0x83,0xe0,0xfd,0x53,0x05,0x01,0x90,0x7f,0x00,0xed,0xf0,0x80,0x2b}
+},
+{ 3,
+ 0xce4,
+ 0,
+ {0xbc,0x81,0x00}
+},
+{ 2,
+ 0xce7,
+ 0,
+ {0x40,0x21}
+},
+{ 6,
+ 0xce9,
+ 0,
+ {0xc3,0x74,0x87,0x9c,0x40,0x1b}
+},
+{ 14,
+ 0xcef,
+ 0,
+ {0xec,0x24,0x7f,0x25,0xe0,0xfc,0x24,0xb6,0xf5,0x82,0xe4,0x34,0x7f,0xf5}
+},
+{ 13,
+ 0xcfd,
+ 0,
+ {0x83,0xe0,0xfc,0x53,0x04,0x01,0x90,0x7f,0x00,0xec,0xf0,0x80,0x05}
+},
+{ 5,
+ 0xd0a,
+ 0,
+ {0x90,0x7f,0x00,0xe4,0xf0}
+},
+{ 14,
+ 0xd0f,
+ 0,
+ {0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5,0x74,0x02,0xf0,0x02,0x0e,0xcd}
+},
+{ 5,
+ 0xd1d,
+ 0,
+ {0xba,0x81,0x02,0x80,0x03}
+},
+{ 3,
+ 0xd22,
+ 0,
+ {0x02,0x0e,0xc5}
+},
+{ 14,
+ 0xd25,
+ 0,
+ {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5,0x74}
+},
+{ 5,
+ 0xd33,
+ 0,
+ {0x02,0xf0,0x02,0x0e,0xcd}
+},
+{ 3,
+ 0xd38,
+ 0,
+ {0xbb,0x01,0x2d}
+},
+{ 6,
+ 0xd3b,
+ 0,
+ {0xba,0x00,0x03,0x02,0x0e,0xcd}
+},
+{ 3,
+ 0xd41,
+ 0,
+ {0xba,0x02,0x11}
+},
+{ 13,
+ 0xd44,
+ 0,
+ {0x75,0x59,0x00,0xc0,0x02,0xc0,0x03,0x12,0x0e,0xf0,0xd0,0x03,0xd0}
+},
+{ 4,
+ 0xd51,
+ 0,
+ {0x02,0x02,0x0e,0xcd}
+},
+{ 5,
+ 0xd55,
+ 0,
+ {0xba,0x21,0x02,0x80,0x03}
+},
+{ 3,
+ 0xd5a,
+ 0,
+ {0x02,0x0e,0xcd}
+},
+{ 11,
+ 0xd5d,
+ 0,
+ {0x75,0x37,0x01,0x90,0x7f,0xc5,0xe4,0xf0,0x02,0x0e,0xcd}
+},
+{ 3,
+ 0xd68,
+ 0,
+ {0xbb,0x03,0x1f}
+},
+{ 6,
+ 0xd6b,
+ 0,
+ {0xba,0x00,0x03,0x02,0x0e,0xcd}
+},
+{ 5,
+ 0xd71,
+ 0,
+ {0xba,0x02,0x02,0x80,0x03}
+},
+{ 3,
+ 0xd76,
+ 0,
+ {0x02,0x0e,0xcd}
+},
+{ 13,
+ 0xd79,
+ 0,
+ {0x75,0x59,0x01,0xc0,0x02,0xc0,0x03,0x12,0x0e,0xf0,0xd0,0x03,0xd0}
+},
+{ 4,
+ 0xd86,
+ 0,
+ {0x02,0x02,0x0e,0xcd}
+},
+{ 3,
+ 0xd8a,
+ 0,
+ {0xbb,0x06,0x54}
+},
+{ 5,
+ 0xd8d,
+ 0,
+ {0xba,0x80,0x02,0x80,0x03}
+},
+{ 3,
+ 0xd92,
+ 0,
+ {0x02,0x0e,0xc5}
+},
+{ 8,
+ 0xd95,
+ 0,
+ {0x90,0x7f,0xeb,0xe0,0xfc,0xbc,0x01,0x15}
+},
+{ 12,
+ 0xd9d,
+ 0,
+ {0x7c,0xfb,0x7d,0x0f,0x8d,0x06,0x7f,0x00,0x90,0x7f,0xd4,0xee}
+},
+{ 9,
+ 0xda9,
+ 0,
+ {0xf0,0x90,0x7f,0xd5,0xec,0xf0,0x02,0x0e,0xcd}
+},
+{ 10,
+ 0xdb2,
+ 0,
+ {0x90,0x7f,0xeb,0xe0,0xfc,0xbc,0x02,0x02,0x80,0x03}
+},
+{ 3,
+ 0xdbc,
+ 0,
+ {0x02,0x0e,0xc5}
+},
+{ 10,
+ 0xdbf,
+ 0,
+ {0x90,0x7f,0xea,0xe0,0xfc,0xbc,0x00,0x02,0x80,0x03}
+},
+{ 3,
+ 0xdc9,
+ 0,
+ {0x02,0x0e,0xc5}
+},
+{ 12,
+ 0xdcc,
+ 0,
+ {0x7c,0x3b,0x7d,0x0f,0x8d,0x06,0x7f,0x00,0x90,0x7f,0xd4,0xee}
+},
+{ 9,
+ 0xdd8,
+ 0,
+ {0xf0,0x90,0x7f,0xd5,0xec,0xf0,0x02,0x0e,0xcd}
+},
+{ 6,
+ 0xde1,
+ 0,
+ {0xbb,0x07,0x03,0x02,0x0e,0xc5}
+},
+{ 3,
+ 0xde7,
+ 0,
+ {0xbb,0x08,0x10}
+},
+{ 13,
+ 0xdea,
+ 0,
+ {0xac,0x48,0x90,0x7f,0x00,0xec,0xf0,0x90,0x7f,0xb5,0x74,0x01,0xf0}
+},
+{ 3,
+ 0xdf7,
+ 0,
+ {0x02,0x0e,0xcd}
+},
+{ 3,
+ 0xdfa,
+ 0,
+ {0xbb,0x09,0x31}
+},
+{ 5,
+ 0xdfd,
+ 0,
+ {0xba,0x00,0x02,0x80,0x03}
+},
+{ 3,
+ 0xe02,
+ 0,
+ {0x02,0x0e,0xc5}
+},
+{ 14,
+ 0xe05,
+ 0,
+ {0x90,0x7f,0xea,0xe0,0xfc,0xc3,0x74,0x01,0x9c,0x50,0x03,0x02,0x0e,0xc5}
+},
+{ 8,
+ 0xe13,
+ 0,
+ {0x90,0x7f,0xea,0xe0,0xfc,0xbc,0x00,0x0a}
+},
+{ 10,
+ 0xe1b,
+ 0,
+ {0x90,0x17,0x21,0xe4,0xf0,0x90,0x17,0x22,0xe4,0xf0}
+},
+{ 9,
+ 0xe25,
+ 0,
+ {0x90,0x7f,0xea,0xe0,0xf5,0x48,0x02,0x0e,0xcd}
+},
+{ 3,
+ 0xe2e,
+ 0,
+ {0xbb,0x0a,0x27}
+},
+{ 5,
+ 0xe31,
+ 0,
+ {0xba,0x81,0x02,0x80,0x03}
+},
+{ 3,
+ 0xe36,
+ 0,
+ {0x02,0x0e,0xc5}
+},
+{ 14,
+ 0xe39,
+ 0,
+ {0x90,0x7f,0xec,0xe0,0xfa,0x24,0x20,0xfa,0xe4,0x34,0x17,0xfc,0x8a,0x82}
+},
+{ 14,
+ 0xe47,
+ 0,
+ {0x8c,0x83,0xe0,0xfa,0x90,0x7f,0x00,0xf0,0x90,0x7f,0xb5,0x74,0x01,0xf0}
+},
+{ 3,
+ 0xe55,
+ 0,
+ {0x02,0x0e,0xcd}
+},
+{ 5,
+ 0xe58,
+ 0,
+ {0xbb,0x0b,0x02,0x80,0x03}
+},
+{ 3,
+ 0xe5d,
+ 0,
+ {0x02,0x0e,0xa9}
+},
+{ 13,
+ 0xe60,
+ 0,
+ {0x90,0x17,0x20,0xe4,0xf0,0x90,0x7f,0xec,0xe0,0xfa,0xba,0x01,0x1a}
+},
+{ 8,
+ 0xe6d,
+ 0,
+ {0x90,0x7f,0xed,0xe0,0xfa,0xba,0x00,0x12}
+},
+{ 14,
+ 0xe75,
+ 0,
+ {0x90,0x7f,0xea,0xe0,0xfa,0x90,0x17,0x21,0xf0,0xc0,0x03,0x12,0x04,0xe2}
+},
+{ 4,
+ 0xe83,
+ 0,
+ {0xd0,0x03,0x80,0x46}
+},
+{ 8,
+ 0xe87,
+ 0,
+ {0x90,0x7f,0xec,0xe0,0xfa,0xba,0x02,0x3e}
+},
+{ 8,
+ 0xe8f,
+ 0,
+ {0x90,0x7f,0xed,0xe0,0xfa,0xba,0x00,0x36}
+},
+{ 13,
+ 0xe97,
+ 0,
+ {0xc0,0x03,0x12,0x04,0xef,0xd0,0x03,0x90,0x7f,0xea,0xe0,0xfa,0x90}
+},
+{ 5,
+ 0xea4,
+ 0,
+ {0x17,0x22,0xf0,0x80,0x24}
+},
+{ 5,
+ 0xea9,
+ 0,
+ {0xbb,0x12,0x02,0x80,0x17}
+},
+{ 5,
+ 0xeae,
+ 0,
+ {0xbb,0x81,0x02,0x80,0x0d}
+},
+{ 5,
+ 0xeb3,
+ 0,
+ {0xbb,0x83,0x02,0x80,0x08}
+},
+{ 5,
+ 0xeb8,
+ 0,
+ {0xbb,0x82,0x02,0x80,0x03}
+},
+{ 3,
+ 0xebd,
+ 0,
+ {0xbb,0x84,0x05}
+},
+{ 5,
+ 0xec0,
+ 0,
+ {0x12,0x06,0x4e,0x80,0x08}
+},
+{ 8,
+ 0xec5,
+ 0,
+ {0x90,0x7f,0xb4,0x74,0x03,0xf0,0x80,0x06}
+},
+{ 6,
+ 0xecd,
+ 0,
+ {0x90,0x7f,0xb4,0x74,0x02,0xf0}
+},
+{ 2,
+ 0xed3,
+ 0,
+ {0xd0,0x86}
+},
+{ 14,
+ 0xed5,
+ 0,
+ {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04}
+},
+{ 13,
+ 0xee3,
+ 0,
+ {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32}
+},
+{ 11,
+ 0xef0,
+ 0,
+ {0x90,0x7f,0xec,0xe0,0xf5,0x5a,0xc3,0x94,0x01,0x40,0x1d}
+},
+{ 7,
+ 0xefb,
+ 0,
+ {0xc3,0x74,0x07,0x95,0x5a,0x40,0x16}
+},
+{ 13,
+ 0xf02,
+ 0,
+ {0xe5,0x5a,0x24,0xff,0x25,0xe0,0xfa,0x24,0xc6,0xf5,0x82,0xe4,0x34}
+},
+{ 9,
+ 0xf0f,
+ 0,
+ {0x7f,0xf5,0x83,0xaa,0x59,0xea,0xf0,0x80,0x22}
+},
+{ 7,
+ 0xf18,
+ 0,
+ {0xc3,0xe5,0x5a,0x94,0x81,0x40,0x1b}
+},
+{ 7,
+ 0xf1f,
+ 0,
+ {0xc3,0x74,0x87,0x95,0x5a,0x40,0x14}
+},
+{ 13,
+ 0xf26,
+ 0,
+ {0xe5,0x5a,0x24,0xff,0x25,0xe0,0xfa,0x24,0xb6,0xf5,0x82,0xe4,0x34}
+},
+{ 7,
+ 0xf33,
+ 0,
+ {0x7f,0xf5,0x83,0xaa,0x59,0xea,0xf0}
+},
+{ 1,
+ 0xf3a,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0xf3b,
+ 0,
+ {0x09,0x02,0xba,0x00,0x03,0x01,0x00,0x40,0x00,0x09,0x04,0x00,0x00,0x00}
+},
+{ 14,
+ 0xf49,
+ 0,
+ {0x01,0x01,0x00,0x00,0x09,0x24,0x01,0x00,0x01,0x3d,0x00,0x01,0x01,0x0c}
+},
+{ 14,
+ 0xf57,
+ 0,
+ {0x24,0x02,0x01,0x10,0x07,0x00,0x02,0x03,0x00,0x00,0x00,0x0d,0x24,0x06}
+},
+{ 14,
+ 0xf65,
+ 0,
+ {0x03,0x01,0x02,0x15,0x00,0x03,0x00,0x03,0x00,0x00,0x09,0x24,0x03,0x02}
+},
+{ 14,
+ 0xf73,
+ 0,
+ {0x01,0x01,0x00,0x01,0x00,0x09,0x24,0x03,0x04,0x02,0x03,0x00,0x03,0x00}
+},
+{ 14,
+ 0xf81,
+ 0,
+ {0x09,0x24,0x03,0x05,0x03,0x06,0x00,0x01,0x00,0x09,0x04,0x01,0x00,0x00}
+},
+{ 14,
+ 0xf8f,
+ 0,
+ {0x01,0x02,0x00,0x00,0x09,0x04,0x01,0x01,0x01,0x01,0x02,0x00,0x00,0x07}
+},
+{ 14,
+ 0xf9d,
+ 0,
+ {0x24,0x01,0x02,0x01,0x01,0x00,0x0b,0x24,0x02,0x01,0x02,0x02,0x10,0x01}
+},
+{ 14,
+ 0xfab,
+ 0,
+ {0x80,0xbb,0x00,0x09,0x05,0x88,0x05,0x00,0x01,0x01,0x00,0x00,0x07,0x25}
+},
+{ 14,
+ 0xfb9,
+ 0,
+ {0x01,0x00,0x00,0x00,0x00,0x09,0x04,0x02,0x00,0x02,0x00,0x00,0x00,0x00}
+},
+{ 14,
+ 0xfc7,
+ 0,
+ {0x07,0x05,0x82,0x02,0x40,0x00,0x00,0x07,0x05,0x02,0x02,0x40,0x00,0x00}
+},
+{ 14,
+ 0xfd5,
+ 0,
+ {0x09,0x04,0x02,0x01,0x03,0x00,0x00,0x00,0x00,0x07,0x05,0x82,0x02,0x40}
+},
+{ 14,
+ 0xfe3,
+ 0,
+ {0x00,0x00,0x07,0x05,0x02,0x02,0x40,0x00,0x00,0x09,0x05,0x89,0x05,0xa0}
+},
+{ 10,
+ 0xff1,
+ 0,
+ {0x01,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00}
+},
+{ 14,
+ 0xffb,
+ 0,
+ {0x12,0x01,0x00,0x01,0x00,0x00,0x00,0x40,0x47,0x05,0x99,0x99,0x00,0x01}
+},
+{ 14,
+ 0x1009,
+ 0,
+ {0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0xba}
+},
+{ 4,
+ 0x1017,
+ 0,
+ {0x00,0x03,0x01,0x00}
+},
+{ 2,
+ 0x101b,
+ 0,
+ {0x7a,0x00}
+},
+{ 3,
+ 0x101d,
+ 0,
+ {0xba,0x05,0x00}
+},
+{ 2,
+ 0x1020,
+ 0,
+ {0x50,0x17}
+},
+{ 8,
+ 0x1022,
+ 0,
+ {0x90,0x7f,0xa5,0xe0,0xfb,0x30,0xe0,0x05}
+},
+{ 5,
+ 0x102a,
+ 0,
+ {0x90,0x00,0x01,0x80,0x0d}
+},
+{ 10,
+ 0x102f,
+ 0,
+ {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xe4}
+},
+{ 3,
+ 0x1039,
+ 0,
+ {0x90,0x00,0x01}
+},
+{ 1,
+ 0x103c,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x103d,
+ 0,
+ {0x90,0x7d,0xc1,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0x7c,0x00,0x7d}
+},
+{ 4,
+ 0x104b,
+ 0,
+ {0x7e,0xeb,0x60,0x12}
+},
+{ 14,
+ 0x104f,
+ 0,
+ {0x89,0x82,0x8a,0x83,0xe0,0xa3,0xa9,0x82,0xaa,0x83,0x8c,0x82,0x8d,0x83}
+},
+{ 4,
+ 0x105d,
+ 0,
+ {0xf0,0x0c,0xdb,0xee}
+},
+{ 8,
+ 0x1061,
+ 0,
+ {0x90,0x7d,0xc3,0xe0,0x90,0x7f,0xb9,0xf0}
+},
+{ 1,
+ 0x1069,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x106a,
+ 0,
+ {0x90,0x7d,0xc1,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0x7c,0xc4,0x7d}
+},
+{ 4,
+ 0x1078,
+ 0,
+ {0x7d,0xeb,0x60,0xe5}
+},
+{ 14,
+ 0x107c,
+ 0,
+ {0x8c,0x82,0x8d,0x83,0xe0,0x0c,0x89,0x82,0x8a,0x83,0xf0,0xa3,0xa9,0x82}
+},
+{ 4,
+ 0x108a,
+ 0,
+ {0xaa,0x83,0xdb,0xee}
+},
+{ 1,
+ 0x108e,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x108f,
+ 0,
+ {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x05,0x86,0x90,0x7d,0xc1,0xe0,0x05,0x86}
+},
+{ 14,
+ 0x109d,
+ 0,
+ {0xa3,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa6,0x05,0x86,0xa3,0xa3,0xe0,0xf9}
+},
+{ 5,
+ 0x10ab,
+ 0,
+ {0x60,0x16,0xa3,0x05,0x86}
+},
+{ 13,
+ 0x10b0,
+ 0,
+ {0x90,0x7f,0xa6,0x05,0x86,0xe0,0xa3,0x05,0x86,0xf0,0xc0,0x01,0x12}
+},
+{ 6,
+ 0x10bd,
+ 0,
+ {0x10,0x1b,0xd0,0x01,0xd9,0xed}
+},
+{ 6,
+ 0x10c3,
+ 0,
+ {0x90,0x7f,0xa5,0x74,0x40,0xf0}
+},
+{ 1,
+ 0x10c9,
+ 0,
+ {0x22}
+},
+{ 8,
+ 0x10ca,
+ 0,
+ {0x90,0x88,0x02,0x74,0x01,0xf0,0x7a,0x00}
+},
+{ 3,
+ 0x10d2,
+ 0,
+ {0xba,0xff,0x00}
+},
+{ 2,
+ 0x10d5,
+ 0,
+ {0x50,0x0a}
+},
+{ 10,
+ 0x10d7,
+ 0,
+ {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xf1}
+},
+{ 1,
+ 0x10e1,
+ 0,
+ {0x22}
+},
+{ 5,
+ 0x10e2,
+ 0,
+ {0xe5,0x6b,0xb4,0xc0,0x08}
+},
+{ 8,
+ 0x10e7,
+ 0,
+ {0x90,0x88,0x03,0xe5,0x6c,0xf0,0x80,0x06}
+},
+{ 6,
+ 0x10ef,
+ 0,
+ {0x90,0x88,0x02,0xe5,0x6c,0xf0}
+},
+{ 4,
+ 0x10f5,
+ 0,
+ {0x7a,0x00,0x7b,0x00}
+},
+{ 11,
+ 0x10f9,
+ 0,
+ {0xc3,0xea,0x94,0x32,0xeb,0x64,0x80,0x94,0x80,0x50,0x07}
+},
+{ 5,
+ 0x1104,
+ 0,
+ {0x0a,0xba,0x00,0x01,0x0b}
+},
+{ 2,
+ 0x1109,
+ 0,
+ {0x80,0xee}
+},
+{ 1,
+ 0x110b,
+ 0,
+ {0x22}
+},
+{ 10,
+ 0x110c,
+ 0,
+ {0x90,0x88,0x03,0xe5,0x6d,0xf0,0x05,0x39,0x7a,0x00}
+},
+{ 3,
+ 0x1116,
+ 0,
+ {0xba,0x28,0x00}
+},
+{ 2,
+ 0x1119,
+ 0,
+ {0x50,0x03}
+},
+{ 3,
+ 0x111b,
+ 0,
+ {0x0a,0x80,0xf8}
+},
+{ 5,
+ 0x111e,
+ 0,
+ {0xe5,0x39,0xb4,0x10,0x08}
+},
+{ 8,
+ 0x1123,
+ 0,
+ {0x90,0x88,0x02,0x74,0xc0,0xf0,0x80,0x0e}
+},
+{ 5,
+ 0x112b,
+ 0,
+ {0xe5,0x39,0xb4,0x20,0x09}
+},
+{ 9,
+ 0x1130,
+ 0,
+ {0x90,0x88,0x02,0x74,0x80,0xf0,0x75,0x39,0x00}
+},
+{ 2,
+ 0x1139,
+ 0,
+ {0x7a,0x00}
+},
+{ 3,
+ 0x113b,
+ 0,
+ {0xba,0x28,0x00}
+},
+{ 2,
+ 0x113e,
+ 0,
+ {0x50,0x03}
+},
+{ 3,
+ 0x1140,
+ 0,
+ {0x0a,0x80,0xf8}
+},
+{ 1,
+ 0x1143,
+ 0,
+ {0x22}
+},
+{ 4,
+ 0x1144,
+ 0,
+ {0xe5,0x6f,0x60,0x02}
+},
+{ 2,
+ 0x1148,
+ 0,
+ {0x80,0x07}
+},
+{ 7,
+ 0x114a,
+ 0,
+ {0x7a,0x00,0x75,0x39,0x00,0x80,0x05}
+},
+{ 5,
+ 0x1151,
+ 0,
+ {0x7a,0x40,0x75,0x39,0x10}
+},
+{ 9,
+ 0x1156,
+ 0,
+ {0xe5,0x6e,0x2a,0xfa,0xe5,0x6e,0x25,0x39,0xf5}
+},
+{ 10,
+ 0x115f,
+ 0,
+ {0x39,0x90,0x88,0x02,0x74,0x80,0x2a,0xf0,0x7a,0x00}
+},
+{ 8,
+ 0x1169,
+ 0,
+ {0xc3,0xea,0x64,0x80,0x94,0xa8,0x50,0x03}
+},
+{ 3,
+ 0x1171,
+ 0,
+ {0x0a,0x80,0xf5}
+},
+{ 1,
+ 0x1174,
+ 0,
+ {0x22}
+},
+{ 6,
+ 0x1175,
+ 0,
+ {0xaa,0x70,0xab,0x71,0xac,0x72}
+},
+{ 12,
+ 0x117b,
+ 0,
+ {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x12,0x14,0xee,0xfd,0x60,0x18}
+},
+{ 13,
+ 0x1187,
+ 0,
+ {0x8d,0x6d,0xc0,0x02,0xc0,0x03,0xc0,0x04,0x12,0x11,0x0c,0xd0,0x04}
+},
+{ 9,
+ 0x1194,
+ 0,
+ {0xd0,0x03,0xd0,0x02,0x0a,0xba,0x00,0x01,0x0b}
+},
+{ 2,
+ 0x119d,
+ 0,
+ {0x80,0xdc}
+},
+{ 1,
+ 0x119f,
+ 0,
+ {0x22}
+},
+{ 13,
+ 0x11a0,
+ 0,
+ {0xe5,0x73,0xc4,0x54,0x0f,0xfa,0x53,0x02,0x0f,0xc3,0x74,0x09,0x9a}
+},
+{ 2,
+ 0x11ad,
+ 0,
+ {0x50,0x06}
+},
+{ 6,
+ 0x11af,
+ 0,
+ {0x74,0x37,0x2a,0xfb,0x80,0x04}
+},
+{ 4,
+ 0x11b5,
+ 0,
+ {0x74,0x30,0x2a,0xfb}
+},
+{ 12,
+ 0x11b9,
+ 0,
+ {0x8b,0x6d,0xc0,0x03,0x12,0x11,0x0c,0xd0,0x03,0xaa,0x73,0x53}
+},
+{ 8,
+ 0x11c5,
+ 0,
+ {0x02,0x0f,0xc3,0x74,0x09,0x9a,0x50,0x06}
+},
+{ 6,
+ 0x11cd,
+ 0,
+ {0x74,0x37,0x2a,0xfb,0x80,0x04}
+},
+{ 4,
+ 0x11d3,
+ 0,
+ {0x74,0x30,0x2a,0xfb}
+},
+{ 5,
+ 0x11d7,
+ 0,
+ {0x8b,0x6d,0x12,0x11,0x0c}
+},
+{ 1,
+ 0x11dc,
+ 0,
+ {0x22}
+},
+{ 7,
+ 0x11dd,
+ 0,
+ {0x90,0x7d,0xc3,0xe0,0xfa,0x60,0x0f}
+},
+{ 12,
+ 0x11e4,
+ 0,
+ {0x90,0x7d,0xc1,0xe0,0xf5,0x6e,0x90,0x7d,0xc2,0xe0,0xf5,0x6f}
+},
+{ 3,
+ 0x11f0,
+ 0,
+ {0x12,0x11,0x44}
+},
+{ 12,
+ 0x11f3,
+ 0,
+ {0x90,0x7d,0xff,0xe4,0xf0,0x75,0x70,0xc4,0x75,0x71,0x7d,0x75}
+},
+{ 5,
+ 0x11ff,
+ 0,
+ {0x72,0x01,0x12,0x11,0x75}
+},
+{ 1,
+ 0x1204,
+ 0,
+ {0x22}
+},
+{ 2,
+ 0x1205,
+ 0,
+ {0x7a,0x04}
+},
+{ 3,
+ 0x1207,
+ 0,
+ {0xba,0x40,0x00}
+},
+{ 2,
+ 0x120a,
+ 0,
+ {0x50,0x36}
+},
+{ 14,
+ 0x120c,
+ 0,
+ {0xea,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x7d,0xf5,0x83,0xe0,0xfb,0x7c,0x00}
+},
+{ 3,
+ 0x121a,
+ 0,
+ {0xbc,0x08,0x00}
+},
+{ 2,
+ 0x121d,
+ 0,
+ {0x50,0x20}
+},
+{ 6,
+ 0x121f,
+ 0,
+ {0x8b,0x05,0xed,0x30,0xe7,0x0b}
+},
+{ 11,
+ 0x1225,
+ 0,
+ {0x90,0x7f,0x96,0x74,0x42,0xf0,0x74,0xc3,0xf0,0x80,0x08}
+},
+{ 8,
+ 0x1230,
+ 0,
+ {0x90,0x7f,0x96,0xe4,0xf0,0x74,0x81,0xf0}
+},
+{ 7,
+ 0x1238,
+ 0,
+ {0xeb,0x25,0xe0,0xfb,0x0c,0x80,0xdb}
+},
+{ 3,
+ 0x123f,
+ 0,
+ {0x0a,0x80,0xc5}
+},
+{ 1,
+ 0x1242,
+ 0,
+ {0x22}
+},
+{ 4,
+ 0x1243,
+ 0,
+ {0x7a,0x00,0x7b,0xef}
+},
+{ 3,
+ 0x1247,
+ 0,
+ {0xba,0x10,0x00}
+},
+{ 2,
+ 0x124a,
+ 0,
+ {0x50,0x20}
+},
+{ 14,
+ 0x124c,
+ 0,
+ {0x74,0x11,0x2b,0xfb,0x24,0x00,0xfc,0xe4,0x34,0x18,0xfd,0x8c,0x82,0x8d}
+},
+{ 14,
+ 0x125a,
+ 0,
+ {0x83,0xe4,0xf0,0xea,0x24,0x00,0xf5,0x82,0xe4,0x34,0x19,0xf5,0x83,0xe4}
+},
+{ 4,
+ 0x1268,
+ 0,
+ {0xf0,0x0a,0x80,0xdb}
+},
+{ 1,
+ 0x126c,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x126d,
+ 0,
+ {0x74,0xf8,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0}
+},
+{ 14,
+ 0x127b,
+ 0,
+ {0x74,0xf9,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0}
+},
+{ 14,
+ 0x1289,
+ 0,
+ {0x74,0xfa,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0}
+},
+{ 14,
+ 0x1297,
+ 0,
+ {0x74,0xfb,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0}
+},
+{ 14,
+ 0x12a5,
+ 0,
+ {0x74,0xff,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0}
+},
+{ 1,
+ 0x12b3,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x12b4,
+ 0,
+ {0x12,0x03,0xcb,0x12,0x12,0x6d,0x7a,0xc0,0x7b,0x87,0x7c,0x01,0x74,0x01}
+},
+{ 14,
+ 0x12c2,
+ 0,
+ {0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x74}
+},
+{ 14,
+ 0x12d0,
+ 0,
+ {0x01,0x12,0x14,0xbf,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e}
+},
+{ 14,
+ 0x12de,
+ 0,
+ {0x83,0x8f,0xf0,0x74,0x06,0x12,0x14,0xbf,0x74,0x01,0x2a,0xfd,0xe4,0x3b}
+},
+{ 14,
+ 0x12ec,
+ 0,
+ {0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83,0x8c,0xf0,0xe4,0x12,0x14,0xbf,0x74}
+},
+{ 14,
+ 0x12fa,
+ 0,
+ {0x01,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0}
+},
+{ 14,
+ 0x1308,
+ 0,
+ {0x74,0x0b,0x12,0x14,0xbf,0x74,0x01,0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07}
+},
+{ 14,
+ 0x1316,
+ 0,
+ {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x74,0x08,0x12,0x14,0xbf,0x74,0x01,0x2d}
+},
+{ 14,
+ 0x1324,
+ 0,
+ {0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0,0x74,0x01}
+},
+{ 14,
+ 0x1332,
+ 0,
+ {0x12,0x14,0xbf,0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83}
+},
+{ 14,
+ 0x1340,
+ 0,
+ {0x8c,0xf0,0xe4,0x12,0x14,0xbf,0x74,0x01,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f}
+},
+{ 14,
+ 0x134e,
+ 0,
+ {0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0,0x74,0x03,0x12,0x14,0xbf,0x7d,0x00}
+},
+{ 3,
+ 0x135c,
+ 0,
+ {0xbd,0x06,0x00}
+},
+{ 2,
+ 0x135f,
+ 0,
+ {0x50,0x12}
+},
+{ 11,
+ 0x1361,
+ 0,
+ {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x0a,0xba,0x00,0x01,0x0b}
+},
+{ 7,
+ 0x136c,
+ 0,
+ {0xe4,0x12,0x14,0xbf,0x0d,0x80,0xe9}
+},
+{ 13,
+ 0x1373,
+ 0,
+ {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0xe5,0x74,0x12,0x14,0xbf,0x74,0xf9}
+},
+{ 14,
+ 0x1380,
+ 0,
+ {0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0x74,0x0f,0xf0,0x74}
+},
+{ 14,
+ 0x138e,
+ 0,
+ {0xfe,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0x74,0x01,0xf0}
+},
+{ 6,
+ 0x139c,
+ 0,
+ {0x12,0x03,0xe1,0x12,0x04,0xf7}
+},
+{ 1,
+ 0x13a2,
+ 0,
+ {0x22}
+},
+{ 13,
+ 0x13a3,
+ 0,
+ {0x90,0x7d,0xc1,0xe0,0xfa,0x24,0x00,0xfb,0xe4,0x34,0x19,0xfc,0x90}
+},
+{ 14,
+ 0x13b0,
+ 0,
+ {0x7d,0xc2,0xe0,0xfd,0x8b,0x82,0x8c,0x83,0xf0,0x75,0xf0,0x11,0xea,0xa4}
+},
+{ 3,
+ 0x13be,
+ 0,
+ {0xfa,0x7b,0x00}
+},
+{ 3,
+ 0x13c1,
+ 0,
+ {0xbb,0x10,0x00}
+},
+{ 2,
+ 0x13c4,
+ 0,
+ {0x50,0x24}
+},
+{ 14,
+ 0x13c6,
+ 0,
+ {0xea,0x24,0x00,0xfc,0xe4,0x34,0x18,0xfd,0xeb,0x2c,0xfc,0xe4,0x3d,0xfd}
+},
+{ 14,
+ 0x13d4,
+ 0,
+ {0x74,0x04,0x2b,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x7d,0xf5,0x83,0xe0,0xfe}
+},
+{ 8,
+ 0x13e2,
+ 0,
+ {0x8c,0x82,0x8d,0x83,0xf0,0x0b,0x80,0xd7}
+},
+{ 14,
+ 0x13ea,
+ 0,
+ {0xea,0x24,0x00,0xfa,0xe4,0x34,0x18,0xfb,0x74,0x10,0x2a,0xf5,0x82,0xe4}
+},
+{ 5,
+ 0x13f8,
+ 0,
+ {0x3b,0xf5,0x83,0xe4,0xf0}
+},
+{ 1,
+ 0x13fd,
+ 0,
+ {0x22}
+},
+{ 4,
+ 0x13fe,
+ 0,
+ {0xe5,0x76,0x60,0x02}
+},
+{ 2,
+ 0x1402,
+ 0,
+ {0x80,0x16}
+},
+{ 12,
+ 0x1404,
+ 0,
+ {0x74,0x0f,0x55,0x75,0xfa,0x8a,0x75,0x24,0x00,0xf5,0x82,0xe4}
+},
+{ 10,
+ 0x1410,
+ 0,
+ {0x34,0x19,0xf5,0x83,0xe0,0xf5,0x74,0x12,0x12,0xb4}
+},
+{ 10,
+ 0x141a,
+ 0,
+ {0x12,0x10,0xca,0x75,0x6e,0x00,0x75,0x6f,0x00,0x12}
+},
+{ 6,
+ 0x1424,
+ 0,
+ {0x11,0x44,0x75,0x70,0xb9,0x75}
+},
+{ 6,
+ 0x142a,
+ 0,
+ {0x71,0x14,0x75,0x72,0x02,0x12}
+},
+{ 11,
+ 0x1430,
+ 0,
+ {0x11,0x75,0xe5,0x76,0xb4,0x02,0x04,0x74,0x01,0x80,0x01}
+},
+{ 1,
+ 0x143b,
+ 0,
+ {0xe4}
+},
+{ 3,
+ 0x143c,
+ 0,
+ {0xfa,0x70,0x0f}
+},
+{ 12,
+ 0x143f,
+ 0,
+ {0x74,0x01,0x25,0x75,0xf5,0x73,0xc0,0x02,0x12,0x11,0xa0,0xd0}
+},
+{ 3,
+ 0x144b,
+ 0,
+ {0x02,0x80,0x0a}
+},
+{ 10,
+ 0x144e,
+ 0,
+ {0x85,0x75,0x73,0xc0,0x02,0x12,0x11,0xa0,0xd0,0x02}
+},
+{ 12,
+ 0x1458,
+ 0,
+ {0x75,0x6e,0x00,0x75,0x6f,0x01,0xc0,0x02,0x12,0x11,0x44,0xd0}
+},
+{ 4,
+ 0x1464,
+ 0,
+ {0x02,0xea,0x70,0x1a}
+},
+{ 13,
+ 0x1468,
+ 0,
+ {0x75,0xf0,0x11,0xe5,0x75,0xa4,0xfa,0x24,0x00,0xfa,0xe4,0x34,0x18}
+},
+{ 9,
+ 0x1475,
+ 0,
+ {0xfb,0x8a,0x70,0x8b,0x71,0x75,0x72,0x01,0x12}
+},
+{ 4,
+ 0x147e,
+ 0,
+ {0x11,0x75,0x80,0x36}
+},
+{ 2,
+ 0x1482,
+ 0,
+ {0x7a,0x00}
+},
+{ 3,
+ 0x1484,
+ 0,
+ {0xba,0x10,0x00}
+},
+{ 2,
+ 0x1487,
+ 0,
+ {0x50,0x2f}
+},
+{ 13,
+ 0x1489,
+ 0,
+ {0xea,0x24,0x00,0xf5,0x82,0xe4,0x34,0x19,0xf5,0x83,0xe0,0xfb,0xe5}
+},
+{ 4,
+ 0x1496,
+ 0,
+ {0x75,0xb5,0x03,0x1b}
+},
+{ 14,
+ 0x149a,
+ 0,
+ {0x75,0xf0,0x11,0xea,0xa4,0xfb,0x24,0x00,0xfb,0xe4,0x34,0x18,0xfc,0x8b}
+},
+{ 9,
+ 0x14a8,
+ 0,
+ {0x70,0x8c,0x71,0x75,0x72,0x01,0xc0,0x02,0x12}
+},
+{ 4,
+ 0x14b1,
+ 0,
+ {0x11,0x75,0xd0,0x02}
+},
+{ 3,
+ 0x14b5,
+ 0,
+ {0x0a,0x80,0xcc}
+},
+{ 1,
+ 0x14b8,
+ 0,
+ {0x22}
+},
+{ 6,
+ 0x14b9,
+ 0,
+ {0x50,0x72,0x6f,0x67,0x20,0x00}
+},
+{ 14,
+ 0x14bf,
+ 0,
+ {0xc8,0xc0,0xe0,0xc8,0xc0,0xe0,0xe5,0xf0,0x60,0x0b,0x14,0x60,0x0f,0x14}
+},
+{ 7,
+ 0x14cd,
+ 0,
+ {0x60,0x11,0x14,0x60,0x12,0x80,0x15}
+},
+{ 7,
+ 0x14d4,
+ 0,
+ {0xd0,0xe0,0xa8,0x82,0xf6,0x80,0x0e}
+},
+{ 5,
+ 0x14db,
+ 0,
+ {0xd0,0xe0,0xf0,0x80,0x09}
+},
+{ 4,
+ 0x14e0,
+ 0,
+ {0xd0,0xe0,0x80,0x05}
+},
+{ 5,
+ 0x14e4,
+ 0,
+ {0xd0,0xe0,0xa8,0x82,0xf2}
+},
+{ 4,
+ 0x14e9,
+ 0,
+ {0xc8,0xd0,0xe0,0xc8}
+},
+{ 1,
+ 0x14ed,
+ 0,
+ {0x22}
+},
+{ 14,
+ 0x14ee,
+ 0,
+ {0xc8,0xc0,0xe0,0xe5,0xf0,0x60,0x0d,0x14,0x60,0x0f,0x14,0x60,0x0f,0x14}
+},
+{ 6,
+ 0x14fc,
+ 0,
+ {0x60,0x10,0x74,0xff,0x80,0x0f}
+},
+{ 5,
+ 0x1502,
+ 0,
+ {0xa8,0x82,0xe6,0x80,0x0a}
+},
+{ 3,
+ 0x1507,
+ 0,
+ {0xe0,0x80,0x07}
+},
+{ 4,
+ 0x150a,
+ 0,
+ {0xe4,0x93,0x80,0x03}
+},
+{ 3,
+ 0x150e,
+ 0,
+ {0xa8,0x82,0xe2}
+},
+{ 4,
+ 0x1511,
+ 0,
+ {0xf8,0xd0,0xe0,0xc8}
+},
+{ 1,
+ 0x1515,
+ 0,
+ {0x22}
+},
+{ 0,
+ 0x0,
+ 1,
+ {0}
+}
+};
if (!bitmap)
return -1;
- if (usb_get_hub_descriptor(dev, bitmap, header->bLength) < 0)
+ if (usb_get_hub_descriptor(dev, bitmap, header->bLength) < 0) {
+ kfree(bitmap);
return -1;
+ }
descriptor = (struct usb_hub_descriptor *)bitmap;
/* We're done now, we already disconnected the device */
return;
}
- wait_ms(500);
+ wait_ms(400);
/* Reset the port */
usb_set_port_feature(hub, port + 1, USB_PORT_FEAT_RESET);
- wait_ms(500);
+ wait_ms(100);
/* Allocate a new device struct for it */
usb = usb_alloc_dev(hub, hub->bus);
if (!usb) {
#define USBKBD_REPEAT_DELAY (HZ / 4)
#define USBKBD_REPEAT_RATE (HZ / 20)
-struct usb_keyboard
-{
- struct usb_device *dev;
- unsigned long down[2];
- unsigned char repeat_key;
- struct timer_list repeat_timer;
- struct list_head list;
- unsigned int irqpipe;
- void *irq_handler; /* host controller's IRQ transfer handle */
+struct usb_keyboard {
+ struct usb_device *dev;
+ unsigned long down[2];
+ unsigned char repeat_key;
+ struct timer_list repeat_timer;
+ struct list_head list;
+ unsigned int irqpipe;
+ void *irq_handler; /* host controller's IRQ transfer handle */
};
extern unsigned char usb_kbd_map[];
-static void * usb_kbd_probe(struct usb_device *dev, unsigned int i);
+static void *usb_kbd_probe(struct usb_device *dev, unsigned int i);
static void usb_kbd_disconnect(struct usb_device *dev, void *ptr);
static void usb_kbd_repeat(unsigned long dummy);
static LIST_HEAD(usb_kbd_list);
-static struct usb_driver usb_kbd_driver =
-{
- "keyboard",
- usb_kbd_probe,
- usb_kbd_disconnect,
- {NULL, NULL}
+static struct usb_driver usb_kbd_driver = {
+ "keyboard",
+ usb_kbd_probe,
+ usb_kbd_disconnect,
+ {NULL, NULL}
};
-static void
-usb_kbd_handle_key(unsigned char key, int down)
+static void usb_kbd_handle_key(unsigned char key, int down)
{
- int scancode = (int) usb_kbd_map[key];
- if(scancode)
- {
+ int scancode = (int) usb_kbd_map[key];
+ if (scancode) {
#ifndef CONFIG_MAC_KEYBOARD
- if(scancode & PCKBD_NEEDS_E0)
- {
- handle_scancode(0xe0, 1);
- }
-#endif /* CONFIG_MAC_KEYBOARD */
- handle_scancode((scancode & ~PCKBD_NEEDS_E0), down);
- }
+ if (scancode & PCKBD_NEEDS_E0) {
+ handle_scancode(0xe0, 1);
+ }
+#endif /* CONFIG_MAC_KEYBOARD */
+ handle_scancode((scancode & ~PCKBD_NEEDS_E0), down);
+ }
}
-static void
-usb_kbd_repeat(unsigned long dev_id)
+static void usb_kbd_repeat(unsigned long dev_id)
{
- struct usb_keyboard *kbd = (struct usb_keyboard*) dev_id;
-
- unsigned long flags;
- save_flags(flags);
- cli();
-
- if(kbd->repeat_key)
- {
- usb_kbd_handle_key(kbd->repeat_key, 1);
-
- /* reset repeat timer */
- kbd->repeat_timer.function = usb_kbd_repeat;
- kbd->repeat_timer.expires = jiffies + USBKBD_REPEAT_RATE;
- kbd->repeat_timer.data = (unsigned long) kbd;
- kbd->repeat_timer.prev = NULL;
- kbd->repeat_timer.next = NULL;
- add_timer(&kbd->repeat_timer);
- }
-
- restore_flags(flags);
+ struct usb_keyboard *kbd = (struct usb_keyboard *) dev_id;
+
+ unsigned long flags;
+ save_flags(flags);
+ cli();
+
+ if (kbd->repeat_key) {
+ usb_kbd_handle_key(kbd->repeat_key, 1);
+
+ /* reset repeat timer */
+ kbd->repeat_timer.function = usb_kbd_repeat;
+ kbd->repeat_timer.expires = jiffies + USBKBD_REPEAT_RATE;
+ kbd->repeat_timer.data = (unsigned long) kbd;
+ kbd->repeat_timer.prev = NULL;
+ kbd->repeat_timer.next = NULL;
+ add_timer(&kbd->repeat_timer);
+ }
+
+ restore_flags(flags);
}
-static int
-usb_kbd_irq(int state, void *buffer, int len, void *dev_id)
+static int usb_kbd_irq(int state, void *buffer, int len, void *dev_id)
{
- struct usb_keyboard *kbd = (struct usb_keyboard*) dev_id;
- unsigned long *down = (unsigned long*) buffer;
+ struct usb_keyboard *kbd = (struct usb_keyboard *) dev_id;
+ unsigned long *down = (unsigned long *) buffer;
- /*
- * USB_ST_NOERROR is the normal case.
- * USB_ST_REMOVED occurs if keyboard disconnected
- * On other states, ignore
- */
+ /*
+ * USB_ST_NOERROR is the normal case.
+ * USB_ST_REMOVED occurs if keyboard disconnected
+ * On other states, ignore
+ */
- switch (state) {
+ switch (state) {
case USB_ST_REMOVED:
case USB_ST_INTERNALERROR:
- printk(KERN_DEBUG "%s(%d): Suspending\n", __FILE__, __LINE__);
- return 0; /* disable */
- case USB_ST_NOERROR: break;
- default: return 1; /* ignore */
- }
-
- if(kbd->down[0] != down[0] || kbd->down[1] != down[1]) {
- unsigned char *olddown, *newdown;
- unsigned char modsdelta, key;
- int i;
-
- /* handle modifier change */
- modsdelta = (*(unsigned char*) down ^ *(unsigned char*) kbd->down);
- if(modsdelta)
- {
- for(i = 0; i < 8; i++)
- {
- if(modsdelta & 0x01)
- {
- int pressed = (*(unsigned char*) down >> i) & 0x01;
- usb_kbd_handle_key(
- i + USBKBD_MODIFIER_BASE,
- pressed);
- }
- modsdelta >>= 1;
- }
- }
-
- olddown = (unsigned char*) kbd->down + USBKBD_KEYCODE_OFFSET;
- newdown = (unsigned char*) down + USBKBD_KEYCODE_OFFSET;
-
- /* handle released keys */
- for(i = 0; i < USBKBD_KEYCODE_COUNT; i++)
- {
- key = olddown[i];
- if(USBKBD_VALID_KEYCODE(key)
- && !USBKBD_FIND_KEYCODE(newdown, key, USBKBD_KEYCODE_COUNT))
- {
- usb_kbd_handle_key(key, 0);
- }
- }
-
- /* handle pressed keys */
- kbd->repeat_key = 0;
- for(i = 0; i < USBKBD_KEYCODE_COUNT; i++)
- {
- key = newdown[i];
- if(USBKBD_VALID_KEYCODE(key)
- && !USBKBD_FIND_KEYCODE(olddown, key, USBKBD_KEYCODE_COUNT))
- {
- usb_kbd_handle_key(key, 1);
- kbd->repeat_key = key;
- }
- }
-
- /* set repeat timer if any keys were pressed */
- if(kbd->repeat_key)
- {
- del_timer(&kbd->repeat_timer);
- kbd->repeat_timer.function = usb_kbd_repeat;
- kbd->repeat_timer.expires = jiffies + USBKBD_REPEAT_DELAY;
- kbd->repeat_timer.data = (unsigned long) kbd;
- kbd->repeat_timer.prev = NULL;
- kbd->repeat_timer.next = NULL;
- add_timer(&kbd->repeat_timer);
- }
-
- kbd->down[0] = down[0];
- kbd->down[1] = down[1];
- }
-
- return 1;
+ printk(KERN_DEBUG "%s(%d): Suspending\n", __FILE__,
+ __LINE__);
+ return 0; /* disable */
+ case USB_ST_NOERROR:
+ break;
+ default:
+ return 1; /* ignore */
+ }
+
+ if (kbd->down[0] != down[0] || kbd->down[1] != down[1]) {
+ unsigned char *olddown, *newdown;
+ unsigned char modsdelta, key;
+ int i;
+
+ /* handle modifier change */
+ modsdelta =
+ (*(unsigned char *) down ^ *(unsigned char *) kbd->
+ down);
+ if (modsdelta) {
+ for (i = 0; i < 8; i++) {
+ if (modsdelta & 0x01) {
+ int pressed =
+ (*(unsigned char *) down >> i)
+ & 0x01;
+ usb_kbd_handle_key(i +
+ USBKBD_MODIFIER_BASE,
+ pressed);
+ }
+ modsdelta >>= 1;
+ }
+ }
+
+ olddown =
+ (unsigned char *) kbd->down + USBKBD_KEYCODE_OFFSET;
+ newdown = (unsigned char *) down + USBKBD_KEYCODE_OFFSET;
+
+ /* handle released keys */
+ for (i = 0; i < USBKBD_KEYCODE_COUNT; i++) {
+ key = olddown[i];
+ if (USBKBD_VALID_KEYCODE(key)
+ && !USBKBD_FIND_KEYCODE(newdown, key,
+ USBKBD_KEYCODE_COUNT))
+ {
+ usb_kbd_handle_key(key, 0);
+ }
+ }
+
+ /* handle pressed keys */
+ kbd->repeat_key = 0;
+ for (i = 0; i < USBKBD_KEYCODE_COUNT; i++) {
+ key = newdown[i];
+ if (USBKBD_VALID_KEYCODE(key)
+ && !USBKBD_FIND_KEYCODE(olddown, key,
+ USBKBD_KEYCODE_COUNT))
+ {
+ usb_kbd_handle_key(key, 1);
+ kbd->repeat_key = key;
+ }
+ }
+
+ /* set repeat timer if any keys were pressed */
+ if (kbd->repeat_key) {
+ del_timer(&kbd->repeat_timer);
+ kbd->repeat_timer.function = usb_kbd_repeat;
+ kbd->repeat_timer.expires =
+ jiffies + USBKBD_REPEAT_DELAY;
+ kbd->repeat_timer.data = (unsigned long) kbd;
+ kbd->repeat_timer.prev = NULL;
+ kbd->repeat_timer.next = NULL;
+ add_timer(&kbd->repeat_timer);
+ }
+
+ kbd->down[0] = down[0];
+ kbd->down[1] = down[1];
+ }
+
+ return 1;
}
-static void *
-usb_kbd_probe(struct usb_device *dev, unsigned int i)
+static void *usb_kbd_probe(struct usb_device *dev, unsigned int i)
{
- struct usb_interface_descriptor *interface;
- struct usb_endpoint_descriptor *endpoint;
- struct usb_keyboard *kbd;
- int ret;
-
- interface = &dev->actconfig->interface[i].altsetting[0];
- endpoint = &interface->endpoint[0];
-
- if(interface->bInterfaceClass != 3
- || interface->bInterfaceSubClass != 1
- || interface->bInterfaceProtocol != 1)
- {
- return NULL;
- }
-
- printk(KERN_INFO "USB HID boot protocol keyboard detected.\n");
-
- kbd = kmalloc(sizeof(struct usb_keyboard), GFP_KERNEL);
- if(kbd)
- {
- memset(kbd, 0, sizeof(*kbd));
- kbd->dev = dev;
-
- usb_set_protocol(dev, 0);
- usb_set_idle(dev, 0, 0);
-
- kbd->irqpipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
- ret = usb_request_irq(dev, kbd->irqpipe,
- usb_kbd_irq, endpoint->bInterval,
- kbd, &kbd->irq_handler);
- if (ret) {
- printk(KERN_INFO "usb-keyboard failed usb_request_irq (0x%x)\n", ret);
- goto probe_err;
+ struct usb_interface_descriptor *interface;
+ struct usb_endpoint_descriptor *endpoint;
+ struct usb_keyboard *kbd;
+ int ret;
+
+ interface = &dev->actconfig->interface[i].altsetting[0];
+ endpoint = &interface->endpoint[0];
+
+ if (interface->bInterfaceClass != 3
+ || interface->bInterfaceSubClass != 1
+ || interface->bInterfaceProtocol != 1) {
+ return NULL;
}
- list_add(&kbd->list, &usb_kbd_list);
-
- return kbd;
- }
+ printk(KERN_INFO "USB HID boot protocol keyboard detected.\n");
+
+ kbd = kmalloc(sizeof(struct usb_keyboard), GFP_KERNEL);
+ if (kbd) {
+ memset(kbd, 0, sizeof(*kbd));
+ kbd->dev = dev;
+
+ usb_set_protocol(dev, 0);
+ usb_set_idle(dev, 0, 0);
+
+ kbd->irqpipe =
+ usb_rcvintpipe(dev, endpoint->bEndpointAddress);
+ ret =
+ usb_request_irq(dev, kbd->irqpipe, usb_kbd_irq,
+ endpoint->bInterval, kbd,
+ &kbd->irq_handler);
+ if (ret) {
+ printk(KERN_INFO
+ "usb-keyboard failed usb_request_irq (0x%x)\n",
+ ret);
+ goto probe_err;
+ }
+
+ list_add(&kbd->list, &usb_kbd_list);
+
+ return kbd;
+ }
probe_err:
- if (kbd)
- kfree (kbd);
- return NULL;
+ if (kbd)
+ kfree(kbd);
+ return NULL;
}
-static void
-usb_kbd_disconnect(struct usb_device *dev, void *ptr)
+static void usb_kbd_disconnect(struct usb_device *dev, void *ptr)
{
- struct usb_keyboard *kbd = (struct usb_keyboard*) ptr;
- if (kbd)
- {
- usb_release_irq(dev, kbd->irq_handler, kbd->irqpipe);
- list_del(&kbd->list);
- del_timer(&kbd->repeat_timer);
- kfree(kbd);
- }
-
- printk(KERN_INFO "USB HID boot protocol keyboard removed.\n");
+ struct usb_keyboard *kbd = (struct usb_keyboard *) ptr;
+ if (kbd) {
+ usb_release_irq(dev, kbd->irq_handler, kbd->irqpipe);
+ list_del(&kbd->list);
+ del_timer(&kbd->repeat_timer);
+ kfree(kbd);
+ }
+
+ printk(KERN_INFO "USB HID boot protocol keyboard removed.\n");
}
int usb_kbd_init(void)
cur = head->next;
while (cur != head) {
- struct usb_keyboard *kbd = list_entry(cur, struct usb_keyboard, list);
+ struct usb_keyboard *kbd =
+ list_entry(cur, struct usb_keyboard, list);
cur = cur->next;
- list_del(&kbd->list);
- INIT_LIST_HEAD(&kbd->list);
+ list_del(&kbd->list);
+ INIT_LIST_HEAD(&kbd->list);
if (kbd->irq_handler) {
- usb_release_irq(kbd->dev, kbd->irq_handler, kbd->irqpipe);
+ usb_release_irq(kbd->dev, kbd->irq_handler,
+ kbd->irqpipe);
/* never keep a reference to a released IRQ! */
kbd->irq_handler = NULL;
}
{
usb_kbd_cleanup();
}
-#endif
+#endif
mouse->suspended = 0;
/* stop polling the mouse while its not in use */
usb_unlink_urb(mouse->urb);
- /* never keep a reference to a released IRQ! */
- mouse->irq_handle = NULL;
- }
+ }
return 0;
}
static int state = 0;
struct mouse_state *mouse = &static_mouse_state;
+ if (!mouse->present)
+ return 0;
/*
* FIXME - Other mouse drivers handle blocking and nonblocking reads
* differently here...
usb_unlink_urb(mouse->urb);
}
- mouse->irq_handle = NULL;
-
/* this might need work */
mouse->present = 0;
printk("Mouse disconnected\n");
struct mouse_state *mouse = &static_mouse_state;
mouse->present = mouse->active = mouse->suspended = 0;
- mouse->irq_handle = NULL;
mouse->buffer=kmalloc(64,GFP_KERNEL);
+
if (!mouse->buffer)
return -ENOMEM;
mouse->urb=usb_alloc_urb(0);
if (!mouse->urb)
printk(KERN_DEBUG MODSTR"URB allocation failed\n");
+
init_waitqueue_head(&mouse->wait);
mouse->fasync = NULL;
/* stop the usb interrupt transfer */
if (mouse->present) {
- usb_unlink_urb(mouse->urb);
- /* never keep a reference to a released IRQ! */
- mouse->irq_handle = NULL;
- }
+ usb_unlink_urb(mouse->urb);
+ }
kfree(mouse->urb);
kfree(mouse->buffer);
/* this, too, probably needs work */
/* free the private part of an URB */
-static void urb_rm_priv (purb_t purb)
+static void urb_rm_priv (urb_t * urb)
{
- purb_priv_t purb_priv = purb->hcpriv;
+ urb_priv_t * urb_priv = urb->hcpriv;
int i;
void * wait;
- if (!purb_priv) return;
+ if (!urb_priv) return;
- wait = purb_priv->wait;
+ wait = urb_priv->wait;
- for (i=0; i < purb_priv->length; i++) {
- if (purb_priv->td[i]) {
- OHCI_FREE (purb_priv->td[i]);
+ for (i = 0; i < urb_priv->length; i++) {
+ if (urb_priv->td [i]) {
+ OHCI_FREE (urb_priv->td [i]);
}
}
- kfree (purb->hcpriv);
- purb->hcpriv = NULL;
+ kfree (urb->hcpriv);
+ urb->hcpriv = NULL;
if (wait) {
add_wait_queue (&op_wakeup, wait);
/* debug| print the main components of an URB
* small: 0) header + data packets 1) just header */
-static void urb_print (purb_t purb, char * str, int small)
+static void urb_print (urb_t * urb, char * str, int small)
{
- unsigned int pipe= purb->pipe;
+ unsigned int pipe= urb->pipe;
int i, len;
- if (!purb->dev || !purb->dev->bus) {
+ if (!urb->dev || !urb->dev->bus) {
printk(KERN_DEBUG " %s URB: no dev\n", str);
return;
}
printk (KERN_DEBUG "%s URB:[%4x] dev:%2d,ep:%2d-%c,type:%s,"
"flags:%4x,len:%d/%d,stat:%d(%x)\n",
str,
- sohci_get_current_frame_number (purb->dev),
+ sohci_get_current_frame_number (urb->dev),
usb_pipedevice (pipe),
usb_pipeendpoint (pipe),
usb_pipeout (pipe)? 'O': 'I',
usb_pipetype (pipe) < 2? (usb_pipeint (pipe)? "INTR": "ISOC"):
(usb_pipecontrol (pipe)? "CTRL": "BULK"),
- purb->transfer_flags,
- purb->actual_length,
- purb->transfer_buffer_length,
- purb->status, purb->status);
+ urb->transfer_flags,
+ urb->actual_length,
+ urb->transfer_buffer_length,
+ urb->status, urb->status);
if (!small) {
if (usb_pipecontrol (pipe)) {
printk (KERN_DEBUG " cmd(8):");
for (i = 0; i < 8 ; i++)
- printk (" %02x", ((__u8 *) purb->setup_packet) [i]);
+ printk (" %02x", ((__u8 *) urb->setup_packet) [i]);
printk ("\n");
}
- if (purb->transfer_buffer_length > 0 && purb->transfer_buffer) {
+ if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) {
printk (KERN_DEBUG " data(%d/%d):",
- purb->actual_length,
- purb->transfer_buffer_length);
+ urb->actual_length,
+ urb->transfer_buffer_length);
len = usb_pipeout (pipe)?
- purb->transfer_buffer_length: purb->actual_length;
+ urb->transfer_buffer_length: urb->actual_length;
for (i = 0; i < 16 && i < len; i++)
- printk(" %02x", ((__u8 *) purb->transfer_buffer) [i]);
- printk("%s stat:%d\n", i < len? "...": "", purb->status);
+ printk (" %02x", ((__u8 *) urb->transfer_buffer) [i]);
+ printk ("%s stat:%d\n", i < len? "...": "", urb->status);
}
}
}
+/* just for debugging; prints all 32 branches of the int ed tree inclusive iso eds*/
+void ep_print_int_eds (ohci_t * ohci, char * str) {
+ int i, j;
+ __u32 * ed_p;
+ for (i= 0; i < 32; i++) {
+ j = 5;
+ printk (KERN_DEBUG " %s branch int %2d(%2x): ", str, i, i);
+ ed_p = &(ohci->hcca.int_table [i]);
+ while (*ed_p != 0 && j--) {
+ printk ("ed: %4x; ", (((ed_t *) bus_to_virt (*ed_p))->hwINFO));
+ ed_p = &(((ed_t *) bus_to_virt (*ed_p))->hwNextED);
+ }
+ printk ("\n");
+ }
+}
+
+
#endif
/*-------------------------------------------------------------------------*
/* return a request to the completion handler */
-static int sohci_return_urb (purb_t purb)
+static int sohci_return_urb (urb_t * urb)
{
- purb_priv_t purb_priv = purb->hcpriv;
- purb_t purbt;
+ urb_priv_t * urb_priv = urb->hcpriv;
+ urb_t * urbt;
unsigned int flags;
int i;
/* just to be sure */
- if (!purb->complete) {
- urb_rm_priv (purb);
- usb_dec_dev_use (purb->dev);
+ if (!urb->complete) {
+ urb_rm_priv (urb);
+ usb_dec_dev_use (urb->dev);
return -1;
}
- if (!purb_priv) return -1; /* urb already unlinked */
+ if (!urb_priv) return -1; /* urb already unlinked */
#ifdef DEBUG
- urb_print (purb, "RET", usb_pipeout (purb->pipe));
+ urb_print (urb, "RET", usb_pipeout (urb->pipe));
#endif
- switch (usb_pipetype(purb->pipe)) {
+ switch (usb_pipetype (urb->pipe)) {
case PIPE_INTERRUPT:
- purb->complete (purb); /* call complete and requeue URB */
- purb->actual_length = 0;
- purb->status = USB_ST_URB_PENDING;
- if (purb_priv->state != URB_DEL)
- td_submit_urb (purb);
+ urb->complete (urb); /* call complete and requeue URB */
+ urb->actual_length = 0;
+ urb->status = USB_ST_URB_PENDING;
+ if (urb_priv->state != URB_DEL)
+ td_submit_urb (urb);
break;
case PIPE_ISOCHRONOUS:
- for (purbt = purb->next; purbt && (purbt != purb); purbt = purbt->next);
- if (purbt) { /* send the reply and requeue URB */
- purb->complete (purb);
+ for (urbt = urb->next; urbt && (urbt != urb); urbt = urbt->next);
+ if (urbt) { /* send the reply and requeue URB */
+ urb->complete (urb);
+
spin_lock_irqsave (&usb_ed_lock, flags);
- purb->actual_length = 0;
- purb->status = USB_ST_URB_PENDING;
- purb->start_frame = purb_priv->ed->last_iso + 1;
- if (purb_priv->state != URB_DEL) {
- for (i = 0; i < purb->number_of_packets; i++) {
- purb->iso_frame_desc[i].actual_length = 0;
- purb->iso_frame_desc[i].status = TD_NOTACCESSED;
+ urb->actual_length = 0;
+ urb->status = USB_ST_URB_PENDING;
+ urb->start_frame = urb_priv->ed->last_iso + 1;
+ if (urb_priv->state != URB_DEL) {
+ for (i = 0; i < urb->number_of_packets; i++) {
+ urb->iso_frame_desc[i].actual_length = 0;
+ urb->iso_frame_desc[i].status = -EXDEV;
}
- td_submit_urb (purb);
+ td_submit_urb (urb);
}
spin_unlock_irqrestore (&usb_ed_lock, flags);
+
} else { /* unlink URB, call complete */
- urb_rm_priv (purb);
- usb_dec_dev_use (purb->dev);
- purb->complete (purb);
+ urb_rm_priv (urb);
+ usb_dec_dev_use (urb->dev);
+ urb->complete (urb);
}
break;
case PIPE_BULK:
- case PIPE_CONTROL: /* short packet error?, unlink URB, call complete */
- urb_rm_priv (purb);
- usb_dec_dev_use (purb->dev);
- purb->complete (purb);
+ case PIPE_CONTROL: /* unlink URB, call complete */
+ urb_rm_priv (urb);
+ usb_dec_dev_use (urb->dev);
+ urb->complete (urb);
break;
}
return 0;
/* get a transfer request */
-static int sohci_submit_urb (purb_t purb)
+static int sohci_submit_urb (urb_t * urb)
{
- pohci_t ohci;
- ped_t ed;
- purb_priv_t purb_priv;
- unsigned int pipe = purb->pipe;
+ ohci_t * ohci;
+ ed_t * ed;
+ urb_priv_t * urb_priv;
+ unsigned int pipe = urb->pipe;
int i, size = 0;
unsigned int flags;
- if (!purb->dev || !purb->dev->bus) return -EINVAL;
+ if (!urb->dev || !urb->dev->bus) return -EINVAL;
- if (purb->hcpriv) return -EINVAL; /* urb already in use */
+ if (urb->hcpriv) return -EINVAL; /* urb already in use */
- usb_inc_dev_use (purb->dev);
- ohci = (pohci_t) purb->dev->bus->hcpriv;
+ usb_inc_dev_use (urb->dev);
+ ohci = (ohci_t *) urb->dev->bus->hcpriv;
#ifdef DEBUG
- urb_print(purb, "SUB", usb_pipein (pipe));
+ urb_print (urb, "SUB", usb_pipein (pipe));
#endif
if (usb_pipedevice (pipe) == ohci->rh.devnum)
- return rh_submit_urb (purb); /* a request to the virtual root hub */
+ return rh_submit_urb (urb); /* a request to the virtual root hub */
/* every endpoint has a ed, locate and fill it */
- if (!(ed = ep_add_ed (purb->dev, pipe, purb->interval, 1))) {
- usb_dec_dev_use (purb->dev);
+ if (!(ed = ep_add_ed (urb->dev, pipe, urb->interval, 1))) {
+ usb_dec_dev_use (urb->dev);
return -ENOMEM;
}
/* for the private part of the URB we need the number of TDs (size) */
switch (usb_pipetype (pipe)) {
case PIPE_BULK: /* one TD for every 4096 Byte */
- size = (purb->transfer_buffer_length - 1) / 4096 + 1;
+ size = (urb->transfer_buffer_length - 1) / 4096 + 1;
break;
case PIPE_ISOCHRONOUS: /* number of packets from URB */
- size = purb->number_of_packets;
- for (i = 0; i < purb->number_of_packets; i++) {
- purb->iso_frame_desc[i].actual_length = 0;
- purb->iso_frame_desc[i].status = TD_NOTACCESSED;
+ size = urb->number_of_packets;
+ for (i = 0; i < urb->number_of_packets; i++) {
+ urb->iso_frame_desc[i].actual_length = 0;
+ urb->iso_frame_desc[i].status = -EXDEV;
}
break;
case PIPE_CONTROL: /* 1 TD for setup, 1 for ACK and 1 for every 4096 B */
- size = (purb->transfer_buffer_length == 0)? 2:
- (purb->transfer_buffer_length - 1) / 4096 + 3;
+ size = (urb->transfer_buffer_length == 0)? 2:
+ (urb->transfer_buffer_length - 1) / 4096 + 3;
break;
case PIPE_INTERRUPT: /* one TD */
size = 1;
}
/* allocate the private part or the URB */
- purb_priv = kmalloc (sizeof (urb_priv_t) + size * sizeof (ptd_t),
+ urb_priv = kmalloc (sizeof (urb_priv_t) + size * sizeof (td_t *),
in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
- if (!purb_priv) {
- usb_dec_dev_use (purb->dev);
+ if (!urb_priv) {
+ usb_dec_dev_use (urb->dev);
return -ENOMEM;
}
- memset (purb_priv, 0, sizeof (urb_priv_t) + size * sizeof (ptd_t));
+ memset (urb_priv, 0, sizeof (urb_priv_t) + size * sizeof (td_t *));
/* fill the private part of the URB */
- purb->hcpriv = purb_priv;
- purb_priv->length = size;
- purb_priv->td_cnt = 0;
- purb_priv->state = 0;
- purb_priv->ed = ed;
- purb_priv->wait = NULL;
+ urb->hcpriv = urb_priv;
+ urb_priv->length = size;
+ urb_priv->td_cnt = 0;
+ urb_priv->state = 0;
+ urb_priv->ed = ed;
+ urb_priv->wait = NULL;
/* allocate the TDs */
for (i = 0; i < size; i++) {
- OHCI_ALLOC (purb_priv->td[i], sizeof (td_t));
- if (!purb_priv->td[i]) {
- usb_dec_dev_use (purb->dev);
- urb_rm_priv (purb);
+ OHCI_ALLOC (urb_priv->td[i], sizeof (td_t));
+ if (!urb_priv->td[i]) {
+ usb_dec_dev_use (urb->dev);
+ urb_rm_priv (urb);
return -ENOMEM;
}
}
spin_lock_irqsave (&usb_ed_lock, flags);
if (ed->state == ED_NEW || (ed->state & ED_DEL)) {
- urb_rm_priv(purb);
- usb_dec_dev_use (purb->dev);
+ urb_rm_priv(urb);
+ usb_dec_dev_use (urb->dev);
return -EINVAL;
}
/* for ISOC transfers calculate start frame index */
- if (purb->transfer_flags & USB_ISO_ASAP) {
- purb->start_frame = ((ed->state == ED_OPER)? (ed->last_iso + 1):
+ if (urb->transfer_flags & USB_ISO_ASAP) {
+ urb->start_frame = ((ed->state == ED_OPER)? (ed->last_iso + 1):
(ohci->hcca.frame_no + 10)) & 0xffff;
}
- td_submit_urb (purb); /* fill the TDs and link it to the ed */
+ td_submit_urb (urb); /* fill the TDs and link it to the ed */
if (ed->state != ED_OPER) /* link the ed into a chain if is not already */
ep_link (ohci, ed);
spin_unlock_irqrestore (&usb_ed_lock, flags);
- purb->status = USB_ST_URB_PENDING;
- // queue_urb(s, &purb->urb_list);
+ urb->status = USB_ST_URB_PENDING;
+ // queue_urb(s, &urb->urb_list);
return 0;
}
/* deactivate all TDs and remove the private part of the URB */
-static int sohci_unlink_urb (purb_t purb)
+static int sohci_unlink_urb (urb_t * urb)
{
unsigned int flags;
- pohci_t ohci;
+ ohci_t * ohci;
DECLARE_WAITQUEUE (wait, current);
- if (!purb) /* just to be sure */
+ if (!urb) /* just to be sure */
return -EINVAL;
-
- ohci = (pohci_t) purb->dev->bus->hcpriv;
-
- if (usb_pipedevice (purb->pipe) == ohci->rh.devnum)
- return rh_unlink_urb (purb); /* a request to the virtual root hub */
+
+#ifdef DEBUG
+ urb_print (urb, "UNLINK", 1);
+#endif
+
+ ohci = (ohci_t *) urb->dev->bus->hcpriv;
+
+ if (usb_pipedevice (urb->pipe) == ohci->rh.devnum)
+ return rh_unlink_urb (urb); /* a request to the virtual root hub */
- if (purb->hcpriv) {
- if (purb->status == USB_ST_URB_PENDING) { /* URB active? */
- purb_priv_t purb_priv = purb->hcpriv;
- purb_priv->state = URB_DEL;
+ if (urb->hcpriv) {
+ if (urb->status == USB_ST_URB_PENDING) { /* URB active? */
+ urb_priv_t * urb_priv = urb->hcpriv;
+ urb_priv->state = URB_DEL;
/* we want to delete the TDs of an URB from an ed
* request the deletion, it will be handled at the next USB-frame */
- purb_priv->wait = &wait;
- current->state = TASK_UNINTERRUPTIBLE;
+ urb_priv->wait = &wait;
+
spin_lock_irqsave (&usb_ed_lock, flags);
- ep_rm_ed (purb->dev, purb_priv->ed);
- purb_priv->ed->state |= ED_URB_DEL;
+ ep_rm_ed (urb->dev, urb_priv->ed);
+ urb_priv->ed->state |= ED_URB_DEL;
spin_unlock_irqrestore (&usb_ed_lock, flags);
+
current->state = TASK_UNINTERRUPTIBLE;
schedule_timeout (HZ / 10); /* wait until all TDs are deleted */
remove_wait_queue (&op_wakeup, &wait);
} else
- urb_rm_priv (purb);
- usb_dec_dev_use (purb->dev);
+ urb_rm_priv (urb);
+ usb_dec_dev_use (urb->dev);
}
return 0;
}
static int sohci_alloc_dev (struct usb_device *usb_dev)
{
- struct ohci_device *dev;
+ struct ohci_device * dev;
dev = kmalloc (sizeof (*dev), GFP_KERNEL);
if (!dev)
/* free private data space of usb device */
-static int sohci_free_dev (struct usb_device *usb_dev)
+static int sohci_free_dev (struct usb_device * usb_dev)
{
unsigned int flags;
int i, cnt = 0;
- ped_t ed;
+ ed_t * ed;
DECLARE_WAITQUEUE (wait, current);
- struct ohci_device *dev = usb_to_ohci (usb_dev);
- struct ohci *ohci = usb_dev->bus->hcpriv;
+ struct ohci_device * dev = usb_to_ohci (usb_dev);
+ ohci_t * ohci = usb_dev->bus->hcpriv;
if (!dev) return 0;
static int sohci_get_current_frame_number (struct usb_device *usb_dev)
{
- pohci_t ohci = usb_dev->bus->hcpriv;
+ ohci_t * ohci = usb_dev->bus->hcpriv;
return ohci->hcca.frame_no;
}
* returns the branch and
* sets the interval to interval = 2^integer (ld (interval)) */
-static int ep_int_ballance (pohci_t ohci, int interval, int load)
+static int ep_int_ballance (ohci_t * ohci, int interval, int load)
{
int i, branch = 0;
/* link an ed into one of the HC chains */
-static int ep_link (pohci_t ohci, ped_t ed)
+static int ep_link (ohci_t * ohci, ed_t * edi)
{
int int_branch;
int i;
int interval;
int load;
__u32 * ed_p;
+ volatile ed_t * ed = edi;
ed->state = ED_OPER;
for (i = 0; i < ep_rev (6, interval); i += inter) {
inter = 1;
for (ed_p = &(ohci->hcca.int_table[ep_rev (5, i) + int_branch]);
- (*ed_p != 0) && (((ped_t) bus_to_virt (le32_to_cpu (*ed_p)))->int_interval >= interval);
- ed_p = &(((ped_t) bus_to_virt (le32_to_cpu (*ed_p)))->hwNextED))
- inter = ep_rev (6, ((ped_t) bus_to_virt (le32_to_cpu (*ed_p)))->int_interval);
+ (*ed_p != 0) && (((ed_t *) bus_to_virt (le32_to_cpu (*ed_p)))->int_interval >= interval);
+ ed_p = &(((ed_t *) bus_to_virt (le32_to_cpu (*ed_p)))->hwNextED))
+ inter = ep_rev (6, ((ed_t *) bus_to_virt (le32_to_cpu (*ed_p)))->int_interval);
ed->hwNextED = *ed_p;
*ed_p = cpu_to_le32 (virt_to_bus (ed));
}
+#ifdef DEBUG
+ ep_print_int_eds (ohci, "LINK_INT");
+#endif
break;
case ISO:
+ ed->hwNextED = 0;
if (ohci->ed_isotail != NULL) {
ohci->ed_isotail->hwNextED = cpu_to_le32 (virt_to_bus (ed));
ed->ed_prev = ohci->ed_isotail;
inter = 1;
for (ed_p = &(ohci->hcca.int_table[ep_rev (5, i)]);
*ed_p != 0;
- ed_p = &(((ped_t) bus_to_virt (le32_to_cpu (*ed_p)))->hwNextED))
- inter = ep_rev (6, ((ped_t) bus_to_virt (le32_to_cpu (*ed_p)))->int_interval);
+ ed_p = &(((ed_t *) bus_to_virt (le32_to_cpu (*ed_p)))->hwNextED))
+ inter = ep_rev (6, ((ed_t *) bus_to_virt (le32_to_cpu (*ed_p)))->int_interval);
*ed_p = cpu_to_le32 (virt_to_bus (ed));
}
ed->ed_prev = NULL;
}
- ed->hwNextED = 0;
ohci->ed_isotail = ed;
+#ifdef DEBUG
+ ep_print_int_eds (ohci, "LINK_ISO");
+#endif
break;
- }
-
+ }
return 0;
}
* the link from the ed still points to another operational ed or 0
* so the HC can eventually finish the processing of the unlinked ed */
-static int ep_unlink (pohci_t ohci, ped_t ed)
+static int ep_unlink (ohci_t * ohci, ed_t * ed)
{
int int_branch;
int i;
if(ohci->ed_controltail == ed) {
ohci->ed_controltail = ed->ed_prev;
} else {
- ((ped_t) bus_to_virt (le32_to_cpu (ed->hwNextED)))->ed_prev = ed->ed_prev;
+ ((ed_t *) bus_to_virt (le32_to_cpu (ed->hwNextED)))->ed_prev = ed->ed_prev;
}
break;
if (ohci->ed_bulktail == ed) {
ohci->ed_bulktail = ed->ed_prev;
} else {
- ((ped_t) bus_to_virt (le32_to_cpu (ed->hwNextED)))->ed_prev = ed->ed_prev;
+ ((ed_t *) bus_to_virt (le32_to_cpu (ed->hwNextED)))->ed_prev = ed->ed_prev;
}
break;
for (i = 0; i < ep_rev (6, interval); i += inter) {
for (ed_p = &(ohci->hcca.int_table[ep_rev (5, i) + int_branch]), inter = 1;
(*ed_p != 0) && (*ed_p != ed->hwNextED);
- ed_p = &(((ped_t) bus_to_virt (le32_to_cpu (*ed_p)))->hwNextED),
- inter = ep_rev (6, ((ped_t) bus_to_virt (le32_to_cpu (*ed_p)))->int_interval)) {
- if(((ped_t) bus_to_virt (le32_to_cpu (*ed_p))) == ed) {
+ ed_p = &(((ed_t *) bus_to_virt (le32_to_cpu (*ed_p)))->hwNextED),
+ inter = ep_rev (6, ((ed_t *) bus_to_virt (le32_to_cpu (*ed_p)))->int_interval)) {
+ if(((ed_t *) bus_to_virt (le32_to_cpu (*ed_p))) == ed) {
*ed_p = ed->hwNextED;
break;
}
}
}
for (i = int_branch; i < 32; i += interval) ohci->ohci_int_load[i] -= ed->int_load;
- break;
+#ifdef DEBUG
+ ep_print_int_eds (ohci, "UNLINK_INT");
+#endif break;
case ISO:
if (ohci->ed_isotail == ed)
ohci->ed_isotail = ed->ed_prev;
if (ed->hwNextED != 0)
- ((ped_t) bus_to_virt (le32_to_cpu (ed->hwNextED)))->ed_prev = ed->ed_prev;
+ ((ed_t *) bus_to_virt (le32_to_cpu (ed->hwNextED)))->ed_prev = ed->ed_prev;
if (ed->ed_prev != NULL) {
ed->ed_prev->hwNextED = ed->hwNextED;
inter = 1;
for (ed_p = &(ohci->hcca.int_table[ep_rev (5, i)]);
*ed_p != 0;
- ed_p = &(((ped_t) bus_to_virt (le32_to_cpu (*ed_p)))->hwNextED)) {
- inter = ep_rev (6, ((ped_t) bus_to_virt (le32_to_cpu (*ed_p)))->int_interval);
- if(((ped_t) bus_to_virt (le32_to_cpu (*ed_p))) == ed) {
+ ed_p = &(((ed_t *) bus_to_virt (le32_to_cpu (*ed_p)))->hwNextED)) {
+ inter = ep_rev (6, ((ed_t *) bus_to_virt (le32_to_cpu (*ed_p)))->int_interval);
+ if(((ed_t *) bus_to_virt (le32_to_cpu (*ed_p))) == ed) {
*ed_p = ed->hwNextED;
break;
}
}
}
}
+#ifdef DEBUG
+ ep_print_int_eds (ohci, "UNLINK_ISO");
+#endif
break;
}
ed->state = ED_UNLINK;
* in all other cases the state is left unchanged
* the ed info fields are setted anyway even though most of them should not change */
-static ped_t ep_add_ed (struct usb_device * usb_dev, unsigned int pipe, int interval, int load)
+static ed_t * ep_add_ed (struct usb_device * usb_dev, unsigned int pipe, int interval, int load)
{
- struct ohci * ohci = usb_dev->bus->hcpriv;
- ptd_t td;
- ped_t ed;
+ ohci_t * ohci = usb_dev->bus->hcpriv;
+ td_t * td;
+ volatile ed_t * ed;
spin_lock (&usb_ed_lock);
return NULL; /* pending delete request */
if (ed->state == ED_NEW) {
+ ed->hwINFO = cpu_to_le32 (OHCI_ED_SKIP); /* skip ed */
OHCI_ALLOC (td, sizeof (*td)); /* dummy td; end of td list for ed */
if(!td) return NULL; /* out of memory */
ed->hwTailP = cpu_to_le32 (virt_to_bus (td));
* put the ep on the rm_list and request a stop of the bulk or ctrl list
* real removal is done at the next start of frame (SOF) hardware interrupt */
-static void ep_rm_ed (struct usb_device * usb_dev, ped_t ed)
+static void ep_rm_ed (struct usb_device * usb_dev, ed_t * ed)
{
unsigned int frame;
- pohci_t ohci = usb_dev->bus->hcpriv;
+ ohci_t * ohci = usb_dev->bus->hcpriv;
if ((ed->state & ED_DEL) || (ed->state & ED_URB_DEL)) return;
/* prepare a TD */
-static void td_fill (unsigned int info, void * data, int len, purb_t purb, int type, int index)
+static void td_fill (unsigned int info, void * data, int len, urb_t * urb, int type, int index)
{
- volatile ptd_t td, td_pt;
- purb_priv_t purb_priv = purb->hcpriv;
+ volatile td_t * td, * td_pt;
+ urb_priv_t * urb_priv = urb->hcpriv;
+
+ if (index >= urb_priv->length) {
+ printk(KERN_ERR MODSTR "internal OHCI error: TD index > length\n");
+ return;
+ }
- td_pt = purb_priv->td [index];
+ td_pt = urb_priv->td [index];
/* fill the old dummy TD */
- td = (ptd_t) bus_to_virt (le32_to_cpu (purb_priv->ed->hwTailP) & 0xfffffff0);
- td->ed = purb_priv->ed;
+ td = (td_t *) bus_to_virt (le32_to_cpu (urb_priv->ed->hwTailP) & 0xfffffff0);
+ td->ed = urb_priv->ed;
td->index = index;
- td->urb = purb;
+ td->urb = urb;
td->hwINFO = cpu_to_le32 (info);
td->type = type;
if ((td->ed->type & 3) == PIPE_ISOCHRONOUS) {
td->hwPSW [0] = cpu_to_le16 ((virt_to_bus (data) & 0x0FFF) | 0xE000);
td_pt->hwNextTD = 0;
td->ed->hwTailP = td->hwNextTD;
- purb_priv->td [index] = td;
+ urb_priv->td [index] = td;
- td->next_dl_td = td_pt;
+ td->next_dl_td = NULL; //td_pt;
}
/*-------------------------------------------------------------------------*/
/* prepare all TDs of a transfer */
-static void td_submit_urb (purb_t purb)
+static void td_submit_urb (urb_t * urb)
{
- purb_priv_t purb_priv = purb->hcpriv;
- pohci_t ohci = (pohci_t) purb->dev->bus->hcpriv;
- void * ctrl = purb->setup_packet;
- void * data = purb->transfer_buffer;
- int data_len = purb->transfer_buffer_length;
+ urb_priv_t * urb_priv = urb->hcpriv;
+ ohci_t * ohci = (ohci_t *) urb->dev->bus->hcpriv;
+ void * ctrl = urb->setup_packet;
+ void * data = urb->transfer_buffer;
+ int data_len = urb->transfer_buffer_length;
int cnt = 0;
__u32 info = 0;
- purb_priv->td_cnt = 0;
+ urb_priv->td_cnt = 0;
- switch (usb_pipetype (purb->pipe)) {
+ switch (usb_pipetype (urb->pipe)) {
case PIPE_BULK:
- info = usb_pipeout (purb->pipe)?
+ info = usb_pipeout (urb->pipe)?
TD_CC | TD_DP_OUT | TD_T_TOGGLE: TD_CC | TD_DP_IN | TD_T_TOGGLE;
while(data_len > 4096) {
- td_fill (info, data, 4096, purb, (cnt? 0: ST_ADDR) | ADD_LEN, cnt);
+ td_fill (info, data, 4096, urb, (cnt? 0: ST_ADDR) | ADD_LEN, cnt);
data += 4096; data_len -= 4096; cnt++;
}
- info = usb_pipeout (purb->pipe)?
+ info = usb_pipeout (urb->pipe)?
TD_CC | TD_DP_OUT | TD_T_TOGGLE: TD_CC | TD_R | TD_DP_IN | TD_T_TOGGLE;
- td_fill (info, data, data_len, purb, (cnt? 0: ST_ADDR) | ADD_LEN, cnt);
+ td_fill (info, data, data_len, urb, (cnt? 0: ST_ADDR) | ADD_LEN, cnt);
+ cnt++;
writel (OHCI_BLF, &ohci->regs->cmdstatus); /* start bulk list */
break;
case PIPE_INTERRUPT:
- info = usb_pipeout (purb->pipe)?
+ info = usb_pipeout (urb->pipe)?
TD_CC | TD_DP_OUT | TD_T_TOGGLE: TD_CC | TD_R | TD_DP_IN | TD_T_TOGGLE;
- td_fill (info, data, data_len, purb, ST_ADDR | ADD_LEN, 0);
+ td_fill (info, data, data_len, urb, ST_ADDR | ADD_LEN, cnt++);
break;
case PIPE_CONTROL:
info = TD_CC | TD_DP_SETUP | TD_T_DATA0;
- td_fill (info, ctrl, 8, purb, ST_ADDR, cnt++);
+ td_fill (info, ctrl, 8, urb, ST_ADDR, cnt++);
if (data_len > 0) {
- info = usb_pipeout (purb->pipe)?
+ info = usb_pipeout (urb->pipe)?
TD_CC | TD_R | TD_DP_OUT | TD_T_DATA1 : TD_CC | TD_R | TD_DP_IN | TD_T_DATA1;
- td_fill (info, data, data_len, purb, ADD_LEN, cnt++);
+ td_fill (info, data, data_len, urb, ADD_LEN, cnt++);
}
- info = usb_pipeout (purb->pipe)?
+ info = usb_pipeout (urb->pipe)?
TD_CC | TD_DP_IN | TD_T_DATA1: TD_CC | TD_DP_OUT | TD_T_DATA1;
- td_fill (info, NULL, 0, purb, 0, cnt++);
+ td_fill (info, NULL, 0, urb, 0, cnt++);
writel (OHCI_CLF, &ohci->regs->cmdstatus); /* start Control list */
break;
case PIPE_ISOCHRONOUS:
- for (cnt = 0; cnt < purb->number_of_packets; cnt++) {
- td_fill (TD_CC|TD_ISO | ((purb->start_frame + cnt) & 0xffff),
- (__u8 *) data + purb->iso_frame_desc[cnt].offset,
- purb->iso_frame_desc[cnt].length, purb, (cnt? 0: ST_ADDR) | ADD_LEN, cnt);
+ for (cnt = 0; cnt < urb->number_of_packets; cnt++) {
+ td_fill (TD_CC|TD_ISO | ((urb->start_frame + cnt) & 0xffff),
+ (__u8 *) data + urb->iso_frame_desc[cnt].offset,
+ urb->iso_frame_desc[cnt].length, urb, (cnt? 0: ST_ADDR) | ADD_LEN, cnt);
}
break;
}
+#ifdef DEBUG
+ if (urb_priv->length != cnt)
+ dbg (KERN_ERR MODSTR " ********* TD LENGTH %d != CNT %d\n", urb_priv->length, cnt);
+#endif
}
/*-------------------------------------------------------------------------*
/* replies to the request have to be on a FIFO basis so
* we reverse the reversed done-list */
-static ptd_t dl_reverse_done_list (pohci_t ohci)
+static td_t * dl_reverse_done_list (ohci_t * ohci)
{
__u32 td_list_hc;
- ptd_t td_rev = NULL;
- ptd_t td_list = NULL;
- purb_priv_t purb_priv = NULL;
+ td_t * td_rev = NULL;
+ td_t * td_list = NULL;
+ urb_priv_t * urb_priv = NULL;
unsigned int flags;
spin_lock_irqsave (&usb_ed_lock, flags);
ohci->hcca.done_head = 0;
while (td_list_hc) {
- td_list = (ptd_t) bus_to_virt (td_list_hc);
+ td_list = (td_t *) bus_to_virt (td_list_hc);
if (TD_CC_GET (le32_to_cpu (td_list->hwINFO))) {
- purb_priv = (purb_priv_t) td_list->urb->hcpriv;
+ urb_priv = (urb_priv_t *) td_list->urb->hcpriv;
dbg (KERN_DEBUG MODSTR "**** USB-error/status: %x : %p \n",
TD_CC_GET (le32_to_cpu (td_list->hwINFO)), td_list);
if (td_list->ed->hwHeadP & cpu_to_le32 (0x1)) {
- if (purb_priv && ((td_list->index + 1) < purb_priv->length)) {
+ if (urb_priv && ((td_list->index + 1) < urb_priv->length)) {
td_list->ed->hwHeadP =
- (purb_priv->td[purb_priv->length - 1]->hwNextTD & cpu_to_le32 (0xfffffff0)) |
+ (urb_priv->td[urb_priv->length - 1]->hwNextTD & cpu_to_le32 (0xfffffff0)) |
(td_list->ed->hwHeadP & cpu_to_le32 (0x2));
- purb_priv->td_cnt = purb_priv->length - 1;
+ urb_priv->td_cnt = urb_priv->length - 1;
} else
td_list->ed->hwHeadP &= cpu_to_le32 (0xfffffff2);
}
/* there are some pending requests to remove
* - some of the eds (if ed->state & ED_DEL (set by sohci_free_dev)
- * - some URBs/TDs if purb_priv->state == URB_DEL */
+ * - some URBs/TDs if urb_priv->state == URB_DEL */
-static void dl_del_list (pohci_t ohci, unsigned int frame)
+static void dl_del_list (ohci_t * ohci, unsigned int frame)
{
unsigned int flags;
- ped_t ed;
+ ed_t * ed;
__u32 edINFO;
- ptd_t td = NULL, td_next = NULL, tdHeadP = NULL, tdTailP;
+ td_t * td = NULL, * td_next = NULL, * tdHeadP = NULL, * tdTailP;
__u32 * td_p;
- int ctrl=0, bulk=0;
+ int ctrl = 0, bulk = 0;
spin_lock_irqsave (&usb_ed_lock, flags);
for (ed = ohci->ed_rm_list[frame]; ed != NULL; ed = ed->ed_rm_list) {
td_p = &ed->hwHeadP;
for (td = tdHeadP; td != tdTailP; td = td_next) {
- purb_t purb = td->urb;
- purb_priv_t purb_priv = td->urb->hcpriv;
+ urb_t * urb = td->urb;
+ urb_priv_t * urb_priv = td->urb->hcpriv;
- td_next = td->next_dl_td; /* td may be freed by urb_rm_priv */
- if ((purb_priv->state == URB_DEL) || (ed->state & ED_DEL)) {
+ td_next = bus_to_virt (le32_to_cpu (td->hwNextTD) & 0xfffffff0);
+ if ((urb_priv->state == URB_DEL) || (ed->state & ED_DEL)) {
*td_p = td->hwNextTD | (*td_p & cpu_to_le32 (0x3));
- if(++ (purb_priv->td_cnt) == purb_priv->length)
- urb_rm_priv (purb);
+ if(++ (urb_priv->td_cnt) == urb_priv->length)
+ urb_rm_priv (urb);
} else {
td_p = &td->hwNextTD;
}
if (ed->state & ED_DEL) { /* set by sohci_free_dev */
struct ohci_device * dev = usb_to_ohci (ohci->dev[edINFO & 0x7F]);
OHCI_FREE (tdTailP); /* free dummy td */
+ ed->hwINFO = cpu_to_le32 (OHCI_ED_SKIP);
ed->state = ED_NEW;
/* if all eds are removed wake up sohci_free_dev */
if ((! --dev->ed_cnt) && dev->wait) {
/* td done list */
-static void dl_done_list (pohci_t ohci, ptd_t td_list)
+static void dl_done_list (ohci_t * ohci, td_t * td_list)
{
- ptd_t td_list_next = NULL;
- ped_t ed;
+ td_t * td_list_next = NULL;
+ ed_t * ed;
int dlen = 0;
int cc = 0;
- purb_t purb;
- purb_priv_t purb_priv;
+ urb_t * urb;
+ urb_priv_t * urb_priv;
__u32 tdINFO, tdBE, tdCBP, edHeadP, edTailP;
__u16 tdPSW;
unsigned int flags;
while (td_list) {
td_list_next = td_list->next_dl_td;
- purb = td_list->urb;
- purb_priv = purb->hcpriv;
+ urb = td_list->urb;
+ urb_priv = urb->hcpriv;
tdINFO = le32_to_cpu (td_list->hwINFO);
tdBE = le32_to_cpu (td_list->hwBE);
tdCBP = le32_to_cpu (td_list->hwCBP);
ed = td_list->ed;
if (td_list->type & ST_ADDR)
- purb->actual_length = 0;
+ urb->actual_length = 0;
if (td_list->type & ADD_LEN) { /* accumulate length of multi td transfers */
if (tdINFO & TD_ISO) {
tdPSW = le16_to_cpu (td_list->hwPSW[0]);
cc = (tdPSW >> 12) & 0xF;
if (cc < 0xE) {
- if (usb_pipeout(purb->pipe)) {
- dlen = purb->iso_frame_desc[td_list->index].length;
+ if (usb_pipeout(urb->pipe)) {
+ dlen = urb->iso_frame_desc[td_list->index].length;
} else {
dlen = tdPSW & 0x3ff;
}
- purb->actual_length += dlen;
- purb->iso_frame_desc[td_list->index].actual_length = dlen;
- if (!(purb->transfer_flags & USB_DISABLE_SPD) && (cc == TD_DATAUNDERRUN))
+ urb->actual_length += dlen;
+ urb->iso_frame_desc[td_list->index].actual_length = dlen;
+ if (!(urb->transfer_flags & USB_DISABLE_SPD) && (cc == TD_DATAUNDERRUN))
cc = TD_CC_NOERROR;
- purb->iso_frame_desc[td_list->index].status = cc_to_error[cc];
+ urb->iso_frame_desc[td_list->index].status = cc_to_error[cc];
}
} else {
if (tdBE != 0) {
- dlen = (bus_to_virt (tdBE) - purb->transfer_buffer + 1);
+ dlen = (bus_to_virt (tdBE) - urb->transfer_buffer + 1);
if (td_list->hwCBP == 0)
- purb->actual_length += dlen;
+ urb->actual_length += dlen;
else
- purb->actual_length += (bus_to_virt(tdCBP) - purb->transfer_buffer);
+ urb->actual_length += (bus_to_virt(tdCBP) - urb->transfer_buffer);
}
}
}
/* error code of transfer */
cc = TD_CC_GET (tdINFO);
- if (!(purb->transfer_flags & USB_DISABLE_SPD) && (cc == TD_DATAUNDERRUN))
+ if (!(urb->transfer_flags & USB_DISABLE_SPD) && (cc == TD_DATAUNDERRUN))
cc = TD_CC_NOERROR;
- if (++(purb_priv->td_cnt) == purb_priv->length) {
- if (purb_priv->state != URB_DEL) {
- purb->status = cc_to_error[cc];
- sohci_return_urb (purb);
+ if (++(urb_priv->td_cnt) == urb_priv->length) {
+ if (urb_priv->state != URB_DEL) {
+ urb->status = cc_to_error[cc];
+ sohci_return_urb (urb);
} else {
- urb_rm_priv (purb);
+ urb_rm_priv (urb);
}
}
/* prepare Interrupt pipe data; HUB INTERRUPT ENDPOINT */
-static int rh_send_irq (pohci_t ohci, void * rh_data, int rh_len)
+static int rh_send_irq (ohci_t * ohci, void * rh_data, int rh_len)
{
int num_ports;
int i;
int ret;
int len;
- __u8 * data = rh_data;
+ __u8 data[8];
num_ports = readl (&ohci->regs->roothub.a) & 0xff;
*(__u8 *) data = (readl (&ohci->regs->roothub.status) & 0x00030000) > 0? 1: 0;
}
len = i/8 + 1;
- if (ret > 0) return len;
-
+ if (ret > 0) {
+ memcpy (rh_data, data, min (len, min (rh_len, sizeof(data))));
+ return len;
+ }
return 0;
}
{
int len;
- purb_t purb = (purb_t) ptr;
- pohci_t ohci = purb->dev->bus->hcpriv;
+ urb_t * urb = (urb_t *) ptr;
+ ohci_t * ohci = urb->dev->bus->hcpriv;
if(ohci->rh.send) {
- len = rh_send_irq (ohci, purb->transfer_buffer, purb->transfer_buffer_length);
+ len = rh_send_irq (ohci, urb->transfer_buffer, urb->transfer_buffer_length);
if (len > 0) {
- purb->actual_length = len;
+ urb->actual_length = len;
#ifdef DEBUG
- urb_print (purb, "RET(rh)", usb_pipeout (purb->pipe));
+ urb_print (urb, "RET(rh)", usb_pipeout (urb->pipe));
#endif
- if (purb->complete) purb->complete (purb);
+ if (urb->complete) urb->complete (urb);
}
}
- rh_init_int_timer (purb);
+ rh_init_int_timer (urb);
}
/*-------------------------------------------------------------------------*/
/* Root Hub INTs are polled by this timer */
-static int rh_init_int_timer (purb_t purb)
+static int rh_init_int_timer (urb_t * urb)
{
- pohci_t ohci = purb->dev->bus->hcpriv;
+ ohci_t * ohci = urb->dev->bus->hcpriv;
- ohci->rh.interval = purb->interval;
+ ohci->rh.interval = urb->interval;
init_timer (&ohci->rh.rh_int_timer);
ohci->rh.rh_int_timer.function = rh_int_timer_do;
- ohci->rh.rh_int_timer.data = (unsigned long) purb;
+ ohci->rh.rh_int_timer.data = (unsigned long) urb;
ohci->rh.rh_int_timer.expires =
- jiffies + (HZ * (purb->interval < 30? 30: purb->interval)) / 1000;
+ jiffies + (HZ * (urb->interval < 30? 30: urb->interval)) / 1000;
add_timer (&ohci->rh.rh_int_timer);
return 0;
/*-------------------------------------------------------------------------*/
-#define OK(x) len = (x); req_reply = 0; break
+#define OK(x) len = (x); break
#define WR_RH_STAT(x) writel((x), &ohci->regs->roothub.status)
#define WR_RH_PORTSTAT(x) writel((x), &ohci->regs->roothub.portstatus[wIndex-1])
#define RD_RH_STAT readl(&ohci->regs->roothub.status)
/* request to virtual root hub */
-static int rh_submit_urb (purb_t purb)
+static int rh_submit_urb (urb_t * urb)
{
- struct usb_device *usb_dev = purb->dev;
- pohci_t ohci = usb_dev->bus->hcpriv;
- unsigned int pipe = purb->pipe;
- devrequest * cmd = (devrequest *) purb->setup_packet;
- void *data = purb->transfer_buffer;
- int leni = purb->transfer_buffer_length;
+ struct usb_device * usb_dev = urb->dev;
+ ohci_t * ohci = usb_dev->bus->hcpriv;
+ unsigned int pipe = urb->pipe;
+ devrequest * cmd = (devrequest *) urb->setup_packet;
+ void * data = urb->transfer_buffer;
+ int leni = urb->transfer_buffer_length;
int len = 0;
int status = TD_CC_NOERROR;
- __u8 data_buf[16];
- int req_reply=-4;
+ __u8 datab[16];
+ __u8 * data_buf = datab;
__u16 bmRType_bReq;
__u16 wValue;
if (usb_pipeint(pipe)) {
- ohci->rh.urb = purb;
+ ohci->rh.urb = urb;
ohci->rh.send = 1;
- ohci->rh.interval = purb->interval;
- rh_init_int_timer(purb);
- purb->status = cc_to_error [TD_CC_NOERROR];
+ ohci->rh.interval = urb->interval;
+ rh_init_int_timer(urb);
+ urb->status = cc_to_error [TD_CC_NOERROR];
return 0;
}
*/
case RH_GET_STATUS:
- *(__u16 *) data = cpu_to_le16 (1); OK (2);
+ *(__u16 *) data_buf = cpu_to_le16 (1); OK (2);
case RH_GET_STATUS | RH_INTERFACE:
- *(__u16 *) data = cpu_to_le16 (0); OK (2);
+ *(__u16 *) data_buf = cpu_to_le16 (0); OK (2);
case RH_GET_STATUS | RH_ENDPOINT:
- *(__u16 *) data = cpu_to_le16 (0); OK (2);
+ *(__u16 *) data_buf = cpu_to_le16 (0); OK (2);
case RH_GET_STATUS | RH_CLASS:
- *(__u32 *) data = cpu_to_le32 (RD_RH_STAT & 0x7fff7fff); OK (4);
+ *(__u32 *) data_buf = cpu_to_le32 (RD_RH_STAT & 0x7fff7fff); OK (4);
case RH_GET_STATUS | RH_OTHER | RH_CLASS:
- *(__u32 *) data = cpu_to_le32 (RD_RH_PORTSTAT); OK (4);
+ *(__u32 *) data_buf = cpu_to_le32 (RD_RH_PORTSTAT); OK (4);
case RH_CLEAR_FEATURE | RH_ENDPOINT:
switch (wValue) {
switch ((wValue & 0xff00) >> 8) {
case (0x01): /* device descriptor */
len = min (leni, min (sizeof (root_hub_dev_des), wLength));
- memcpy (data, root_hub_dev_des, len); OK(len);
+ data_buf = root_hub_dev_des; OK(len);
case (0x02): /* configuration descriptor */
len = min (leni, min (sizeof (root_hub_config_des), wLength));
- memcpy (data, root_hub_config_des, len); OK(len);
+ data_buf = root_hub_config_des; OK(len);
case (0x03): /* string descriptors */
default:
status = TD_CC_STALL;
} else {
*(__u32 *) (data_buf+7) = cpu_to_le32 (readl(&ohci->regs->roothub.b));
}
- memcpy (data, data_buf, len);
OK (len);
- case RH_GET_CONFIGURATION: *(__u8 *) data = 0x01; OK (1);
+ case RH_GET_CONFIGURATION: *(__u8 *) data_buf = 0x01; OK (1);
case RH_SET_CONFIGURATION: WR_RH_STAT (0x10000); OK (0);
dbg (KERN_DEBUG MODSTR "USB HC roothubstat2: %x \n",
readl ( &(ohci->regs->roothub.portstatus[1]) ));
- purb->actual_length = len;
- purb->status = cc_to_error [status];
+ len = min(len, leni);
+ memcpy (data, data_buf, len);
+ urb->actual_length = len;
+ urb->status = cc_to_error [status];
#ifdef DEBUG
- urb_print (purb, "RET(rh)", usb_pipeout (purb->pipe));
+ urb_print (urb, "RET(rh)", usb_pipeout (urb->pipe));
#endif
- if (purb->complete) purb->complete (purb);
+ if (urb->complete) urb->complete (urb);
return 0;
}
/*-------------------------------------------------------------------------*/
-static int rh_unlink_urb (purb_t purb)
+static int rh_unlink_urb (urb_t * urb)
{
- pohci_t ohci = purb->dev->bus->hcpriv;
+ ohci_t * ohci = urb->dev->bus->hcpriv;
ohci->rh.send = 0;
del_timer (&ohci->rh.rh_int_timer);
/* reset the HC not the BUS */
-static void hc_reset (pohci_t ohci)
+static void hc_reset (ohci_t * ohci)
{
int timeout = 30;
int smm_timeout = 50; /* 0,5 sec */
* enable interrupts
* connect the virtual root hub */
-static int hc_start (pohci_t ohci)
+static int hc_start (ohci_t * ohci)
{
unsigned int mask;
unsigned int fminterval;
/* an interrupt happens */
-static void hc_interrupt (int irq, void *__ohci, struct pt_regs *r)
+static void hc_interrupt (int irq, void * __ohci, struct pt_regs * r)
{
- pohci_t ohci = __ohci;
- struct ohci_regs *regs = ohci->regs;
+ ohci_t * ohci = __ohci;
+ struct ohci_regs * regs = ohci->regs;
int ints;
if ((ohci->hcca.done_head != 0) && !(ohci->hcca.done_head & 0x01)) {
if ((ints = (readl (®s->intrstatus) & readl (®s->intrenable))) == 0)
return;
}
-
+
+ dbg (KERN_DEBUG MODSTR "Interrupt: %x frame: %x \n", ints, ohci->hcca.frame_no);
+
if (ints & OHCI_INTR_WDH) {
writel (OHCI_INTR_WDH, ®s->intrdisable);
dl_done_list (ohci, dl_reverse_done_list (ohci));
/* allocate OHCI */
-static pohci_t hc_alloc_ohci (void* mem_base)
+static ohci_t * hc_alloc_ohci (void * mem_base)
{
int i;
- pohci_t ohci;
- struct usb_bus *bus;
+ ohci_t * ohci;
+ struct usb_bus * bus;
- ohci = (pohci_t) __get_free_pages (GFP_KERNEL, 1);
+ ohci = (ohci_t *) __get_free_pages (GFP_KERNEL, 1);
if (!ohci)
return NULL;
/* De-allocate all resources.. */
-static void hc_release_ohci (pohci_t ohci)
+static void hc_release_ohci (ohci_t * ohci)
{
dbg (KERN_DEBUG MODSTR "USB HC release ohci\n");
/* Increment the module usage count, start the control thread and
* return success. */
-static int hc_found_ohci (int irq, void* mem_base)
+static int hc_found_ohci (int irq, void * mem_base)
{
- pohci_t ohci;
+ ohci_t * ohci;
dbg (KERN_DEBUG MODSTR "USB HC found: irq= %d membase= %x \n", irq, (int) mem_base);
ohci = hc_alloc_ohci (mem_base);
/*-------------------------------------------------------------------------*/
-static int hc_start_ohci (struct pci_dev *dev)
+static int hc_start_ohci (struct pci_dev * dev)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
unsigned int mem_base = dev->resource[0].start;
/* On Powerbooks, put the controller into suspend mode when going
* to sleep, and do a resume when waking up. */
-static int ohci_sleep_notify (struct pmu_sleep_notifier *self, int when)
+static int ohci_sleep_notify (struct pmu_sleep_notifier * self, int when)
{
- struct list_head *ohci_l;
- pohci_t ohci;
+ struct list_head * ohci_l;
+ ohci_t * ohci;
for (ohci_l = ohci_hcd_list.next; ohci_l != &ohci_hcd_list; ohci_l = ohci_l->next) {
- ohci = list_entry (ohci_l, struct ohci, ohci_hcd_list);
+ ohci = list_entry (ohci_l, ohci_t, ohci_hcd_list);
switch (when) {
case PBOOK_SLEEP_NOW:
static int handle_apm_event (apm_event_t event)
{
static int down = 0;
- pohci_t ohci;
- struct list_head *ohci_l;
+ ohci_t * ohci;
+ struct list_head * ohci_l;
switch (event) {
case APM_SYS_SUSPEND:
break;
}
for (ohci_l = ohci_hcd_list.next; ohci_l != &ohci_hcd_list; ohci_l = ohci_l->next) {
- ohci = list_entry (ohci_l, struct ohci, ohci_hcd_list);
+ ohci = list_entry (ohci_l, ohci_t, ohci_hcd_list);
dbg (KERN_DEBUG MODSTR "USB-Bus suspend: %p\n", ohci);
writel (ohci->hc_control = 0xFF, &ohci->regs->control);
}
break;
}
for (ohci_l = ohci_hcd_list.next; ohci_l != &ohci_hcd_list; ohci_l = ohci_l->next) {
- ohci = list_entry(ohci_l, struct ohci, ohci_hcd_list);
+ ohci = list_entry(ohci_l, ohci_t, ohci_hcd_list);
dbg (KERN_DEBUG MODSTR "USB-Bus resume: %p\n", ohci);
writel (ohci->hc_control = 0x7F, &ohci->regs->control);
}
wait_ms (20);
for (ohci_l = ohci_hcd_list.next; ohci_l != &ohci_hcd_list; ohci_l = ohci_l->next) {
- ohci = list_entry (ohci_l, struct ohci, ohci_hcd_list);
+ ohci = list_entry (ohci_l, ohci_t, ohci_hcd_list);
writel (ohci->hc_control = 0xBF, &ohci->regs->control);
}
down = 0;
int ohci_hcd_init (void)
{
int ret = -ENODEV;
- struct pci_dev *dev = NULL;
+ struct pci_dev * dev = NULL;
while ((dev = pci_find_class (PCI_CLASS_SERIAL_USB_OHCI, dev))) {
if (hc_start_ohci(dev) >= 0) ret = 0;
void cleanup_module (void)
{
- struct ohci *ohci;
+ ohci_t * ohci;
#ifdef CONFIG_APM
apm_unregister_callback (&handle_apm_event);
#endif
while (!list_empty (&ohci_hcd_list)) {
- ohci = list_entry (ohci_hcd_list.next, struct ohci, ohci_hcd_list);
+ ohci = list_entry (ohci_hcd_list.next, ohci_t, ohci_hcd_list);
list_del (&ohci->ohci_hcd_list);
INIT_LIST_HEAD (&ohci->ohci_hcd_list);
hc_release_ohci (ohci);
/* BufferOver */ USB_ST_BUFFEROVERRUN,
/* BuffUnder */ USB_ST_BUFFERUNDERRUN,
/* Not Access */ USB_ST_NORESPONSE,
- /* Not Access */ USB_ST_NORESPONSE
+ /* Not Access */ USB_ST_NORESPONSE
};
#else /* error codes */
__u32 hwHeadP;
__u32 hwNextED;
- struct ed *ed_prev;
+ struct ed * ed_prev;
__u8 int_period;
__u8 int_branch;
__u8 int_load;
__u16 last_iso;
struct ed * ed_rm_list;
-} ed_t, * ped_t;
+} ed_t;
/* TD info field */
#define TD_NOTACCESSED 0x0F
-#define MAXPSW 8
+#define MAXPSW 1
typedef struct td {
__u32 hwINFO;
__u8 type;
__u8 index;
- struct ed *ed;
- struct td *next_dl_td;
- purb_t urb;
-} td_t, * ptd_t;
+ struct ed * ed;
+ struct td * next_dl_td;
+ urb_t * urb;
+} td_t;
/* TD types */
/* urb */
typedef struct
{
- ped_t ed;
+ ed_t * ed;
__u16 length; // number of tds associated with this request
__u16 td_cnt; // number of tds already serviced
int state;
void * wait;
- ptd_t td[0]; // list pointer to all corresponding TDs associated with this request
+ td_t * td[0]; // list pointer to all corresponding TDs associated with this request
-} urb_priv_t, *purb_priv_t;
+} urb_priv_t;
#define URB_DEL 1
/*
struct ohci_hcca hcca; /* hcca */
int irq;
- struct ohci_regs *regs; /* OHCI controller's memory */
+ struct ohci_regs * regs; /* OHCI controller's memory */
struct list_head ohci_hcd_list; /* list of all ohci_hcd */
- struct ohci *next; // chain of uhci device contexts
+ struct ohci * next; // chain of uhci device contexts
struct list_head urb_list; // list of all pending urbs
spinlock_t urb_list_lock; // lock to keep consistency
int ohci_int_load[32]; /* load of the 32 Interrupt Chains (for load ballancing)*/
- ped_t ed_rm_list[2]; /* lists of all endpoints to be removed */
- ped_t ed_bulktail; /* last endpoint of bulk list */
- ped_t ed_controltail; /* last endpoint of control list */
- ped_t ed_isotail; /* last endpoint of iso list */
+ ed_t * ed_rm_list[2]; /* lists of all endpoints to be removed */
+ ed_t * ed_bulktail; /* last endpoint of bulk list */
+ ed_t * ed_controltail; /* last endpoint of control list */
+ ed_t * ed_isotail; /* last endpoint of iso list */
int intrstatus;
__u32 hc_control; /* copy of the hc control reg */
- struct usb_bus *bus;
+ struct usb_bus * bus;
struct usb_device * dev[128];
struct virt_root_hub rh;
-} ohci_t, * pohci_t;
+} ohci_t;
#define NUM_TDS 0 /* num of preallocated transfer descriptors */
/* hcd */
/* endpoint */
-static int ep_link(pohci_t ohci, ped_t ed);
-static int ep_unlink(pohci_t ohci, ped_t ed);
-static ped_t ep_add_ed(struct usb_device * usb_dev, unsigned int pipe, int interval, int load);
-static void ep_rm_ed(struct usb_device * usb_dev, ped_t ed);
+static int ep_link(ohci_t * ohci, ed_t * ed);
+static int ep_unlink(ohci_t * ohci, ed_t * ed);
+static ed_t * ep_add_ed(struct usb_device * usb_dev, unsigned int pipe, int interval, int load);
+static void ep_rm_ed(struct usb_device * usb_dev, ed_t * ed);
/* td */
-static void td_fill(unsigned int info, void * data, int len, purb_t purb, int type, int index);
-static void td_submit_urb(purb_t purb);
+static void td_fill(unsigned int info, void * data, int len, urb_t * urb, int type, int index);
+static void td_submit_urb(urb_t * urb);
/* root hub */
-static int rh_submit_urb(purb_t purb);
-static int rh_unlink_urb(purb_t purb);
-static int rh_init_int_timer(purb_t purb);
+static int rh_submit_urb(urb_t * urb);
+static int rh_unlink_urb(urb_t * urb);
+static int rh_init_int_timer(urb_t * urb);
#ifdef DEBUG
#define OHCI_FREE(x) kfree(x); printk("OHCI FREE: %d: %4x\n", -- __ohci_free_cnt, (unsigned int) x)
* but it was just unplugged, so the directory is now deleted.
* But programs would just have to be prepared for situations like
* this in any plug-and-play environment.)
+ *
+ * 1999-12-16: Thomas Sailer <sailer@ife.ee.ethz.ch>
+ * Converted the whole proc stuff to real
+ * read methods. Now not the whole device list needs to fit
+ * into one page, only the device list for one bus.
+ * Added a poll method to /proc/bus/usb/devices, to wake
+ * up an eventual usbd
+ *
+ * $Id: proc_usb.c,v 1.14 1999/12/17 10:51:41 fliegl Exp $
*/
-#define __KERNEL__ 1
-
+#define __NO_VERSION__
+#include <linux/module.h>
#include <linux/types.h>
-#include <asm/types.h>
#include <linux/kernel.h>
-/* #include <linux/module.h> */
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/stat.h>
#include <linux/bitops.h>
#include <asm/uaccess.h>
#include <linux/mm.h>
+#include <linux/wait.h>
+#include <linux/poll.h>
#include "usb.h"
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-extern inline struct proc_dir_entry *create_proc_read_entry(const char *name,
- mode_t mode, struct proc_dir_entry *base,
- read_proc_t *read_proc, void * data)
-{
- struct proc_dir_entry *res=create_proc_entry(name,mode,base);
- if (res) {
- res->read_proc=read_proc;
- res->data=data;
- }
- return res;
-}
-#endif
-
-#define DUMP_LIMIT (PAGE_SIZE - 100)
- /* limit to only one memory page of output */
#define MAX_TOPO_LEVEL 6
+/* Define ALLOW_SERIAL_NUMBER if you want to see the serial number of devices */
+#define ALLOW_SERIAL_NUMBER
static char *format_topo =
/* T: Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=ddd MxCh=dd */
"T: Lev=%2.2d Prnt=%2.2d Port=%2.2d Cnt=%2.2d Dev#=%3d Spd=%3s MxCh=%2d\n";
+static char *format_string_manufacturer =
+/* S: Manufacturer=xxxx */
+ "S: Manufacturer=%s\n";
+
+static char *format_string_product =
+/* S: Product=xxxx */
+ "S: Product=%s\n";
+
+#ifdef ALLOW_SERIAL_NUMBER
+static char *format_string_serialnumber =
+/* S: SerialNumber=xxxx */
+ "S: SerialNumber=%s\n";
+#endif
+
static char *format_bandwidth =
/* B: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd */
"B: Alloc=%3d/%3d us (%2d%%), #Int=%3d, #Iso=%3d\n";
"C:%c #Ifs=%2d Cfg#=%2d Atr=%02x MxPwr=%3dmA\n";
static char *format_iface =
-/* I: If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx */
+/* I: If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=xxxx*/
"I: If#=%2d Alt=%2d #EPs=%2d Cls=%02x(%-5s) Sub=%02x Prot=%02x Driver=%s\n";
static char *format_endpt =
static struct proc_dir_entry *usbdir = NULL, *driversdir = NULL;
static struct proc_dir_entry *devicesdir = NULL;
+static DECLARE_WAIT_QUEUE_HEAD(deviceconndiscwq);
+static unsigned int conndiscevcnt = 0;
+
+/* this struct stores the poll state for /proc/bus/usb/devices pollers */
+struct usb_device_status {
+ unsigned int lastev;
+};
+
struct class_info {
int class;
char *class_name;
};
-struct class_info clas_info [] =
+static const struct class_info clas_info[] =
{ /* max. 5 chars. per name string */
{USB_CLASS_PER_INTERFACE, ">ifc"},
{USB_CLASS_AUDIO, "audio"},
/*****************************************************************/
-static char *class_decode (const int class)
+extern inline void conndiscevent(void)
{
- int ix;
+ wake_up(&deviceconndiscwq);
+ conndiscevcnt++;
+}
- for (ix = 0; clas_info [ix].class != -1; ix++)
- if (clas_info [ix].class == class)
- break;
+static const char *class_decode(const int class)
+{
+ int ix;
- return (clas_info [ix].class_name);
+ for (ix = 0; clas_info[ix].class != -1; ix++)
+ if (clas_info[ix].class == class)
+ break;
+ return (clas_info[ix].class_name);
}
-static int usb_dump_endpoint_descriptor (const struct usb_endpoint_descriptor *desc,
- char *buf, int *len)
+
+static char *usb_dump_endpoint_descriptor(char *start, char *end, const struct usb_endpoint_descriptor *desc)
{
char *EndpointType [4] = {"Ctrl", "Isoc", "Bulk", "Int."};
- *len += sprintf (buf + *len, format_endpt,
- desc->bEndpointAddress,
- (desc->bEndpointAddress & USB_DIR_IN) ? 'I' : 'O',
- desc->bmAttributes,
- EndpointType[desc->bmAttributes & 3],
- desc->wMaxPacketSize,
- desc->bInterval
- );
-
- return (*len >= DUMP_LIMIT) ? -1 : 0;
+ if (start > end)
+ return start;
+ start += sprintf(start, format_endpt, desc->bEndpointAddress,
+ (desc->bEndpointAddress & USB_DIR_IN) ? 'I' : 'O',
+ desc->bmAttributes, EndpointType[desc->bmAttributes & 3],
+ desc->wMaxPacketSize, desc->bInterval);
+ return start;
}
-static int usb_dump_endpoint (const struct usb_endpoint_descriptor *endpoint,
- char *buf, int *len)
+static char *usb_dump_endpoint(char *start, char *end, const struct usb_endpoint_descriptor *endpoint)
{
- if (usb_dump_endpoint_descriptor (endpoint, buf, len) < 0)
- return -1;
-
- return 0;
+ return usb_dump_endpoint_descriptor(start, end, endpoint);
}
-static int usb_dump_interface_descriptor (const struct usb_interface *iface,
- int setno, char *buf, int *len)
+static char *usb_dump_interface_descriptor(char *start, char *end, const struct usb_interface *iface, int setno)
{
- struct usb_interface_descriptor *desc =
- &iface->altsetting[setno];
-
- *len += sprintf (buf + *len, format_iface,
- desc->bInterfaceNumber,
- desc->bAlternateSetting,
- desc->bNumEndpoints,
- desc->bInterfaceClass,
- class_decode (desc->bInterfaceClass),
- desc->bInterfaceSubClass,
- desc->bInterfaceProtocol,
- iface->driver ? iface->driver->name : "(none)"
- );
-
- return (*len >= DUMP_LIMIT) ? -1 : 0;
+ struct usb_interface_descriptor *desc = &iface->altsetting[setno];
+
+ if (start > end)
+ return start;
+ start += sprintf(start, format_iface,
+ desc->bInterfaceNumber,
+ desc->bAlternateSetting,
+ desc->bNumEndpoints,
+ desc->bInterfaceClass,
+ class_decode(desc->bInterfaceClass),
+ desc->bInterfaceSubClass,
+ desc->bInterfaceProtocol,
+ iface->driver ? iface->driver->name : "(none)");
+ return start;
}
-static int usb_dump_interface (const struct usb_interface *iface,
- int setno, char *buf, int *len)
+static char *usb_dump_interface(char *start, char *end, const struct usb_interface *iface, int setno)
{
+ struct usb_interface_descriptor *desc = &iface->altsetting[setno];
int i;
- struct usb_interface_descriptor *desc =
- &iface->altsetting[setno];
-
- if (usb_dump_interface_descriptor (iface, setno, buf, len) < 0)
- return -1;
+ start = usb_dump_interface_descriptor(start, end, iface, setno);
for (i = 0; i < desc->bNumEndpoints; i++) {
- if (usb_dump_endpoint (desc->endpoint + i, buf, len) < 0)
- return -1;
+ if (start > end)
+ return start;
+ start = usb_dump_endpoint(start, end, desc->endpoint + i);
}
-
- return 0;
+ return start;
}
/* TBD:
* 2. add <halted> status to each endpoint line
*/
-static int usb_dump_config_descriptor (const struct usb_config_descriptor *desc,
- const int active, char *buf, int *len)
+static char *usb_dump_config_descriptor(char *start, char *end, const struct usb_config_descriptor *desc, const int active)
{
- *len += sprintf (buf + *len, format_config,
- active ? '*' : ' ', /* mark active/actual/current cfg. */
- desc->bNumInterfaces,
- desc->bConfigurationValue,
- desc->bmAttributes,
- desc->MaxPower * 2
- );
-
- return (*len >= DUMP_LIMIT) ? -1 : 0;
+ if (start > end)
+ return start;
+ start += sprintf(start, format_config,
+ active ? '*' : ' ', /* mark active/actual/current cfg. */
+ desc->bNumInterfaces,
+ desc->bConfigurationValue,
+ desc->bmAttributes,
+ desc->MaxPower * 2);
+ return start;
}
-static int usb_dump_config (const struct usb_config_descriptor *config,
- const int active, char *buf, int *len)
+static char *usb_dump_config(char *start, char *end, const struct usb_config_descriptor *config, const int active)
{
int i, j;
struct usb_interface *interface;
- if (!config) { /* getting these some in 2.3.7; none in 2.3.6 */
- *len += sprintf (buf + *len, "(null Cfg. desc.)\n");
- return 0;
- }
-
- if (usb_dump_config_descriptor (config, active, buf, len) < 0)
- return -1;
-
+ if (start > end)
+ return start;
+ if (!config) /* getting these some in 2.3.7; none in 2.3.6 */
+ return start + sprintf(start, "(null Cfg. desc.)\n");
+ start = usb_dump_config_descriptor(start, end, config, active);
for (i = 0; i < config->bNumInterfaces; i++) {
interface = config->interface + i;
if (!interface)
break;
-
- for (j = 0; j < interface->num_altsetting; j++)
- if (usb_dump_interface (interface, j, buf, len) < 0)
- return -1;
+ for (j = 0; j < interface->num_altsetting; j++) {
+ if (start > end)
+ return start;
+ start = usb_dump_interface(start, end, interface, j);
+ }
}
-
- return 0;
+ return start;
}
/*
* Dump the different USB descriptors.
*/
-static int usb_dump_device_descriptor (const struct usb_device_descriptor *desc,
- char *buf, int *len)
+static char *usb_dump_device_descriptor(char *start, char *end, const struct usb_device_descriptor *desc)
{
- *len += sprintf (buf + *len, format_device1,
- desc->bcdUSB >> 8, desc->bcdUSB & 0xff,
- desc->bDeviceClass,
- class_decode (desc->bDeviceClass),
- desc->bDeviceSubClass,
- desc->bDeviceProtocol,
- desc->bMaxPacketSize0,
- desc->bNumConfigurations
- );
- if (*len >= DUMP_LIMIT) return -1;
-
- *len += sprintf (buf + *len, format_device2,
- desc->idVendor, desc->idProduct,
- desc->bcdDevice >> 8, desc->bcdDevice & 0xff
- );
-
- return (*len >= DUMP_LIMIT) ? -1 : 0;
+ if (start > end)
+ return start;
+ start += sprintf (start, format_device1,
+ desc->bcdUSB >> 8, desc->bcdUSB & 0xff,
+ desc->bDeviceClass,
+ class_decode (desc->bDeviceClass),
+ desc->bDeviceSubClass,
+ desc->bDeviceProtocol,
+ desc->bMaxPacketSize0,
+ desc->bNumConfigurations);
+ if (start > end)
+ return start;
+ start += sprintf(start, format_device2,
+ desc->idVendor, desc->idProduct,
+ desc->bcdDevice >> 8, desc->bcdDevice & 0xff);
+ return start;
}
-static int usb_dump_desc (const struct usb_device *dev, char *buf, int *len)
+/*
+ * Dump the different strings that this device holds.
+ */
+static char *usb_dump_device_strings (char *start, char *end, const struct usb_device *dev)
{
- int i;
+ if (start > end)
+ return start;
+
+ if (dev->descriptor.iManufacturer) {
+ char * string = usb_string ((struct usb_device *)dev,
+ dev->descriptor.iManufacturer);
+ if (string) {
+ start += sprintf (start, format_string_manufacturer,
+ string
+ );
+ if (start > end)
+ return start;
+
+ }
+ }
- if (usb_dump_device_descriptor (&dev->descriptor, buf, len) < 0)
- return -1;
+ if (dev->descriptor.iProduct) {
+ char * string = usb_string ((struct usb_device *)dev,
+ dev->descriptor.iProduct);
+ if (string) {
+ start += sprintf (start, format_string_product,
+ string
+ );
+ if (start > end)
+ return start;
- for (i = 0; i < dev->descriptor.bNumConfigurations; i++) {
- if (usb_dump_config (dev->config + i,
- (dev->config + i) == dev->actconfig, /* active ? */
- buf, len) < 0)
- return -1;
+ }
}
- return 0;
+#ifdef ALLOW_SERIAL_NUMBER
+ if (dev->descriptor.iSerialNumber) {
+ char * string = usb_string ((struct usb_device *)dev,
+ dev->descriptor.iSerialNumber);
+ if (string) {
+ start += sprintf (start, format_string_serialnumber,
+ string
+ );
+ }
+ }
+#endif
+
+ return start;
}
-static int usb_hcd_bandwidth (const struct usb_device *dev, char *buf, int *len)
+static char *usb_dump_desc(char *start, char *end, const struct usb_device *dev)
{
- *len += sprintf (buf + *len, format_bandwidth,
- dev->bus->bandwidth_allocated,
- FRAME_TIME_MAX_USECS_ALLOC,
- (100 * dev->bus->bandwidth_allocated + FRAME_TIME_MAX_USECS_ALLOC / 2) /
- FRAME_TIME_MAX_USECS_ALLOC,
- dev->bus->bandwidth_int_reqs,
- dev->bus->bandwidth_isoc_reqs
- );
-
- return (*len >= DUMP_LIMIT) ? -1 : 0;
+ int i;
+
+ if (start > end)
+ return start;
+
+ start = usb_dump_device_descriptor(start, end, &dev->descriptor);
+
+ if (start > end)
+ return start;
+
+ start = usb_dump_device_strings (start, end, dev);
+
+ for (i = 0; i < dev->descriptor.bNumConfigurations; i++) {
+ if (start > end)
+ return start;
+ start = usb_dump_config(start, end, dev->config + i,
+ (dev->config + i) == dev->actconfig); /* active ? */
+ }
+ return start;
}
+
#ifdef PROC_EXTRA /* TBD: may want to add this code later */
-static int usb_dump_hub_descriptor (const struct usb_hub_descriptor * desc,
- char *buf, int *len)
+static char *usb_dump_hub_descriptor(char *start, char *end, const struct usb_hub_descriptor * desc)
{
int leng = USB_DT_HUB_NONVAR_SIZE;
- unsigned char *ptr = (unsigned char *) desc;
-
- *len += sprintf (buf + *len, "Interface:");
+ unsigned char *ptr = (unsigned char *)desc;
+ if (start > end)
+ return start;
+ start += sprintf(start, "Interface:");
while (leng) {
- *len += sprintf (buf + *len, " %02x", *ptr);
+ start += sprintf(start, " %02x", *ptr);
ptr++; leng--;
}
- *len += sprintf (buf + *len, "\n");
-
- return (*len >= DUMP_LIMIT) ? -1 : 0;
+ start += sprintf(start, "\n");
+ return start;
}
-static int usb_dump_string (const struct usb_device *dev, char *id, int index,
- char *buf, int *len)
+static char *usb_dump_string(char *start, char *end, const struct usb_device *dev, char *id, int index)
{
+ if (start > end)
+ return start;
+ start += sprintf(start, "Interface:");
if (index <= dev->maxstring && dev->stringindex && dev->stringindex[index])
- *len += sprintf (buf + *len, "%s: %s ", id, dev->stringindex[index]);
-
- return (*len >= DUMP_LIMIT) ? -1 : 0;
+ start += sprintf(start, "%s: %s ", id, dev->stringindex[index]);
+ return start;
}
#endif /* PROC_EXTRA */
/*****************************************************************/
-static int usb_device_dump (char *buf, int *len,
- const struct usb_device *usbdev,
- int level, int index, int count)
+static char *usb_device_dump(char *start, char *end, const struct usb_device *usbdev,
+ int level, int index, int count)
{
- int chix;
- int cnt = 0;
- int parent_devnum;
-
- if (level > MAX_TOPO_LEVEL) return -1;
-
- parent_devnum = usbdev->parent ? (usbdev->parent->devnum == -1) ? 0
- : usbdev->parent->devnum : 0;
- /*
- * So the root hub's parent is 0 and any device that is
- * plugged into the root hub has a parent of 0.
- */
- *len += sprintf (buf + *len, format_topo,
- level, parent_devnum, index, count,
- usbdev->devnum,
- usbdev->slow ? "1.5" : "12 ",
- usbdev->maxchild
- );
- /*
- * level = topology-tier level;
- * parent_devnum = parent device number;
- * index = parent's connector number;
- * count = device count at this level
- */
-
- if (*len >= DUMP_LIMIT)
- return -1;
-
- if ((level == 0) && (usbdev->devnum < 0)) { /* for root hub */
- if (usb_hcd_bandwidth (usbdev, buf, len) < 0)
- return -1;
- }
- else { /* for anything but a root hub */
- if (usb_dump_desc (usbdev, buf, len) < 0)
- return -1;
- }
+ int chix;
+ int cnt = 0;
+ int parent_devnum = 0;
+ if (level > MAX_TOPO_LEVEL)
+ return start;
+ if (usbdev->parent && usbdev->parent->devnum != -1)
+ parent_devnum = usbdev->parent->devnum;
+ /*
+ * So the root hub's parent is 0 and any device that is
+ * plugged into the root hub has a parent of 0.
+ */
+ start += sprintf(start, format_topo, level, parent_devnum, index, count,
+ usbdev->devnum, usbdev->slow ? "1.5" : "12 ", usbdev->maxchild);
+ /*
+ * level = topology-tier level;
+ * parent_devnum = parent device number;
+ * index = parent's connector number;
+ * count = device count at this level
+ */
+ /* do not dump descriptors for root hub */
+ if (usbdev->devnum >= 0)
+ start = usb_dump_desc(start, end, usbdev);
+ if (start > end)
+ return start + sprintf(start, "(truncated)\n");
/* Now look at all of this device's children. */
for (chix = 0; chix < usbdev->maxchild; chix++) {
- if (usbdev->children [chix]) {
- if (usb_device_dump (buf, len,
- usbdev->children [chix],
- level + 1, chix, ++cnt) < 0)
- return -1;
- }
+ if (start > end)
+ return start;
+ if (usbdev->children[chix])
+ start = usb_device_dump(start, end, usbdev->children[chix], level + 1, chix, ++cnt);
}
-
- return 0;
+ return start;
}
-static int usb_bus_list_dump (char *buf, int len)
+static ssize_t usb_device_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
{
- struct list_head *usb_bus_list = usb_bus_get_list ();
- struct list_head *list = usb_bus_list->next;
-
- len = 0;
-
- /*
- * Go thru each usb_bus. Within each usb_bus: each usb_device.
- * Within each usb_device: all of its device & config. descriptors,
- * marking the currently active ones.
- */
-
-
- while (list != usb_bus_list) {
- struct usb_bus *bus = list_entry (list, struct usb_bus, bus_list);
-
- if (usb_device_dump (buf, &len, bus->root_hub, 0, 0, 0)
- < 0)
- break;
+ struct list_head *usb_bus_list, *buslist;
+ struct usb_bus *bus;
+ char *page, *end;
+ ssize_t ret = 0;
+ unsigned int pos, len;
- list = list->next;
+ if (*ppos < 0)
+ return -EINVAL;
+ if (nbytes <= 0)
+ return 0;
+ if (!access_ok(VERIFY_WRITE, buf, nbytes))
+ return -EFAULT;
+ if (!(page = (char*) __get_free_page(GFP_KERNEL)))
+ return -ENOMEM;
+ pos = *ppos;
+ usb_bus_list = usb_bus_get_list();
+ /* enumerate busses */
+ for (buslist = usb_bus_list->next; buslist != usb_bus_list; buslist = buslist->next) {
+ /* print bandwidth allocation */
+ bus = list_entry(buslist, struct usb_bus, bus_list);
+ len = sprintf(page, format_bandwidth, bus->bandwidth_allocated, FRAME_TIME_MAX_USECS_ALLOC,
+ (100 * bus->bandwidth_allocated + FRAME_TIME_MAX_USECS_ALLOC / 2) / FRAME_TIME_MAX_USECS_ALLOC,
+ bus->bandwidth_int_reqs, bus->bandwidth_isoc_reqs);
+ end = usb_device_dump(page + len, page + (PAGE_SIZE - 100), bus->root_hub, 0, 0, 0);
+ len = end - page;
+ if (len > pos) {
+ len -= pos;
+ if (len > nbytes)
+ len = nbytes;
+ if (copy_to_user(buf, page + pos, len)) {
+ if (!ret)
+ ret = -EFAULT;
+ break;
+ }
+ nbytes -= len;
+ buf += len;
+ ret += len;
+ pos = 0;
+ *ppos += len;
+ } else
+ pos -= len;
+ }
+ free_page((unsigned long)page);
+ return ret;
+}
- if (len >= DUMP_LIMIT) {
- len += sprintf (buf + len, "(truncated)\n");
- break;
- }
- }
+static unsigned int usb_device_poll(struct file *file, struct poll_table_struct *wait)
+{
+ struct usb_device_status *st = (struct usb_device_status *)file->private_data;
+ unsigned int mask = 0;
+
+ if (!st) {
+ st = kmalloc(sizeof(struct usb_device_status), GFP_KERNEL);
+ if (!st)
+ return POLLIN;
+ /*
+ * need to prevent the module from being unloaded, since
+ * proc_unregister does not call the release method and
+ * we would have a memory leak
+ */
+ st->lastev = conndiscevcnt;
+ file->private_data = st;
+ MOD_INC_USE_COUNT;
+ mask = POLLIN;
+ }
+ if (file->f_mode & FMODE_READ)
+ poll_wait(file, &deviceconndiscwq, wait);
+ if (st->lastev != conndiscevcnt)
+ mask |= POLLIN;
+ st->lastev = conndiscevcnt;
+ return mask;
+}
- return (len);
+static int usb_device_open(struct inode *inode, struct file *file)
+{
+ file->private_data = NULL;
+ MOD_INC_USE_COUNT;
+ return 0;
}
-static int usb_bus_list_dump_devices (char *buf, char **start, off_t offset,
- int len, int *eof, void *data)
+static int usb_device_release(struct inode *inode, struct file *file)
{
- return usb_bus_list_dump (buf, len);
+ if (file->private_data) {
+ kfree(file->private_data);
+ file->private_data = NULL;
+ }
+ MOD_DEC_USE_COUNT;
+ return 0;
}
/*
*
* We now walk the list of registered USB drivers.
*/
-static int usb_driver_list_dump (char *buf, char **start, off_t offset,
- int len, int *eof, void *data)
+static ssize_t usb_driver_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
{
- struct list_head *usb_driver_list = usb_driver_get_list ();
+ struct list_head *usb_driver_list = usb_driver_get_list();
struct list_head *tmp = usb_driver_list->next;
- int cnt = 0;
-
- len = 0;
-
- while (tmp != usb_driver_list) {
- struct usb_driver *driver = list_entry (tmp, struct usb_driver,
- driver_list);
- len += sprintf (buf + len, "%s\n", driver->name);
- cnt++;
- tmp = tmp->next;
+ char *page, *start, *end;
+ ssize_t ret = 0;
+ unsigned int pos, len;
- if (len >= DUMP_LIMIT)
- {
- len += sprintf (buf + len, "(truncated)\n");
- return (len);
+ if (*ppos < 0)
+ return -EINVAL;
+ if (nbytes <= 0)
+ return 0;
+ if (!access_ok(VERIFY_WRITE, buf, nbytes))
+ return -EFAULT;
+ if (!(page = (char*) __get_free_page(GFP_KERNEL)))
+ return -ENOMEM;
+ start = page;
+ end = page + (PAGE_SIZE - 100);
+ pos = *ppos;
+ for (; tmp != usb_driver_list; tmp = tmp->next) {
+ struct usb_driver *driver = list_entry(tmp, struct usb_driver, driver_list);
+ start += sprintf (start, "%s\n", driver->name);
+ if (start > end) {
+ start += sprintf(start, "(truncated)\n");
+ break;
}
}
-
- if (!cnt)
- len += sprintf (buf + len, "(none)\n");
- return (len);
+ if (start == page)
+ start += sprintf(start, "(none)\n");
+ len = start - page;
+ if (len > pos) {
+ len -= pos;
+ if (len > nbytes)
+ len = nbytes;
+ ret = len;
+ if (copy_to_user(buf, page + pos, len))
+ ret = -EFAULT;
+ else
+ *ppos += len;
+ }
+ free_page((unsigned long)page);
+ return ret;
}
+static long long usbdev_lseek(struct file * file, long long offset, int orig);
+
+static struct file_operations proc_usb_devlist_file_operations = {
+ usbdev_lseek, /* lseek */
+ usb_device_read, /* read */
+ NULL, /* write */
+ NULL, /* readdir */
+ usb_device_poll, /* poll */
+ NULL, /* ioctl */
+ NULL, /* mmap */
+ usb_device_open, /* open */
+ NULL, /* flush */
+ usb_device_release, /* release */
+ NULL /* fsync */
+};
+
+static struct inode_operations proc_usb_devlist_inode_operations = {
+ &proc_usb_devlist_file_operations, /* file-ops */
+};
+
+static struct file_operations proc_usb_drvlist_file_operations = {
+ usbdev_lseek, /* lseek */
+ usb_driver_read, /* read */
+ NULL, /* write */
+ NULL, /* readdir */
+ NULL, /* poll */
+ NULL, /* ioctl */
+ NULL, /* mmap */
+ NULL, /* no special open code */
+ NULL, /* flush */
+ NULL, /* no special release code */
+ NULL /* can't fsync */
+};
+
+static struct inode_operations proc_usb_drvlist_inode_operations = {
+ &proc_usb_drvlist_file_operations, /* file-ops */
+};
+
+
/*
* proc entry for every device
*/
static ssize_t usbdev_read(struct file * file, char * buf, size_t nbytes, loff_t *ppos)
{
- struct inode *inode = file->f_dentry->d_inode;
+ struct inode *inode = file->f_dentry->d_inode;
struct proc_dir_entry *dp = (struct proc_dir_entry *)inode->u.generic_ip;
struct usb_device *dev = (struct usb_device *)dp->data;
ssize_t ret = 0;
};
static struct inode_operations proc_usb_device_inode_operations = {
- &proc_usb_device_file_operations, /* file-ops */
+ &proc_usb_device_file_operations, /* file-ops */
};
void proc_usb_add_bus(struct usb_bus *bus)
if (!usbdir)
return;
sprintf(buf, "%03d", bus->busnum);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,31)
+ if (!(bus->proc_entry = create_proc_entry(buf, S_IFDIR, usbdir)))
+#else
if (!(bus->proc_entry = proc_mkdir(buf, usbdir)))
+#endif
return;
bus->proc_entry->data = bus;
+ conndiscevent();
}
/* devices need already be removed! */
if (!bus->proc_entry)
return;
remove_proc_entry(bus->proc_entry->name, usbdir);
+ conndiscevent();
}
void proc_usb_add_device(struct usb_device *dev)
return;
dev->proc_entry->ops = &proc_usb_device_inode_operations;
dev->proc_entry->data = dev;
+ conndiscevent();
}
void proc_usb_remove_device(struct usb_device *dev)
{
if (dev->proc_entry)
remove_proc_entry(dev->proc_entry->name, dev->bus->proc_entry);
+ conndiscevent();
}
void proc_usb_cleanup (void)
{
if (driversdir)
- remove_proc_entry ("drivers", usbdir);
+ remove_proc_entry("drivers", usbdir);
if (devicesdir)
- remove_proc_entry ("devices", usbdir);
+ remove_proc_entry("devices", usbdir);
if (usbdir)
- remove_proc_entry ("usb", proc_bus);
+ remove_proc_entry("usb", proc_bus);
}
int proc_usb_init (void)
{
- usbdir = proc_mkdir ("usb", proc_bus);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,31)
+ usbdir = create_proc_entry("usb", S_IFDIR, proc_bus);
+#else
+ usbdir = proc_mkdir("usb", proc_bus);
+#endif
if (!usbdir) {
printk ("proc_usb: cannot create /proc/bus/usb entry\n");
return -1;
}
- driversdir = create_proc_read_entry("drivers", 0, usbdir,
- usb_driver_list_dump, NULL);
+ driversdir = create_proc_entry("drivers", 0, usbdir);
if (!driversdir) {
printk ("proc_usb: cannot create /proc/bus/usb/drivers entry\n");
- proc_usb_cleanup ();
+ proc_usb_cleanup();
return -1;
}
+ driversdir->ops = &proc_usb_drvlist_inode_operations;
- devicesdir = create_proc_read_entry ("devices", 0, usbdir,
- usb_bus_list_dump_devices, NULL);
+ devicesdir = create_proc_entry("devices", 0, usbdir);
if (!devicesdir) {
printk ("proc_usb: cannot create /proc/bus/usb/devices entry\n");
proc_usb_cleanup ();
return -1;
}
+ devicesdir->ops = &proc_usb_devlist_inode_operations;
return 0;
}
/*
* $Id: uhci-debug.c,v 1.12 1999/12/13 15:24:42 fliegl Exp $
*/
-#include <linux/config.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include <asm/io.h>
* Thomas Sailer, sailer@ife.ee.ethz.ch (chief consultant) (cheer leader)
* Roman Weissgaerber, weissg@vienna.at (virt root hub) (studio porter)
*
- * HW-initalization and root hub allocation code based on material of
+ * HW-initalization based on material of
*
* (C) Copyright 1999 Linus Torvalds
* (C) Copyright 1999 Johannes Erdfelt
* (C) Copyright 1999 Randy Dunlap
*
- * $Id: uhci.c,v 1.124 1999/12/14 18:38:25 fliegl Exp $
+ * $Id: uhci.c,v 1.139 1999/12/17 17:50:59 fliegl Exp $
*/
-#define VROOTHUB
#ifndef EXPORT_SYMTAB
#define EXPORT_SYMTAB
#include <linux/errno.h>
#include <linux/unistd.h>
#include <linux/interrupt.h> /* for in_interrupt() */
+#include <linux/init.h>
#include <asm/uaccess.h>
#include <asm/io.h>
//#define DEBUG
#ifdef DEBUG
-#define dbg printk
+#define dbg(format, args...) printk(format, ## args)
#else
-#define dbg nix
-static void nix (const char *format,...)
-{
-}
-
+#define dbg(format, args...)
#endif
#define _static static
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
+#define __init
+#define __exit
+#endif
+
#ifdef __alpha
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
extern long __kernel_thread (unsigned long, int (*)(void *), void *);
static int handle_apm_event (apm_event_t event);
#endif
+/* We added an UHCI_SLAB slab support just for debugging purposes. In real
+ life this compile option is NOT recommended, because slab caches are not
+ suitable for modules.
+*/
+
+// #define _UHCI_SLAB
+#ifdef _UHCI_SLAB
+static kmem_cache_t *uhci_desc_kmem;
+static kmem_cache_t *urb_priv_kmem;
+#endif
+
+static int rh_submit_urb (purb_t purb);
+static int rh_unlink_urb (purb_t purb);
static puhci_t devs = NULL;
/*-------------------------------------------------------------------*/
_static void queue_urb (puhci_t s, struct list_head *p, int do_lock)
{
unsigned long flags=0;
- if (do_lock) spin_lock_irqsave (&s->urb_list_lock, flags);
+
+ if (do_lock)
+ spin_lock_irqsave (&s->urb_list_lock, flags);
+
list_add_tail (p, &s->urb_list);
- if (do_lock) spin_unlock_irqrestore (&s->urb_list_lock, flags);
+
+ if (do_lock)
+ spin_unlock_irqrestore (&s->urb_list_lock, flags);
}
/*-------------------------------------------------------------------*/
_static void dequeue_urb (puhci_t s, struct list_head *p, int do_lock)
{
unsigned long flags=0;
- if (do_lock) spin_lock_irqsave (&s->urb_list_lock, flags);
+
+ if (do_lock)
+ spin_lock_irqsave (&s->urb_list_lock, flags);
+
list_del (p);
- if (do_lock) spin_unlock_irqrestore (&s->urb_list_lock, flags);
+
+ if (do_lock)
+ spin_unlock_irqrestore (&s->urb_list_lock, flags);
}
/*-------------------------------------------------------------------*/
_static int alloc_td (puhci_desc_t * new, int flags)
{
+#ifdef _UHCI_SLAB
+ *new= kmem_cache_alloc(uhci_desc_kmem, in_interrupt ()? SLAB_ATOMIC : SLAB_KERNEL);
+#else
*new = (uhci_desc_t *) kmalloc (sizeof (uhci_desc_t), in_interrupt ()? GFP_ATOMIC : GFP_KERNEL);
+#endif
if (!*new)
return -ENOMEM;
+
memset (*new, 0, sizeof (uhci_desc_t));
(*new)->hw.td.link = UHCI_PTR_TERM | (flags & UHCI_PTR_BITS); // last by default
(*new)->type = TD_TYPE;
INIT_LIST_HEAD (&(*new)->vertical);
INIT_LIST_HEAD (&(*new)->horizontal);
+
return 0;
}
/*-------------------------------------------------------------------*/
// implicitely remove TERM bit of prev
prev->hw.td.link = virt_to_bus (new) | (flags & UHCI_PTR_DEPTH);
}
+
spin_unlock_irqrestore (&s->td_lock, xxx);
+
return 0;
}
/*-------------------------------------------------------------------*/
new->hw.td.link = td->hw.td.link;
list_add (&new->horizontal, &td->horizontal);
td->hw.td.link = virt_to_bus (new);
+
spin_unlock_irqrestore (&s->td_lock, xxx);
+
return 0;
}
/*-------------------------------------------------------------------*/
unsigned long xxx;
spin_lock_irqsave (&s->td_lock, xxx);
+
next = list_entry (element->vertical.next, uhci_desc_t, vertical);
+
if (next == element) {
dir = 1;
next = list_entry (element->horizontal.next, uhci_desc_t, horizontal);
else {
prev = list_entry (element->vertical.prev, uhci_desc_t, vertical);
}
+
if (prev->type == TD_TYPE)
prev->hw.td.link = element->hw.td.link;
else
prev->hw.qh.element = element->hw.td.link;
+
wmb ();
+
if (dir == 0)
list_del (&element->vertical);
else
list_del (&element->horizontal);
+
spin_unlock_irqrestore (&s->td_lock, xxx);
+
return 0;
}
/*-------------------------------------------------------------------*/
-_static int delete_td (puhci_desc_t element)
+_static int delete_desc (puhci_desc_t element)
{
+#ifdef _UHCI_SLAB
+ kmem_cache_free(uhci_desc_kmem, element);
+#else
kfree (element);
+#endif
return 0;
}
/*-------------------------------------------------------------------*/
// Allocates qh element
_static int alloc_qh (puhci_desc_t * new)
{
+#ifdef _UHCI_SLAB
+ *new= kmem_cache_alloc(uhci_desc_kmem, in_interrupt ()? SLAB_ATOMIC : SLAB_KERNEL);
+#else
*new = (uhci_desc_t *) kmalloc (sizeof (uhci_desc_t), in_interrupt ()? GFP_ATOMIC : GFP_KERNEL);
+#endif
if (!*new)
return -ENOMEM;
+
memset (*new, 0, sizeof (uhci_desc_t));
(*new)->hw.qh.head = UHCI_PTR_TERM;
(*new)->hw.qh.element = UHCI_PTR_TERM;
(*new)->type = QH_TYPE;
INIT_LIST_HEAD (&(*new)->horizontal);
INIT_LIST_HEAD (&(*new)->vertical);
+
dbg (KERN_DEBUG MODSTR "Allocated qh @ %p\n", *new);
+
return 0;
}
/*-------------------------------------------------------------------*/
-// inserts new qh _before_ the qh at pos
+// inserts new qh before/after the qh at pos
+// flags: 0: insert before pos, 1: insert after pos (for low speed transfers)
_static int insert_qh (puhci_t s, puhci_desc_t pos, puhci_desc_t new, int flags)
{
- puhci_desc_t prev;
+ puhci_desc_t old;
unsigned long xxx;
spin_lock_irqsave (&s->qh_lock, xxx);
- prev = list_entry (pos->horizontal.prev, uhci_desc_t, horizontal);
- // dbg("pos->horizontal.prev:%p pos->horizontal:%p\n", pos->horizontal.prev, &pos->horizontal);
- // dbg("insert_qh: prev->hw.qh.head:%p prev:%p new:%p pos:%p\n", prev->hw.qh.head, prev, new, pos);
+ if (!flags) {
+ // (OLD) (POS) -> (OLD) (NEW) (POS)
+ old = list_entry (pos->horizontal.prev, uhci_desc_t, horizontal);
+ list_add_tail (&new->horizontal, &pos->horizontal);
+ new->hw.qh.head = MAKE_QH_ADDR (pos) ;
+
+ if (!(old->hw.qh.head & UHCI_PTR_TERM))
+ old->hw.qh.head = MAKE_QH_ADDR (new) ;
+ }
+ else {
+ // (POS) (OLD) -> (POS) (NEW) (OLD)
+ old = list_entry (pos->horizontal.next, uhci_desc_t, horizontal);
+ list_add (&new->horizontal, &pos->horizontal);
+ pos->hw.qh.head = MAKE_QH_ADDR (new) ;
+ new->hw.qh.head = MAKE_QH_ADDR (old);
+ }
- list_add_tail (&new->horizontal, &pos->horizontal);
- new->hw.qh.head = MAKE_QH_ADDR (pos) | (flags & UHCI_PTR_BITS);
- if (!(prev->hw.qh.head & UHCI_PTR_TERM))
- prev->hw.qh.head = MAKE_QH_ADDR (new) | (flags & UHCI_PTR_BITS);
wmb ();
- // dbg("new->hw.qh.head:%p prev->hw.qh.head:%p\n",new->hw.qh.head,prev->hw.qh.head);
+
spin_unlock_irqrestore (&s->qh_lock, xxx);
+
return 0;
}
/*-------------------------------------------------------------------*/
unsigned long xxx;
spin_lock_irqsave (&s->qh_lock, xxx);
+
next = list_entry (element->horizontal.next, uhci_desc_t, horizontal);
prev = list_entry (element->horizontal.prev, uhci_desc_t, horizontal);
prev->hw.qh.head = element->hw.qh.head;
wmb ();
list_del (&element->horizontal);
+
spin_unlock_irqrestore (&s->qh_lock, xxx);
+
return 0;
}
/*-------------------------------------------------------------------*/
struct list_head *p;
list_del (&qh->horizontal);
+
while ((p = qh->vertical.next) != &qh->vertical) {
td = list_entry (p, uhci_desc_t, vertical);
unlink_td (s, td);
- delete_td (td);
+ delete_desc (td);
}
- kfree (qh);
+
+ delete_desc (qh);
+
return 0;
}
/*-------------------------------------------------------------------*/
if (!td)
return;
+
while ((p = td->horizontal.next) != &td->horizontal) {
td1 = list_entry (p, uhci_desc_t, horizontal);
- delete_td (td1);
+ delete_desc (td1);
}
- delete_td (td);
+
+ delete_desc (td);
}
/*-------------------------------------------------------------------*/
// Removes ALL qhs in chain (paranoia!)
puhci_desc_t td;
printk (KERN_DEBUG MODSTR "Cleanup_skel\n");
+
for (n = 0; n < 8; n++) {
td = s->int_chain[n];
clean_td_chain (td);
{
int n, ret;
puhci_desc_t qh, td;
+
dbg (KERN_DEBUG MODSTR "init_skel\n");
+
s->framelist = (__u32 *) get_free_page (GFP_KERNEL);
if (!s->framelist)
dbg (KERN_DEBUG MODSTR "allocating iso desc pointer list\n");
s->iso_td = (puhci_desc_t *) kmalloc (1024 * sizeof (puhci_desc_t), GFP_KERNEL);
+
if (!s->iso_td)
goto init_skel_cleanup;
dbg (KERN_DEBUG MODSTR "allocating qh: chain_end\n");
ret = alloc_qh (&qh);
+
if (ret)
goto init_skel_cleanup;
+
s->chain_end = qh;
dbg (KERN_DEBUG MODSTR "allocating qh: bulk_chain\n");
ret = alloc_qh (&qh);
+
if (ret)
goto init_skel_cleanup;
+
insert_qh (s, s->chain_end, qh, 0);
s->bulk_chain = qh;
dbg (KERN_DEBUG MODSTR "allocating qh: control_chain\n");
ret = alloc_qh (&qh);
+
if (ret)
goto init_skel_cleanup;
+
insert_qh (s, s->bulk_chain, qh, 0);
s->control_chain = qh;
for (n = 0; n < 8; n++)
s->int_chain[n] = 0;
dbg (KERN_DEBUG MODSTR "Allocating skeleton INT-TDs\n");
+
for (n = 0; n < 8; n++) {
puhci_desc_t td;
}
dbg (KERN_DEBUG MODSTR "Linking skeleton INT-TDs\n");
+
for (n = 0; n < 1024; n++) {
// link all iso-tds to the interrupt chains
int m, o;
to OUT (0xE1). Else change it from SETUP to IN (0x69). */
destination ^= (USB_PID_SETUP ^ USB_PID_IN); /* SETUP -> IN */
+
if (usb_pipeout (purb->pipe))
destination ^= (USB_PID_IN ^ USB_PID_OUT); /* IN -> OUT */
len = purb->transfer_buffer_length;
bytesrequested = len;
data = purb->transfer_buffer;
+
while (len > 0) {
int pktsze = len;
/* Build the final TD for control status */
/* It's only IN if the pipe is out AND we aren't expecting data */
destination &= ~0xFF;
+
if (usb_pipeout (purb->pipe) | (bytesrequested == 0))
destination |= USB_PID_IN;
else
destination |= 1 << TD_TOKEN_TOGGLE; /* End in Data1 */
alloc_td (&td, UHCI_PTR_DEPTH);
+
if (!td) {
delete_qh (s, qh);
return -ENOMEM;
list_add (&qh->desc_list, &purb_priv->desc_list);
- /* Start it up... */
- insert_qh (s, s->bulk_chain, qh, 0); // insert before bulk chain
+
+ /* Start it up... put low speed first */
+ if (purb->pipe & TD_CTRL_LS)
+ insert_qh (s, s->control_chain, qh, 1); // insert after control chain
+ else
+ insert_qh (s, s->bulk_chain, qh, 0); // insert before bulk chain
//uhci_show_queue(s->control_chain);
dbg (KERN_DEBUG MODSTR "uhci_submit_control end\n");
len = purb->transfer_buffer_length;
data = purb->transfer_buffer;
dbg (KERN_DEBUG MODSTR "uhci_submit_bulk_urb: len %d\n", len);
+
while (len > 0) {
int pktsze = len;
// unlinks an urb by dequeuing its qh, waits some frames and forgets it
// Problem: unlinking in interrupt requires waiting for one frame (udelay)
// to allow the whole structures to be safely removed
-// Maybe an unlink-queue and a KILLED-completion handler would be much
-// cleaner...
_static int uhci_unlink_urb (purb_t purb)
{
puhci_t s;
puhci_desc_t qh;
puhci_desc_t td;
purb_priv_t purb_priv;
- unsigned long flags;
+ unsigned long flags=0;
struct list_head *p;
if (!purb) // you never know...
return -1;
s = (puhci_t) purb->dev->bus->hcpriv; // get pointer to uhci struct
-#ifdef VROOTHUB
+
if (usb_pipedevice (purb->pipe) == s->rh.devnum)
return rh_unlink_urb (purb);
-#endif
- // is the following really necessary? dequeue_urb has its own spinlock (GA)
- spin_lock_irqsave (&s->unlink_urb_lock, flags); // do not allow interrupts
+ if(!in_interrupt()) {
+ // is the following really necessary? dequeue_urb has its own spinlock (GA)
+ spin_lock_irqsave (&s->unlink_urb_lock, flags); // do not allow interrupts
+ }
+
//dbg("unlink_urb called %p\n",purb);
if (purb->status == USB_ST_URB_PENDING) {
// URB probably still in work
purb_priv = purb->hcpriv;
dequeue_urb (s, &purb->urb_list,1);
- spin_unlock_irqrestore (&s->unlink_urb_lock, flags); // allow interrupts from here
+ if(!in_interrupt()) {
+ spin_unlock_irqrestore (&s->unlink_urb_lock, flags); // allow interrupts from here
+ }
switch (usb_pipetype (purb->pipe)) {
case PIPE_ISOCHRONOUS:
while ((p = purb_priv->desc_list.next) != &purb_priv->desc_list) {
td = list_entry (p, uhci_desc_t, desc_list);
list_del (p);
- delete_td (td);
+ delete_desc (td);
}
break;
}
purb->status = USB_ST_URB_KILLED; // mark urb as killed
+#ifdef _UHCI_SLAB
+ kmem_cache_free(urb_priv_kmem, purb->hcpriv);
+#else
kfree (purb->hcpriv);
+#endif
if (purb->complete) {
dbg (KERN_DEBUG MODSTR "unlink_urb: calling completion\n");
purb->complete ((struct urb *) purb);
}
return 0;
}
- else
- spin_unlock_irqrestore (&s->unlink_urb_lock, flags); // allow interrupts from here
+ else {
+ if(!in_interrupt())
+ spin_unlock_irqrestore (&s->unlink_urb_lock, flags); // allow interrupts from here
+ }
return 0;
}
struct list_head *p = s->urb_list.next;
int ret=-1;
unsigned long flags;
+
spin_lock_irqsave (&s->urb_list_lock, flags);
for (; p != &s->urb_list; p = p->next) {
last_urb = u;
}
}
+
if (last_urb) {
*end = (last_urb->start_frame + last_urb->number_of_packets) & 1023;
ret=0;
}
+
spin_unlock_irqrestore(&s->urb_list_lock, flags);
+
return ret; // no previous urb found
}
if ((unsigned) purb->number_of_packets > 900)
return -EFBIG;
+
limits = find_iso_limits (purb, &start_limit, &stop_limit);
queued_size = (stop_limit - start_limit) & 1023;
purb->start_frame, purb->number_of_packets, start_limit, stop_limit);
return -EAGAIN;
}
+
return 0;
}
/*-------------------------------------------------------------------*/
return -EINVAL;
ret = alloc_td (&td, UHCI_PTR_DEPTH);
+
if (ret)
return -ENOMEM;
goto err;
tdm = (puhci_desc_t *) kmalloc (purb->number_of_packets * sizeof (puhci_desc_t), in_interrupt ()? GFP_ATOMIC : GFP_KERNEL);
+
if (!tdm) {
ret = -ENOMEM;
goto err;
}
+
// First try to get all TDs
for (n = 0; n < purb->number_of_packets; n++) {
dbg (KERN_DEBUG MODSTR "n:%d purb->iso_frame_desc[n].length:%d\n", n, purb->iso_frame_desc[n].length);
//uhci_show_td(td);
}
+
kfree (tdm);
dbg ("ISO-INT# %i, start %i, now %i\n", purb->number_of_packets, purb->start_frame, UHCI_GET_CURRENT_FRAME (s) & 1023);
ret = 0;
unsigned long flags;
struct list_head *p = s->urb_list.next;
purb_t tmp;
+
dbg (KERN_DEBUG MODSTR "search_dev_ep:\n");
spin_lock_irqsave (&s->urb_list_lock, flags);
+
for (; p != &s->urb_list; p = p->next) {
tmp = list_entry (p, urb_t, urb_list);
dbg (KERN_DEBUG MODSTR "urb: %p\n", tmp);
return 1; // found another urb already queued for processing
}
+
spin_unlock_irqrestore (&s->urb_list_lock, flags);
+
return 0;
}
/*-------------------------------------------------------------------*/
s = (puhci_t) purb->dev->bus->hcpriv;
//printk( MODSTR"submit_urb: %p type %d\n",purb,usb_pipetype(purb->pipe));
-#ifdef VROOTHUB
+
if (usb_pipedevice (purb->pipe) == s->rh.devnum)
return rh_submit_urb (purb); /* virtual root hub */
-#endif
+
usb_inc_dev_use (purb->dev);
if (search_dev_ep (s, purb)) {
return -ENXIO; // no such address
}
+
+#ifdef _UHCI_SLAB
+ purb_priv = kmem_cache_alloc(urb_priv_kmem, in_interrupt ()? SLAB_ATOMIC : SLAB_KERNEL);
+#else
purb_priv = kmalloc (sizeof (urb_priv_t), in_interrupt ()? GFP_ATOMIC : GFP_KERNEL);
+#endif
if (!purb_priv) {
usb_dec_dev_use (purb->dev);
return -ENOMEM;
}
+
purb->hcpriv = purb_priv;
INIT_LIST_HEAD (&purb_priv->desc_list);
purb_priv->short_control_packet=0;
dbg (KERN_DEBUG MODSTR "submit_urb: scheduling %p\n", purb);
+
switch (usb_pipetype (purb->pipe)) {
case PIPE_ISOCHRONOUS:
ret = uhci_submit_iso_urb (purb);
default:
ret = -EINVAL;
}
+
dbg (KERN_DEBUG MODSTR "submit_urb: scheduled with ret: %d\n", ret);
+
if (ret != USB_ST_NOERROR) {
usb_dec_dev_use (purb->dev);
+#ifdef _UHCI_SLAB
+ kmem_cache_free(urb_priv_kmem, purb_priv);
+#else
kfree (purb_priv);
+#endif
return ret;
}
+
purb->status = USB_ST_URB_PENDING;
queue_urb (s, &purb->urb_list,1);
dbg (KERN_DEBUG MODSTR "submit_urb: exit\n");
+
return 0;
}
/*-------------------------------------------------------------------
Virtual Root Hub
-------------------------------------------------------------------*/
-#ifdef VROOTHUB
+
_static __u8 root_hub_dev_des[] =
{
0x12, /* __u8 bLength; */
return 0;
}
/*-------------------------------------------------------------------*/
-#endif
#define UHCI_DEBUG
*/
_static int uhci_alloc_dev (struct usb_device *usb_dev)
{
- // hint: inc module usage count
return 0;
}
_static int uhci_free_dev (struct usb_device *usb_dev)
{
- // hint: dec module usage count
return 0;
}
struct list_head *qhl = purb_priv->desc_list.next;
puhci_desc_t qh = list_entry (qhl, uhci_desc_t, desc_list);
struct list_head *p = qh->vertical.next;
- puhci_desc_t desc;
- puhci_desc_t last_desc = list_entry (purb_priv->desc_list.prev, uhci_desc_t, desc_list);
+ puhci_desc_t desc= list_entry (purb_priv->desc_list.prev, uhci_desc_t, desc_list);
+ puhci_desc_t last_desc = list_entry (desc->vertical.prev, uhci_desc_t, vertical);
int data_toggle = usb_gettoggle (purb->dev, usb_pipeendpoint (purb->pipe), usb_pipeout (purb->pipe)); // save initial data_toggle
- int skip_active = 0;
+
// extracted and remapped info from TD
int maxlength;
dbg (KERN_DEBUG MODSTR "process_transfer: urb contains bulk/control request\n");
- /* if the urb is a control-transfer, data has been recieved and the
+ /* if the status phase has been retriggered and the
queue is empty or the last status-TD is inactive, the retriggered
status stage is completed
*/
#if 1
if (purb_priv->short_control_packet &&
- ((qh->hw.qh.element == UHCI_PTR_TERM)||(!(last_desc->hw.td.status & TD_CTRL_ACTIVE))))
+ ((qh->hw.qh.element == UHCI_PTR_TERM) ||(!(last_desc->hw.td.status & TD_CTRL_ACTIVE))))
goto transfer_finished;
#endif
purb->actual_length=0;
+
for (; p != &qh->vertical; p = p->next) {
desc = list_entry (p, uhci_desc_t, vertical);
- if ((desc->hw.td.status & TD_CTRL_ACTIVE) && (skip_active == 0)) // do not process active TDs
+ if (desc->hw.td.status & TD_CTRL_ACTIVE) // do not process active TDs
return ret;
-#if 1
- if (skip_active) {
- if ((desc->hw.td.info & 0xff) == USB_PID_OUT) {
- uhci_show_td (desc);
- qh->hw.qh.element = virt_to_bus (desc); // trigger status stage
- //printk("retrigger\n");
- purb_priv->short_control_packet=1;
- return 0;
- }
- continue;
- }
-#endif
+
// extract transfer parameters from TD
actual_length = (desc->hw.td.status + 1) & 0x7ff;
maxlength = (((desc->hw.td.info >> 21) & 0x7ff) + 1) & 0x7ff;
// set up stalled condition
usb_endpoint_halt (purb->dev, usb_pipeendpoint (purb->pipe), usb_pipeout (purb->pipe));
}
+
// if any error occured stop processing of further TDs
if (status != USB_ST_NOERROR) {
// only set ret if status returned an error
purb->actual_length += actual_length;
#if 0
- //if (i++==0)
- if (skip_active)
- uhci_show_td (desc); // show first TD of each transfer
+ if (i++==0)
+ uhci_show_td (desc); // show first TD of each transfer
#endif
// go into error condition to keep data_toggle unchanged if short packet occurs
//printk(KERN_DEBUG MODSTR"process_transfer: len:%d status:%x mapped:%x toggle:%d\n", actual_length, desc->hw.td.status,status, data_toggle);
#if 1
if ((usb_pipetype (purb->pipe) == PIPE_CONTROL) && (actual_length < maxlength)) {
- skip_active = 1;
- //printk("skip_active...\n");
+ if (uhci_packetid(last_desc->hw.td.info) == USB_PID_OUT) {
+ uhci_show_td (last_desc);
+ qh->hw.qh.element = virt_to_bus (last_desc); // re-trigger status stage
+ printk("uhci: short packet during control transfer, retrigger status stage\n");
+ purb_priv->short_control_packet=1;
+ return 0;
+ }
}
#endif
}
usb_settoggle (purb->dev, usb_pipeendpoint (purb->pipe), usb_pipeout (purb->pipe), !data_toggle);
- transfer_finished:
+ transfer_finished:
+
+ /* APC BackUPS Pro kludge */
+ /* It tries to send all of the descriptor instead of */
+ /* the amount we requested */
+ if (desc->hw.td.status & TD_CTRL_IOC &&
+ status & TD_CTRL_ACTIVE &&
+ status & TD_CTRL_NAK )
+ {
+ ret=0;
+ purb->status=0;
+ }
unlink_qh (s, qh);
delete_qh (s, qh);
purb->status = status;
+
+
dbg(KERN_DEBUG MODSTR"process_transfer: urb %p, wanted len %d, len %d status %x err %d\n",
purb,purb->transfer_buffer_length,purb->actual_length, purb->status, purb->error_count);
//dbg(KERN_DEBUG MODSTR"process_transfer: exit\n");
//printk(KERN_DEBUG MODSTR"urb contains interrupt request\n");
for (i = 0; p != &purb_priv->desc_list; p = p->next, i++) // Maybe we allow more than one TD later ;-)
-
{
desc = list_entry (p, uhci_desc_t, desc_list);
// set up stalled condition
usb_endpoint_halt (purb->dev, usb_pipeendpoint (purb->pipe), usb_pipeout (purb->pipe));
}
+
// if any error occured: ignore this td, and continue
if (status != USB_ST_NOERROR) {
purb->error_count++;
for (i = 0; p != &purb_priv->desc_list; p = p->next, i++) {
desc = list_entry (p, uhci_desc_t, desc_list);
+
//uhci_show_td(desc);
if (desc->hw.td.status & TD_CTRL_ACTIVE) {
// means we have completed the last TD, but not the TDs before
unlink_td (s, desc);
goto err;
}
+
unlink_td (s, desc);
+
if (purb->number_of_packets <= i) {
dbg (KERN_DEBUG MODSTR "purb->number_of_packets (%d)<=(%d)\n", purb->number_of_packets, i);
ret = USB_ST_URB_INVALID_ERROR;
purb->actual_length += purb->iso_frame_desc[i].actual_length;
err:
+
if (purb->iso_frame_desc[i].status != USB_ST_NOERROR) {
purb->error_count++;
purb->status = purb->iso_frame_desc[i].status;
dbg (KERN_DEBUG MODSTR "process_iso: len:%d status:%x\n",
purb->iso_frame_desc[i].length, purb->iso_frame_desc[i].status);
- delete_td (desc);
+ delete_desc (desc);
list_del (p);
}
dbg ( /*KERN_DEBUG */ MODSTR "process_iso: exit %i (%d)\n", i, ret);
_static int process_urb (puhci_t s, struct list_head *p)
{
int ret = USB_ST_NOERROR;
- unsigned long flags;
purb_t purb = list_entry (p, urb_t, urb_list);
- spin_lock_irqsave (&s->urb_list_lock, flags);
+ spin_lock(&s->urb_list_lock);
dbg ( /*KERN_DEBUG */ MODSTR "found queued urb: %p\n", purb);
switch (usb_pipetype (purb->pipe)) {
ret = process_interrupt (s, purb);
break;
}
- spin_unlock_irqrestore(&s->urb_list_lock, flags);
+
+ spin_unlock(&s->urb_list_lock);
if (purb->status != USB_ST_URB_PENDING) {
int proceed = 0;
dbg ( /*KERN_DEBUG */ MODSTR "dequeued urb: %p\n", purb);
dequeue_urb (s, p, 1);
+
+#ifdef _UHCI_SLAB
+ kmem_cache_free(urb_priv_kmem, purb->hcpriv);
+#else
kfree (purb->hcpriv);
+#endif
if ((usb_pipetype (purb->pipe) != PIPE_INTERRUPT)) {
purb_t tmp = purb->next; // pointer to first urb
-
int is_ring = 0;
+
if (purb->next) {
do {
if (tmp->status != USB_ST_URB_PENDING) {
}
while (tmp != NULL && tmp != purb->next); // submit until we reach NULL or our own pointer or submit fails
-
if (purb->complete && !(purb->transfer_flags & USB_URB_EARLY_COMPLETE)) {
dbg ( /*KERN_DEBUG */ MODSTR "process_transfer: calling completion\n");
purb->complete ((struct urb *) purb);
*/
dbg ("interrupt\n");
status = inw (io_addr + USBSTS);
+
if (!status) /* shared interrupt, not mine */
return;
if (status != 1) {
printk (KERN_DEBUG MODSTR "interrupt, status %x\n", status);
- uhci_show_status (s);
+ //uhci_show_status (s);
}
//beep(1000);
/*
* we need to advance the list before
* - Thomas Sailer
*/
+
+ spin_lock(&s->unlink_urb_lock);
spin_lock (&s->urb_list_lock);
p = s->urb_list.prev;
spin_unlock (&s->urb_list_lock);
p = p->prev;
process_urb (s, p2);
}
+
+ spin_unlock(&s->unlink_urb_lock);
+
outw (status, io_addr + USBSTS);
#ifdef __alpha
mb (); // ?
* implies.
*/
outw (USBCMD_HCRESET, io_addr + USBCMD);
+
while (inw (io_addr + USBCMD) & USBCMD_HCRESET) {
if (!--timeout) {
printk (KERN_ERR MODSTR "USBCMD_HCRESET timed out!\n");
s->apm_state = 1;
}
-#ifdef VROOTHUB
-_static int uhci_start_usb (puhci_t s)
+_static void __exit uhci_cleanup_dev(puhci_t s)
+{
+ struct usb_device *root_hub = s->bus->root_hub;
+ if (root_hub)
+ usb_disconnect (&root_hub);
+
+ usb_deregister_bus (s->bus);
+
+ reset_hc (s);
+ release_region (s->io_addr, s->io_size);
+ free_irq (s->irq, s);
+ usb_free_bus (s->bus);
+ cleanup_skel (s);
+ kfree (s);
+
+}
+
+_static int __init uhci_start_usb (puhci_t s)
{ /* start it up */
/* connect the virtual root hub */
struct usb_device *usb_dev;
usb_free_dev (usb_dev);
return -1;
}
+
return 0;
}
-#endif
-
-_static puhci_t alloc_uhci (unsigned int io_addr, unsigned int io_size)
+_static int __init alloc_uhci (int irq, unsigned int io_addr, unsigned int io_size)
{
puhci_t s;
struct usb_bus *bus;
-#ifndef VROOTHUB
- struct usb_device *usb;
-#endif
+
s = kmalloc (sizeof (uhci_t), GFP_KERNEL);
if (!s)
- return NULL;
+ return -1;
memset (s, 0, sizeof (uhci_t));
INIT_LIST_HEAD (&s->urb_list);
s->irq = -1;
s->io_addr = io_addr;
s->io_size = io_size;
- s->next = devs; //chain new uhci device into global list
-
- devs = s;
+ s->next = devs; //chain new uhci device into global list
bus = usb_alloc_bus (&uhci_device_operations);
- if (!bus)
- goto err_bus;
+ if (!bus) {
+ kfree (s);
+ return -1;
+ }
s->bus = bus;
bus->hcpriv = s;
-#if 1
-#ifndef VROOTHUB
- /*
- * Allocate the root_hub
- */
- usb = usb_alloc_dev (NULL, bus);
- if (!usb)
- goto err_dev;
-
- s->bus->root_hub = usb;
-#endif
- /* Initialize the root hub */
/* UHCI specs says devices must have 2 ports, but goes on to say */
/* they may have more but give no way to determine how many they */
/* have, so default to 2 */
/* According to the UHCI spec, Bit 7 is always set to 1. So we try */
/* to use this to our advantage */
+
for (s->maxports = 0; s->maxports < (io_size - 0x10) / 2; s->maxports++) {
unsigned int portstatus;
dbg (KERN_DEBUG "Port count misdetected, forcing to 2 ports\n");
s->maxports = 2;
}
-#ifndef VROOTHUB
- usb->maxchild = s->maxports;
- usb_init_root_hub (usb);
-#endif
-#endif
-#ifdef VROOTHUB
- s->rh.numports = s->maxports;
-#endif
- return s;
-
-/*
- * error exits:
- */
-#ifndef VROOTHUB
- err_dev:
-#endif
- usb_free_bus (bus);
- err_bus:
- kfree (s);
- return NULL;
-}
-
-#ifndef VROOTHUB
-/*
- * This is just incredibly fragile. The timings must be just
- * right, and they aren't really documented very well.
- *
- * Note the short delay between disabling reset and enabling
- * the port..
- */
-_static void uhci_reset_port (unsigned int port)
-{
- unsigned short status;
- status = inw (port);
- outw (status | USBPORTSC_PR, port); /* reset port */
- wait_ms (10);
- outw (status & ~USBPORTSC_PR, port);
- udelay (5);
-
- status = inw (port);
- outw (status | USBPORTSC_PE, port); /* enable port */
- wait_ms (10);
-
- status = inw (port);
- if (!(status & USBPORTSC_PE)) {
- outw (status | USBPORTSC_PE, port); /* one more try at enabling port */
- wait_ms (50);
- }
-}
-
-/*
- * Check port status - Connect Status Change - for
- * each of the attached ports (defaults to two ports,
- * but at least in theory there can be more of them).
- */
-_static int uhci_root_hub_events (puhci_t s)
-{
- int io_addr = s->io_addr;
- int ports = s->maxports;
-
- io_addr += USBPORTSC1;
- do {
- if (inw (io_addr) & USBPORTSC_CSC)
- return 1;
- io_addr += 2;
- }
- while (--ports > 0);
- return 0;
-}
-/*
- * This gets called if the connect status on the root
- * hub (and the root hub only) changes.
- */
-_static void uhci_connect_change (puhci_t s, unsigned int port, unsigned int nr)
-{
- struct usb_device *usb_dev;
- unsigned short status;
- struct usb_device *root_hub = s->bus->root_hub;
-#if 1 // UHCI_DEBUG
- printk (KERN_INFO MODSTR "uhci_connect_change: called for %d\n", nr);
-#endif
-
- /*
- * Even if the status says we're connected,
- * the fact that the status bits changed may
- * that we got disconnected and then reconnected.
- *
- * So start off by getting rid of any old devices..
- */
- // dbg("before disconnect\n");
- usb_disconnect (&root_hub->children[nr]);
- status = inw (port);
- //dbg("after disconnect\n");
- /* If we have nothing connected, then clear change status and disable the port */
- status = (status & ~USBPORTSC_PE) | USBPORTSC_PEC;
- if (!(status & USBPORTSC_CCS)) {
- outw (status, port);
- return;
- }
-
- /*
- * Ok, we got a new connection. Allocate a device to it,
- * and find out what it wants to do..
- */
- usb_dev = usb_alloc_dev (root_hub, root_hub->bus);
-
- if (!usb_dev)
- return;
-
- usb_connect (usb_dev);
-
- root_hub->children[nr] = usb_dev;
- wait_ms (200); /* wait for powerup */
- uhci_reset_port (port);
-
- /* Get speed information */
- usb_dev->slow = (inw (port) & USBPORTSC_LSDA) ? 1 : 0;
-
- /*
- * Ok, all the stuff specific to the root hub has been done.
- * The rest is generic for any new USB attach, regardless of
- * hub type.
- */
- if (usb_new_device (usb_dev)) {
- unsigned short status = inw (port);
- dbg (KERN_INFO MODSTR "disabling malfunctioning port %d\n", nr + 1);
- outw (status | USBPORTSC_PE, port);
- }
-
-}
-
-/*
- * This gets called when the root hub configuration
- * has changed. Just go through each port, seeing if
- * there is something interesting happening.
- */
-_static void uhci_check_configuration (puhci_t s)
-{
- unsigned int io_addr = s->io_addr + USBPORTSC1;
- int nr = 0;
-
- do {
- unsigned short status = inw (io_addr);
-
- if (status & USBPORTSC_CSC)
- uhci_connect_change (s, io_addr, nr);
- dbg ("after connchange\n");
- nr++;
- io_addr += 2;
- }
- while (nr < s->maxports);
- //dbg("after check conf\n");
-}
-
-_static int uhci_control_thread (void *__uhci)
-{
- puhci_t s = (puhci_t) __uhci;
-
- s->control_running = 1;
-
- lock_kernel ();
-
- exit_mm (current);
- exit_files (current);
-
- strcpy (current->comm, "uhci-control");
- unlock_kernel ();
- /*
- * Ok, all systems are go..
- */
- do {
- if (s->apm_state) {
- if (uhci_root_hub_events (s))
- uhci_check_configuration (s);
- }
+ s->rh.numports = s->maxports;
- current->state = TASK_INTERRUPTIBLE;
- schedule_timeout (HZ);
-
- if (signal_pending (current)) {
- siginfo_t info;
- int signr;
- /* sending SIGUSR1 makes us print out some info */
- spin_lock_irq (¤t->sigmask_lock);
- signr = dequeue_signal (¤t->blocked, &info);
- spin_unlock_irq (¤t->sigmask_lock);
- dbg (KERN_DEBUG MODSTR "signal %d\n", signr);
- if (signr == SIGUSR1) {
- dbg (KERN_DEBUG "UHCI queue dump:\n");
- uhci_show_queue (s->control_chain);
- }
- else if (signr == SIGUSR2) {
- purb_t purb;
- struct list_head *p = s->urb_list.next;
- for (; p != &s->urb_list; p = p->next) {
- purb = list_entry (p, urb_t, urb_list);
- printk (KERN_DEBUG MODSTR "found queued urb:%p type:%d\n", purb, usb_pipetype (purb->pipe));
- }
- }
- }
+ if (init_skel (s)) {
+ usb_free_bus (bus);
+ kfree(s);
+ return -1;
}
- while (s->control_continue);
- s->control_running = 0;
- return 0;
-}
-#endif
-
-/*
- * If we've successfully found a UHCI, now is the time to increment the
- * module usage count, start the control thread, and return success..
- */
-_static int found_uhci (int irq, unsigned int io_addr, unsigned int io_size)
-{
- puhci_t s;
- s = alloc_uhci (io_addr, io_size);
- if (!s)
- return -ENOMEM;
-
- if (init_skel (s))
- return -ENOMEM;
-
- request_region (s->io_addr, io_size, "usb-uhci");
+ request_region (s->io_addr, io_size, MODNAME);
reset_hc (s);
usb_register_bus (s->bus);
start_hc (s);
- s->control_continue = 1;
- if (!request_irq (irq, uhci_interrupt, SA_SHIRQ, "uhci", s)) {
+ if (request_irq (irq, uhci_interrupt, SA_SHIRQ, MODNAME, s)) {
+ usb_free_bus (bus);
+ reset_hc (s);
+ release_region (s->io_addr, s->io_size);
+ cleanup_skel(s);
+ kfree(s);
+ return -1;
+ }
- s->irq = irq;
-#ifdef VROOTHUB
- return uhci_start_usb (s);
-#endif
-#ifndef VROOTHUB
- uhci_check_configuration (s);
-// #if 1
- s->control_pid = kernel_thread (uhci_control_thread, s, 0); //CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
+ s->irq = irq;
- if (s->control_pid >= 0)
- return 0;
-#endif
+ if(uhci_start_usb (s) < 0) {
+ uhci_cleanup_dev(s);
+ return -1;
}
- reset_hc (s);
- release_region (s->io_addr, s->io_size);
- free_irq (irq, s);
- return -1;
+
+ //chain new uhci device into global list
+ devs = s;
+
+ return 0;
}
-_static int start_uhci (struct pci_dev *dev)
+_static int __init start_uhci (struct pci_dev *dev)
{
int i;
/* disable legacy emulation */
pci_write_config_word (dev, USBLEGSUP, USBLEGSUP_DEFAULT);
- return found_uhci (dev->irq, io_addr, io_size);
+ return alloc_uhci(dev->irq, io_addr, io_size);
}
return -1;
}
}
#endif
-int uhci_init (void)
+int __init uhci_init (void)
{
int retval = -ENODEV;
struct pci_dev *dev = NULL;
u8 type;
+ int i=0;
+
+#ifdef _UHCI_SLAB
+ char *slabname=kmalloc(16, GFP_KERNEL);
+
+ if(!slabname)
+ return -ENOMEM;
+
+ strcpy(slabname, "uhci_desc");
+ uhci_desc_kmem = kmem_cache_create(slabname, sizeof(uhci_desc_t), 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
+
+ if(!uhci_desc_kmem) {
+ printk(KERN_ERR MODSTR"kmem_cache_create for uhci_desc failed (out of memory)\n");
+ return -ENOMEM;
+ }
+
+ slabname=kmalloc(16, GFP_KERNEL);
+
+ if(!slabname)
+ return -ENOMEM;
+ strcpy(slabname, "urb_priv");
+ urb_priv_kmem = kmem_cache_create(slabname, sizeof(urb_priv_t), 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
+
+ if(!urb_priv_kmem) {
+ printk(KERN_ERR MODSTR"kmem_cache_create for urb_priv_t failed (out of memory)\n");
+ return -ENOMEM;
+ }
+#endif
printk (KERN_INFO MODSTR VERSTR "\n");
+
for (;;) {
dev = pci_find_class (PCI_CLASS_SERIAL_USB << 8, dev);
if (!dev)
/* Ok set it up */
retval = start_uhci (dev);
- if (retval)
- break;
+ if (!retval)
+ i++;
}
+
#ifdef CONFIG_APM
- apm_register_callback (&handle_apm_event);
+ if(i)
+ apm_register_callback (&handle_apm_event);
#endif
return retval;
}
-void uhci_cleanup (void)
+void __exit uhci_cleanup (void)
{
-#ifndef VROOTHUB
- int ret, i;
-#endif
puhci_t s;
-
while ((s = devs)) {
- struct usb_device *root_hub = s->bus->root_hub;
devs = devs->next;
-#ifndef VROOTHUB
- s->control_continue = 0;
- /* Check if the process is still running */
- ret = kill_proc (s->control_pid, 0, 1);
- if (!ret) {
- /* Try a maximum of 10 seconds */
- int count = 10 * 100;
-
- while (s->control_running && --count) {
- current->state = TASK_INTERRUPTIBLE;
- schedule_timeout (1);
- }
-
- if (!count)
- printk (KERN_ERR MODSTR "giving up on killing uhci-control\n");
- }
-
- if (root_hub)
- for (i = 0; i < root_hub->maxchild; i++)
- usb_disconnect (root_hub->children + i);
-#endif
-#ifdef VROOTHUB
- if (root_hub)
- usb_disconnect (&root_hub);
-#endif
- usb_deregister_bus (s->bus);
-
- reset_hc (s);
- release_region (s->io_addr, s->io_size);
- free_irq (s->irq, s);
- usb_free_bus (s->bus);
- cleanup_skel (s);
- kfree (s);
+ uhci_cleanup_dev(s);
}
+#ifdef _UHCI_SLAB
+ kmem_cache_shrink(uhci_desc_kmem);
+ kmem_cache_shrink(urb_priv_kmem);
+#endif
}
#ifdef MODULE
#define __LINUX_UHCI_H
/*
- $Id: uhci.h,v 1.28 1999/12/14 18:38:26 fliegl Exp $
+ $Id: uhci.h,v 1.30 1999/12/15 17:57:25 fliegl Exp $
*/
-
-#define MODSTR "uhci: "
+#define MODNAME "usb-uhci"
+#define MODSTR MODNAME": "
#define VERSTR "version v0.9 time " __TIME__ " " __DATE__
/* Command register */
int short_control_packet;
} urb_priv_t, *purb_priv_t;
-#ifdef VROOTHUB
struct virt_root_hub {
int devnum; /* Address of Root Hub endpoint */
void *urb;
struct timer_list rh_int_timer;
};
-#endif
-
typedef struct uhci {
int irq;
unsigned int io_addr;
unsigned int io_size;
unsigned int maxports;
- int control_pid;
- int control_running;
- int control_continue;
int apm_state;
struct uhci *next; // chain of uhci device contexts
uhci_desc_t *chain_end;
spinlock_t qh_lock;
spinlock_t td_lock;
-#ifdef VROOTHUB
struct virt_root_hub rh; //private data of the virtual root hub
-#endif
} uhci_t, *puhci_t;
/* ------------------------------------------------------------------------------------
Virtual Root HUB
------------------------------------------------------------------------------------ */
-#ifdef VROOTHUB
/* destination of request */
#define RH_INTERFACE 0x01
#define RH_ENDPOINT 0x02
#define RH_NACK 0x00
#define min(a,b) (((a)<(b))?(a):(b))
-static int rh_submit_urb (purb_t purb);
-static int rh_unlink_urb (purb_t purb);
-#endif /* VROOTHUB */
#endif
*
* See README.serial for more information on using this driver.
*
+ * version 0.2.2 (12/16/99) gkh
+ * Changed major number to the new allocated number. We're legal now!
+ *
+ * version 0.2.1 (12/14/99) gkh
+ * Fixed bug that happens when device node is opened when there isn't a
+ * device attached to it. Thanks to marek@webdesign.no for noticing this.
+ *
* version 0.2.0 (11/10/99) gkh
* Split up internals to make it easier to add different types of serial
* converters to the code.
#define PERACOM_SERIAL_CONVERTER 0x0001
-#define SERIAL_MAJOR 240
+#define SERIAL_MAJOR 188 /* Nice legal number now */
#define NUM_PORTS 4 /* Have to pick a number for now. Need to look */
/* into dynamically creating them at insertion time. */
/* Need to do device specific setup here (control lines, baud rate, etc.) */
/* FIXME!!! */
-
+
return (0);
}
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 etek_write_room (struct tty_struct *tty)
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 (0);
}
}
return;
-}
+}
static int generic_write_room (struct tty_struct *tty)
* Think of this as a "USB library" rather than anything else.
* It should be considered a slave, with no callbacks. Callbacks
* are evil.
+ *
+ * $Id: usb.c,v 1.37 1999/12/17 10:48:08 fliegl Exp $
*/
#ifndef EXPORT_SYMTAB
while (tmp != &usb_bus_list) {
struct usb_bus *bus = list_entry(tmp,struct usb_bus, bus_list);
- tmp = tmp->next;
+ tmp = tmp->next;
usb_check_support(bus->root_hub);
}
return 0;
if (dev->children[i])
usb_drivers_purge(driver, dev->children[i]);
- if (!dev->actconfig)
- return;
-
- for (i = 0; i < dev->actconfig->bNumInterfaces; i++) {
- struct usb_interface *interface = &dev->actconfig->interface[i];
+ if (!dev->actconfig)
+ return;
+
+ for (i = 0; i < dev->actconfig->bNumInterfaces; i++) {
+ struct usb_interface *interface = &dev->actconfig->interface[i];
- if (interface->driver == driver) {
- driver->disconnect(dev, interface->private_data);
+ if (interface->driver == driver) {
+ driver->disconnect(dev, interface->private_data);
usb_driver_release_interface(driver, interface);
- /*
- * This will go through the list looking for another
- * driver that can handle the device
- */
- usb_find_interface_driver(dev, i);
- }
+ /*
+ * This will go through the list looking for another
+ * driver that can handle the device
+ */
+ usb_find_interface_driver(dev, i);
+ }
}
}
if (low_speed) /* no isoc. here */
{
if (input_dir)
- {
- tmp = (67667L * (31L + 10L * BitTime (bytecount))) / 1000L;
+ {
+ tmp = (67667L * (31L + 10L * BitTime (bytecount))) / 1000L;
return (64060L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp);
}
else
- {
+ {
tmp = (66700L * (31L + 10L * BitTime (bytecount))) / 1000L;
return (64107L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp);
}
if (dev->children[i])
usb_check_support(dev->children[i]);
- if (!dev->actconfig)
- return;
+ if (!dev->actconfig)
+ return;
/* now we check this device */
- if (dev->devnum > 0)
- for (i = 0; i < dev->actconfig->bNumInterfaces; i++)
- usb_find_interface_driver(dev, i);
+ if (dev->devnum > 0)
+ for (i = 0; i < dev->actconfig->bNumInterfaces; i++)
+ usb_find_interface_driver(dev, i);
}
static int usb_find_interface_driver(struct usb_device *dev, unsigned ifnum)
{
struct list_head *tmp = usb_driver_list.next;
- struct usb_interface *interface;
+ struct usb_interface *interface;
if ((!dev) || (ifnum >= dev->actconfig->bNumInterfaces)) {
printk(KERN_ERR "usb-core: bad find_interface_driver params\n");
interface = dev->actconfig->interface + ifnum;
- if (usb_interface_claimed(interface))
- return -1;
+ if (usb_interface_claimed(interface))
+ return -1;
- while (tmp != &usb_driver_list) {
+ while (tmp != &usb_driver_list) {
void *private;
- struct usb_driver *driver = list_entry(tmp, struct usb_driver,
- driver_list);
-
- tmp = tmp->next;
- if (!(private = driver->probe(dev, ifnum)))
- continue;
+ struct usb_driver *driver = list_entry(tmp, struct usb_driver,
+ driver_list);
+
+ tmp = tmp->next;
+ if (!(private = driver->probe(dev, ifnum)))
+ continue;
usb_driver_claim_interface(driver, interface, private);
- return 0;
- }
-
+ return 0;
+ }
+
return -1;
}
static void usb_find_drivers(struct usb_device *dev)
{
unsigned ifnum;
- unsigned rejected = 0;
+ unsigned rejected = 0;
for (ifnum = 0; ifnum < dev->actconfig->bNumInterfaces; ifnum++) {
/* if this interface hasn't already been claimed */
if (!urb) // none found? there is nothing to remove!
return -ENODEV;
- if (urb->status!= -EINPROGRESS)
- usb_unlink_urb(urb);
+ usb_unlink_urb(urb);
kfree(urb->context);
kfree(urb);
return USB_ST_NOERROR;
unsigned int maxsze = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
*handle = NULL;
- printk("irq: dev:%p pipe:%08X handler:%p period:%d dev_id:%p max:%d\n", dev, pipe, handler, period, dev_id, maxsze);
+
+ //printk("irq: dev:%p pipe:%08X handler:%p period:%d dev_id:%p max:%d\n", dev, pipe, handler, period, dev_id, maxsze);
+
/* Check host controller's bandwidth for this int. request. */
bustime = calc_bus_time (usb_pipeslow(pipe), usb_pipein(pipe), 0,
usb_maxpacket(dev, pipe, usb_pipeout(pipe)));
else
memcpy(endpoint, buffer, USB_DT_ENDPOINT_SIZE);
- le16_to_cpus(&endpoint->wMaxPacketSize);
+ le16_to_cpus(&endpoint->wMaxPacketSize);
buffer += header->bLength;
size -= header->bLength;
}
endpoint->extra = kmalloc(len, GFP_KERNEL);
+
if (!endpoint->extra) {
printk(KERN_ERR "Couldn't allocate memory for endpoint extra descriptors\n");
endpoint->extralen = 0;
interface->max_altsetting = USB_ALTSETTINGALLOC;
interface->altsetting = kmalloc(sizeof(struct usb_interface_descriptor) * interface->max_altsetting, GFP_KERNEL);
+
if (!interface->altsetting) {
printk(KERN_ERR "couldn't kmalloc interface->altsetting\n");
return -1;
ifp->extralen = 0;
} else {
ifp->extra = kmalloc(len, GFP_KERNEL);
+
if (!ifp->extra) {
printk(KERN_ERR "couldn't allocate memory for interface extra descriptors\n");
ifp->extralen = 0;
void usb_destroy_configuration(struct usb_device *dev)
{
- int c, i, j;
+ int c, i, j, k;
if (!dev->config)
return;
struct usb_config_descriptor *cf = &dev->config[c];
if (!cf->interface)
- break;
+ break;
for (i = 0; i < cf->bNumInterfaces; i++) {
struct usb_interface *ifp =
&cf->interface[i];
-
+
if (!ifp->altsetting)
- break;
+ break;
for (j = 0; j < ifp->num_altsetting; j++) {
struct usb_interface_descriptor *as =
&ifp->altsetting[j];
+
+ if(as->extra) {
+ kfree(as->extra);
+ }
if (!as->endpoint)
break;
+
+ for(k = 0; k < as->bNumEndpoints; k++) {
+ if(as->endpoint[k].extra) {
+ kfree(as->endpoint[k].extra);
+ }
+ }
kfree(as->endpoint);
}
+
kfree(ifp->altsetting);
}
kfree(cf->interface);
printk("usbcore: USB disconnect on device %d\n", dev->devnum);
- if (dev->actconfig) {
- for (i = 0; i < dev->actconfig->bNumInterfaces; i++) {
- struct usb_interface *interface = &dev->actconfig->interface[i];
+ if (dev->actconfig) {
+ for (i = 0; i < dev->actconfig->bNumInterfaces; i++) {
+ struct usb_interface *interface = &dev->actconfig->interface[i];
struct usb_driver *driver = interface->driver;
- if (driver) {
- driver->disconnect(dev, interface->private_data);
+ if (driver) {
+ driver->disconnect(dev, interface->private_data);
usb_driver_release_interface(driver, interface);
- }
- }
- }
+ }
+ }
+ }
/* Free up all the children.. */
for (i = 0; i < USB_MAXCHILDREN; i++) {
dev->devnum = addr;
err = usb_set_address(dev);
+
if (err < 0) {
printk(KERN_ERR "usbcore: USB device not accepting new address (error=%d)\n", err);
clear_bit(dev->devnum, &dev->bus->devmap.devicemap);
}
err=usb_get_configuration(dev);
+
if (err < 0) {
printk(KERN_ERR "usbcore: unable to get configuration (error=%d)\n", err);
clear_bit(dev->devnum, &dev->bus->devmap.devicemap);
usb_show_string(dev, "Manufacturer", dev->descriptor.iManufacturer);
usb_show_string(dev, "Product", dev->descriptor.iProduct);
usb_show_string(dev, "SerialNumber", dev->descriptor.iSerialNumber);
-
+
/* now that the basic setup is over, add a /proc/bus/usb entry */
proc_usb_add_device(dev);
/* find drivers willing to handle this device */
- usb_find_drivers(dev);
+ usb_find_drivers(dev);
return 0;
}
}
static struct file_operations usb_fops = {
- NULL, /* seek */
+ NULL, /* seek */
NULL, /* read */
NULL, /* write */
NULL, /* readdir */
NULL, /* poll */
NULL, /* ioctl */
NULL, /* mmap */
- usb_open,
+ usb_open,
NULL, /* flush */
- NULL /* release */
+ NULL /* release */
};
void usb_major_init(void)
*
*/
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
* uss720.c -- USS720 USB Parport Cable.
*
* Copyright (C) 1999
- * Thomas Sailer (sailer@ife.ee.ethz.ch)
+ * Thomas Sailer (sailer@ife.ee.ethz.ch)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* History:
* 0.1 04.08.99 Created
* 0.2 07.08.99 Some fixes mainly suggested by Tim Waugh
- * Interrupt handling currently disabled because
- * usb_request_irq crashes somewhere within ohci.c
- * for no apparent reason (that is for me, anyway)
- * ECP currently untested
+ * Interrupt handling currently disabled because
+ * usb_request_irq crashes somewhere within ohci.c
+ * for no apparent reason (that is for me, anyway)
+ * ECP currently untested
* 0.3 10.08.99 fixing merge errors
* 0.4 13.08.99 Added Vendor/Product ID of Brad Hard's cable
* 0.5 20.09.99 usb_control_msg wrapper used
struct usb_device *usbdev;
void *irqhandle;
unsigned int irqpipe;
- unsigned char reg[7]; /* USB registers */
+ unsigned char reg[7]; /* USB registers */
};
/* --------------------------------------------------------------------- */
static const unsigned char regindex[9] = {
4, 0, 1, 5, 5, 0, 2, 3, 6
};
- int ret;
+ int ret;
if (!usbdev)
return -1;
- ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev,0), 3, 0xc0, ((unsigned int)reg) << 8, 0, priv->reg, 7, HZ);
- if (ret) {
- printk(KERN_DEBUG "uss720: get_1284_register(%d) failed, status 0x%x\n",
+ ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev,0), 3, 0xc0, ((unsigned int)reg) << 8, 0, priv->reg, 7, HZ);
+ if (ret) {
+ printk(KERN_DEBUG "uss720: get_1284_register(%d) failed, status 0x%x\n",
(unsigned int)reg, ret);
- } else {
+ } else {
#if 0
- printk(KERN_DEBUG "uss720: get_1284_register(%d) return %02x %02x %02x %02x %02x %02x %02x\n",
+ printk(KERN_DEBUG "uss720: get_1284_register(%d) return %02x %02x %02x %02x %02x %02x %02x\n",
(unsigned int)reg, (unsigned int)priv->reg[0], (unsigned int)priv->reg[1],
(unsigned int)priv->reg[2], (unsigned int)priv->reg[3], (unsigned int)priv->reg[4],
(unsigned int)priv->reg[5], (unsigned int)priv->reg[6]);
{
struct parport_uss720_private *priv = pp->private_data;
struct usb_device *usbdev = priv->usbdev;
- int ret;
+ int ret;
if (!usbdev)
return -1;
- ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev,0), 4, 0x40, (((unsigned int)reg) << 8) | val, 0, NULL, 0, HZ);
- if (ret) {
- printk(KERN_DEBUG "uss720: set_1284_register(%u,0x%02x) failed, status 0x%x\n",
+ ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev,0), 4, 0x40, (((unsigned int)reg) << 8) | val, 0, NULL, 0, HZ);
+ if (ret) {
+ printk(KERN_DEBUG "uss720: set_1284_register(%u,0x%02x) failed, status 0x%x\n",
(unsigned int)reg, (unsigned int)val, ret);
- } else {
+ } else {
#if 0
- printk(KERN_DEBUG "uss720: set_1284_register(%u,0x%02x)\n",
+ printk(KERN_DEBUG "uss720: set_1284_register(%u,0x%02x)\n",
(unsigned int)reg, (unsigned int)val);
#endif
- }
+ }
return ret;
}
static void * uss720_probe(struct usb_device *usbdev, unsigned int ifnum)
{
- struct usb_interface_descriptor *interface;
- struct usb_endpoint_descriptor *endpoint;
+ struct usb_interface_descriptor *interface;
+ struct usb_endpoint_descriptor *endpoint;
struct parport_uss720_private *priv;
struct parport *pp;
- int i;
+ int i;
- printk(KERN_DEBUG "uss720: probe: vendor id 0x%x, device id 0x%x\n",
- usbdev->descriptor.idVendor, usbdev->descriptor.idProduct);
+ printk(KERN_DEBUG "uss720: probe: vendor id 0x%x, device id 0x%x\n",
+ usbdev->descriptor.idVendor, usbdev->descriptor.idProduct);
- if ((usbdev->descriptor.idVendor != 0x047e || usbdev->descriptor.idProduct != 0x1001) &&
+ if ((usbdev->descriptor.idVendor != 0x047e || usbdev->descriptor.idProduct != 0x1001) &&
(usbdev->descriptor.idVendor != 0x0557 || usbdev->descriptor.idProduct != 0x2001) &&
(usbdev->descriptor.idVendor != 0x0729 || usbdev->descriptor.idProduct != 0x1284))
- return NULL;
+ return NULL;
- /* our known interfaces have 3 alternate settings */
- if (usbdev->actconfig->interface[ifnum].num_altsetting != 3)
- return NULL;
+ /* our known interfaces have 3 alternate settings */
+ if (usbdev->actconfig->interface[ifnum].num_altsetting != 3)
+ return NULL;
- i = usb_set_interface(usbdev, ifnum, 2);
- printk(KERN_DEBUG "uss720: set inteface result %d\n", i);
+ i = usb_set_interface(usbdev, ifnum, 2);
+ printk(KERN_DEBUG "uss720: set inteface result %d\n", i);
- interface = &usbdev->actconfig->interface[ifnum].altsetting[2];
+ interface = &usbdev->actconfig->interface[ifnum].altsetting[2];
/*
* Allocate parport interface
priv->usbdev = usbdev;
pp->modes = PARPORT_MODE_PCSPP | PARPORT_MODE_TRISTATE | PARPORT_MODE_EPP | PARPORT_MODE_ECP | PARPORT_MODE_COMPAT;
- /* set the USS720 control register to manual mode, no ECP compression, enable all ints */
- set_1284_register(pp, 7, 0x00);
+ /* set the USS720 control register to manual mode, no ECP compression, enable all ints */
+ set_1284_register(pp, 7, 0x00);
set_1284_register(pp, 6, 0x30); /* PS/2 mode */
set_1284_register(pp, 2, 0x0c);
- /* debugging */
- get_1284_register(pp, 0, NULL);
- printk("uss720: reg: %02x %02x %02x %02x %02x %02x %02x\n",
- priv->reg[0], priv->reg[1], priv->reg[2], priv->reg[3], priv->reg[4], priv->reg[5], priv->reg[6]);
+ /* debugging */
+ get_1284_register(pp, 0, NULL);
+ printk("uss720: reg: %02x %02x %02x %02x %02x %02x %02x\n",
+ priv->reg[0], priv->reg[1], priv->reg[2], priv->reg[3], priv->reg[4], priv->reg[5], priv->reg[6]);
- endpoint = &interface->endpoint[2];
+ endpoint = &interface->endpoint[2];
printk(KERN_DEBUG "uss720: epaddr %d interval %d\n", endpoint->bEndpointAddress, endpoint->bInterval);
#if 0
priv->irqpipe = usb_rcvctrlpipe(usbdev, endpoint->bEndpointAddress);
goto probe_abort_port;
}
#endif
- parport_proc_register(pp);
- parport_announce_port(pp);
+ parport_proc_register(pp);
+ parport_announce_port(pp);
MOD_INC_USE_COUNT;
- return pp;
+ return pp;
probe_abort_port:
parport_unregister_port(pp);
struct parport_uss720_private *priv = pp->private_data;
usb_release_irq(usbdev, priv->irqhandle, priv->irqpipe);
- priv->usbdev = NULL;
+ priv->usbdev = NULL;
parport_proc_unregister(pp);
parport_unregister_port(pp);
kfree(priv);
}
static struct usb_driver uss720_driver = {
- "uss720",
- uss720_probe,
- uss720_disconnect,
- { NULL, NULL }
+ "uss720",
+ uss720_probe,
+ uss720_disconnect,
+ { NULL, NULL }
};
/* --------------------------------------------------------------------- */
if (usb_register(&uss720_driver) < 0)
return -1;
- printk(KERN_INFO "uss720: USB<->IEEE1284 cable driver v0.4 registered.\n"
+ printk(KERN_INFO "uss720: USB<->IEEE1284 cable driver v0.4 registered.\n"
KERN_INFO "uss720: (C) 1999 by Thomas Sailer, <sailer@ife.ee.ethz.ch>\n");
return 0;
}